Особенности языка mql5, тонкости и приёмы работы - страница 155

 
Nikolai Semko:

Нашел интересное исследование двухлетней давности по сравнению эффективности различных языков 

https://greenlab.di.uminho.pt/wp-content/uploads/2017/09/paperSLE.pdf



Oh my!

Неужели Ada жива и развивается?! Если не ошибаюсь, первый ООП. Я его изучал в начале 80х. До сих пор ничего о нём не слышал, думал язык умер, как Modula. Оба - глубокие модернизации Паскаля. Компилятора Ada у меня не было, а Modula был - семипроходный на ДВК, если кто-то помнит.

 

Чтобы в Тестере не нарываться на ошибки исполнения, отправляйте соответствующие маркет-ордера в случае, если нужно выставить отложку или SL/TP по текущей цене:

  • Выставляем отложку по текущей цене - добавляем после OrderSend маркет-ордера.
  • Выставляем SL/TP позиции по текущей цене - добавляем после OrderClose позиции.
 
fxsaber:

Чтобы в Тестере не нарываться на ошибки исполнения отправляйте соответствующие маркет-ордера в случае, если нужно выставить отложку или SL/TP по текущей цене:

  • Выставляем отложку по текущей цене - добавляем после OrderSend маркет-ордера.
  • Выставляем SL/TP позиции по текущей цене - добавляем после OrderClose позиции.

Как-то более развёрнуто можно? Ведь не понятно же ничего:

  • чтобы выставить отложенный ордер по текущей цене, нужно что-то добавить после отправки запроса на открытие позиции (?????????)
  • чтобы выставить стоп-приказ (чему?) по текущей цене, нужно что-то добавить после отправки запроса на закрытие позиции (?????????)
Такие вот вопросы появляются после попытки расшифровки вами написанного ...
 
Artyom Trishkin:

Как-то более развёрнуто можно? Ведь не понятно же ничего:

  • чтобы выставить отложенный ордер по текущей цене, нужно что-то добавить после отправки запроса на открытие позиции (?????????)
  • чтобы выставить стоп-приказ (чему?) по текущей цене, нужно что-то добавить после отправки запроса на закрытие позиции (?????????)
Такие вот вопросы появляются после попытки расшифровки вами написанного ...

Проблема показана здесь. Решение.

// Делает более точными MT4/5-тестеры.
TICKET_TYPE MyOrderSend( const string Symb, int Type, const double dVolume, const double Price, const int SlipPage, const double SL, const double TP,
                         const string comment = NULL, const MAGIC_TYPE magic = 0, const datetime dExpiration = 0, color arrow_color = clrNONE )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  MqlTick Tick = {0};  
  
  bool Res = IsTester && SymbolInfoTick(Symb, Tick);
  
  if (Res && (Type > OP_SELL))
  {
    if ((Type == OP_BUYLIMIT) || (Type == OP_BUYSTOP))
    {
      if (Price == Tick.ask)
        Type = OP_BUY;
    }
    else if (Price == Tick.bid)
      Type = OP_SELL;
  }
  
  const TICKET_TYPE Ticket = OrderSend(Symb, Type, dVolume, Price, SlipPage, SL, TP, comment, magic, dExpiration, arrow_color);
  
  Res = Res && (Type <= OP_SELL) && (Ticket != -1) &&
        (Type ? (SL == Tick.ask) || (TP == Tick.ask) : (SL == Tick.bid) || (TP == Tick.bid)) &&
        OrderClose(Ticket, dVolume, Type ? Tick.ask : Tick.bid, SlipPage, arrow_color);
  
  return(Ticket);
}

// Делает более точными MT4/5-тестеры.
bool MyOrderModify( const long Ticket, const double Price, const double SL, const double TP, const datetime Expiration, const color Arrow_Color = clrNONE )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  
  bool Res = false;
  
  if (IsTester && OrderSelect(Ticket, SELECT_BY_TICKET) && !OrderCloseTime())
  {
    if (OrderType() <= OP_SELL)
    {
      Res = (OrderClosePrice() == SL) || (OrderClosePrice() == TP);
      Res = OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color) && (!Res || OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0, Arrow_Color));
    }
    else if (OrderClosePrice())    
      Res = ((OrderClosePrice() == Price) &&
             (MyOrderSend(OrderSymbol(), OrderType() & 1, OrderLots(), Price, 0, SL, TP,
                          OrderComment(), OrderMagicNumber(), OrderExpiration(), Arrow_Color) != -1) && OrderDelete(Ticket)) ||
            OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color);
    else
    {
      MqlTick Tick = {0};
      
      if (SymbolInfoTick(OrderSymbol(), Tick))
        Res = (((bool)(OrderType() & 1) ? (Price == Tick.bid) : (Price == Tick.ask)) &&
               (MyOrderSend(OrderSymbol(), OrderType() & 1, OrderLots(), Price, 0, SL, TP,
                            OrderComment(), OrderMagicNumber(), OrderExpiration(), Arrow_Color) != -1) && OrderDelete(Ticket)) ||
               OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color);
      else
        Res = OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color);                     
    }
  }
  else
    Res = OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color); 
  
  return(Res);
}

#define OrderSend MyOrderSend
#define OrderModify MyOrderModify
 
fxsaber:

Проблема показана здесь. Решение.

От этого понятнее не стало для чего это нужно, и что делать. Ведь многие, прежде чем начать читать код, чтобы сделать своё, или воспользоваться готовым, должны понять что написано о причине, побудившей написать решение.

Я ж просил словами пояснить более развёрнуто вот это:

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2019.12.18 12:45

Чтобы в Тестере не нарываться на ошибки исполнения, отправляйте соответствующие маркет-ордера в случае, если нужно выставить отложку или SL/TP по текущей цене:

  • Выставляем отложку по текущей цене - добавляем после OrderSend маркет-ордера.
  • Выставляем SL/TP позиции по текущей цене - добавляем после OrderClose позиции.

И показал пример того, как это воспринялось мною, а может и ещё кем-нибудь:

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

Особенности языка mql5, тонкости и приёмы работы

Artyom Trishkin, 2019.12.18 12:53

Как-то более развёрнуто можно? Ведь не понятно же ничего:

  • чтобы выставить отложенный ордер по текущей цене, нужно что-то добавить после отправки запроса на открытие позиции (?????????)
  • чтобы выставить стоп-приказ (чему?) по текущей цене, нужно что-то добавить после отправки запроса на закрытие позиции (?????????)
Такие вот вопросы появляются после попытки расшифровки вами написанного ...

Ну да ладно...

 
Artyom Trishkin:

Я ж просил словами пояснить более развёрнуто

Выставление отложки и SL/TP по текущей цене не акцептирует исполнение на текущем тике в MT5-Тестере.

 

Привет всем.

Подскажите pls, какие в МТ5 есть средства для отображения тиковых графиков ?

В МТ4 была опция "открыть автономно". В ней удобно было работать с тиками создавая свои hst-файлы истории.

А в МТ5 "открыть автономно" отсутствует в принципе. Хотя программные средства для работы с тиками отличные.

Не может быть чтобы не была предусмотрена какая-нибудь возможность выводить их на график

 
fxsaber:

Проблема показана здесь. Решение.

  const TICKET_TYPE Ticket = OrderSend();
  ...
  OrderClose(Ticket, dVolume, Type ? Tick.ask : Tick.bid, SlipPage, arrow_color);

Ну бред же! Зачем открываться со СЛ/ТП на текущей цене?

Ну а закрытие путем выставления СЛ/ТП на текущую цену, если и делают, то намеренно. Тоже не нужно эмулировать срабатывание.

 
Andrey Khatimlianskii:

Ну бред же! Зачем открываться со СЛ/ТП на текущей цене?

Ну а закрытие путем выставления СЛ/ТП на текущую цену, если и делают, то намеренно. Тоже не нужно эмулировать срабатывание.

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

Представьте себе, что нужно закрыться по ТП, который как-то вычисляется. И вот он стал равен текущей цене.

 
fxsaber:

нужно закрыться по ТП, который как-то вычисляется. И вот он стал равен текущей цене.

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

Или, если нужно лимитом обязательно выйти, тяну его за ценой, пока не зальют.

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