Транспонирование скрипта из МТ4 в МТ5

 

Хай всем!

Помогите переписать хороший скрипт по выставлению ордеров по сетке с языка MQL4 в MQL5.

Буду признателен!

Файлы:
 
vofkin:

Хай всем!

Помогите переписать хороший скрипт по выставлению ордеров по сетке с языка MQL4 в MQL5.

Буду признателен!

поменять extern на input

и start() на OnTick() (поздний фикс: OnStart() это-ж скрипт, не советник)

для MT5 - include библиотеку от fxsaber MT4Orders

и вроде как всё - дальше возможно справитесь..

---

сам автор к сожалению не сможет помочь :-(

если кому есть что добавить, вот код чтобы видно и не скачивать отдельным файлом (он короткий)

#property copyright "Copyright © 2013, Хлыстов Владимир"
#property link      "cmillion@narod.ru"
#property show_inputs
//--------------------------------------------------------------------
extern datetime TimeSet        = D'2013.10.01 00:00:00'; //Время выставления ордеров, если текущее время больше установленного, то выставляются сразу
extern bool     Buy            = true;     //открыть Buy ордер 
extern bool     Sell           = true;     //открыть Sell ордеа 
extern bool     BuyStop        = true;     //открыть BuyStop ордера 
extern bool     BuyLimit       = true;     //открыть BuyLimit ордера 
extern bool     SellStop       = true;     //открыть SellStop ордера 
extern bool     SellLimit      = true;     //открыть SellLimit ордера 
extern string   __             = "";
extern double   FirstBuyStop   = 0;        //цена выставления первого BuyStop ордера, если 0 то первый BuyStop будет выставлен по цене Ask+FirstStop
extern double   FirstSellStop  = 0;        //цена выставления первого SellStop ордера, если 0 то первый SellStop будет выставлен по цене Bid-FirstStop
extern double   FirstBuyLimit  = 0;        //цена выставления первого BuyLimit ордера, если 0 то первый BuyLimit будет выставлен по цене Bid-FirstStop
extern double   FirstSellLimit = 0;        //цена выставления первого SellLimit ордера, если 0 то первый SellLimit будет выставлен по цене Ask+FirstStop
extern int      FirstStop      = 100;      //расстояние (в пунктах) от текущей цены до первого Stop ордера в случае First..Stop=0 
extern int      FirstLimit     = 50;       //расстояние (в пунктах) от текущей цены до первого Limit ордера в случае First..Limit=0
extern int      StepStop       = 30;       //расстояние (в пунктах) между Stop ордерами
extern double   K_StepStop     = 1;        //коэффициент расширения сетки
extern int      StepLimit      = 30;       //расстояние (в пунктах) между Limit ордерами
extern double   K_StepLimit    = 1;        //коэффициент расширения сетки
extern string   _              = "";
extern int      Orders         = 5;        //кол-во ордеров сетки
extern double   LotMarket      = 0.5;      //объем рыночных ордеров
extern double   LotStop        = 0.5;      //объем первого Stop ордера
extern double   K_LotStop      = 1;        //умножение лота Stop ордеров 
extern double   Plus_LotStop   = 0;        //добавление лота Stop ордеров 
extern double   LotLimit       = 0.1;      //объем первого Limit ордера
extern double   K_LotLimit     = 2;        //умножение лота Limit ордеров
extern double   Plus_LotLimit  = 0;        //добавление лота Limit ордеров
extern int      stoploss       = 50;       //уровень выставления SL, если 0, то SL не выставляется
extern int      takeprofit     = 100;      //уровень выставления TP, если 0, то TP не выставляется
extern int      Expiration     = 36000;    //Срок истечения отложенного ордера в секундах, если 0, то срок не ограничен (86400 - сутки)
extern int      attempts       = 10;       //кол-во попыток открытия ордера 
extern int      Magic          = 0;        //уникальный номер ордера
extern string   Order_Comment  = "http://cmillion.narod.ru";
//--------------------------------------------------------------------
string txt;
int n,slippage=3,STOPLEVEL;
datetime expiration;
//--------------------------------------------------------------------
int start()
{
//===========================================================================================================================================   
//===========================================================================================================================================   
//===========================================================================================================================================   
/*============================================*/if (IsTesting() && OrdersTotal()>0) return(0);/*===============================================*/
//===========================================================================================================================================   
//===========================================================================================================================================   
//===========================================================================================================================================   
   if (Expiration>0) expiration=TimeCurrent()+Expiration; else expiration=0;
   Comment("Запуск скрипта OpenStopOrderNetTime ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
   STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if (Digits==3 || Digits==5) slippage=30;
   while (TimeCurrent()<TimeSet)
   {
      Sleep(1000);
      Comment("Скрипт выставления сетки отложенных ордеров Copyright © 2013 cmillion@narod.ru\n",
      TimeToStr(TimeCurrent(),TIME_SECONDS)," До выставления сетки осталось ",TimeToStr(TimeSet-TimeCurrent(),TIME_SECONDS));
      RefreshRates();
   }
   double PriceBS,PriceBL,PriceSS,PriceSL;
   double LOTs=LotStop;
   double LOTl=LotLimit;
   if (FirstBuyStop==0) PriceBS = NormalizeDouble(Ask+FirstStop*Point,Digits);
   else PriceBS = NormalizeDouble(FirstBuyStop,Digits);
   if ((PriceBS-Ask)/Point<STOPLEVEL) {Alert("Первый ордер BuyStop не может быть установлен ближе чем ",STOPLEVEL," п");return(0);}
   
   if (FirstSellStop==0) PriceSS = NormalizeDouble(Bid-FirstStop*Point,Digits);
   else PriceSS = NormalizeDouble(FirstSellStop,Digits);
   if ((Bid-PriceSS)/Point<STOPLEVEL) {Alert("Первый ордер SellStop не может быть установлен ближе чем ",STOPLEVEL," п");return(0);}
   
   if (FirstBuyLimit==0) PriceBL = NormalizeDouble(Bid-FirstLimit*Point,Digits);
   else PriceBL = NormalizeDouble(FirstBuyLimit,Digits);
   if ((Bid-PriceBL)/Point<STOPLEVEL) {Alert("Первый ордер BuyLimit не может быть установлен ближе чем ",STOPLEVEL," п");return(0);}
   
   if (FirstSellLimit==0) PriceSL = NormalizeDouble(Ask+FirstLimit*Point,Digits);
   else PriceSL = NormalizeDouble(FirstSellLimit,Digits);
   if ((PriceSL-Ask)/Point<STOPLEVEL) {Alert("Первый ордер SellLimit не может быть установлен ближе чем ",STOPLEVEL," п");return(0);}
   
   double Step_Stop=StepStop;
   double Step_Limit=StepLimit;
   if (Buy) OPENORDER (OP_BUY,Ask,LotMarket,0);
   if (Sell) OPENORDER (OP_SELL,Bid,LotMarket,0);
   for (int i=1; i<=Orders; i++)
   {
      if (BuyStop||SellStop)
      {
         Step_Stop=Step_Stop*K_StepStop;
         if (BuyStop)
         {
            OPENORDER (OP_BUYSTOP,PriceBS,LOTs,i);
            PriceBS = NormalizeDouble(PriceBS+Step_Stop*Point,Digits);
         }
         if (SellStop)
         {  
            OPENORDER (OP_SELLSTOP,PriceSS,LOTs,i);
            PriceSS = NormalizeDouble(PriceSS-Step_Stop*Point,Digits);
         }
      }
      LOTs=LOTs*K_LotStop+Plus_LotStop;
      if (BuyLimit||SellLimit)
      {
         Step_Limit=Step_Limit*K_StepLimit;
         if (BuyLimit)
         {
            OPENORDER (OP_BUYLIMIT,PriceBL,LOTl,i);
            PriceBL = NormalizeDouble(PriceBL-Step_Limit*Point,Digits);
         }
         if (SellLimit)
         {  
            OPENORDER (OP_SELLLIMIT,PriceSL,LOTl,i);
            PriceSL = NormalizeDouble(PriceSL+Step_Limit*Point,Digits);
         }
      }
      LOTl=LOTl*K_LotLimit+Plus_LotLimit;
   }
   Comment("Скрипт закончил свою работу, выставлено ",n," ордеров  ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
return(0);
}
//--------------------------------------------------------------------
void OPENORDER(int ord,double Price,double LOT,int i)
{
   int error,err;
   double SL,TP;
   while (true)
   {  error=true;
      if (ord==OP_BUY) 
      {
         if (takeprofit!=0) TP  = NormalizeDouble(Price + takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Price - stoploss*Point,Digits); else SL=0;     
         error=OrderSend(Symbol(),ord, LOT,Price,slippage,SL,TP,Order_Comment,Magic,expiration,Blue);
      }
      if (ord==OP_SELL) 
      {
         if (takeprofit!=0) TP = NormalizeDouble(Price - takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Price + stoploss*Point,Digits);  else SL=0;              
         error=OrderSend(Symbol(),ord,LOT,Price,slippage,SL,TP,Order_Comment,Magic,expiration,Red);
      }
      if (ord==OP_BUYSTOP) 
      {
         if (takeprofit!=0) TP  = NormalizeDouble(Price + takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Price - stoploss*Point,Digits); else SL=0;     
         error=OrderSend(Symbol(),ord, LOT,Price,slippage,SL,TP,Order_Comment,Magic,expiration,Blue);
      }
      if (ord==OP_SELLSTOP) 
      {
         if (takeprofit!=0) TP = NormalizeDouble(Price - takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Price + stoploss*Point,Digits);  else SL=0;              
         error=OrderSend(Symbol(),ord,LOT,Price,slippage,SL,TP,Order_Comment,Magic,expiration,Red);
      }
      if (ord==OP_SELLLIMIT) 
      {
         if (takeprofit!=0) TP = NormalizeDouble(Price - takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Price + stoploss*Point,Digits);  else SL=0;              
         error=OrderSend(Symbol(),ord, LOT,Price,slippage,SL,TP,Order_Comment,Magic,expiration,Blue);
      }
      if (ord==OP_BUYLIMIT) 
      {
         if (takeprofit!=0) TP  = NormalizeDouble(Price + takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Price - stoploss*Point,Digits); else SL=0;     
         error=OrderSend(Symbol(),ord,LOT,Price,slippage,SL,TP,Order_Comment,Magic,expiration,Red);
      }
      if (error==-1)
      {  
         txt=StringConcatenate(txt,"\nError ",GetLastError());
         if (ord==OP_BUY)   txt = StringConcatenate(txt,"  OPENORDER BUY  Price =",DoubleToStr(Price,Digits),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((Price-SL)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((TP-Price)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if (ord==OP_SELL)  txt = StringConcatenate(txt,"  OPENORDER SELL  Price =",DoubleToStr(Price,Digits),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((SL-Price)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((Price-TP)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if (ord==OP_BUYSTOP)   txt = StringConcatenate(txt,"  OPENORDER BUYSTOP ",  i,"   Ask =",DoubleToStr(Ask,Digits),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Price-Ask)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((Price-SL)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((TP-Price)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if (ord==OP_SELLSTOP)  txt = StringConcatenate(txt,"  OPENORDER SELLSTOP ", i,"   Bid =",DoubleToStr(Bid,Digits),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Bid-Price)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((SL-Price)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((Price-TP)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if (ord==OP_SELLLIMIT) txt = StringConcatenate(txt,"  OPENORDER SELLLIMIT ",i,"   Ask =",DoubleToStr(Ask,Digits),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Price-Ask)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((Price-SL)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((TP-Price)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         if (ord==OP_BUYLIMIT)  txt = StringConcatenate(txt,"  OPENORDER BUYLIMIT ", i,"   Bid =",DoubleToStr(Bid,Digits),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Bid-Price)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((SL-Price)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((Price-TP)/Point,0),")  STOPLEVEL=",STOPLEVEL);
         Print(txt);
         Comment(txt,"  ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
         err++;Sleep(1000);RefreshRates();
      }
      else 
      {
         Comment("Ордер ",error," успешно выставлен ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
         n++;
         return;
      }
      if (err>attempts) return;
   }
return;
} 
 
Maxim Kuznetsov #:

поменять extern на input

и start() на OnTick() (поздний фикс: OnStart() это-ж скрипт, не советник)

для MT5 - include библиотеку от fxsaber MT4Orders

и вроде как всё - дальше возможно справитесь..

---

сам автор к сожалению не сможет помочь :-(

если кому есть что добавить, вот код чтобы видно и не скачивать отдельным файлом (он короткий)

Благодарю!!!

Буду пробовать)