Как реализовать функцию закрытия ордера при поступления сигнала от индикатора ?

 

Подскажите функцию закрытия имеющегося ордера при поступления сигнала от индикатора , индикатор рисует одну линию жёлтую или красную в зависимости от тренда

советник открывает 1 позицию по тренду от индикатора и при появлении противоположного сигнала должен закрыть ордер и открыть новый в противоположном направлении

void OpenPos()
  {
   int    res;
   double SSYellow=iCustom(Symbol(),0,"Scalper",SSPeriod,Filter,Width,1,0);
   double SSRed=iCustom(Symbol(),0,"Scalper",SSPeriod,Filter,Width,2,0);
   double TP,SL;

//--- sell conditions
   if(SSYellow>SSRed)
     {
      
      res=OrderSend(Symbol(),OP_SELL,Lot(),Bid,Slip,SL,TP,"",MAGIC,0,Yellow);
      return;
     }
//--- buy conditions
   if(SSRed>SSYellow)
     {
      
      res=OrderSend(Symbol(),OP_BUY,Lot(),Ask,Slip,SL,TP,"",MAGIC,0,Red);
      return;
     }
//---
  }
 
Ted-trader:

Подскажите функцию закрытия имеющегося ордера при поступления сигнала от индикатора , индикатор рисует одну линию жёлтую или красную в зависимости от тренда

советник открывает 1 позицию по тренду от индикатора и при появлении противоположного сигнала должен закрыть ордер и открыть новый в противоположном направлении

Ну так вставьте код закрытия, перед открытием

void OpenPos()
  {
   int    res;
   double SSYellow=iCustom(Symbol(),0,"Scalper",SSPeriod,Filter,Width,1,0);
   double SSRed=iCustom(Symbol(),0,"Scalper",SSPeriod,Filter,Width,2,0);
   double TP,SL;

//--- sell conditions
   if(SSYellow>SSRed)
     {
      ClosePositions(Symbol(),OP_BUY,MAGIC);
      res=OrderSend(Symbol(),OP_SELL,Lot(),Bid,Slip,SL,TP,"",MAGIC,0,Yellow);
      return;
     }
//--- buy conditions
   if(SSRed>SSYellow)
     {
      ClosePositions(Symbol(),OP_SELL,MAGIC);
      res=OrderSend(Symbol(),OP_BUY,Lot(),Ask,Slip,SL,TP,"",MAGIC,0,Red);
      return;
     }
//---
  }
//--------------------------
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}

Вообще, нужно видеть код не одним куском, неизвестно, что у вас и где выполняется. Но суть надеюсь поняли

 
Vitaly Muzichenko:

Ну так вставьте код закрытия, перед открытием

Вообще, нужно видеть код не одним куском, неизвестно, что у вас и где выполняется. Но суть надеюсь поняличё

чёт у меня не получается , вот весь код

input double StopLoss     = 500;
input double TakeProfit   = 500;
input double Slip         = 50;
input double Procent      = 10;
input double Lots         = 0.05;
//----
extern int SSPeriod       = 16;
extern int Slipe          = 3;
extern int Filter         = 0;
extern int Width          = 0;

extern int MAGIC=20141020;
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int    res;
   double SSYellow=iCustom(Symbol(),0,"Scalper",SSPeriod,Slipe,Filter,Width,1,1);
   double SSRed=iCustom(Symbol(),0,"Scalper",SSPeriod,Slipe,Filter,Width,2,2);
   double TP,SL;

//--- sell conditions
   if(SSYellow>SSRed)
     {
      if(StopLoss>0)SL=Bid+StopLoss*Point; else SL=0;
      if(TakeProfit>0)TP=Bid-TakeProfit*Point; else TP=0;
      res=OrderSend(Symbol(),OP_SELL,Lot(),Bid,Slip,SL,TP,"",MAGIC,0,Red);
      return;
     }
//--- buy conditions
   if(SSRed>SSYellow)
     {
      if(StopLoss>0)SL=Ask-StopLoss*Point; else SL=0;
      if(TakeProfit>0)TP=Ask+TakeProfit*Point; else TP=0;
      res=OrderSend(Symbol(),OP_BUY,Lot(),Ask,Slip,SL,TP,"",MAGIC,0,Blue);
      return;
     }
//---
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot;
   if(Lots==0)
     {
      double Prots=Procent/100;
      lot=MathFloor(AccountFreeMargin()*Prots/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/MarketInfo(Symbol(),MODE_LOTSTEP))*MarketInfo(Symbol(),MODE_LOTSTEP);// Лоты 
     }
   else lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   double SSYellow=iCustom(Symbol(),0,"Scalper",SSPeriod,Slipe,Filter,Width,1,1);
   double SSRed=iCustom(Symbol(),0,"Scalper",SSPeriod,Slipe,Filter,Width,2,2);
   Comment(
           "\n Red ",SSRed,
           "\n Yellow ",SSYellow);

   if(CountTrades()<1) OpenPos();
//   if(StopLoss==0 && TakeProfit==0)ClosePos();
//---
  }
//+------------------------------------------------------------------+