Скачать MetaTrader 5

Expiration. Проблема с результатами

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Yedelkin
4532
Yedelkin  

При оформлении запроса на установку отложенного ордера пробую использовать такую конструкцию:

request.expiration=TimeTradeServer()+int(PeriodSeconds()/Div);

где Div - input-переменная типа float (double). При этом ожидаю, что изменение времени истечения ордера должно влиять на результаты ТС. Цель - найти оптимальное время истечения ордера. Таймфреймы - краткосрочные (внутридневные). Сервер MQ допускает все режимы срока действия (истечения) отложенных ордеров (7).

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

Для наглядности набросал простейший советник (см. DateTimeTest.mq5) и прогнал его с настройками и входными данными, изложенными в Expiration.doc. Входные данные указаны достаточно произвольно, с целью побыстрее получить значимые результаты. В этом же doc-файле отражены результаты оптимизации по переменной Div. Билд 316.

Почему результаты оптимизации по переменной Div являются  одинаковыми и не зависят от изменения срока истечения ордера? Что я делаю не так?

В Справочнике говорится, что expiration - это "Срок истечения ордера". В каких единицах измеряется этот срок (дни, часы, минуты, секунды)?

Файлы:
expiration.rar 124 kb
Yedelkin
4532
Yedelkin  

Поскольку в теме полное молчание, пришлось использовать метод научного тыка.

1-ый результат использования метода научного тыка: срок истечения ордера измеряется в минутах, т.е. минимальный шаг для установки expiration  составляет одну минуту. Уже хорошо.

2-ой результат использования метода научного тыка:  сама по себе конструкция "request.expiration=TimeTradeServer()+int(PeriodSeconds()/Div);" работает нормально и не противоречит правилам языка MQL5.

3-ий результат использования метода научного тыка:  прогон datetimetest.mq5 на дневном таймфрейме и "OHLC на M1" (при прочих одинаковых условиях) не принёс никаких значимых изменений (по-прежнему одинаковые результаты прогонов при различных значениях Div):

 

На основании изложенного прихожу к выводу, что описанная выше проблема может быть результатом некорректной обработки функцией Ordsend() правильно оформленного запроса на установку отложенного ордера (и, в частности, результатом некорректной обработки параметра request.expiration). Могу ошибаться; но иных объяснений происходящему никто не представил. Что ещё проверять - не знаю. В связи с этим адресую свой вопрос непосредственно разработчикам: Почему результаты оптимизации по переменной Div являются  одинаковыми и не зависят от изменения срока истечения ордера?  

Alexey Da
Модератор
6641
Alexey Da  

Спасибо за сообщение. 

Мы разбираемся.

Пока могу сказать, что результаты не всегда одинаковые.

 

На счет expiration - на данный момент требование что время должно отстоять не менее чем на 1 минуту.

 

Yedelkin
4532
Yedelkin  

Спасибо за ответ!

Вполне возможно, что при полноценной проверке результаты не всегда одинаковые.

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

Lari333
7
Lari333  

Здравствуйте.

 

1. Нашел ошибку в тестере стратегий.

При установке времени ликвидации отложенного ордера request.expiration, ордер по истечении времени не ликвидируется.

Когда советник работает в реальном времени, то все работает нормально.

и еще

2. При установке ордера программно с параметром expiration, ордер не ставится и дает ошибку 10022 (Неверная дата истечения ордера в запросе)

      request.action=TRADE_ACTION_PENDING;
      request.symbol=Symbol();
      request.volume=Lots;
      request.price=NormalizeDouble(Price,Digits);
      request.sl=NormalizeDouble(Loss,Digits);
      request.tp=NormalizeDouble(Take,Digits);
      request.type=ORDER_TYPE_SELL_LIMIT;
      request.magic=MagicNumber;
      request.type_time=ORDER_TIME_SPECIFIED;
      request.expiration=TimeTradeServer()+5*60*kol5ot;
      OrderSend(request,result);

Приходится модифицировать установленный без expiration ордер и тогда дата expiration принимается.

 

         OrderSelect(ticket);
         request.symbol=Symbol();
         request.volume=OrderGetDouble(ORDER_VOLUME_INITIAL);
         request.price=OrderGetDouble(ORDER_PRICE_OPEN);
         request.sl=OrderGetDouble(ORDER_SL);
         request.tp=OrderGetDouble(ORDER_TP);
         request.type=ORDER_TYPE_SELL_LIMIT;
         request.magic=MagicNumber;
         request.order=ticket;
         request.action=TRADE_ACTION_MODIFY;
         request.type_time=ORDER_TIME_SPECIFIED;
         request.expiration=TimeTradeServer()+5*60*kol5ot;
         OrderSend(request,result);
   

 

Lari333
7
Lari333  

Вопрос 2 - снимается. Вроде заработало.

Вопрос по тестеру остается. 

Slava
Модератор
6924
Slava  

В тестере исправили. Ждите следующего билда

Lari333
7
Lari333  

Спасибо

Yedelkin
4532
Yedelkin  

Да, заработало. Спасибо!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий