Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 548

 
edutak:

Мне бы не хотелось показывать код, так как первая версия оказалась очень живучей. Выдержал 10 лет без оптимизации. Теперь хочу сделать его чуть сложней и прибыльней.

Код очень простой.

 

Все таки ордера на каждом тике могут открываться из-за ошибки в логике? 

Проверку делайте перед открытием позиции на предмет есть ли уже открытые или нет.
 
Vitalii Ananev:
Проверку делайте перед открытием позиции на предмет есть ли уже открытые или нет.
Так?
for(int pos=0; pos<OrdersTotal(); pos++)
     {
      OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
         kolpos++;
     }
 

Перед закрытием такая.

 if(OrdersTotal()!=0)
         if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
            if(OrderType()==OP_BUY)
 
edutak:
Так?
   for(int pos=OrdersTotal()-1; pos>=0; pos--)         
   {
      if(!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)  kolpos++;
   }

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

Лучше оформить это в виде функции.

int CountOrder(string Smb,int Magik)
{
   int Total = OrdersTotal();
   if (Total==0) return(0);
   int kolpos = 0;
   for(int pos=Total-1; pos>=0; pos--)         
   {
      if(!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()==Smb && OrderMagicNumber()==Magik)  kolpos++;
   }
   return(kolpos);
}
 
edutak:

Перед закрытием такая.

У вас перед закрытием отсутсвует проверка на магик и символ. Может закрыть сделки другого советника или открытые в ручную.
 
Vitalii Ananev:
Примерно так.

Нет, проблема не решилась. она не в этом блоке.

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

 
edutak:

Нет, проблема не решилась. она не в этом блоке.

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

Значит что то делаете не так, разбирайтесь с вашим кодом.

 

Мой лучше :)

...

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

 
Vitalii Ananev:

Значит что то делаете не так, разбирайтесь с вашим кодом.

 

Мой лучше :)

...

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

Объявил как глобальную переменную, но выдает ошибку.

int CountOrder;
 
edutak:

Объявил как глобальную переменную, но выдает ошибку.

То что я вам написал это функция.

Вот пример использования.

int Count = CountOrder(Symbol(),12345);

if (Count==0)
{
//можно открывать
}
 
Vitalii Ananev:

То что я вам написал это функция.

Вот пример использования.

Запутался
Причина обращения: