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

 
fxsaber:

Условия MT4 и MT5 одинаковые.

Столько лет все знали о задвоении, приходя к... Sleep. Потому что ОЧЕНЬ сложно. О многих особенностях торгового API, что поднимались на форуме, разработчики не в курсе, либо не давали своих комментариев.


Никто не хает MT5. Показал примерами некоторые проблемы при решении элементарных задач.

Откуда-же они одинаковые? Ведь вы так и не ответили на вопрос

Никто не хает MT5. Показал примерами некоторые проблемы при решении элементарных задач.

Просто надо правильно обрабатывать результат выполнения функции OrderSend() а вы никак не можете оторваться от простоты mql4. У вас своя цель, поймать микросекунды, а не торговать… У одного дц есть проблемы, а вы выдаёте эти проблемы за баги МТ. Покажите задвоение позиций на счёте MQ и тогда разработчики обратят на это внимание. Я ваш код запускал на демке Робо и никаких задвоений не получилось увидеть.

Некоторые ваши сообщения об ошибках действительно заслуживают уважения, но некоторые… извините, такая чушь, аж слов приличных не хватает.

На этом всё… С праздником Победы. Мир. Труд. Май.

 
Alexey Viktorov:

Откуда-же они одинаковые? Ведь вы так и не ответили на вопрос

Еще раз, условия задачи для MT4/5 одинаковые. Нужно на пустом счете по окончании выполнения скрипта иметь 100 открытых позиций. При этом допускается во время выполнения скрипта с любого Терминала закрывать некоторые позиции. Это "вмешательство" нужно только для того, чтобы не было тупых решений.

for (int i = 0; i < 100; i += OrderSend(Request, Result))
  ;

Просто надо правильно обрабатывать результат выполнения функции OrderSend() а вы никак не можете оторваться от простоты mql4. У вас своя цель, поймать микросекунды, а не торговать… У одного дц есть проблемы, а вы выдаёте эти проблемы за баги МТ. Покажите задвоение позиций на счёте MQ и тогда разработчики обратят на это внимание. Я ваш код запускал на демке Робо и никаких задвоений не получилось увидеть.

Некоторые ваши сообщения об ошибках действительно заслуживают уважения, но некоторые… извините, такая чушь, аж слов приличных не хватает.

Если не замечаете проблем, это не значит, что их нет. MQ-демо - отвратительное место, с точки зрения отладки. Там выставлен такой тип исполнения, когда OrderSend возвращает true для маркет-ордеров только тогда, когда открылась позиция. В реальности на ECN-счетах ничего подобного нет. true - маркет-ордер принят. Что дальше - надо следить. Только кухонные ДЦ используют иную (как на MQ-Demo) схему исполнения.

На этом всё… С праздником Победы. Мир. Труд. Май.

Взаимно.

 
fxsaber:

Нужно на MT5 написать скрипт, который на пустом счете открывает 100 позиций.


На MT4 решил таким образом.

void OnStart()
{
  while (OrdersTotal() < 100)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);
    
  Print(OrdersTotal());
}

У кого какие варианты решения на MT5?

самый короткий код, какой смог написать на МТ5:

MqlTradeRequest BuyRequest = {0};
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   static bool run = false;
   if(run) return;
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   BuyRequest.type_filling = GetFilling();
   MqlTradeResult result;
   run = OrderSend(BuyRequest, result);
}
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
{
   MqlTradeResult result;
   while(PositionsTotal() < 10 &&
         SymbolInfoDouble(_Symbol, SYMBOL_ASK, BuyRequest.price) &&
         OrderSend(BuyRequest, result))
   {}
}
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+

без  GetFilling() - не работает на крипте (((

но даже в этом коде у меня открылось 11 позиций:


 
Igor Makanu:

самый короткий код, какой смог написать на МТ5:

Можно СБ для лаконичности

но даже в этом коде у меня открылось 11 позиций:

Потому что логика в коде такая.

 
fxsaber:

Можно СБ для лаконичности

Потому что логика в коде такая.

не решается задача с помощью PositionsTotal() даже так:

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

открывает когда 10 позиций, когда даже 13 шт

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

 
Igor Makanu:

не решается задача с помощью PositionsTotal() даже так:

открывает когда 10 позиций, когда даже 13 шт

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

Так и ждите!!! Ведь mql4 ждёт и вы не возмущаетесь. А в MQL5 вы решили, что можно просто отправить запрос и считать, что он обязательно должен быть выполнен…………

 
Igor Makanu:

не решается задача с помощью PositionsTotal() даже так:

открывает когда 10 позиций, когда даже 13 шт

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

Заметьте, что это уже не скрипт/сервис, а советник. Но даже с советником голову поломать придется для того, чтобы решить столь простую задачу в две строки.

 
Alexey Viktorov:

Так и ждите!!! Ведь mql4 ждёт и вы не возмущаетесь. А в MQL5 вы решили, что можно просто отправить запрос и считать, что он обязательно должен быть выполнен…………

Здесь несколько человек высказывались, что сложностей нет. Однако, решения они не предоставили.

 
fxsaber:

Здесь несколько человек высказывались, что сложностей нет. Однако, решения они не предоставили.

Я тоже не предоставлю по самой простой причине. Не хочу учить …кодеров (к вам это не относится), но если будет необходимость решу проблему не долго думая. И всё по той-же причине уже долгое время в CodeBase попадают коды исключительно от барабашки. Все остальные молчат…

 
Alexey Viktorov:

Я тоже не предоставлю по самой простой причине. Не хочу учить …кодеров (к вам это не относится), но если будет необходимость решу проблему не долго думая. И всё по той-же причине уже долгое время в CodeBase попадают коды исключительно от барабашки. Все остальные молчат…

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

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

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