//+------------------------------------------------------------------+ #property copyright "Copyright 2015, http://cmillion.ru" #property link "http://cmillion.ru" #property version "1.00" #property strict #property show_inputs //+------------------------------------------------------------------+ /* Скрипт предназначен для выставления ордеров в то время, когда это сделать невозможно, например, когда рынок закрыт. Указываете в скрипте направление торговли (покупка или продажа) объем ордера и параметры стопов. Как только рынок откроется, ордер будет выставлен. Более того, скрипт доведет этот ордер до закрытия. Можно сразу указать все параметры трала и после открытия ордер будет сопровождаться тралом. Есть и еще одна функция, это виртуальные стопы. Если стоплосс или тейкпрофит указаны менее разрешенного брокером уровня стоплевел, то скрипт будет контролировать стоплосс и тейкпрофит виртуально и закроет ордер по указанным параметрам сам. Если после установки скрипта на график, произошел ГЭП, то скрипт будет пытаться открыть ордер по первой возможной цене. Можно так же установить время старта скрипта и тогда ордер будет установлен не сразу при открытии рынка, а в указанное время. Скрипт заканчивает свою работу, когда выставленный им ордер будет закрыт. */ //+------------------------------------------------------------------+ enum t { L=0, //покупка S=1, //продажа }; input t O = L; //торговая операция extern double Lot = 0.1; //лот extern int Stoploss = 0, //стоплосс, 0 - откл Takeprofit = 40; //тейкпрофит, 0 - откл extern int TrailingStop = 15; //длина трала, если 0, то нет трала extern int TrailingStart = 0; //минимальная прибыль установки трала, например после достижения 40 п прибыли extern int TrailingStep = 1; //шаг трала int slippage=30; //проскальзывание цены extern string TimeStart = "00:01";//начало работы советника extern int Magic = 0; //магик //+------------------------------------------------------------------+ void OnStart() { if(!IsTradeAllowed()) {Comment("Разрешите автоторговлю и запустите скрипт еще раз");return;} double STOPLEVEL,OSL,OTP,StLo,OOP,SL,TP; int n=0,OT; string txt=StringConcatenate("\nстоплосс = ",Stoploss,"\n", "тейкпрофит = ",Takeprofit,"\n", "длинна трала = ",TrailingStop,"\n", "прибыль трала = ",TrailingStart,"\n", "шаг трала = ",TrailingStep,"\n"); while(!IsStopped()) { RefreshRates(); STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL); n=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && Magic==OrderMagicNumber()) { OT=OrderType(); OSL = NormalizeDouble(OrderStopLoss(),Digits); OTP = NormalizeDouble(OrderTakeProfit(),Digits); OOP = NormalizeDouble(OrderOpenPrice(),Digits); SL=OSL;TP=OTP; if(OT==OP_BUY) { if(Stoploss!=0 && Bid<=OOP - Stoploss * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE)) continue;} if(Takeprofit!=0 && Bid>=OOP + Takeprofit * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE)) continue;} n++; if(OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0) { SL=NormalizeDouble(OOP-Stoploss *Point,Digits); } if(OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0) { TP=NormalizeDouble(OOP+Takeprofit*Point,Digits); } if(TrailingStop>=STOPLEVEL && TrailingStop!=0 && (Bid-OOP)/Point>=TrailingStart) { StLo=NormalizeDouble(Bid-TrailingStop*Point,Digits); if(StLo>=OOP && StLo>OSL+TrailingStep*Point) SL=StLo; } if(SL!=OSL || TP!=OTP) { if(!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error OrderModify <<",GetLastError(),">> "); } } if(OT==OP_SELL) { if(Stoploss!=0 && Ask>=OOP + Stoploss * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE)) continue;} if(Takeprofit!=0 && Ask<=OOP - Takeprofit * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE)) continue;} n++; if(OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0) { SL=NormalizeDouble(OOP+Stoploss *Point,Digits); } if(OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0) { TP=NormalizeDouble(OOP-Takeprofit*Point,Digits); } if(TrailingStop>=STOPLEVEL && TrailingStop!=0 && (OOP-Ask)/Point>=TrailingStart) { StLo=NormalizeDouble(Ask+TrailingStop*Point,Digits); if(StLo<=OOP && (StLo> "); } } } } } if(Lot!=0) { if(O==0) Comment("Скрипт ",WindowExpertName(),"\nВремя последней котировки ",TimeToStr(TimeCurrent(),TIME_SECONDS),txt,"\nсопровождает ",n," орд.\n","\nПокупка ",TimeStart); if(O==1) Comment("Скрипт ",WindowExpertName(),"\nВремя последней котировки ",TimeToStr(TimeCurrent(),TIME_SECONDS),txt,"\nсопровождает ",n," орд.\n","\nПродажа ",TimeStart); } else Comment("Скрипт ",WindowExpertName(),"\nВремя последней котировки ",TimeToStr(TimeCurrent(),TIME_SECONDS),txt,"\nсопровождает ",n," орд.\n"); if(Lot==0 && n==0) {Comment("Скрипт ",WindowExpertName()," закончил свою работу ",TimeToStr(TimeCurrent(),TIME_SECONDS));return;} if(TimeCurrent()>=StrToTime(TimeStart)) { if(O==0) if(OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),slippage,0,0,NULL,Magic,0,CLR_NONE)!=-1) Lot=0; if(O==1) if(OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,0,0,NULL,Magic,0,CLR_NONE)!=-1) Lot=0; } } } //+------------------------------------------------------------------+