Есть вопросы к OrderCloseBy()

 

В качестве аргументов использовал 2 противоположных ордера по одному инструменту, функцией OrdersTotal() до и после OrderCloseBy() вывел количество ордеров, оно не изменилось, функция GetLastError() после клоуса пишет об отсутствии ошибок, в истории счета нулевых прибылей нет. Вопросы:

1. имеет ли разница в порядке баевых и селльных ордеров?

2.как все же закрыть встречные ордера?

 
cheater.wot:

В качестве аргументов использовал 2 противоположных ордера по одному инструменту, функцией OrdersTotal() до и после OrderCloseBy() вывел количество ордеров, оно не изменилось, функция GetLastError() после клоуса пишет об отсутствии ошибок, в истории счета нулевых прибылей нет. Вопросы:

1. имеет ли разница в порядке баевых и селльных ордеров?

2.как все же закрыть встречные ордера?


  1. покажите код
  2. покажи те журнал
  3. покажите терминал

 

int id = OrderSend(Symbol(), cmd, 0.1, price, MarketInfo(Symbol(), MODE_SPREAD), stopLoss, takeProfit);// Создание ордера
if(id > 0)
{
RefreshRates();
Alert("Создан новый ордер("+cmd+", "+id+").Всего открытых ордеров: "+OrdersTotal());
}
if(OrdersTotal() == 1)
Alert("Этот ордер единственный"); 
return; 
}
if(OrdersTotal() > 1)
if(getorder(cmd1) > 0) OrderCloseBy(getorder(cmd1), id);  Alert("Закрываю этот ордер противоположным. Осталось ордеров:"+GetLastError()); 

}


журнал

в истории этих ордеров нету, но в торговле они есть

 
cheater.wot:

int id = OrderSend(Symbol(), cmd, 0.1, price, MarketInfo(Symbol(), MODE_SPREAD), stopLoss, takeProfit);// Создание ордера
if(id > 0)
{
RefreshRates();
Alert("Создан новый ордер("+cmd+", "+id+").Всего открытых ордеров: "+OrdersTotal());
}
if(OrdersTotal() == 1)
Alert("Этот ордер единственный"); 
return; 
}
if(OrdersTotal() > 1)
if(getorder(cmd1) > 0) OrderCloseBy(getorder(cmd1), id);  Alert("Закрываю этот ордер противоположным. Осталось ордеров:"+GetLastError()); 

}


журнал

в истории этих ордеров нету, но в торговле они есть

Переменная id точно помнит тикет открытого ордера? Возможно, она где-то обнуляется.

Также странно, что не проверен результат вызова OrderCloseBy. Ну а количество ордеров не может быть получено через GetLastError. Какой-то сумбур получается.

Нужно хотя бы:

if(getorder(cmd1) > 0) 
  if (OrderCloseBy(getorder(cmd1), id))
     Alert("Закрытие произошло успешно. Осталось ордеров: ", OrdersTotal()); 
  else
     Alert("Ошибка закрытия: ", GetLastError());

Но непонятно, что там возвращает функция getorder и что такое cmd1.

 
Нет, GetLastError() это вывод ошибки, выводит 0, т.е. как я понимаю, OrderCloseBy() проводит операцию, но ее результаов не в истории не в журнале нет
 
getorder(cmd1) это тикет противоположного ордера, проверял.
 

Все-таки проверьте, что там лежит в id перед вызовом OrderCloseBy, а потом попробуйте сделать, как я написал.

 
cheater.wot:

int id = OrderSend(Symbol(), cmd, 0.1, price, MarketInfo(Symbol(), MODE_SPREAD), stopLoss, takeProfit);// Создание ордера
if(id > 0)
{
RefreshRates();
Alert("Создан новый ордер("+cmd+", "+id+").Всего открытых ордеров: "+OrdersTotal());
}
if(OrdersTotal() == 1)
Alert("Этот ордер единственный"); 
return; 
}
if(OrdersTotal() > 1)
if(getorder(cmd1) > 0) OrderCloseBy(getorder(cmd1), id);  Alert("Закрываю этот ордер противоположным. Осталось ордеров:"+GetLastError()); 

}


журнал

в истории этих ордеров нету, но в торговле они есть



Ваш код не совсем понятен. Даже Вам будет трудно в нем ориентироваться. 

Хотя я тоже грешу этим. когда делаю для себя, или чтобы никто не смог понять мой код при декомпиле. :-)


посмотрите этот код:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int id1=0,id2=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(id1==0)
     {
      id1=OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT),MarketInfo(Symbol(),MODE_ASK),MarketInfo(Symbol(),MODE_SPREAD),0,0);
      if(id1>0)Alert("Открыта новая позиция("+OP_BUY+", "+id1+").Всего открытых позиций: "+OrdersTotal());
      else Alert("Ошибка открытия позиции "+GetLastError());

     }
   if(id2==0)
     {
      id2=OrderSend(Symbol(),OP_SELL,MarketInfo(Symbol(),MODE_MINLOT),MarketInfo(Symbol(),MODE_BID),MarketInfo(Symbol(),MODE_SPREAD),0,0);
      if(id2>0)Alert("Открыта новая позиция ("+OP_SELL+", "+id2+").Всего открытых позиций: "+OrdersTotal());
      else Alert("Ошибка открытия позиции "+GetLastError());

     }

   if(id1!=0 && id2!=0)
     {
      bool result=OrderCloseBy(id1,id2);
      if(result)
        {
         Alert("Позиции закрыты: ");
         ExpertRemove();
         return;
        }
      else Alert("Позиции не закрыты: "+GetLastError());
     }

  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+


он полностью рабочий и показывает, что функция работает.


 
Господа, я не пробовал эту функцию, но говорят один спред экономится, так ли это?
 
Renat Akhtyamov:
Господа, я не пробовал эту функцию, но говорят один спред экономится, так ли это?


других скрытых прибылей не добавляется :-) 

 

CloseBy не всегда можно использовать. Проверить можно так:

MarketInfo(NULL,MODE_CLOSEBY_ALLOWED);