Помогите с советом по индикатору.

 

Я написал просто советник к индикатору ADX. если DI+  поднимается выше  DI- то он открывает ордер на покупку а закрывает на продажу. И наоборот. Вроде все просто и правильно написано. Однако советник в тестере почему-то запарывается.

Советник прилагается к сообщению.

В тестере почему-то советник каждую секунду совершает две операции - BUY и CLOSE. постоянно buy-close-buy-close-buy-close..... и так пока тестовый счет не скатывается к нулю. Дамы и господа, не могли бы вы помочь мне в этом? Это проблемы с тестером стратегий или я что-то не то написал в коде?

Файлы:
ADX_Simple.mq4  16 kb
 
Nick_Provodnik:

Я написал просто советник к индикатору ADX. если DI+  поднимается выше  DI- то он открывает ордер на покупку а закрывает на продажу. И наоборот. Вроде все просто и правильно написано. Однако советник в тестере почему-то запарывается.

Советник прилагается к сообщению.

В тестере почему-то советник каждую секунду совершает две операции - BUY и CLOSE. постоянно buy-close-buy-close-buy-close..... и так пока тестовый счет не скатывается к нулю. Дамы и господа, не могли бы вы помочь мне в этом? Это проблемы с тестером стратегий или я что-то не то написал в коде?


В коде очень много проблем.

Самая главная, что после пустого перебора ордеров вы работаете с последний открытым, а не с каждым по очереди. Видимо это получилось случайным переставлением фигурной скобки.

Итого, за первую итерацию вы по сигналу открываете ордер buy, затем из за ошибки в блоке sell выставляете флаг OB=true на закрытие  -> if (OrdersTotal()>0&&Type==0), по идее там должно быть Type == 1, а вообще лучше использовать стандартные константы OP_BUY, OP_SELL. Далее, в этой же итерации вы закрываете ордер.

Видимо за основу был взят очень старый код. Сейчас используются другие события. Код компилируется только потому, что старые еще поддерживаются для совместимости.

Я так понимаю, вы пока просто разбираетесь в написании советников. Рекомендую еще раз прочитать код, подписать закрывающие скобки комментариями, например так:

for (int i=0; i<OrdersTotal(); i++) {             // Цикл перебора ордеров
    if (!OrderSelect(i, SELECT_BY_POS)) continue; // Если ордера нет, пропускаем
    if (OrderMagicNumber() != Magic) continue;    // Если не наш мэджик, пропускаем
    Total++;                                      // Счетчик рыночн. орд.
    if (Total>1) {                                // Не более одного орд.
        Alert("Many orders. Error.");
        return(0);                                // Выход из start() <-!!! после открытия первого ордера робот перестает вообще что либо делать в следующей итерации
    } //end if     
    Ticket=OrderTicket();                      // Номер выбран. орд.
    Type  =OrderType();                        // Тип выбран. орд.
    Lots  =OrderLots();                        // Количество лотов
    // Тут по идее должен быть остальной код функции Start (функция Start, достаточно давно заменена на событие OnTick, прочитайте документацию
} //end for
 
Aleksei Radchenko:


Aleskei, спасибо большое за совет, учту ваши заметки и пожалуй буду коптеть над кодом дальше. Я и правда пока только разбираюсь в советниках. Видимо я читал древний материал...

Причина обращения: