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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
T926SA
35
T926SA  
//+------------------------------------------------------------------+
//| Скрипт, выставляет 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);
}

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


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

Konstantin Nikitin
9256
Konstantin Nikitin  
T926SA:

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

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

T926SA
35
T926SA  
Konstantin Nikitin:

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

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

Artyom Trishkin
Модератор
56668
Artyom Trishkin  
T926SA:

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

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

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

Konstantin Nikitin
9256
Konstantin Nikitin  
T926SA:

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

Konstantin Nikitin:

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий