Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен приватный мониторинг счета? В Сигналах есть такая возможность!
mgmaxim
310
mgmaxim 2014.11.10 12:07 

Здравствуйте! Пишу  советник, который определяет уровни и на них выставляет ордера. Возникла проблема в  том, что он выставляет множество ордеров на одном и том же уровне. В коде пишу функцию:

bool fu_exist_order(double open_price, double sl_price)

{

int count =0;

bool order_exist=true;

if(OrdersTotal()==0)order_exist=false;

for(int i=OrdersTotal(); i>=0; i--)

   {

   if(OrderSelect(i,SELECT_BY_POS)==true)

      {

      if(OrderSymbol()!=Symbol())continue;

      if(OrderType()!=OP_SELLLIMIT)continue;

      if(OrderOpenPrice()==open_price && OrderStopLoss()==sl_price)count++;

      Print(count);

      }

   }

Print(order_exist);

return(order_exist);

но эффекта нет. 

 Подскажите, пожалуйста, как правильно написать функцию? Нужно чтобы  советник перед тем как выставить ордер проверял, а нет ли  уже такого ордера с такими же ценой открытия и стоплосом. 

mgmaxim
310
mgmaxim 2014.11.10 13:56  

Разобрался. Похоже нужно было нормалиизовать все цены. сразу заработало

Vitalie Postolache
11097
Vitalie Postolache 2014.11.10 18:10  
for(int i=OrdersTotal()-1; i>=0; i--)
mgmaxim
310
mgmaxim 2014.11.11 09:08  
evillive:
for(int i=OrdersTotal()-1; i>=0; i--)

Да. Исправил. Спасибо. Только появилась другая проблема )

Почему - то советник выставляет иногда по 3-4 одинаковых ордера. Раньше сразу сотнями выставлял, а теперь иногда нормально по одному, а иногда сразу 3-4. Может быть такое, что советник когда послал ордер на сервер и ждет ответа, то пришел новый тик, но первый ордер не выставился и он снова отправляет запрос на сервер? 

mgmaxim
310
mgmaxim 2014.11.11 09:28  

Сейчас функция вот такая: 

 

bool fu_exist_order(double open_price, double sl_price, int order_type)
{
bool order_exist;
if(OrdersTotal()>0)
{
for(int i=OrdersTotal()-1; i>=0; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS)==true)
      {
      double oop = NormalizeDouble(OrderOpenPrice(),Digits());
      double op_pr = NormalizeDouble(open_price,Digits());
      if(OrderSymbol()!=Symbol())continue;
      if(OrderType()!=order_type)continue;
      //if(OrderMagicNumber()!=magic)continue;
      if(oop==op_pr)order_exist=true;
      }
   }
}
if(OrdersTotal()==0)order_exist=false;
return(order_exist);

}

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

 

mgmaxim
310
mgmaxim 2014.11.11 10:45  

АГа! Нашел! Оказывается когда срабатывет ордер, то его тип меняется, и фунция перестает его видеть. Т.к. я указываю только OP_SELLLIMIT, то когда он становиться рыночным он его не видит, и выставляет следующий. 

Сам с собой общаюсь ). Но это не важно, главное результат есть.

Форум - вещь!!! ))) 

Vitalie Postolache
11097
Vitalie Postolache 2014.11.11 16:12  
mgmaxim:

АГа! Нашел! Оказывается когда срабатывет ордер, то его тип меняется, и фунция перестает его видеть. Т.к. я указываю только OP_SELLLIMIT, то когда он становиться рыночным он его не видит, и выставляет следующий. 

Сам с собой общаюсь ). Но это не важно, главное результат есть.

Форум - вещь!!! ))) 

Иногда простое описание проблемы в письменном виде содержит подсказки, даже если никто не отвечает )))
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий