Закрытие ордеров

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vadim Kazakevich
1648
Vadim Kazakevich  

Здравствуйте уважаемые господа трейдеры и программисты!

Столкнулся с таким явлением, как правильно закрывать ордера. Допустим, что в рынке 4 ордера бай, и 3 ордера селл. При достижении определенного профита, все ордера должны закрыться по одной цене! Так и должно быть. Но у меня закрывает так:

То есть на каждом тике. Что у меня не правильно в коде?

Вариант закрытия

if(Close[0]>=TpStop(OP_BUY))
   if(Profit()>0){
    CloseOrders(OP_BUY,MAGIC,clrGray);
    CloseOrders(OP_SELL,MAGIC,clrGray);
  }

Сама функция закрытия

//------------------------Функция закрытия ордеров-------------------+  
bool CloseOrders(int Op,int magic, color Clcol){
 double price;
   string op;
  if(Op==OP_BUY){
   RefreshRates();
   price=NormalizeDouble(Bid,Digits);
   op="BUY";
  }
  if(Op==OP_SELL){
   RefreshRates();
   price=NormalizeDouble(Ask,Digits);
   op="SELL";
   }
 for(int i=0; i<=OrdersTotal(); i++){ 
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
   if(OrderType()==Op)
    if(OrderMagicNumber()==magic){
     RefreshRates();
     if(OrderClose(OrderTicket(),OrderLots(),price,Slip,Clcol)){
      Print("Ордер №",OrderTicket()," : ",op," : "," закрыт по цене = ",price); 
      return(true);
     }
      Print("Ордер №",OrderTicket()," : ",op," : "," не закрыт! Ошибка: ",GetLastError());
    }
   } 
  }
  return(false);
}
Ihor Herasko
21742
Ihor Herasko  
Vadim Kazakevich:

Здравствуйте уважаемые господа трейдеры и программисты!

Столкнулся с таким явлением, как правильно закрывать ордера. Допустим, что в рынке 4 ордера бай, и 3 ордера селл. При достижении определенного профита, все ордера должны закрыться по одной цене! Так и должно быть. Но у меня закрывает так:

То есть на каждом тике. Что у меня не правильно в коде?

Для циклического закрытия нужно развернуть цикл. Иначе после закрытия одного ордера происходит пропуск следующего.

for (int i = OrdersTotal() - 1; i >= 0; --i)
Vadim Kazakevich
1648
Vadim Kazakevich  
Ihor Herasko:

Для циклического закрытия нужно развернуть цикл. Иначе после закрытия одного ордера происходит пропуск следующего.

Ничего не выходит. Даже не все ордера закрывает!


Ihor Herasko
21742
Ihor Herasko  
Vadim Kazakevich:

Ничего не выходит. Даже не все ордера закрывает!

Покажите, как пытаетесь.

Vadim Kazakevich
1648
Vadim Kazakevich  
Ihor Herasko:

Покажите, как пытаетесь.

С закрытием всех ордеров разобрался. А так закрывает на каждом тике.

У меня два варианта закрытия. Про профиту Buy и по профиту Sell. Профит это линии, при достижении которых должны закрыться все ордера.

Примеры кода:

 if(TpStop(OP_BUY)>0)//профит buy
  if(Profit()>0){
  if(Bid>=TpStop(OP_BUY))CloseOrders(OP_BUY,MAGIC,clrGray); 
  if(Ask>=TpStop(OP_BUY))CloseOrders(OP_SELL,MAGIC,clrGray);
 }
  
 if(TpStop(OP_SELL)>0)//профит Sell
  if(Profit()>0){
   if(Bid<=TpStop(OP_SELL))CloseOrders(OP_BUY,MAGIC,clrGray);
   if(Ask<=TpStop(OP_SELL))CloseOrders(OP_SELL,MAGIC,clrGray);
  } 
//------------------------Функция закрытия ордеров-------------------+  
bool CloseOrders(int Op,int magic, color Clcol){
 double price;
   string op;
  if(Op==OP_BUY){
   RefreshRates();
   price=NormalizeDouble(Bid,Digits);
   op="BUY";
  }
  if(Op==OP_SELL){
   RefreshRates();
   price=NormalizeDouble(Ask,Digits);
   op="SELL";
   }
 for(int i=OrdersTotal()-1; i>=0;--i){ 
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
   if(OrderType()==Op)
    if(OrderMagicNumber()==magic){
     RefreshRates();
     if(OrderClose(OrderTicket(),OrderLots(),price,Slip,Clcol)){
      Print("Ордер №",OrderTicket()," : ",op," : "," закрыт по цене = ",price); 
      return(true);
     }
      Print("Ордер №",OrderTicket()," : ",op," : "," не закрыт! Ошибка: ",GetLastError());
    }
   } 
  }
  return(false);
}


Закрытие всех ордеров происходит по одному на каждом тике.

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

Вернее так должно быть!

Maxim Kuznetsov
13607
Maxim Kuznetsov  

Открывайте локирующий ордер и далее закрывайте всё через CloseBy

Ihor Herasko
21742
Ihor Herasko  
Vadim Kazakevich:

Закрытие всех ордеров происходит по одному на каждом тике.

Тогда уберите return после успешного закрытия ордера. В этом случае не будете ждать следующего тика.

Vadim Kazakevich
1648
Vadim Kazakevich  
Ihor Herasko:

Тогда уберите return после успешного закрытия ордера. В этом случае не будете ждать следующего тика.

Вот это реально помогло! Спасибо!
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий