Navigation:Home > Content >

OpenOrderMarketExecution.mq4

Time: 2017-11-14 | Download file:OpenOrderMarketExecution.mq4

//+------------------------------------------------------------------+
//|                                     OpenOrderMarketExecution.mq4 |
//|                              Copyright © 2010, Khlystov Vladimir |
//|                                                cmillion@narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Khlystov Vladimir"
#property link      "cmillion@narod.ru"
#property show_inputs
//--------------------------------------------------------------------
extern int     stoploss    = 50,       //уровень выставления SL, если 0, то SL не выставляется
               takeprofit  = 50,       //уровень выставления TP, если 0, то TP не выставляется
               Magic       = 777;      //уникальный номер ордера
extern bool    SELL        = true,     //открыть ордер SELL
               BUY         = true;     //открыть ордер BUY
extern double  Lot         = 0.0;      //объем ордера
extern int     Risk        = 1;        //% которым  мы готовы рискнуть, применяется при Lot=0
extern int     slippage    = 5;        //Максимально допустимое отклонение цены для рыночных ордеров
extern bool    MarketExecution = true; //Выставление стопов на следующем тике
//--------------------------------------------------------------------
int start()
{
   string txt =StringConcatenate("OpenOrderMarketExecution Copyright © 2010, cmillion@narod.ru  time ",TimeToStr(TimeCurrent(),TIME_MINUTES),"\n","\n");
   if (BUY ) 
   {
      if (stoploss!=0)   txt =StringConcatenate(txt,"Open BUY    SL =",DoubleToStr(Bid - stoploss*Point,Digits));
      if (takeprofit!=0) txt =StringConcatenate(txt,"   TP =",DoubleToStr(Ask + takeprofit*Point,Digits),"\n");
   }
   if (SELL) 
   {
      if (stoploss!=0)   txt =StringConcatenate(txt,"Open SELL   SL =",DoubleToStr(Ask + stoploss*Point,Digits));
      if (takeprofit!=0) txt =StringConcatenate(txt,"   TP =",DoubleToStr(Bid - takeprofit*Point,Digits),"\n");
   }
   double MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   double Maxlot = MarketInfo(Symbol(),MODE_MAXLOT);
   int OkrLOT;
   if (MinLot==0.01) OkrLOT = 2;
   if (MinLot >0.01) OkrLOT = 1;
   if (MinLot >0.1 ) OkrLOT = 0;
   if (Lot==0) 
   if (stoploss==0) {Comment("stoploss не может быть = 0 при определении % риска");return;} 
   else Lot = NormalizeDouble(AccountFreeMargin()*Risk/100/MarketInfo(Symbol(),MODE_TICKVALUE)/stoploss,OkrLOT);
   if (LotMaxlot) {Lot=Maxlot;txt =StringConcatenate(txt,"Выставлен максимальный ");}
   txt =StringConcatenate(txt,"Lot =",Lot);
   Comment(txt);
   //---
   double SL,TP;
   if (BUY)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Bid - stoploss*Point,Digits); else SL=0;     
      OPENORDER (1,SL,TP);
   }
   if (SELL)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Ask + stoploss*Point,Digits);  else SL=0;              
      OPENORDER (-1,SL,TP);
   }
   while(MarketExecution)
   {
      if (stoploss==0 && takeprofit==0) break;
      else
      {
         if (SetStop()==0) break;
      }
   }
return(0);
}
//--------------------------------------------------------------------
void OPENORDER(int ord,double SL,double TP)
{
   int error,err;
   if (MarketExecution) {SL=0;TP=0;}
   while (true)
   {  error=true;
      if (ord== 1) error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"BUY",Magic,0,Blue);
      if (ord==-1) error=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,SL,TP,"SELL",Magic,0,Red);
      if (error==-1)
      {  
         Print(Symbol()," ",ShowERROR());
         err++;Sleep(2000);RefreshRates();
      }
      if (error || err >10) return;
   }
return;
}                  
//--------------------------------------------------------------------
string ShowERROR()
{
   int err=GetLastError();
   string com;
   switch ( err )
   {                  
      case 0:   return;
      case 1:   return;
      case 2:   com=StringConcatenate(com," Нет связи с торговым сервером   ");break;
      case 3:   com=StringConcatenate(com," Неправильные параметры          ");break;
      case 130: com=StringConcatenate(com," Близкие стопы                   ");break;
      case 134: com=StringConcatenate(com," Недостаточно денег              ");break;
      case 136: com=StringConcatenate(com," Нет цен                         ");break;
      case 146: com=StringConcatenate(com," Подсистема торговли занята      ");break;
      case 129: com=StringConcatenate(com," Неправильная цена               ");break;
      case 131: com=StringConcatenate(com," Неправильный объем              ");break;
      case 137: com=StringConcatenate(com," Брокер занят                    ");break;
      case 138: com=StringConcatenate(com," Новые цены                      ");break;
      default:  com=StringConcatenate(com," Error " ,err);break;
   }
   return(com);
}
//--------------------------------------------------------------------
int SetStop()
{  int tip,Ticket,n=0;
   double SL,TP;
   double OOP;bool error;
   int SPREAD = MarketInfo(Symbol(),MODE_SPREAD);
   for (int i=0; i        

Recommend