Организация цикла перебора ордеров - страница 14

 
Andrey Khatimlianskii:

И что, OrderClose гарантированно закрывает сделку?

Не гарантировано, но проверка в коде есть на этот случай. Каждый вызов OnTick независим от предыдущего.

 
fxsaber:

Не гарантировано, но проверка в коде есть на этот случай. Каждый вызов OnTick независим от предыдущего.

Ок, закрытие на следующем тике подойдет.

 
@Artyom Trishkin@Andrey Khatimlianskii, Спасибо за участие! Жаль, никто больше не высказался по MT5-коду. Видимо, считают, что все в порядке.
 
fxsaber:
@Artyom Trishkin@Andrey Khatimlianskii, Спасибо за участие! Жаль, никто больше не высказался по MT5-коду. Видимо, считают, что все в порядке.

Конечно, пример был дан для ответа, что в MT5 все совсем не в порядке. Пример, показывающий проблему

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

#include <Trade/Trade.mqh>

// Возвращает количество позиций по символу
int GetAmountPositions( const string Symb )
{
  int Res = 0;
  
  // Этот MQL5-код с ошибкой
  for (int i = PositionsTotal() - 1; i >= 0; i--)
    if (PositionGetSymbol(i) == Symb)
      Res++;

/*
  // В MT4 такой код выполняется без ошибки
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Res++;
*/      
  return(Res);
}

// Пример OnTick
void ExampleOnTick()
{
  static CTrade Trade;
  
  // Если нет позиции, открываем
  if (!GetAmountPositions(_Symbol))
    Trade.Buy(1);    
}

// Эмуляция прихода двух Tick-событий
void OnStart()
{
  ExampleOnTick(); 
  
  Sleep(10); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}

Как думаете, если запустить этот скрипт на символе без позиций, что будет в итоге?

Правильный ответ: будет открыта одна или две позиции.

 
fxsaber:

Конечно, пример был дан для ответа, что в MT5 все совсем не в порядке. Пример, показывающий проблему

Как думаете, если запустить этот скрипт на символе без позиций, что будет в итоге?

Правильный ответ: будет открыта одна или две позиции.

Как следствие - подавляющее большинство MT5-советников в Кодобазе написаны неверно!

 
fxsaber:
Мало, кто будет спорить с этим утверждением

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

По какой-то причине некоторые пишут больше кода для таких же ТС. Но на самом деле этот код справляется не хуже. Большинство ТС требуют написания только BuySignal и SellSignal. Больше ничего не нужно.

Пример шаблона специально написан с помощью СБ. Поэтому вопрос к спецам по MT5, код правильный?

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

В свое время я даже написал статью MetaEditor: Опираясь на силу шаблонов.  С тех пор изменился язык, нет шаблон редактора. Интересно было бы обсудить этот вопрос (можно в отдельной ветке), а еще бы и статью получить на эту тему. Я считаю, что при написании кода нужно стараться, чтобы стратегия читалась с одного взгляда без необходимости залезать в методы класса или макроса.

 
fxsaber:

Как следствие - подавляющее большинство MT5-советников в Кодобазе написаны неверно!

Как всегда - категорично. Не можут быть, хотя и не читал ваш код.

 
Rashid Umarov:

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

Если сделать OnTick == Strategy, то шаблон уменьшится/упростится до неприличных размеров.

В свое время я даже написал статью MetaEditor: Опираясь на силу шаблонов.  С тех пор изменился язык, нет шаблон редактора. Интересно было бы обсудить этот вопрос (можно в отдельной ветке), а еще бы и статью получить на эту тему. Я считаю, что при написании кода нужно стараться, чтобы стратегия читалась с одного взгляда без необходимости залезать в методы класса или макроса.

Так шаблон для обеих платформ показал. Он настолько простой, что его обсуждать тяжело, хотя для MT5 он в корне неверный. А так у Вас же есть CExpert. Сам туда не заглядывал - страшно.

 
Rashid Umarov:

Как всегда - категорично. Не можут быть, хотя и не читал ваш код.

Вы прочтите, очень интересно Ваше мнение.

 
fxsaber:

Конечно, пример был дан для ответа, что в MT5 все совсем не в порядке. Пример, показывающий проблему

Как думаете, если запустить этот скрипт на символе без позиций, что будет в итоге?

Правильный ответ: будет открыта одна или две позиции.

А если заменить GetAmountPositions на штатную OnTradeTransaction???

Примерно так:

#include <Trade/Trade.mqh>
  int Res = 0;

// Возвращает количество позиций по символу
/*********************TradeTransaction function*********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol)
   {
    /******************** Если открылась позиция********************/
    if(PositionSelectByTicket(trans.position))
     Res++;
    /******************** Если закрылась позиция********************/
    if(!PositionSelectByTicket(trans.position))
     Res--;
   }
}/*******************************************************************/

// Пример OnTick
void ExampleOnTick()
{
  static CTrade Trade;
  
  // Если нет позиции, открываем
  if (Res == 0)
    Trade.Buy(1);    
}

// Эмуляция прихода двух Tick-событий
void OnStart()
{
  ExampleOnTick(); 
  
  Sleep(10); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}
Причина обращения: