Тестер стратегий версия 1.39 Некоторые ошибки при тестировании истории с использованием лимитных ордеров. - страница 4

 

Да, описанные проблемы имеют место быть - писал пару лет назад, что это не позволяет банально воспроизвести торговлю по своей же истории счёта.

Теоретически, не сложно поправить это разработчикам, добавив в настройках тестера подобный функционал - активацию отложек по последней цене.

 
JRandomTrader #:

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

Полностью согласен. Я просто описал идеальный вариант. 

 

БИЛД 4000.

Если мне не кажется то подкорректировали исполнение лимитных ордеров. Теперь они срабатывают по цене ласт. )))) Спасибо. 

 
Уважаемые разработчики. Здесь категорично отвечает кто-то что тестер не будет меняться и точка. НО все таки прошу Вас обратить внимание на то что в тестере лимитные ордера обрабатываются не правильно. Это не дает возможности правильно оттестировать значения. Таким образом рыночные ордера из истории не заставляют тригерить лимитный ордер.

Привожу код для проверки selllimit. Подтвержденный картинкой выполнения.  Это очень ВАЖНО!!!!

      if(MQLInfoInteger(MQL_TESTER) == 1 || MQLInfoInteger(MQL_OPTIMIZATION) == 1)
        {
         // Проверяем не выше ли ласт чем у нас ордер.
         if(last_f_tick.last > OrderGetDouble(ORDER_PRICE_OPEN) && prevmymqltic.last <= OrderGetDouble(ORDER_PRICE_OPEN))
           {
            Print("Пропустили сделку ",last_f_tick.last," ",OrderGetDouble(ORDER_PRICE_OPEN));
            }
         prevmymqltic = last_f_tick;
        }
      if(OrderGetInteger(ORDER_STATE) == ORDER_STATE_PLACED)
        {
         if(!b_trade.OrderModify(PrevLimOrderTicket,price,0,0,0,0,0))
           {
            uint _result=a_trade.ResultRetcode();
            Print(__FUNCTION__+"не изменен лимитный ордер на продажу. Объем ",1," Result=",_result," ",OrderGetDouble(ORDER_PRICE_OPEN)," ",price);
            currenttime=TimeTradeServer();
            buysellrunning = false;
            return;
           }
        Print("Изменили ",last_f_tick.ask," ",last_f_tick.last," ",price); 
        }


 
Файлы:
 

Начинаю искать новые способы стригерить лимитный ордер в тестере стратегии что бы хоть как то приблизить реальный результат  к результату тестера. Делаю явную провокацию.  Выставляю лимитный ордер на продажу по определенной цене. Затем запускаю рыночный ордер на покупку выше цены ордера на продажу с проскальзыванием. лимитный ордер не тригерит. Так бы я хот как-то из ситуации вышел.  Может кто то может еще что нибудь предложить как стригерить лимитку в тестере. Очень надо. 

Ну можно конечно написать математический  заменитель. 

Проверять если ласт выше условного уровня sellimit считать что ордер сработал. и наоборот ниже если якобы лимитка на покупку сработала и добавлять в баланс сумму прибыли. 

Но это уже новый тестер)))

Но лень же. Но похоже придется писать свою библиотеку. 

 
Aleksandr Dziuba #:

Начинаю искать новые способы стригерить лимитный ордер в тестере стратегии что бы хоть как то приблизить реальный результат  к результату тестера. Делаю явную провокацию.  Выставляю лимитный ордер на продажу по определенной цене. Затем запускаю рыночный ордер на покупку выше цены ордера на продажу с проскальзыванием. лимитный ордер не тригерит. Так бы я хот как-то из ситуации вышел.  Может кто то может еще что нибудь предложить как стригерить лимитку в тестере. Очень надо. 

Ну можно конечно написать математический  заменитель. 

Проверять если ласт выше условного уровня sellimit считать что ордер сработал. и наоборот ниже если якобы лимитка на покупку сработала и добавлять в баланс сумму прибыли. 

Но это уже новый тестер)))

Но лень же. Но похоже придется писать свою библиотеку. 

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

 
Aleksandr Slavskii #:

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

Я нашел выход для себя. Очень коряво. Для SellLimit. Я проверяю выше в моменте ли lasttik.last моего лимитного ордера. Бросаю рыночную заявку. Естественно она срабатывает по цене бид. Разницу в спред в деньгах списываю в депозит. И уже получается более менее похожая картина на реальный рынок.

Вот фрагмент кода. Может кому то поможет. Но это же реально костыль. АУ РАЗРАБЫ? ИЛИ У ВАС ПРОГРАММИСТОВ НЕ ОСТАЛОСЬ? 

Может на английском форуме описать ситуацию?

      if(MQLInfoInteger(MQL_TESTER) == 1 || MQLInfoInteger(MQL_OPTIMIZATION) == 1)
        {
         // Проверяем не выше ли ласт чем у нас ордер.
         if(last_f_tick.last > OrderGetDouble(ORDER_PRICE_OPEN) && prevmymqltic.last <= OrderGetDouble(ORDER_PRICE_OPEN))
           {
            Print("Пропустили сделку ",last_f_tick.last," ",OrderGetDouble(ORDER_PRICE_OPEN));
            if(!b_trade.Sell(1,futuer,OrderGetDouble(ORDER_PRICE_OPEN),0,0,DoubleToString(OrderGetDouble(ORDER_PRICE_OPEN),b_symbol.Digits())))
              {
               uint _result=a_trade.ResultRetcode();
               Print(__FUNCTION__+"не установлен ордер на продажу. Объем ",f_volume," Result=",_result);
               buysellrunning = false;
               return;
              }
            PrevSellOrderTicket =  b_trade.ResultOrder();
            if(!a_trade.Buy(1,_Symbol,0,0,0,""))
              {
               uint _result=a_trade.ResultRetcode();
               Print(__FUNCTION__+"не установлен ордер на покупку. Объем ",b_volume," Result=",_result);
               buysellrunning = false;
               return;
              }
            PrevBuyOrderTicket =  a_trade.ResultOrder();
            double diff = ((OrderGetDouble(ORDER_PRICE_OPEN)- last_f_tick.bid)/a_symbol.TickSize())*a_symbol.TickValue();
            TesterDeposit(diff);
            if(!b_trade.OrderDelete(PrevLimOrderTicket))
              {
               uint _result=a_trade.ResultRetcode();
               Print(__FUNCTION__+"не удален лимитный ордер на продажу. Объем ",1," Result=",_result);
               buysellrunning = false;
               return;
              }
            buysellrunning = false;
            prevmymqltic = last_f_tick;
            return;
           }
        }
 
Aleksandr Dziuba #:

Может кто то может еще что нибудь предложить как стригерить лимитку в тестере. Очень надо. 


   Можно получать котировки с реального символа, а торговать на кастомном. Кастомной символ, точно такой же как и реальный, но вместо тика в котором была сделка заменяется на исходный + тик с Ask=Bid= цена сделки. Это простои идея. Я не побывал.  Если получиться с вас отсчет и скрипт для формирования таких кастомных символов. 

 
pivomoe #:

   Можно получать котировки с реального символа, а торговать на кастомном. Кастомной символ, точно такой же как и реальный, но вместо тика в котором была сделка заменяется на исходный + тик с Ask=Bid= цена сделки. Это простои идея. Я не побывал.  Если получиться с вас отсчет и скрипт для формирования таких кастомных символов. 

Котировки по реальным тикам идут на реальном символе. SVZ3 (фьючерс ММВБ). Данных хватает.  100% истории за 5 дней. У меня просто высокочастотный алгоритм.  Кастомный символ (у нас строится) по котировкам того же финама с которым я уже и так работаю с реальной историей. 
Я результат уже получил. Он похож на реал. Очень близко. И оптимизация уже работает с костылем TesterDeposit() и TesterWithdrawal()

Написал на англоязычном форуме пост. Может хоть возьмут и исправят тестер для лимиток. Делов то. 2 строчки.

А мне пришлось весь код #ifdef испортить ))))

 

Вы наверное меня не поняли.

Берем реальный символ например SBER.

Полностью копируем всю спецификацию и все его тики в SBER Custom. Далее смотрим все тики оригинального символа и ищем тики на которых были сделки. Т.е изменился Last или Volume. 

Пример.

SBER Bid 100 Ask 105 Last 105 . Вместо этого тика в SBER Custom Пишем.

SBER Custom Bid 105 Ask 105 Last 105. 

В тестере индикаторы кормим с символа с SBER, а торгуем на SBER Custom на котором наши лимитки должны исполнять нормально.