Navigation:Home > Content >

two-orders.mq4

Time: 2015-01-27 | Download file:two-orders.mq4

//+------------------------------------------------------------------+
//|                                                     i_forum_6.mq4 |
//|                                      Copyright © 2010, ENSED Team |
//|                                              http://www.ensed.org |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2010, ENSED Team"
#property link       "http://www.ensed.org"

//+-------------------------------------------------------------------------------------------------------------------+
//|                                      внешние переменные (входные  параметры)                                        |
extern double  Lots             = 0.1;      //рабочий лот
extern int    SL                = 50;       //Stop Loss для открываемых ордеров (в пунктах)
extern  int    TP               = 100;       //Take Profit для открываемых  ордеров (в пунктах)
extern int    Magic_Number     = 006;        //магическое число. Необходимо роботу для идентификации "своих" ордеров
extern  string Order_Comment    = "";        //комментарий, которым  снабжаются открываемые ордера
extern int    Slippage         = 100;       //уровень допустимого реквота
extern int    Hour_To_Open     =  -1; //час открытия (-1 - не задано), терминальное время
extern int     Minute_To_Open   = -1; //минута открытия (-1 - не задано), терминальное  время
extern int    Hour_To_Close     =  -1; //час закрытия (-1 - не задано), терминальное время
extern int     Minute_To_Close   = -1; //минута закрытия (-1 - не задано), терминальное  время
extern int    Distance_To_Open = 100; //расстояние до открыти  сделок в пунктах
extern double k=2.0;//коэффициент увеличения лота(поставьте 1.0 увеличеватся не будет)
//+----------------------------------------------------------------------+
//+                            трейлинг-стоп                              +
extern  bool   UseTrailing   = true;          //включение/выключение T-SL
extern  int    TrailingStop  = 50;           // Фиксированный размер трала
extern  int    TrailingStep  = 1;            // Шаг трала

//+                            трейлинг-стоп                              +
//+----------------------------------------------------------------------+
//|                                      внешние переменные (входные  параметры)                                        |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//|                                  функция, выполняющаяся при  инициализации программы                                |
void init() {
  if(IsTesting())  GlobalVariableDel(Symbol()+Period()+Magic_Number+"mod");
  sound();
  return;
}
//|                                 функция,  выполняющаяся при инициализации программы                                 |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//|                                 функция, выполняющаяся при  деинициализации программы                               |
void  deinit() {
  if(IsTesting())  GlobalVariableDel(Symbol()+Period()+Magic_Number+"mod");
  return;
}
//|                                 функция, выполняющаяся при  деинициализации программы                               |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//|                                функция воспроизведения звука при  изменении числа сделок                            |
void sound() {
  int c=num_of_orders(Magic_Number);
   if(GlobalVariableCheck("num_of_oppened_"+Symbol()+"_"+Magic_Number)) {  //если глобальная переменная (где хранится число сделок) найдена
     if(GlobalVariableGet("num_of_oppened_"+Symbol()+"_"+Magic_Number)!=c) {  //если число сделок изменилось - играем звук
       GlobalVariableSet("num_of_oppened_"+Symbol()+"_"+Magic_Number,c);      
      PlaySound("alert.wav");
    }  
    return;
  } 
  
  GlobalVariableSet("num_of_oppened_"+Symbol()+"_"+Magic_Number,c);
   return; 
}
//|                               функция  воспроизведения звука при изменении числа сделок                             |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//|                                       функция подсчета ордеров данного  робота                                      |
int num_of_orders(int  magic) { 
  int i=0,
      result=0;
  for(i=OrdersTotal()-1;  i>=0; i--) {
    if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))  continue;
    if((OrderMagicNumber()==magic) &&  (OrderSymbol()==Symbol())) {
      //если ордер найден, то наращиваем  переменную result
      result++;
    } //end  if((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()))
  } //end for(i=OrdersTotal()-1; i>=0; i--)

  return(result);  //возвращаем false
} //end bool find_orders(int magic, int type)
//|                                       функция подсчета ордеров данного  робота                                      |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//|                                         функция поиска ордеров данного  типа                                        |
int find_orders(int  magic, int type) { 
  /* возвращает истину, если найден хотя бы один  ордер данного типа с данным магическим числом */
  int i=0;
   for(i=OrdersTotal()-1; i>=0; i--) {
     if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
     if((OrderType()==type) && (OrderMagicNumber()==magic) &&  (OrderSymbol()==Symbol())) {
      //если ордер найден, то  возвращаем true и выходим из цикла
      return(OrderTicket());
       break;
    } //end if((OrderType()==type) &&  (OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()))
  }  //end for(i=OrdersTotal()-1; i>=0; i--)

  return(-1);  //возвращаем false
} //end bool find_orders(int magic, int type)
//|                                         функция поиска ордеров данного  типа                                        |
//+-------------------------------------------------------------------------------------------------------------------+
  
//+-------------------------------------------------------------------------------------------------------------------+
//|                                                  трейлинг стоп лосс                                                 |
void T_SL() {
  int  i=0;
  for(i=0; iNormalizeDouble(TrailingStop*Point,Digits))  {
         if(NormalizeDouble(OrderStopLoss(),Digits)NormalizeDouble(TrailingStop*Point,Digits))
    } //end if(OrderType()==OP_BUY)

    if(OrderType()==OP_SELL) {
       if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop*Point,Digits))  {
         if(NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(TrailingStop+TrailingStep-1)*Point,Digits))
          OrderModify(OrderTicket(), OrderOpenPrice(),  NormalizeDouble(Ask+TrailingStop*Point,Digits), OrderTakeProfit(), 0,  CLR_NONE);
      } //end  if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop*Point,Digits))
    } //end if(OrderType()==OP_SELL)
  } //end for(i=0;  i покупки
  //mode=2 -> продажи
   if(sl_value<=0) return(0);
  if(mode==4)      return(NormalizeDouble(price-sl_value*Point,Digits)); //для покупок
   if(mode==5)     return(NormalizeDouble(price+sl_value*Point,Digits));  //для продаж
} //end double sl(int sl_value, int mode)
//|                                   функция расчета величины Stop Loss для ордеров                                    |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//|                                  функция расчета величины Take Profit  для ордеров                                  |
double tp(int  tp_value, double price, int mode) { //расчет величины Take Profit для  ордеров
  //mode=1 -> покупки
  //mode=2 -> продажи
   if(tp_value<=0) return(0);
  if(mode==4)      return(NormalizeDouble(price+tp_value*Point,Digits)); //для покупок
   if(mode==5)     return(NormalizeDouble(price-tp_value*Point,Digits));  //для продаж
} //end double tp(int tp_value, int mode)
//|                                  функция расчета величины Take Profit для  ордеров                                  |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//|                                               функция открытия ордеров                                              |
void open_positions(int  signal, double op_price, double lots) { //открытие ордеров
   //signal=1 -> сигнал на открытие покупки
  //signal=2 -> сигнал  на открытие продажи
  int    i     = 0;
  int    count = 5;  //количество попыток открытия ордера в случае, если его не удаeтся  совершить сразу
  double price = 0.0; //цена открытия
  
   if(signal==4)  price=NormalizeDouble(op_price+Distance_To_Open*Point,Digits); //цена  открытия для покупок
  if(signal==5)  price=NormalizeDouble(op_price-Distance_To_Open*Point,Digits); //цена  открытия для продаж
  while(i<=count) {
    int ticket =  OrderSend(Symbol(),
                           signal,
                            lots,
                           price,
                            Slippage,
                            sl(SL,price,signal),
                           tp(TP,price,signal),
                           Order_Comment,
                            Magic_Number,
                           0,
                            CLR_NONE);
    if(ticket!=-1)
      break;
    i++;  
   } //end while(i<=count)
} //end void open_positions(int signal)
//|                                               функция открытия ордеров                                              |
//+-------------------------------------------------------------------------------------------------------------------+

void  mod_orders() {
  double lot, price;  
   if((find_orders(Magic_Number, 0)!=-1) &&  (find_orders(Magic_Number, 5)!=-1)) {
     if(OrderSelect(find_orders(Magic_Number,  5),SELECT_BY_TICKET,MODE_TRADES)) {
      lot=OrderLots()*k;
       price=OrderOpenPrice();
       price=NormalizeDouble(price+Distance_To_Open*Point,Digits);
       if((OrderOpenTime()>GlobalVariableGet(Symbol()+Period()+Magic_Number+"mod"))  
          ||  (!GlobalVariableCheck(Symbol()+Period()+Magic_Number+"mod"))) {
         OrderDelete(OrderTicket());
        open_positions(5, price,  Lots*k);
         GlobalVariableSet(Symbol()+Period()+Magic_Number+"mod",TimeCurrent());
      }  
    }
  }
  
  if((find_orders(Magic_Number,  1)!=-1) && (find_orders(Magic_Number, 4)!=-1)) {
     if(OrderSelect(find_orders(Magic_Number,  4),SELECT_BY_TICKET,MODE_TRADES)) {
      lot=OrderLots()*k;
       price=OrderOpenPrice();
       price=NormalizeDouble(price-Distance_To_Open*Point,Digits);
       if((OrderOpenTime()>GlobalVariableGet(Symbol()+Period()+Magic_Number+"mod"))  
          ||  (!GlobalVariableCheck(Symbol()+Period()+Magic_Number+"mod"))) {
         OrderDelete(OrderTicket());
        open_positions(4, price,  Lots*k);
         GlobalVariableSet(Symbol()+Period()+Magic_Number+"mod",TimeCurrent());
      }  
    }
  }
}

double last_order_profit() {
   int time=0, i=0;
  double profit=0.0;
  for(i=0;  itime) {
         time=OrderCloseTime();
        profit=OrderProfit();
      }
    }
  }  
  return(profit);  
}

void del_orders() {
    if((find_orders(Magic_Number, 4)!=-1) &&  (find_orders(Magic_Number, 1)==-1) && (find_orders(Magic_Number,  5)==-1)
       && (last_order_profit()>0)) {
       OrderDelete(find_orders(Magic_Number, 4));
    }
     if((find_orders(Magic_Number, 5)!=-1) &&  (find_orders(Magic_Number, 0)==-1) && (find_orders(Magic_Number,  4)==-1)
       && (last_order_profit()>0)) {
       OrderDelete(find_orders(Magic_Number, 5));
    }
}

//+-------------------------------------------------------------------------------------------------------------------+
//|                                                    главная функция                                                  |
void start() {
   double price = 0.0;
  if((Hour()==Hour_To_Open) &&  (Minute()==Minute_To_Open)) { //если настало время открытия сделок
     price = NormalizeDouble(Bid,Digits);
     if((find_orders(Magic_Number, 0)==-1) &&  (find_orders(Magic_Number, 4)==-1)) //если нет открытого ордера OP_BUY и  OP_BUYSTOP
      open_positions(4, price, Lots); //открываем ордер  BUYSTOP
    if((find_orders(Magic_Number, 1)==-1) &&  (find_orders(Magic_Number, 5)==-1)) //если нет открытого ордера OP_SELL и  OP_SELLSTOP
      open_positions(5, price, Lots); //открываем ордер  SELLSTOP
  } //end if((Hour()==Hour_To_Open) &&  (Minute()==Minute_To_Open))
  
  if((Hour()==Hour_To_Close) &&  (Minute()==Minute_To_Close)) 
  {
      OrderDelete(find_orders(Magic_Number, 4));
      OrderDelete(find_orders(Magic_Number, 5));
  }
  
  T_SL();
  sound();
   mod_orders();
  del_orders();
  return;
} //end void start()
//|                                                    главная функция                                                  |
//+-------------------------------------------------------------------------------------------------------------------+

Recommend