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

 

Кому не трудно Покажите где ошибка

Хочу советником закрыть позиции, открытые вручную Не получается

Заранее благодарен

nt start()
  {
//----
 
  for (int i=OrdersTotal()-1; i>=0; i--) 
   { 
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
    if (OrderProfit( ) >0 ) 
   
     {
 
      double MA= iMA(OrderSymbol(),PERIOD_M5,36,0,MODE_EMA,PRICE_CLOSE,1); 
       { 
            int order_type=OrderType();
            if((order_type==OP_BUY && Close[1]<MA && Close[0]<Close[1])  )
            OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
            if((order_type==OP_SELL  && Close[1]>MA && Close[0]>Close[1]) )
            OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
       } 
     }
   }
//----
   return(0);
  }
 
Пропиши Print и посмотри что у тебя вычисляет iMA
 
 if (s+b==0) pl=0; 
 
 if (s+b!=0 && sum>0 && Hour()>=ttk) pl=1;
 if (s>0 && b==0 && ((C0-O0)/point)>=del) {pl=1;tst=Time[0];}
 if (b>0 && s==0 && ((O0-C0)/point)>=del) {pl=1;tbt=Time[0];} // вычисление флага и проверка на наличие поз
 
 if (pl==1 && s+b>0)
 {   
for (i=0;i<OrdersTotal();i++)
 {
     OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
     
 if (OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderProfit()>0)
 {   RefreshRates();                   
     OrderClose(OrderTicket(),OrderLots(),ask,3,Red); 
     Sleep(10000);
     return(0);
 } 
 if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderProfit()>0)
 {
     RefreshRates();         
     OrderClose(OrderTicket(),OrderLots(),bid,3,Red); 
     Sleep(10000);
     return(0);
 }
 }
 }
alex54 писал (а):

Кому не трудно Покажите где ошибка

Хочу советником закрыть позиции, открытые вручную Не получается

Заранее благодарен

nt start()
  {
//----
 
  for (int i=OrdersTotal()-1; i>=0; i--) 
   { 
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
    if (OrderProfit( ) >0 ) 
   
     {
 
      double MA= iMA(OrderSymbol(),PERIOD_M5,36,0,MODE_EMA,PRICE_CLOSE,1); 
       { 
            int order_type=OrderType();
            if((order_type==OP_BUY && Close[1]<MA && Close[0]<Close[1])  )
            OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
            if((order_type==OP_SELL  && Close[1]>MA && Close[0]>Close[1]) )
            OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
       } 
     }
   }
//----
   return(0);
  }

Привет.

Во-первых код сделан нерационально с точки зрения использования ресурсов компа.

У тебя цикл запускаетя по каждому тику - это очень расточительно.

Лучше всего сделай так:

1. отдельно вычисли условия закрытия ордера по твоей машке и при наличии выставленного ордера и условия ставь флаг закрытия позы.

Тогда вход в цикл не будет пустым.

2. Скажем по сэлу флаг sl=1 а по баю bl=1; Тогда если есть открытые ордера и есть не обнуленный флаг входи в закрытие с условием флага и положительного профита.

3. В этом случае закрытие происходит один раз и цикл отработав засыпает до следующего раза, а после закрытия флаг там же в цикле обнуляется.

Этот код не для твоего случая, но как пример думаю пойдет

 

Во-первых код сделан нерационально с точки зрения использования ресурсов компа.

У тебя цикл запускаетя по каждому тику - это очень расточительно

Ой, сейчас умру от смеха, пожалел проц. А как ты еще узнаешь о положительном профите в ордере?
То alex54
Все нормально, в строчке if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
убери if и скобки, просто OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) ;
Но это не главное. Если уж у тебя проверяются разные валюты в одном советнике, тогда будь добр и значения Close, Ask и Bid давай для этих валют, т.е. используем MarketInfo().
Ну, и напоследок, последнюю группу команд можно не заключать в фигурные скобки.
Удачи.
 

Спасибо всем откликнувшимся Все заработало

Причина обращения: