Скрипт открывает ордера при заданном убытке

 
//+------------------------------------------------------------------+
//| Скрипт, выставляет 2 ордера по 2м валютам одновременно           |
//+------------------------------------------------------------------+

#property show_inputs
enum type 
{
   t1=0,    // BUY
   t2=1,    // SELL
};
//+------------------------------------------------------------------+
extern double  LossOpen        = 100;      //открывать ордера при получении убытка
extern bool    AllSymbol       = true;     //учитывать все инструменты или только тот, на котором стоит советник
extern string  Comment        = "777";
extern string  SYMBOL1        = "EURUSD";  //первый символ
extern string  SYMBOL2        = "GBPUSD";  //второй символ
extern double  LOT1           = 0.01;      //лот первого инструмента
extern double  LOT2           = 0.01;      //лот второго инструмента
input type     TYPE1          = 0;         //тип ордера первого инструмента
input type     TYPE2          = 1;         //тип ордера второго инструмента
extern int     stoploss       = 0,         //уровень выставления SL, если 0, то SL не выставляется
               takeprofit     = 0;         //уровень выставления TP, если 0, то TP не выставляется
extern int     Slippage       = 30;        //проскальзывание 
extern int     Magic          = 777;
extern bool    MagicAll       = false;     //если true - закрывать все
//+------------------------------------------------------------------+
int start()
{
   double Profit;
   int OT;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {                                              
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {

         if ((OrderMagicNumber() == Magic || MagicAll))
         {
            OT = OrderType();
            if (OT==OP_BUY)
            {
               Profit+=OrderProfit();
            }
            if (OT==OP_SELL)
            {
               Profit+=OrderProfit();
            }
         }
      }
      }
      if (Profit<=-LossOpen)
      {
       Alert("Достигнут уровень заданного убытка "+DoubleToStr(Profit,2));
       OpenOrderON(); 
      }
    return(0);
}

//--------------------------------------------------------------------
int OpenOrderON()
{ 
   int    Digit=(int)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 (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,Comment,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,Comment,Magic,0,Blue)!=-1) 
            Alert("Ордер SELL  лот ",LOT1," ", SYMBOL1);
         else Alert(SYMBOL1," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL1,MODE_ASK),"  ",LOT1);
      }

      Digit=(int)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,Comment,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,Comment,Magic,0,Blue)!=-1) 
            Alert("Ордер SELL  лот ",LOT2," ", SYMBOL2);
         else Alert(SYMBOL2," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL2,MODE_ASK),"  ",LOT2);
      }
      return(0);
}

//--------------------------------------------------------------------


Задаю убыток, если он уже достигнут в момент установки скрипта на график то открываются ордера, а если еще не достигнут, то потом при достижении заданного убытка ордера не открываются. Что может не так?

 
T926SA:

Задаю убыток, если он уже достигнут в момент установки скрипта на график то открываются ордера, а если еще не достигнут, то потом при достижении заданного убытка ордера не открываются. Что может не так?

Так сделайте эксперта из него. И можно добавить функцию чтоб при успешном срабатывании он удалялся/останавливался.

 
Konstantin Nikitin:

Так сделайте эксперта из него. И можно добавить функцию чтоб при успешном срабатывании он удалялся/останавливался.

Если делать эксперта то он будет открывать бесконечно ордера пока убыток висит. Надо коэффициент увеличения убытка добавлять при каждом открытии ордеров. но пока это делать не умею. вот поэтому скрипт пробую. Можете сказать что не так в коде, почему завершает работу не дождавшись достижения заданного убытка и дальнейшего открытия ордеров?

 
T926SA:

Если делать эксперта то он будет открывать бесконечно ордера пока убыток висит. Надо коэффициент увеличения убытка добавлять при каждом открытии ордеров. но пока это делать не умею. вот поэтому скрипт пробую. Можете сказать что не так в коде, почему завершает работу не дождавшись достижения заданного убытка и дальнейшего открытия ордеров?

На то он и скрипт. Запустили - выполнился - выгрузился.
 
Artyom Trishkin:
На то он и скрипт. Запустили - выполнился - выгрузился.

Т.е. дождаться нужного события он не может? когда заданный убыток будет достигнут

 
T926SA:

Если делать эксперта то он будет открывать бесконечно ордера пока убыток висит. Надо коэффициент увеличения убытка добавлять при каждом открытии ордеров. но пока это делать не умею. вот поэтому скрипт пробую. Можете сказать что не так в коде, почему завершает работу не дождавшись достижения заданного убытка и дальнейшего открытия ордеров?

Konstantin Nikitin:

Так сделайте эксперта из него. И можно добавить функцию чтоб при успешном срабатывании он удалялся/останавливался.

При срабатывании открытия блокировочных позиций можно прописать как минимум ExpertRemove

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