Раздельное парное закрытие ордеров по суммарной прибыли

 

Имеется советник cm_ea_Hedge4.mq4, открывающий 4 ордера...

//+------------------------------------------------------------------+
//| Скрипт-советник, выставляет 4 ордера по 4м валютам если по всем  |
//| указанным парам нет открытых позиций.                            |
//| Может использоваться как скрипт                                  |
//|                              Copyright © 2015, Khlistov Vladimir |
//|                                         http://cmillion.narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, Khlistov Vladimir"
#property link      "http://cmillion.narod.ru"
//+------------------------------------------------------------------+
extern string  SYMBOL1        = "GBPUSD"; //первый символ, если не указан, то не выставляется
extern string  SYMBOL2        = "EURUSD"; //второй символ, если не указан, то не выставляется
extern string  SYMBOL3        = "EURGBP"; //третий символ, если не указан, то не выставляется
extern string  SYMBOL4        = "GBPJPY"; //третий символ, если не указан, то не выставляется
extern double  LOT1           = 0.1;      //лот первого инструмента
extern double  LOT2           = 0.1;      //лот второго инструмента
extern double  LOT3           = 0.1;      //лот третьего инструмента
extern double  LOT4           = 0.1;      //лот третьего инструмента
extern int     TYPE1          = OP_BUY;   //тип ордера первого инструмента
extern int     TYPE2          = OP_SELL;  //тип ордера второго инструмента
extern int     TYPE3          = OP_SELL;  //тип ордера третьего инструмента
extern int     TYPE4          = OP_SELL;  //тип ордера третьего инструмента
extern int     stoploss       = 10,       //уровень выставления SL, если 0, то SL не выставляется
               takeprofit     = 10;       //уровень выставления TP, если 0, то TP не выставляется
extern int     Slippage       = 3;        //проскальзывание 
extern int     Magic          = 777888;
//+------------------------------------------------------------------+
int start()
{
   string s;
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         s = OrderSymbol();
         if (s==SYMBOL1 || s==SYMBOL2 || s==SYMBOL3 || s==SYMBOL4) return(0);
      }
   } 
   int    Digit=MarketInfo(SYMBOL1,MODE_DIGITS);
   double Poin=MarketInfo(SYMBOL1,MODE_POINT);
   double ASK=NormalizeDouble(MarketInfo(SYMBOL1,MODE_ASK),Digit);
   double BID=NormalizeDouble(MarketInfo(SYMBOL1,MODE_BID),Digit);
   double SL,TP;
   if (SYMBOL1!="")
   {
      if (TYPE1 == OP_BUY)  
      {
         if (stoploss!=0)   SL  = NormalizeDouble(BID - stoploss*Poin,Digit); else SL=0;     
         if (takeprofit!=0) TP  = NormalizeDouble(ASK + takeprofit*Poin,Digit); else TP=0;
         if (OrderSend(SYMBOL1,OP_BUY,LOT1,ASK,Slippage,SL,TP,"cm_script_Hedge",Magic,0,Blue)!=-1) 
            Alert("Ордер BUY  лот ",LOT1," ", SYMBOL1);
         else Alert(SYMBOL1," send order BAY error ",GetLastError(),"  ",MarketInfo(SYMBOL1,MODE_ASK),"  ",LOT1);
      }
      if (TYPE1 == OP_SELL)  
      {
         if (stoploss!=0)   SL  = NormalizeDouble(ASK + stoploss*Poin,Digit); else SL=0;     
         if (takeprofit!=0) TP  = NormalizeDouble(BID - takeprofit*Poin,Digit); else TP=0;
         if (OrderSend(SYMBOL1,OP_SELL,LOT1,BID,Slippage,SL,TP,"cm_script_Hedge",Magic,0,Blue)!=-1) 
            Alert("Ордер SELL  лот ",LOT1," ", SYMBOL1);
         else Alert(SYMBOL1," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL1,MODE_ASK),"  ",LOT1);
      }
   }
   if (SYMBOL2!="")
   {
      Digit=MarketInfo(SYMBOL2,MODE_DIGITS);
      Poin=MarketInfo(SYMBOL2,MODE_POINT);
      ASK=NormalizeDouble(MarketInfo(SYMBOL2,MODE_ASK),Digit);
      BID=NormalizeDouble(MarketInfo(SYMBOL2,MODE_BID),Digit);
      if (TYPE2 == OP_BUY)  
      {
         if (stoploss!=0)   SL  = NormalizeDouble(BID - stoploss*Poin,Digit); else SL=0;     
         if (takeprofit!=0) TP  = NormalizeDouble(ASK + takeprofit*Poin,Digit); else TP=0;
         if (OrderSend(SYMBOL2,OP_BUY,LOT2,ASK,Slippage,SL,TP,"cm_script_Hedge",Magic,0,Blue)!=-1) 
            Alert("Ордер BUY  лот ",LOT2," ", SYMBOL2);
         else Alert(SYMBOL2," send order BAY error ",GetLastError(),"  ",MarketInfo(SYMBOL2,MODE_ASK),"  ",LOT2);
      }
      if (TYPE2 == OP_SELL)  
      {
         if (stoploss!=0)   SL  = NormalizeDouble(ASK + stoploss*Poin,Digit); else SL=0;     
         if (takeprofit!=0) TP  = NormalizeDouble(BID - takeprofit*Poin,Digit); else TP=0;
         if (OrderSend(SYMBOL2,OP_SELL,LOT2,BID,Slippage,SL,TP,"cm_script_Hedge",Magic,0,Blue)!=-1) 
            Alert("Ордер SELL  лот ",LOT2," ", SYMBOL2);
         else Alert(SYMBOL2," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL2,MODE_ASK),"  ",LOT2);
      }
   }
   if (SYMBOL3!="")
   {
      Digit=MarketInfo(SYMBOL3,MODE_DIGITS);
      Poin=MarketInfo(SYMBOL3,MODE_POINT);
      ASK=NormalizeDouble(MarketInfo(SYMBOL3,MODE_ASK),Digit);
      BID=NormalizeDouble(MarketInfo(SYMBOL3,MODE_BID),Digit);
      if (TYPE3 == OP_BUY)  
      {
         if (stoploss!=0)   SL  = NormalizeDouble(BID - stoploss*Poin,Digit); else SL=0;     
         if (takeprofit!=0) TP  = NormalizeDouble(ASK + takeprofit*Poin,Digit); else TP=0;
         if (OrderSend(SYMBOL3,OP_BUY,LOT3,ASK,Slippage,SL,TP,"cm_script_Hedge",Magic,0,Blue)!=-1) 
            Alert("Ордер BUY  лот ",LOT3," ", SYMBOL3);
         else Alert(SYMBOL3," send order BAY error ",GetLastError(),"  ",MarketInfo(SYMBOL3,MODE_ASK),"  ",LOT3);
      }
      if (TYPE3 == OP_SELL)  
      {
         if (stoploss!=0)   SL  = NormalizeDouble(ASK + stoploss*Poin,Digit); else SL=0;     
         if (takeprofit!=0) TP  = NormalizeDouble(BID - takeprofit*Poin,Digit); else TP=0;
         if (OrderSend(SYMBOL3,OP_SELL,LOT3,BID,Slippage,SL,TP,"cm_script_Hedge",Magic,0,Blue)!=-1) 
            Alert("Ордер SELL  лот ",LOT3," ", SYMBOL3);
         else Alert(SYMBOL3," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL3,MODE_ASK),"  ",LOT3);
      }
   }
   if (SYMBOL4!="")
   {
      Digit=MarketInfo(SYMBOL4,MODE_DIGITS);
      Poin=MarketInfo(SYMBOL4,MODE_POINT);
      ASK=NormalizeDouble(MarketInfo(SYMBOL4,MODE_ASK),Digit);
      BID=NormalizeDouble(MarketInfo(SYMBOL4,MODE_BID),Digit);
      if (TYPE4 == OP_BUY)  
      {
         if (stoploss!=0)   SL  = NormalizeDouble(BID - stoploss*Poin,Digit); else SL=0;     
         if (takeprofit!=0) TP  = NormalizeDouble(ASK + takeprofit*Poin,Digit); else TP=0;
         if (OrderSend(SYMBOL4,OP_BUY,LOT4,ASK,Slippage,SL,TP,"cm_script_Hedge",Magic,0,Blue)!=-1) 
            Alert("Ордер BUY  лот ",LOT4," ", SYMBOL4);
         else Alert(SYMBOL4," send order BAY error ",GetLastError(),"  ",MarketInfo(SYMBOL4,MODE_ASK),"  ",LOT4);
      }
      if (TYPE4 == OP_SELL)  
      {
         if (stoploss!=0)   SL  = NormalizeDouble(ASK + stoploss*Poin,Digit); else SL=0;     
         if (takeprofit!=0) TP  = NormalizeDouble(BID - takeprofit*Poin,Digit); else TP=0;
         if (OrderSend(SYMBOL4,OP_SELL,LOT4,BID,Slippage,SL,TP,"cm_script_Hedge",Magic,0,Blue)!=-1) 
            Alert("Ордер SELL  лот ",LOT4," ", SYMBOL4);
         else Alert(SYMBOL4," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL4,MODE_ASK),"  ",LOT4);
      }
   }
return(0);
} 
//--------------------------------------------------------------------

Подскажите что нужно добавить в этот советник чтобы закрывал парами ордера по суммарной прибыли. например чтобы у SYMBOL1 и SYMBOL4 если есть определенная прибыль то закрывались. так же и SYMBOL2 и SYMBOL3.

Есть примерный код из другого советника по закрытию ордеров по прибыли...

//+------------------------------------------------------------------+
//| Советник закрывает ордер при получении профита Profit в пунктах  |
//|                              Copyright © 2011, Khlystov Vladimir |
//|                                         http://cmillion.narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, cmillion@narod.ru"
#property link      "http://cmillion.narod.ru"
//--------------------------------------------------------------------
extern int     Profit  = 1;    // Советник закрывает ордер при получении профита в пунктах
//--------------------------------------------------------------------
int start()                                  
{
   double OOP;
   for (int i=0; i<OrdersTotal(); i++)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()==Symbol())
         {
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            if (!IsTradeContextBusy()) 
            {
               if (OrderType()==OP_BUY && NormalizeDouble(Bid-Profit*Point,Digits)>=OOP)
                  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Blue);
                  
               if (OrderType()==OP_SELL && NormalizeDouble(Ask+Profit*Point,Digits)<=OOP)
                  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,Red);
            }
         }  
      }  
   }
}
//--------------------------------------------------------------------


 

Закрытие позиций, осталось только профит нужных пар определить.

//+------------------------------------------------------------------+
//| Зкрытие позиций по символу                                       |
//+------------------------------------------------------------------+
void ClosePos(int ticket, string symb){
   color cls=Gray;
   for(i=0;i<OrdersTotal();i++)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==symb && OrderMagicNumber()==Magic){
   if(OrderType()==OP_BUY)  cls=DeepSkyBlue;
   if(OrderType()==OP_SELL) cls=Magenta;}
   if(!OrderSelect(ticket,SELECT_BY_TICKET)||OrderCloseTime()>0) return;
   bool close=OrderClose(ticket,OrderLots(),OrderClosePrice(),30,cls);} 
//+------------------------------------------------------------------+
//| Профит по типу и символу                                         |
//+------------------------------------------------------------------+
double Profit(int type=-1, string symb){
   double prf=0.0;
   for(i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==symb && OrderMagicNumber()==Magic) {
   if(OrderType()==type || (OrderType()>=0 && type==-1)) prf+=OrderProfit()+OrderCommission()+OrderSwap();}
return(prf);}
 
Что нужно изменить чтобы открывал позиции не после когда все закрылись позиции а когда только 2 позиции закрылись? А как две позиции закрываются далее открывается новая 4ка позиций.
 
Подскажите функцию усреднения ордеров с заданием уровня убытка и коэффициента