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

 

Forum on trading, automated trading systems and testing trading strategies

OrderModify() in MQL5?

Edward Munroe, 2021.05.27 00:51

Ask a simple question, get a simple answer!?! Why has almost everything in mql5 got to be so messy?

Хороший вопрос.

 

Традиционно перед выходными простая задача.

Открыта позиция на 1 лот. После запуска скрипта нужно сделать так, чтобы позиция стала 0.9 лота.

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


Как обычно, попытался решить задачу классически.

// Частичное закрытие позиции.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  if (Trade.Buy(1)) // Пытаемся открыть позицию на 1 лот.
  {
    const ulong Ticket = Trade.ResultOrder();
    
    // Ждем, пока не появится.
    while (!IsStopped() && !PositionSelectByTicket(Ticket))
      Sleep(0);
      
    // А теперь просто закрываем 0.1 лота в случае, если объем позиции равен 1.
    // Цикл - для эмуляции запуска скрипта в любой момент.
    while (!IsStopped() && PositionSelectByTicket(Ticket) && (PositionGetDouble(POSITION_VOLUME) == 1))
      Trade.PositionClosePartial(Ticket, 0.1);
  }
}


Запуск этого скрипта выдает позицию на 0.8 лота. Надо 0.9.

 
fxsaber:

Запуск этого скрипта выдает позицию на 0.8 лота. Надо 0.9.

проверил пару раз на 2-х серверах, у меня только 0.9


логика тестов то понятна - пытаемся на одном тике от асинхронности выполнения избавиться, общую схему бы этого процесса (как синхронизироваться на одном тике) хотелось бы узнать

 
fxsaber:

Традиционно перед выходными простая задача.


Ешкин кот! И у меня 0.8 (на MQDemo -0.9). Да сколько ж этих граблей еще будет?

 
 
fxsaber:
Решил.

Пожалуй, на данный момент это самая сложная задача из всех легко формулируемых задач в этой ветке.

Очень сильная проверка владения торговой частью MQL5.

 

открыть ордер на покупку с нулевыми СЛ и ТП, затем выставить СЛ и ТП 30 пп (если не изменяет память в ДЦ это называлось типы счетов Market Execution - нельзя выставлять сразу СЛ и ТП)

для МТ4 этот код работает:

void OnStart()
{
   int ticket;
   if((ticket = OrderSend(_Symbol, OP_BUY, 0.1, Ask, 30, 0.0, 0.0)) < 0 ||
         !OrderSelect(ticket, SELECT_BY_TICKET) ||
         !OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(OrderOpenPrice() - 300 * _Point, _Digits), NormalizeDouble(OrderOpenPrice() + 300 * _Point, _Digits), OrderExpiration()))
   {
      Print("Error Open order # ", GetLastError());
   }
}
 
Igor Makanu:

открыть ордер на покупку с нулевыми СЛ и ТП, затем выставить СЛ и ТП 30 пп (если не изменяет память в ДЦ это называлось типы счетов Market Execution - нельзя выставлять сразу СЛ и ТП)

для МТ4 этот код работает:

Года два-три назад распознавание типа исполнения ввели на уровне терминала. Теперь даже при Market Execution можно установить SL и TP, а терминал сам разобьет ордер на два торговых приказа.

 
Igor Makanu:

открыть ордер на покупку с нулевыми СЛ и ТП, затем выставить СЛ и ТП 30 пп (если не изменяет память в ДЦ это называлось типы счетов Market Execution - нельзя выставлять сразу СЛ и ТП)

Распространенная задача.

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