Оператор While и 138-ая...

 

Всем привет!

Тут на днях столкнулся с таким явлением, как реквоты и 138-ая!

Советник сначала работал нормально, и затем, после трех суток тестирования на демо перестал работать, точнее, ни одной открытой сделки... проверил...

Работал советник с начала каждого нового тика нового бара:

if(Volume[0]>1) return;

И вот на каждом новом баре первого тика начали сыпаться реквоты (138-ые). Соответственно, советник не открывал ордера на последующих тиках и ждал первый тик начала открытия нового бара....

В учебнике МКЛ4 порылся, и вот решил спросить, правильно ли будет обработать 138-ую и 135-ую ошибку оператором цикла While нижеследующим образом ?


...
...

//--------------------------------------------------------------------
int i, res;
//--------------------------------------------------------------------
if (Условие для покупки верно, то... )
    {
        res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"Бычья",MAGICMA,0,Blue); //...открываем ордер на покупку
        RefreshRates(); //проверяем результат операции
        int errcode=GetLastError(); //на наличие ошибок
            if (errcode==135 || errcode==138) //если получаем реквот или другую цену, то...
                {
                    while(res>0) //начинаем долбиться, пока не откроем ордер
                        {
                        i++; //счетчик цикла
                        res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"Бычий тренд",MAGICMA,0,Blue);
                        }     
                }
        return;
    }
...
...


... мозг закипел, никак не соображу... как избавиться от реквотов на первом тике нового бара...

 
Используйте функции KimIV и не придётся ломать голову над этими техническими вопросами. Лучше тратить время на разработку стратегии и условий входа-выхода.
 
160777:

Всем привет!

Тут на днях столкнулся с таким явлением, как реквоты и 138-ая!

Советник сначала работал нормально, и затем, после трех суток тестирования на демо перестал работать, точнее, ни одной открытой сделки... проверил...

Работал советник с начала каждого нового тика нового бара:

И вот на каждом новом баре первого тика начали сыпаться реквоты (138-ые). Соответственно, советник не открывал ордера на последующих тиках и ждал первый тик начала открытия нового бара....

В учебнике МКЛ4 порылся, и вот решил спросить, правильно ли будет обработать 138-ую и 135-ую ошибку оператором цикла While нижеследующим образом ?


... мозг закипел, никак не соображу... как избавиться от реквотов на первом тике нового бара...

В Вашем коде (с циклом) не заложено условие выхода из него (единственное условие - открытие ордера, не предусматривает негативного развития событий, например пропадание связи с сервером). Правильнее ограничить количество попыток переменной, а также, делать паузу после каждой попытки.

    if (!IsTradeContextBusy() && IsTradeAllowed())
    {
        while (tries < NumberOfTries)
        {
            RefreshRates();
            ticket = OrderSend (_symbol, OP_BUY, _volume, NDD (Ask), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
            if (ticket <= 0)
            {tries++;}
            else
            {tries = NumberOfTries;}
            Sleep (RetryTime * 1000);
        }
    }

Вот один из вариантов такого решения - эта простая форма (без обработки конкретных ошибок). Хотите более "навароченный" вариант - берите упомянутые функции KimIV. Есть ещё библиотека LibOrderReliable (мне она больше нравится) - её не трудно отыскать в Интернете.

 
khorosh:
Используйте функции KimIV и не придётся ломать голову над этими техническими вопросами. Лучше тратить время на разработку стратегии и условий входа-выхода.
+100500. "Ну пробил ты головой стену, что ты будешь делать в соседней камере?" (с) Все равно стратегию разрабатывать придется, а это задача покруче.
Причина обращения: