Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода) - страница 20

 
Andrey Khatimlianskii:

Языком молоть — не мешки ворочать. Взяли бы и научили. Меня, пожалуйста.

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

Подпереть еще одним костылем можно, конечно. Но хочется человеческого решения. Над коим fxsaber и трудится публично, выслушивая лай проходящих мимо доброжелателей.

Лично вам, я надеюсь, достаточно вникнуть в такие слова документации

Во время обработки торговых транзакций экспертом при помощи обработчика OnTradeTransaction(), терминал продолжает обрабатывать вновь поступающие торговые транзакции. Таким образом, состояние торгового счета может измениться уже в процессе работы OnTradeTransaction(). Например, пока MQL5-программа обрабатывает событие добавления нового ордера, он может быть исполнен, удален из списка открытых и перемещен в историю. В дальнейшем программа будет уведомлена о всех этих событиях.
и это касается не только обработчика события OnTradeTransaction(), но и любой части кода после отправки OrderSend(). Ждите завершения сделки. Других вариантов нет и вряд-ли будет… Просто задумайтесь почему в mql4 всё так просто? Да потому, что эти ожидания заложены далеко от ваших глаз. А в MQL5 вы все проверки и ожидания почему-то считаете костылями. Почему???
 
Alexey Viktorov:

Лично вам, я надеюсь, достаточно вникнуть в такие слова документации

и это касается не только обработчика события OnTradeTransaction(), но и любой части кода после отправки OrderSend(). Ждите завершения сделки. Других вариантов нет и вряд-ли будет… Просто задумайтесь почему в mql4 всё так просто? Да потому, что эти ожидания заложены далеко от ваших глаз. А в MQL5 вы все проверки и ожидания почему-то считаете костылями. Почему???

Алексей, Вы не в теме. Извините, нет ни времени ни желания объяснять все еще раз.

 

попробовал так:

void OnTrade()
{
   HistorySelect(TimeCurrent(),0);
   if(PositionsTotal() >= 10) return;
   MqlTradeResult result;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   OrderSend(BuyRequest, result);
}

5 раз запускал свой код, пока ровно 10 позиций открывает

 
Igor Makanu:

попробовал так:

5 раз запускал свой код, пока ровно 10 позиций открывает

Выглядит, как ошибка в задании входных HistorySelect.

 
fxsaber:

Выглядит, как ошибка в задании входных HistorySelect.

идея достучаться до сервера и синхронизироваться

переписал как скрипт:

//+------------------------------------------------------------------+
void OnStart()
{
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
   datetime t_start = TimeCurrent();
   while(PositionsTotal() < 10)
   {
      BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      if(!HistorySelect(TimeCurrent(), t_start) || ! OrderSend(BuyRequest, result)) continue;
      if(PositionsTotal() >= 10) return;
   }
}
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
{
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);

   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
//+------------------------------------------------------------------+

несколько раз запустил, тоже открывает 10 позиций, добавил текущее время старта скрипта

 
Igor Makanu:

идея достучаться до сервера и синхронизироваться

переписал как скрипт:

несколько раз запустил, тоже открывает 10 позиций, добавил текущее время старта скрипта

Что покажет такое изменение?

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

      if(!_B(HistorySelect(TimeCurrent(), t_start), 1) || ! OrderSend(BuyRequest, result)) continue;
 
fxsaber:

Что покажет такое изменение?


2021.05.09 21:35:06.210 tst (ETHUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Benchmark.mqh is On.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 20 mcs.

2021.05.09 21:35:06.308 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 6 mcs.

2021.05.09 21:35:06.404 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.501 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 13 mcs.

2021.05.09 21:35:06.597 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.694 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.792 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

2021.05.09 21:35:06.888 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.989 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

позиций пока все равно 10 шт, удвоений пока не было
 
Igor Makanu:

позиций пока все равно 10 шт, удвоений пока не было

По времени выполнения HistorySelect хорошо видно, что она ничего не запрашивает с Торгового сервера.


Несколько версий.

  1. Вам везет.
  2. Эта ветка вызвала тихое изменение в новом билде Терминала. Что легко подтвердить, если в старых будет задвоение.
  3. Нестандартное поведение HistorySelect при From >= To.
  4. Торговый сервер. Имя?


Попробуйте таким же способом избавиться от задвоения здесь.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода)

fxsaber, 2021.05.05 02:04

// Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
    else if (!OrdersTotal())
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}

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

 

вот зашел случайно, почитал - это какой-то позор !

никому нельзя верить !
 
fxsaber:

По времени выполнения HistorySelect хорошо видно, что она ничего не запрашивает с Торгового сервера.


Несколько версий.

  1. Вам везет.
  2. Эта ветка вызвала тихое изменение в новом билде Терминала. Что легко подтвердить, если в старых будет задвоение.
  3. Нестандартное поведение HistorySelect при From >= To.
  4. Торговый сервер. Имя?


Попробуйте таким же способом избавиться от задвоения здесь.

1. увы, в нашем деле без этого не выживешь ))

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

3. я пасс, этим банкетом Вы заведуете, разработчики молчат, мои предположения... пальцем в небо, я думаю, что проблема в сетевых задержках, и в нескольких сокетах? терминала, синхронизации нет, по одному сокету цены, по другому OrderSend, еще где OnTrade()..... вот и летят пакеты откуда и куда

4. сейчас робофорекс + 100 Мбит оптика( ETTH ), ранее на ноуте плохой мобильный интернет и фхопен


попробовал - 2 минуты скрипт молотил, всегда одна позиция, задвоений не было, снял  руками скрипт

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