Скачать MetaTrader 5

Не тестируются эксперты использующие взаимозакрытие ордеров

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Задействуй с пользой свободные компьютеры. Подключись к MQL5 Cloud Network!
Forex Trader
114257
Forex Trader 2005.12.07 17:28 
Собственно сабж.
Точнее проверялся вариант когда производится взаимозакрытие двух ордеров разного размера (в лотах).
После взаимозакрытия должен появиться новый ордер "остаточного" размера. Так вот, в тестере появляется новый ордер "без номера" и на этом тестирование останавливается.
Forex Trader
114257
Forex Trader 2005.12.07 18:59  
Вы можете представить фрагмент лога, иллюстрирующий проблему?
Forex Trader
114257
Forex Trader 2005.12.09 13:39  
Не понял фрагмент какого лога Вам нужен?
Я говорил о том что тест на истории "затыкается" сразу после первой же команды взаимозакрытия ордеров (когда ордера разного размера). Т.е. получается (как и должно быть) остаточный ордер (но без номера) и дальше ничего уже не тестируется.
Чтобы убедиться в этом ниже приведу пример эксперта для теста. Это не тот эксперт на котором я наткнулся на эту особенность (тот большой и сложный). Я просто сейчас "на коленке" его сваял для демонстрации "затыка" теста. Он естественно не претендует на работоспособность в реале и создан исключительно для прогона на истории. Я конечно понимаю что реально работать на таком эксперте нельзя (но на это он не претендует).
bool first=true;

int start()
  {
   int total=OrdersTotal();
   if(first) { OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,0); first=false; }
   if(total==1)
     {
      OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
      int type=OrderType();
      double profit=MathAbs(OrderProfit());
      if(profit>=100.0)
         if(type==OP_BUY) OrderSend(Symbol(),OP_SELL,0.2,Bid,0,0,0);
         else if(type==OP_SELL) OrderSend(Symbol(),OP_BUY,0.2,Ask,0,0,0);
     }
   else if(total==2)
     {
      OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
      int ticket1=OrderTicket();
      OrderSelect(1,SELECT_BY_POS,MODE_TRADES);
      int ticket2=OrderTicket();
      OrderCloseBy(ticket1,ticket2);
     }
   return(0);
  }


Ну тут вроде все прозрачно. При первом запуске открываем 0.1 лота BUY. А дальше как только прибыль или убыток по позиции превышает 100 - открываем контр-позицию двойного размера (0.2 лота). Как только позиций в терминале становится 2 - выполняем взаимозакрытие. В результате получается перевернутая поза одиночного (0.1 лота) размера. Ну и дальше все должно аналогично крутиться туда-сюда.
На практике (при прогоне теста) после взаимозакрытия получаем результирующую позицию без номера и все останавливается.

P.S. Тот эксперт на котором я на это наткнулся на демо работает нормально и позиции переворачивает как и запланированно, а вот на тесте такой же затык получается.

Forex Trader
114257
Forex Trader 2005.12.09 14:11  
проверим
Forex Trader
114257
Forex Trader 2005.12.09 16:28  
проверили, исправили. спасибо
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий