//+------------------------------------------------------------------+ //| 7РО-B1-0И-v01-02-08-В670.mq4 | //| Copyright 2016, Victor Kashabin | //| Author mailto: kashabin54@mail.ru | //+------------------------------------------------------------------+ //|Данный советник предназначен для некомерческого | //|использования в терминале МТ-4, билд > 600. | //|Публикация советника на любих сайтах или литературе Запрещена. | //|Редактирование исходного кода разрешается только при | //|условии сохранения данного текста, ссылок и имени автора. | //|ПРОДАЖА или дарение советника или отдельных его частей ЗАПРЕЩЕНЫ. | //|Автор не несет ответственности за возможные убытки, полученные в | //|результате использования советника. | //-------------------------------------------------------------------+ //изменена индикация в 2017 году. | // ММ по FreeMargin | //Версия 01-02-08 изменена индикации в 2019г. | //Спред не меняется в индикации | //+------------------------------------------------------------------+ //| Corrections © 2019, forex-time@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, Victor Kashabin" #property link "mailto: kashabin54@mail.ru" //---- Открытие ордера input int TimeFrame = 15; //рабочий таймфрейм (1,5,15,30,60,240,1440) input double Lots = 0.00; //фиксированный лот >0; input double Risk = 20; // риск в процентах от депозита, при Lot = 0;не более 35%. input int PointOpen = 56; //(*)количество пунктов для открытия ордера BUY или SELL input int MagicNumber = 777; //магический номер ордера input int Slippage = 20; //(*) проскальзывание в цене при открытии ордера в пунктах //при=0 –проскальзывание рассчитывается через спрэд //---- Закрытие ордера input int SL = 0; //(*)уровень ограничения убытков, 0 –не выставляется input int TP = 200; //(*)уровень фиксации прибыли, 0 –не выставляется input int TPс = 50; // (*) уменьшенный TP для ускоренного закрытия ордера; input int Drawdown = 00; //(*) Размер просадки в пунктах для выставления TPc; input bool СloseСandle = true; // закрытия ордера при открытии новой свечи; //-----Параметры Безубытка input int Profit_Size = 0; //(*) профит в пунктах для переноса SL в БУ, при=0 не работает; input int Bezubytok_Size = 10; //(*) мини размер БУ от цены открытия ордера в пунктах; //---- Параметры трейлинг стопа input int Trailing_Stop = 36; //(*) трейлинг стоп в пунктах, при = 0 – трейлинг не работает input int Trailing_Step = 15; //(*) шаг трейлинга в пунктах, при = 1 – простой трейлинг; //---- Параметры функции работы по времени input int Start_time = 10; // время старта работы эксперта по терминалу (0-24) input int Stop_time = 19; // время остановки работы эксперта по терминалу (0-24) //---- Параметры индикации input bool Use_info = true; // включение индикации вверху слева input bool Use_signal = true; // включение индикации сигнала input bool Use_virtual= true; // включение индикации виртуальных стопов input color Color_use = clrLightGray; // цвет информации на экране input bool Time_line = true; // включение индикации времени работы советника input color Color_line = clrAqua; // цвет линий периода работы советника //--------------------------------------------------------------------------------------- int LastTicket; string Coment=""; int total; datetime Timebar; bool OpenYes=false; int Signal; double Takeprofit,Stoploss; bool CloseOrderCandle=false; bool TradeYes; double Profit; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init(){ New_bar(TimeFrame,Timebar); if(IsExpertEnabled()){ if(Use_info) Ind_Info(); Trade();} return(0);} //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit(){ Deinittrue(); return(0);} //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start(){ if(!IsExpertEnabled() || !IsTradeAllowed() || IsStopped()) { if(IsTesting() || IsVisualMode()) {} else { Deinittrue(); return(0); } } total=TotalSymbol(); if(New_bar(TimeFrame,Timebar)) { TradeYes=Trade(); OpenYes=true; if(СloseСandle && total>0) CloseOrderCandle=true; if(Use_info) Ind_Info(); } Signal=InitSignal(); if(Use_signal) Ind_Signal(); if(total>0) { OpenYes=false; if(Takeprofit==0 && Stoploss==0) InitOldTPSL(); if(CloseOrderCandle) if(CheckforCandle()) return(0); if(Drawdown!=0) CheckforDrawdown(); if(Profit_Size!=0) CheckforBU(); if(Trailing_Stop!=0) CheckforTral(); if(Stoploss!=0) CheckforSL(); if(Takeprofit!=0) CheckforTP(); CheckfotVirtualClose(); } else { Takeprofit=0; Stoploss=0; CloseOrderCandle=false; if(ObjectFind("PriceLine_0")!=-1) ObjectDelete("PriceLine_0"); if(ObjectFind("PriceLine_1")!=-1) ObjectDelete("PriceLine_1"); if(ObjectFind("PriceLine_2")!=-1) ObjectDelete("PriceLine_2"); if(Signal!=0 && OpenYes && TradeYes) InitNewOrder(); } if(Use_info) IndProfit(); return(0);} //Start END //+------------------------------------------------------------------+ bool New_bar(int frame,datetime &timebar) { if(timebar!=iTime(Symbol(),frame,0)) { timebar=iTime(Symbol(),frame,0); return(true); } else return(false); } //-------------------------------------------------------------------+ int TotalSymbol(){ int n=0; LastTicket=-1; Profit=0; int ttl=OrdersTotal(); for(int cnt=0;cnt0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { return(ticket); break; } else n++; } return(ticket);} //-------------------------------------------------------------------+ double MM_Lot(double risk)//-- функция ММ ----------------------+ { double lot,lt; double initbalans=MarketInfo(Symbol(),MODE_MARGINREQUIRED); double riskbalans=AccountFreeMargin()*risk/100.0; lot=NormalizeDouble(riskbalans/initbalans,D()); lt=MathMax(lot,MarketInfo(Symbol(),MODE_MINLOT)); lt=MathMin(lot,MarketInfo(Symbol(),MODE_MAXLOT)); return(lt);} //-------------------------------------------------------------------+ int D() { double stepLot=MarketInfo(Symbol(),MODE_LOTSTEP); int d=1; if(stepLot==1) d=0; else if(stepLot==0.01) d=2; else if(stepLot==0.001) d=3; return(d);} //-------------------------------------------------------------------+ void InitOldTPSL(){ if(LastTicket>0 && OrderSelect(LastTicket,SELECT_BY_TICKET,MODE_TRADES)) { Takeprofit=OrderTakeProfit(); Stoploss=OrderStopLoss(); } } //-------------------------------------------------------------------+ int InitSignal() { double cl=iClose(Symbol(),TimeFrame,0); double op=iOpen(Symbol(),TimeFrame,0); if(cl-op>=PointOpen*_Point) return(1); else if(op-cl>=PointOpen*_Point) return(-1); else return(0); } //-------------------------------------------------------------------+ void InitNewOrder() { int ticket=-1; double lots=Lots; if(lots==0) lots=MM_Lot(Risk); if(Signal>0) ticket=OpenOrder(OP_BUY,lots); else if(Signal<0) ticket=OpenOrder(OP_SELL,lots); if(ticket>0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { Signal=0; OpenYes=false; if(OrderType()==OP_BUY) { if(TP!=0) Takeprofit=OrderOpenPrice()+TP*_Point; if(SL!=0) Stoploss=OrderOpenPrice()-SL*_Point; } else if(OrderType()==OP_SELL) { if(TP!=0) Takeprofit=OrderOpenPrice()-TP*_Point; if(SL!=0) Stoploss=OrderOpenPrice()+SL*_Point; } } } //-------------------------------------------------------------------+ void CheckforSL() { if(LastTicket>0 && OrderSelect(LastTicket,SELECT_BY_TICKET,MODE_TRADES)) { double sl=0; if(OrderStopLoss()==Stoploss && ObjectFind("PriceLine_0")!=-1) ObjectDelete("PriceLine_0"); if(OrderStopLoss()Stoploss+0.1*_Point) { sl=Stoploss; if(OrderType()==OP_BUY) { if(Bid-sl<=Min_SL_TP()*_Point) { sl=0; if(Use_virtual && Stoploss!=0) DrawPriceLine(Stoploss,clrWhite,0); } else if(ObjectFind("PriceLine_0")!=-1) ObjectDelete("PriceLine_0"); } else if(OrderType()==OP_SELL) { if(sl-Ask<=Min_SL_TP()*_Point) { sl=0; if(Use_virtual && Stoploss!=0) DrawPriceLine(Stoploss,clrWhite,0); } else if(ObjectFind("PriceLine_0")!=-1) ObjectDelete("PriceLine_0"); } if(sl!=0) { bool ret=false; while(IsTradeContextBusy()) Sleep(10); ret=OrderModify(LastTicket,OrderOpenPrice(),sl,OrderTakeProfit(),0,clrLime); if(ObjectFind("PriceLine_0")!=-1) ObjectDelete("PriceLine_0"); } } } } //-------------------------------------------------------------------+ void CheckforTP() { if(LastTicket>0 && OrderSelect(LastTicket,SELECT_BY_TICKET,MODE_TRADES)) { double tp=0; if(OrderTakeProfit()==Takeprofit && ObjectFind("PriceLine_1")!=-1) ObjectDelete("PriceLine_1"); if(OrderTakeProfit()Takeprofit+0.1*_Point) { tp=Takeprofit; if(OrderType()==OP_BUY) { if(tp-Bid<=Min_SL_TP()*_Point) { tp=0; if(Use_virtual && Takeprofit!=0) DrawPriceLine(Takeprofit,clrYellow,1); } else if(ObjectFind("PriceLine_1")!=-1) ObjectDelete("PriceLine_1"); } else if(OrderType()==OP_SELL) { if(Ask-tp<=Min_SL_TP()*_Point) { tp=0; if(Use_virtual && Takeprofit!=0) DrawPriceLine(Takeprofit,clrYellow,1); } else if(ObjectFind("PriceLine_1")!=-1) ObjectDelete("PriceLine_1"); } if(tp!=0) { bool ret=false; while(IsTradeContextBusy()) Sleep(10); ret=OrderModify(LastTicket,OrderOpenPrice(),OrderStopLoss(),tp,0,Lime); if(ObjectFind("PriceLine_1")!=-1) ObjectDelete("PriceLine_1"); } } } } //-------------------------------------------------------------------+ bool CloseOrder(int ticket,color Color) { if(ticket>0) { int n=0; while(ticket>0 && n<5) { while(IsTradeContextBusy()) Sleep(10); RefreshRates(); if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { if(OrderType()==OP_BUY){if(OrderClose(ticket,OrderLots(),Bid,Deviation(Slippage),Color)) ticket=-1;} else if(OrderType()==OP_SELL){if(OrderClose(ticket,OrderLots(),Ask,Deviation(Slippage),Color)) ticket=-1;} } else ticket=-1; n++; } } if(ticket<0) return(true); else return(false); } //-------------------------------------------------------------------+ void CheckforDrawdown() { if(LastTicket>0 && OrderSelect(LastTicket,SELECT_BY_TICKET,MODE_TRADES)) { double dd; if(OrderType()==OP_BUY) { dd=OrderOpenPrice()-Drawdown*_Point; if(Bid<=dd) Takeprofit=OrderOpenPrice()+TPс*_Point; } else if(OrderType()==OP_SELL) { dd=OrderOpenPrice()+Drawdown*_Point; if(Ask>=dd) Takeprofit=OrderOpenPrice()-TPс*_Point; } DrawPriceLine(dd,clrMagenta,2); } } //-------------------------------------------------------------------+ void CheckfotVirtualClose() { if(LastTicket>0 && OrderSelect(LastTicket,SELECT_BY_TICKET,MODE_TRADES)) { if(OrderStopLoss()!=Stoploss && Stoploss!=0) { if(OrderType()==OP_BUY && Bid<=Stoploss) CloseOrder(LastTicket,clrYellow); else if(OrderType()==OP_SELL && Ask>=Stoploss) CloseOrder(LastTicket,clrYellow); } if(OrderTakeProfit()!=Takeprofit && Takeprofit!=0) { if(OrderType()==OP_BUY && Bid>=Takeprofit) CloseOrder(LastTicket,clrYellow); else if(OrderType()==OP_SELL && Ask<=Takeprofit) CloseOrder(LastTicket,clrYellow); } } } //-------------------------------------------------------------------+ bool CheckforCandle() { if(LastTicket>0 && OrderSelect(LastTicket,SELECT_BY_TICKET,MODE_TRADES)) { if(Profit>0) { if(CloseOrder(LastTicket,clrMagenta)) { CloseOrderCandle=false; OpenYes=true; return(true); } else return(false); } else CloseOrderCandle=false; return(false); } return(false); } //-------------------------------------------------------------------+ void CheckforBU() { if(LastTicket>0 && OrderSelect(LastTicket,SELECT_BY_TICKET,MODE_TRADES)) { if(OrderType()==OP_BUY) { if(OrderStopLoss()==0 || OrderStopLoss()=OrderOpenPrice()+Profit_Size*_Point) Stoploss=OrderOpenPrice()+Bezubytok_Size*_Point; } } else if(OrderType()==OP_SELL) { if(OrderStopLoss()==0 || OrderStopLoss()>OrderOpenPrice()) { if(Ask<=OrderOpenPrice()-Profit_Size*_Point) Stoploss=OrderOpenPrice()-Bezubytok_Size*_Point; } } } } //-------------------------------------------------------------------+ void CheckforTral() { if(LastTicket>0 && OrderSelect(LastTicket,SELECT_BY_TICKET,MODE_TRADES)) { double sl=0; if(OrderType()==OP_BUY) { if(Bid>=OrderOpenPrice()+Trailing_Stop*_Point) { if(StoplossStoploss+Trailing_Step*_Point) Stoploss=sl; } } } else if(OrderType()==OP_SELL) { if(Ask<=OrderOpenPrice()-Trailing_Stop*_Point) { if(Stoploss>OrderOpenPrice() || Stoploss==0) Stoploss=OrderOpenPrice()-Trailing_Step*_Point; else { sl=Ask+Trailing_Stop*_Point; if(sl=hourop && Hour()=hourop) trd=true; } if(Time_line) { DrawTimeLine(iTime(Symbol(),1440,0)+hourop*60*60,Color_line,0); DrawTimeLine(iTime(Symbol(),1440,0)+hourcl*60*60,Color_line,1); } else { if(ObjectFind("TimeLine_0")!=-1) ObjectDelete("TimeLine_0"); if(ObjectFind("TimeLine_1")!=-1) ObjectDelete("TimeLine_1"); } return(trd);} //----- индикация -----------------------------------------------------------+ void Ind_Signal() { string txt="СИГНАЛ НОЛЬ = 0"; color colors=White; if(TradeYes) { if(Bid>=iOpen(Symbol(),TimeFrame,0)+2*_Point) { txt="СИГНАЛ БАЙ = "+DoubleToStr((Bid-iOpen(Symbol(),TimeFrame,0))/_Point,0)+" ("+PointOpen+")"; colors=LightSkyBlue; } else if(Bid<=iOpen(Symbol(),TimeFrame,0)-2*_Point) { txt="СИГНАЛ СЕЛ = "+DoubleToStr((iOpen(Symbol(),TimeFrame,0)-Bid)/_Point,0)+" ("+PointOpen+")"; colors=Tomato; } } else { txt="НЕРАБОЧЕЕ ВРЕМЯ"; colors=Magenta; } DrawTXTLabel("Signal",0,20,20,colors,txt,12,"Times New Roman"); } //-------------------------------------------------------------------+ void Ind_Info() { color colors=Color_use; string txt=AccountCompany(); //+ " TF = "+TimeFrame; DrawTXTLabel("Broker",0,20,80,colors,txt,10,"Times New Roman"); if(IsDemo()) { txt="Cчет демо - № "+AccountNumber(); DrawTXTLabel("Schet",0,20,95,colors,txt,10,"Times New Roman"); } else { txt="Cчет реал - № "+AccountNumber(); DrawTXTLabel("Schet",0,20,95,colors,txt,10,"Times New Roman"); } txt="Лот макс = "+DoubleToStr(MarketInfo(Symbol(),MODE_MAXLOT),2); DrawTXTLabel("Lotmax",0,20,110,colors,txt,10,"Times New Roman"); txt="Лот мин = "+DoubleToStr(MarketInfo(Symbol(),MODE_MINLOT),2); DrawTXTLabel("Lotmin",0,20,125,colors,txt,10,"Times New Roman"); txt="Плечо 1:"+DoubleToStr(AccountLeverage(),0); DrawTXTLabel("Leverage",0,20,140,colors,txt,10,"Times New Roman"); txt="Спред = "+DoubleToStr((Ask-Bid)/Point,0); DrawTXTLabel("Spread",0,20,155,colors,txt,10,"Times New Roman"); txt="Стоп лимит = "+DoubleToStr(MarketInfo(Symbol(),MODE_STOPLEVEL),1); DrawTXTLabel("Stoplevel",0,20,170,colors,txt,10,"Times New Roman"); txt="Stop Out = "+DoubleToStr(AccountStopoutLevel(),0); DrawTXTLabel("Stopout",0,20,185,colors,txt,10,"Times New Roman"); txt="TIME FRAME = "+TimeFrame; DrawTXTLabel("TimeFrame",0,20,40,colors=Lime,txt,12,"Times New Roman");//"TF = "+TimeFrame; switch(DayOfWeek()) { case 0 : txt="День ВОСКРЕСЕНЬЕ"; break; case 1 : txt="День ПОНЕДЕЛЬНИК"; break; case 2 : txt="День ВТОРНИК"; break; case 3 : txt="День СРЕДА"; break; case 4 : txt="День ЧЕТВЕРГ"; break; case 5 : txt="День ПЯТНИЦА"; break; case 6 : txt="День СУББОТА"; break; default: txt="День ПОНЕДЕЛЬНИК"; } DrawTXTLabel("Day",0,20,60,colors=Yellow,txt,12,"Times New Roman"); colors=Yellow; } //-------------------------------------------------------------------+ void IndProfit() { color colors; if(Profit>=0) colors=Lime; else colors=Tomato; string txt="ПРИБЫЛЬ = "+DoubleToStr(Profit,2); DrawTXTLabel("Profit",0,20,205,colors,txt,12,"Times New Roman"); } //-------------------------------------------------------------------+ void Deinittrue() { if(ObjectFind("TimeLine_0")!=-1) ObjectDelete("TimeLine_0"); if(ObjectFind("TimeLine_1")!=-1) ObjectDelete("TimeLine_1"); if(ObjectFind("PriceLine_0")!=-1) ObjectDelete("PriceLine_0"); if(ObjectFind("PriceLine_1")!=-1) ObjectDelete("PriceLine_1"); if(ObjectFind("PriceLine_2")!=-1) ObjectDelete("PriceLine_2"); if(ObjectFind("Signal")!=-1) ObjectDelete("Signal"); if(ObjectFind("Broker")!=-1) ObjectDelete("Broker"); if(ObjectFind("Schet")!=-1) ObjectDelete("Schet"); if(ObjectFind("Lotmax")!=-1) ObjectDelete("Lotmax"); if(ObjectFind("Lotmin")!=-1) ObjectDelete("Lotmin"); if(ObjectFind("Leverage")!=-1) ObjectDelete("Leverage"); if(ObjectFind("Spread")!=-1) ObjectDelete("Spread"); if(ObjectFind("Stoplevel")!=-1) ObjectDelete("Stoplevel"); if(ObjectFind("Stopout")!=-1) ObjectDelete("Stopout"); if(ObjectFind("Day")!=-1) ObjectDelete("Day"); if(ObjectFind("Profit")!=-1) ObjectDelete("Profit"); if(ObjectFind("T14")!=-1) ObjectDelete("T14"); if(ObjectFind("T24")!=-1) ObjectDelete("T24"); if(ObjectFind("TimeFrame")!=-1) ObjectDelete("TimeFrame"); } //-------------------------------------- end ---------------------------------------------+