Подскажите по поводу ордеров

 
А кто может подсказать почему в этом куске выставляются отложенные ордера без остановки?

Мне надо чтобы после выставления обычного ордера выставлялся отложенный в другую сторону.

И как это исправить?


for(i=0; i<actTotal;i++)
  {
   
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  {
  if( OrderSymbol()==Symbol())
  {
  if(OrderType()==OP_BUY) {BuyOrders++; oop1 = OrderOpenPrice();}
  if(OrderType()==OP_SELL) {SellOrders++; oop2 = OrderOpenPrice();}
  if(OrderType()==OP_BUYSTOP) BuyStop++;
  if(OrderType()==OP_SELLSTOP) SellStop++;
  }
  }
   
if(BuyOrders > 0 || SellOrders > 0 && OT() == 1 && SellStop < 1)
{
  double pBid=oop1-(Pips*Point);
  OrderSend(Symbol(),OP_SELLSTOP,2*Lots,pBid,Slippage,NULL,NULL,"",0,0,Red);
  }
  if(SellOrders > 0 || BuyOrders > 0 && OT() == 2 && BuyStop < 1)
  {
  double pAsk=oop2+Pips*Point;
  OrderSend(Symbol(),OP_BUYSTOP,2*Lots,pAsk,Slippage,NULL,NULL,"",0,0,Blue);
 }
}
 
liza писал(а) >>


А кто может подсказать почему в этом куске выставляются отложенные ордера без остановки?

Мне надо чтобы после выставления обычного ордера выставлялся отложенный в другую сторону.

И как это исправить?


for(i=0; i<actTotal;i++)
{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) {BuyOrders++; oop1 = OrderOpenPrice();}
if(OrderType()==OP_SELL) {SellOrders++; oop2 = OrderOpenPrice();}
if(OrderType()==OP_BUYSTOP) BuyStop++;
if(OrderType()==OP_SELLSTOP) SellStop++;
}
}

if(BuyOrders > 0 || SellOrders > 0 && OT() == 1 && SellStop < 1)
{
double pBid=oop1-(Pips*Point);
OrderSend(Symbol(),OP_SELLSTOP,2*Lots,pBid,Slippage,NULL,NULL,"",0,0,Red);
}
if(SellOrders > 0 || BuyOrders > 0 && OT() == 2 && BuyStop < 1)
{
double pAsk=oop2+Pips*Point;
OrderSend(Symbol(),OP_BUYSTOP,2*Lots,pAsk,Slippage,NULL,NULL,"",0,0,Blue);
}
}

Наверно потому что установка ордеров находится внутри цикла. Желательно было бы вынести за цикл. Тогда сперва был бы расчет количества ордеров по типам, а потом принятие решения.

 
Попробовала.  Ничего не изменяется.  Точно так же выставляет кучу отложенных.
 
// Расчет количества ордеров по типам
for(i=0; i<actTotal;i++)
  {
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if( OrderSymbol()==Symbol())
      {
      if(OrderType()==OP_BUY) {BuyOrders++; oop1 = OrderOpenPrice();}
      if(OrderType()==OP_SELL) {SellOrders++; oop2 = OrderOpenPrice();}
      if(OrderType()==OP_BUYSTOP) BuyStop++;
      if(OrderType()==OP_SELLSTOP) SellStop++;
      }
    }
  }   

// Принятие решения
if(BuyOrders > 0 && SellStop ==0)
  {
  double pBid=oop1-(Pips*Point);
  OrderSend(Symbol(),OP_SELLSTOP,2*Lots,pBid,Slippage,NULL,NULL,"",0,0,Red);
  }
if(SellOrders > 0 && BuyStop ==0)
  {
  double pAsk=oop2+Pips*Point;
  OrderSend(Symbol(),OP_BUYSTOP,2*Lots,pAsk,Slippage,NULL,NULL,"",0,0,Blue);
  }
Проверь этот вариант
 

Огромное спасибо!!!

Работает

 

Не могли бы Вы еще одну функцию посмотреть?

Я ее написала для того чтобы считать сумму прибыли всех ордеров одного инструмента в зависимоти он размера лота.

double countpr()
  {
 double pr = 0, oop1 = 0, oop2 = 0;
  int actTotal, BuyOrders, SellOrders;
  for(int i=0; i<actTotal;i++)
  {
   
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  {
  if( OrderSymbol()==Symbol())
  {
  if(OrderType()==OP_BUY) {BuyOrders++; oop1 = (Bid - OrderOpenPrice())/Point*OrderLots();}
  if(OrderType()==OP_SELL) {SellOrders++; oop1 = (OrderOpenPrice() - Ask)/Point*OrderLots();
  pr+= oop1;
  }
  }
  }
}  

 
liza писал(а) >>

Не могли бы Вы еще одну функцию посмотреть?

Я ее написала для того чтобы считать сумму прибыли всех ордеров одного инструмента в зависимоти он размера лота.

double countpr()
{
double pr = 0, oop1 = 0, oop2 = 0;
int actTotal, BuyOrders, SellOrders;
for(int i=0; i<actTotal;i++)
{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) {BuyOrders++; oop1 = (Bid - OrderOpenPrice())/Point*OrderLots();}
if(OrderType()==OP_SELL) {SellOrders++; oop1 = (OrderOpenPrice() - Ask)/Point*OrderLots();
pr+= oop1;
}
}
}
}

В данном случае считается профит в пунктах. Только надо добавить возвращаемое значение return(pr);

 

Добавила.

А почему тогда не работает это

for(i=0; i<actTotal;i++)
  {
   
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  {
  if( OrderSymbol()==Symbol())
  {
  if(OrderType()==OP_BUY) {BuyOrders++; oop1 = OrderOpenPrice();}
  if(OrderType()==OP_SELL) {SellOrders++; oop2 = OrderOpenPrice();}
  if(OrderType()==OP_BUYSTOP) BuyStop++;
  if(OrderType()==OP_SELLSTOP) SellStop++;
if(OrderType()==OP_BUY){
if(countpr() > 0) oc();//OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
}
if(OrderType()==OP_SELL){
if(countpr() > 0) oc();// OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
if(BuyStop > 0 || SellStop > 0 && (BuyOrders < 1 && SellOrders < 1))
{
OrderDelete(OrderTicket());
}}}}

oc() -- закрывает все открытые ордера

 
liza писал(а) >>

Добавила.

А почему тогда не работает это

.....................

oc() -- закрывает все открытые ордера

Есть несколько замечаний. Цикл по закрытию нужно делать наоборот (если конечно тикеты ордеров не хранятся в массиве).

При вызове твоих функций меняется выбранный ордер, да и другие функции по работе с выбранным ордером. Они работают с последним выбранным. А твои функции тоже делают перебор ордеров. И потому закрывается вернее всего последний. Возможно нужно при обращении к функциям сохранять тикет выбранного ордера, а потом его восстанавливать. Или же менять логику работы или создавать массив для хранения тикетов закрываемых ордеров, а потом отдельной функцией закрывать.

 
А хоть как то наглядно на ( хтя бы частично ) моем коде можно показать?
 
liza писал(а) >>
А хоть как то наглядно на ( хтя бы частично ) моем коде можно показать?

Постараюсь воспользоваться готовыми функциями (хотя я не знаю функцию oc())

int start()
  {
  double profit=countpr();
  if (provit > 0) oc(); // хотя прибыль должна быть бульше 0, желательно задавать какое-то значение, например 25 пунктов.
  
  return(0);
  }
примерно так.