Множественное открытие ордеров одновременно MQL5 - страница 3

 
Evgeniy Zhdan:

А изнчально так:

Тут не ясно, почему после октрытия позиции, код лезет выполняться опять внутрь этого:

Вполне возможно, что список позиций не успевает измениться после операции открытия. Помнится, такой баг ранее был в МТ5 при работе с функциями отправки синхронных торговых приказов. Потом его исправили. Возможно, сейчас опять всплыл этот баг. А может быть экземпляр класса trade, который Вы используете, основан на асинхронных торговых приказах? Тогда это и есть ответ.

 
Evgeniy Zhdan:

А изнчально так:

Тут не ясно, почему после октрытия позиции, код лезет выполняться опять внутрь этого:

Попробуйте так считать позиции, напрямую.

//+------------------------------------------------------------------+
//| Возвращает число открытых позиций и помещает в массивы информацию|
//| о текущих открытых позициях.                                     |
//+------------------------------------------------------------------+
int ExCheckPositions(string sy="", long mg=0)
{
//---
   string pos_symbol;
   long pos_magic;
   int positions=0;
//---
   int pos_total = PositionsTotal();
   
   //--- Получаем информацию об открытых ордерах ---
   for(int p=0; p<pos_total; p++)
   {
      ResetLastError();
      pos_symbol=PositionGetSymbol(p);
      
      if(pos_symbol=="")
      {
         Print(__FUNCTION__+", Error Code = ",GetLastError());
         continue;
      }
      pos_magic=PositionGetInteger(POSITION_MAGIC);
      
      if((pos_symbol==sy || sy=="") && (pos_magic==mg || mg==0))
      {
         positions++;
      }
   }
   return positions;
}
 
Alexey Valeev:

Попробуйте так считать позиции, напрямую.

Да, согласен. В общем, сделаю так:

1. Разнесу эту хрень по советам выше;

2. Подсчет позиций сделаю функцией без использования библиотеки.

Всем спасибо!

 
Ihor Herasko:

Вполне возможно, что список позиций не успевает измениться после операции открытия. Помнится, такой баг ранее был в МТ5 при работе с функциями отправки синхронных торговых приказов. Потом его исправили. Возможно, сейчас опять всплыл этот баг. А может быть экземпляр класса trade, который Вы используете, основан на асинхронных торговых приказах? Тогда это и есть ответ.

Вот этого не знаю. Было бы хорошо, если кто-то из админов ответил

 
Evgeniy Zhdan:

Вот этого не знаю. Было бы хорошо, если кто-то из админов ответил

В функции OnInit обычно настраивают, в классе trade есть метод устанавливающий режим работы.

SetAsyncMode

Устанавливает асинхронный режим торговых операций

 
Evgeniy Zhdan:

А изнчально так:

Тут не ясно, почему после октрытия позиции, код лезет выполняться опять внутрь этого:

У меня аналогичные коды в советниках, но множественности ордеров не возникает.

Попробуйте, буквально после каждой строчки кода, проверять сплошняком все значения, типа

Alert(__FUNCTION__," ",__LINE__," ... ");

Причина найдётся. Подозреваю, где-то теряется количество позиций, поэтому несколько раз выскакивает "0" и советник тиражирует ордера.

Sleep(1000); может добавить?
 

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

Когда перешел на

for(int cnt=0; cnt<PositionsTotal(); cnt++)
{
     if( _Symbol != PositionGetSymbol(cnt) ) continue;
     if( PositionGetInteger(POSITION_TYPE)!=ORDER_TYPE_BUY && PositionGetInteger(POSITION_TYPE)!=ORDER_TYPE_SELL ) continue;
     if( PositionGetInteger(POSITION_MAGIC) != Magic ) continue;
     /*...................*/
}

Все стало работать корректно.

 
Konstantin Nikitin:

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

Когда перешел на

Все стало работать корректно.

     if( _Symbol != PositionGetSymbol(cnt) ) continue;

тоже такой строчкой всегда пользуюсь...

 
Alexey Valeev:

В функции OnInit обычно настраивают, в классе trade есть метод устанавливающий режим работы.

SetAsyncMode

Устанавливает асинхронный режим торговых операций

Vladimir M.:

У меня аналогичные коды в советниках, но множественности ордеров не возникает.

Попробуйте, буквально после каждой строчки кода, проверять сплошняком все значения, типа

Alert(__FUNCTION__," ",__LINE__," ... ");

Причина найдётся. Подозреваю, где-то теряется количество позиций, поэтому несколько раз выскакивает "0" и советник тиражирует ордера.

Sleep(1000); может добавить?
Konstantin Nikitin:

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

Когда перешел на

Все стало работать корректно.


Ребят, у меня была включена асинхронная хрень в OnInit():

trade.SetAsyncMode(true);

Стало:

trade.SetAsyncMode(false);

Пожалуй, совокупность изложенных в ветке рекомендаций решит проблему.

 
Konstantin Nikitin:

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

Когда перешел на

Все стало работать корректно.

Это вот сюда ее надо засунуть?

//+------------------------------------------------------------------+
//| Возвращает число открытых позиций и помещает в массивы информацию|
//| о текущих открытых позициях.                                     |
//+------------------------------------------------------------------+
int ExCheckPositions(string sy="", long mg=0)
{
//---
   string pos_symbol;
   long pos_magic;
   int positions=0;
//---
   int pos_total = PositionsTotal();
   
   //--- Получаем информацию об открытых ордерах ---
   for(int p=0; p<pos_total; p++)
   {
      if( _Symbol != PositionGetSymbol(p)) continue;
      ResetLastError();
      pos_symbol=PositionGetSymbol(p); // хотя это аналог
      
      if(pos_symbol=="")
      {
         Print(__FUNCTION__+", Error Code = ",GetLastError());
         continue;
      }
      pos_magic=PositionGetInteger(POSITION_MAGIC);
      
      if((pos_symbol==sy || sy=="") && (pos_magic==mg || mg==0))
      {
         positions++;
      }
   }
   return positions;
}
Причина обращения: