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

 
fxsaber:

Нет, последняя запись торговой активности во втором логе.

И тут все верно в плане очередности:

2021.05.05 10:32:35.896 Trades  '160122203': market buy 0.01 EURUSD placed for execution
2021.05.05 10:32:35.931 Trades  '160122203': order #2249869869 buy 0.01 / 0.01 EURUSD at market done in 81.962 ms
2021.05.05 10:32:35.931 Trades  '160122203': deal #2240398230 buy 0.01 EURUSD at 1.19876 done (based on order #2249869869)
2021.05.05 10:32:35.931 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': accepted market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876 placed for execution
2021.05.05 10:32:36.009 Trades  '160122203': order #2249869870 sell 0.01 / 0.01 EURUSD at market done in 77.026 ms
2021.05.05 10:32:36.009 Trades  '160122203': deal #2240398231 sell 0.01 EURUSD at 1.19876 done (based on order #2249869870)
2021.05.05 10:32:36.009 Scripts script Test (EURUSD,M1) removed

Здесь я вернулся к варианту без принтов и снова остается одна позиция после выполнения. Получается, что необходимо выдерживать какую-то паузу после выполнения торговых операций. Блин, тот еще костыль.

 
Ihor Herasko:

Ну а кто будет total обновлять? ))

но когда есть открытая позиция - то скрипт закрывает её и больше не чего не делает 

Снимок2

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

ещё если я пытаюсь открыть позицию скрипт закрывает её моментально 

 
fxsaber:

удалось написать IsSynchronized(). Код тяжеловат. Пока не решил, в каком виде выкладывать.

Это как так? Оно как бы найдено, но его как бы нет? А в чем суть или принцип решения? 

 
SanAlex:

но когда есть открытая позиция - то скрипт закрывает её и больше не чего не делает 

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

 
Ihor Herasko:

И тут все верно в плане очередности:

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

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

Ihor Herasko, 2021.05.05 09:35

И тут все верно в плане очередности:

2021.05.05 10:32:35.896 Trades  '160122203': market buy 0.01 EURUSD placed for execution
2021.05.05 10:32:35.931 Trades  '160122203': order #2249869869 buy 0.01 / 0.01 EURUSD at market done in 81.962 ms
2021.05.05 10:32:35.931 Trades  '160122203': deal #2240398230 buy 0.01 EURUSD at 1.19876 done (based on order #2249869869)
2021.05.05 10:32:35.931 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': accepted market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876 placed for execution
2021.05.05 10:32:36.009 Trades  '160122203': order #2249869870 sell 0.01 / 0.01 EURUSD at market done in 77.026 ms
2021.05.05 10:32:36.009 Trades  '160122203': deal #2240398231 sell 0.01 EURUSD at 1.19876 done (based on order #2249869870)
2021.05.05 10:32:36.009 Scripts script Test (EURUSD,M1) removed

Выделенные строки потдверждают последовательность.

Закрытие происходит после завершения выполнения скрипта. Print-кеш немного искажает.

 
Dmitry Fedoseev:

Это как так? Оно как бы найдено, но его как бы нет?

Руки еще не дошли выложить. В течение суток опубликую.

А в чем суть или принцип решения?

Идет анализ соответствия истории торгов текущему торговому окружению. При этом без тормозов.

Также идет проверка Result.order.

В итоге использование такое: IsSync() вернуло false - торговое окружение в Терминале кривое, иначе - можно действовать, как обычно.

 
Разработчики MT традиционно молчат. Проблемы индейцев шерифа не интересуют.
 
Ihor Herasko:

Добавил принтов. Теперь остается две позиции, как и ожидалось:

Результат:

Добавьте Trade.ResultRetcodeDescription()


#include <Trade\Trade.mqh>

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

А также ResultDeal / ResultOrder / ResultComment и Order.State

Наверняка там будет ответ

State
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / ResultOrder
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / ResultOrder
  • www.mql5.com
ResultOrder - CTrade - Торговые классы - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Rashid Umarov:

Добавьте Trade.ResultRetcodeDescription()

А также ResultDeal / ResultOrder / ResultComment и Order.State

Наверняка там будет ответ

State

Сделал:

#define PRINT(A) Print(#A + " = " + (string)(A))

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!OrdersTotal())
    {
      printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      PRINT(Trade.ResultRetcodeDescription());
      PRINT(Trade.ResultDeal());
      PRINT(Trade.ResultOrder());
      PRINT(Trade.ResultComment());
      printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

Результат:

2021.05.05 11:36:14.566 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultRetcodeDescription() = done at 0.00000
2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultDeal() = 0
2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultOrder() = 2249874645
2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultComment() = Request executed
2021.05.05 11:36:14.646 Test (EURUSD,M1)        После открытия. PositionsTotal: 2, OrdersTotal: 1
2021.05.05 11:36:14.646 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Rashid Umarov:

Добавьте Trade.ResultRetcodeDescription()

А также ResultDeal / ResultOrder / ResultComment и Order.State

Наверняка там будет ответ

State

Дело точно не в этом, т.к. условие отправки маркет-ордера на открытие позиции - PositionsTotal == OrdersTotal == 0.

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