Форум трейдеров » Торговые роботы, советники, индикаторы » Вопросы программирования
+ Подписаться
Страница 57 из 87 ПерваяПервая ... 747555657585967 ... ПоследняяПоследняя
  1. 134
    Комментарии
    1
    Темы
    136
    Репутация Pro
    Аватар для G_Dark  
    В начале пути

    2 Медалей
    Цитата Сообщение от west100 Посмотреть сообщение
    А по какой цене продавать-то?
    Наверное, не хватает
    Zapros.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);
    Огромное спосибо. Все заработало :thumbsup_002:
  2. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    В посте 546 чёта вообще какой то мудреный кусок кода.
    Сначала цикл собирает тикеты ордеров в массив, а потом второй цикл эти тикеты обрабатывает. Слижкам многа букав в коде.

    Не знаю зачем это всё нужно, но если оптимизировать задачу, то получим маленький кусочек кода, всего с одним циклом и без лишних массивов и переменных:

    Код:
    void DelOrdersEmptySLTP(int magicnum) {
    	for(int i=OrdersTotal(); i>=0; i--) {
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false || OrderSymbol() != Symbol()) continue;
    		if (OrderMagicNumber() == magicnum && (OrderTakeProfit() == 0 || OrderStopLoss() == 0)) {
    			switch (OrderType()) {
    				case OP_BUY: OrderClose(OrderTicket(), OrderLots(), Bid, 0); break;
    				case OP_SELL: OrderClose(OrderTicket(), OrderLots(), Ask, 0); break;
    				default: OrderDelete(OrderTicket());
    			}
    		}
    	}
    }

    Спасибо! Только код у меня работает только когда ручками открываешь ордера. А оказалось все сложнее. Вот в чем проблема: советник устанавливает отложенники без стопа (а когда они открываются - подставляет стоп). Когда происходит обрыв связи, отложенник открывается во время обрыва связи и советник вообще не понимает, что отложенник открылся и не хочет устанавливать на него стоп, но относительно этого ордера открывает встречный (уже без тейка). Так плодятся ордера без тейка или стопа. Что делать?
    Этот код не работает на такие ордера, потому что в логах советника он даже не открылся! Советник в упор их не замечает, потому что открытие произошло в момент выключения связи.
    Надеюсь понятно объяснил. Подскажите, как с этим бороться.

    С уважением,
    Александр
  3. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Объяснение понятное, но не полное. То что ордера открываются при закрытом терминале это само собой разумеющееся, но я не вижу особых причин что бы при инициализации, советник не смог в первую очередь проинициализировать наличие всех ордеров (пендингов и открытых).
    Например в стандартном советнике МТ4 Moving Averange по этому поводу реализована простейшая функция CalculateCurrentOrders(), но в вашем случае логичнее будет узнать количество всех типов ордеров установленных на момент запуска советника.
    Лично я вижу эту задачу так:
    Код:
    #define MAGICMA 20050610
    
    int BUYS, BUYLIMITS, BUYSTOPS, SELLS, SELLIMITS, SELLSTOPS;
    
    int init() {
    	for(int i = 0; i < OrdersTotal(); i++) {
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
    		if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA) {
    			switch(OrdersType()) {
    				case OP_BUY: BUYS++; break;
    				case OP_SELL: SELLS++; break;
    				case OP_BUYLIMIT: BUYLIMITS++; break;
    				case OP_SELLLIMIT: SELLIMITS++; break;
    				case OP_BUYSTOP: BUYSTOPS++; break;
    				case OP_SELLSTOP: SELLSTOPS++; break;
    			}
    		}
    	}
    }
    результат выполнения функции init() заполнит переменные количеством ордеров каждого типа, а что с ними делать? Нужна четкая блок схема алгоритма, что делать с открытыми ордерами? Максимально допустимое кол-во ордеров? и.т.д и.т.п.... и ещё куча условий. Всё это можно реализовать одним циклом, просто перебирая ордера по очереди.;)
  4. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    Объяснение понятное, но не полное. То что ордера открываются при закрытом терминале это само собой разумеющееся, но я не вижу особых причин что бы при инициализации, советник не смог в первую очередь проинициализировать наличие всех ордеров (пендингов и открытых).
    Например в стандартном советнике МТ4 Moving Averange по этому поводу реализована простейшая функция CalculateCurrentOrders(), но в вашем случае логичнее будет узнать количество всех типов ордеров установленных на момент запуска советника.
    Лично я вижу эту задачу так:
    Код:
    #define MAGICMA 20050610
    
    int BUYS, BUYLIMITS, BUYSTOPS, SELLS, SELLIMITS, SELLSTOPS;
    
    int init() {
    	for(int i = 0; i < OrdersTotal(); i++) {
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
    		if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA) {
    			switch(OrdersType()) {
    				case OP_BUY: BUYS++; break;
    				case OP_SELL: SELLS++; break;
    				case OP_BUYLIMIT: BUYLIMITS++; break;
    				case OP_SELLLIMIT: SELLIMITS++; break;
    				case OP_BUYSTOP: BUYSTOPS++; break;
    				case OP_SELLSTOP: SELLSTOPS++; break;
    			}
    		}
    	}
    }
    результат выполнения функции init() заполнит переменные количеством ордеров каждого типа, а что с ними делать? Нужна четкая блок схема алгоритма, что делать с открытыми ордерами? Максимально допустимое кол-во ордеров? и.т.д и.т.п.... и ещё куча условий. Всё это можно реализовать одним циклом, просто перебирая ордера по очереди.;)
    Если добавить сюда функцию удаления ордеров, не имеющих стопов или тейков, она будет опредялять их наличие и удалять?
  5. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от religare777 Посмотреть сообщение
    Если добавить сюда функцию удаления ордеров, не имеющих стопов или тейков, она будет опредялять их наличие и удалять?
    Просто удалять или закрывать ордера без стопов и тейков? Хм-м-м... Дык в чём проблема?
    Выше уже был приведен пример этой задачи. Вот ещё разок:
    Код:
    #define MAGIC 20050610
    
    extern bool is_Magic = true;
    
    int init() {
    	for(int i = OrdersTotal(); i >= 0; i--) {
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false || OrderSymbol() != Symbol()) continue;
    		if (is_Magic == true && OrderMagicNumber() != MAGIC) continue;
    		if (OrderStopLoss() > 0 && OrderTakeProfit() > 0) continue;
    		switch(OrderType()) {
    			case OP_BUY: OrderClose(OrderTicket(), OrderLots(), Bid, 3); break;
    			case OP_SELL: OrderClose(OrderTicket(), OrderLots(), Ask, 3); break;
    			default: OrderDelete(OrderTicket());
    		}
    	}
    }
    Что не работает?

    PS Добавил в код внешнюю переменную флаг is_Magic, можно включать и отключать проверку магика. Если установлено false, будут удаляться все ордера по данному инструменту, не зависимо от магика.:rolleyes:
  6. 2,974
    Комментарии
    7
    Темы
    2995
    Репутация Pro
     
    Banned

    4 Медалей
    Цитата Сообщение от religare777 Посмотреть сообщение
    Если добавить сюда функцию удаления ордеров, не имеющих стопов или тейков, она будет опредялять их наличие и удалять?
    иф ордертейкпрофит==0 - чёт делаем
    иф ордерстоплосс==0 - чёт делаем
    иф ордермэджик=чемуто - чёт делаем..
    ......
    ......
    ......
    ......
    ......
    ......
    иф ордерпрофит>0 - чёт делаем(важно!))))))

    Примерно так..;)
  7. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    Просто удалять или закрывать ордера без стопов и тейков? Хм-м-м... Дык в чём проблема?
    Выше уже был приведен пример этой задачи. Вот ещё разок:
    Код:
    #define MAGIC 20050610
    
    extern bool is_Magic = true;
    
    int init() {
    	for(int i = OrdersTotal(); i >= 0; i--) {
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false || OrderSymbol() != Symbol()) continue;
    		if (is_Magic == true && OrderMagicNumber() != MAGIC) continue;
    		if (OrderStopLoss() > 0 && OrderTakeProfit() > 0) continue;
    		switch(OrderType()) {
    			case OP_BUY: OrderClose(OrderTicket(), OrderLots(), Bid, 3); break;
    			case OP_SELL: OrderClose(OrderTicket(), OrderLots(), Ask, 3); break;
    			default: OrderDelete(OrderTicket());
    		}
    	}
    }
    Что не работает?

    PS Добавил в код внешнюю переменную флаг is_Magic, можно включать и отключать проверку магика. Если установлено false, будут удаляться все ордера по данному инструменту, не зависимо от магика.:rolleyes:

    Ага. Попробовал. Выдает сообщение:
    market order #... cannot be deleted
    на все ордера, без стопов.
    Вот я тормоз, надо проскальзывание поставить!!!! Сейчас попробую!

    Александр
  8. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Большое СпасиБо, Vladiger!
    Удалось-таки!!!
  9. 134
    Комментарии
    1
    Темы
    136
    Репутация Pro
    Аватар для G_Dark  
    В начале пути

    2 Медалей
    Здраствуйте. Скажите пожалуста В МТ5 можно запустить тестер в режиме визуализации или там такого режима нет?:unsure:
  10. 482
    Комментарии
    12
    Темы
    483
    Репутация Pro
     
    В начале пути

    4 Медалей
    (вопрос по mql4)
    Можно-ли как-то получить значения границ канала OBJ_STDDEVCHANNEL на заданном баре? ObjectGetValueByShift всегда 0 возвращает...

    ------
    всё, отбой - нашел аналогичный Custom индикатор здесь http://forum.mql4.com/ru/10229

Вверх
РегистрацияX

чтобы писать, читать, комментировать