//+------------------------------------------------------------------+ //| Martin_new_v2.mq4 | //| Sergey Gritsay | //| https://www.mql5.com/ru/users/sergey1294 | //+------------------------------------------------------------------+ #property copyright "Sergey Gritsay" #property link "https://www.mql5.com/ru/users/sergey1294" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ enum TYPE_IND { MA, RSI, CCI }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ enum TYPE_ON_OF { ON, OFF }; input int Magic=1;//Identification number input double StartLot=0.01; input double Klot=2.0; input int TakeProfit=200; input int Distance=200; input int Slippage=1000; // Проскальзование (Пипс) input TYPE_ON_OF Two_close=OFF; // Попарное закрытие (Off/On) input TYPE_IND filtr=MA; input bool DynamicStop=true;//Dynamic Stop calculation input int Period_ATR=200; //Period ATR input double Ktp=1.0;//Coefficient TakeProfit input double K_Distance=3.0;//Coefficient Distance input ENUM_TIMEFRAMES TimeFrames_ATR=PERIOD_CURRENT;//TimeFrames ATR sinput string s1=NULL; // Настройки slow МА input int ma_period_slow=20; // Period input ENUM_MA_METHOD ma_method_slow=MODE_SMA;//Method calculation input ENUM_APPLIED_PRICE ma_price_slow=PRICE_CLOSE;//Price calculation sinput string s2=NULL; // Настройки fast МА input int ma_period_fast=5; // Period input ENUM_MA_METHOD ma_method_fast=MODE_SMA;//Method calculation input ENUM_APPLIED_PRICE ma_price_fast=PRICE_CLOSE;//Price calculation sinput string s3=NULL; // Настройки RSI input int period_rsi=14; input ENUM_APPLIED_PRICE rsi_price=PRICE_CLOSE;//Price calculation input double rsi_level_up=70;//Level up input double rsi_level_dw=30;//Level down sinput string s4=NULL; // Настройки CCI input int cci_period_t=100; //Period CCI Trend input double cci_level_up_t=100;//Level up CCI Trend input double cci_level_dw_t=-100;//Level down CCI Trend input ENUM_APPLIED_PRICE cci_price_t=PRICE_CLOSE; //Price calculation input int cci_period_s=13; //Period CCI Signal input ENUM_APPLIED_PRICE cci_price=PRICE_CLOSE; //Price calculation input double cci_level_up_s=100;//Level up CCI Signal input double cci_level_dw_s=-100;//Level down CCI Signal input TYPE_ON_OF Variant_cci_01=OFF; //Variant 1 (Off/On) input TYPE_ON_OF Variant_cci_02=ON; //Variant 2 (Off/On) input TYPE_ON_OF Variant_cci_03=ON; //Variant 3 (Off/On) input TYPE_ON_OF Variant_cci_04=ON; //Variant 4 (Off/On) input TYPE_ON_OF Variant_cci_05=OFF; //Variant 5 (Off/On) int total_order_b=0; double price_open_b=0; double lot_b=0.0; datetime new_bars_b=0; int ticket_b_1=0; int ticket_b_2=0; double profit_b_1=0; double profit_b=0; double profit_b_2=0; double pips_b=0.0; double pr_b=0.0; bool close_b=false; int total_order_s=0; double price_open_s=0; double lot_s=0.0; datetime new_bars_s=0; int ticket_s_1=0; int ticket_s_2=0; double profit_s_1=0; double profit_s_2=0; double profit_s=0; double pips_s=0.0; double pr_s=0.0; bool close_s=false; double lots_b; double lots_s; double Take_Profit=0; double distanse=0; int Signal=WRONG_VALUE; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer EventSetMillisecondTimer(100); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(DynamicStop) { Take_Profit=Dynamic_Stop(_Symbol,Ktp); distanse=Dynamic_Stop(_Symbol,K_Distance); } else { Take_Profit=TakeProfit; distanse=Distance; } Signal=GetSignal(); total_order_b= total_order(OP_BUY); price_open_b = price_order(OP_BUY); total_order_s=total_order(OP_SELL); price_open_s=price_order(OP_SELL); GetTicket(OP_BUY,ticket_b_1,ticket_b_2); profit_b_1 = Profit(ticket_b_1); profit_b_2 = Profit(ticket_b_2); GetTicket(OP_SELL,ticket_s_1,ticket_s_2); profit_s_1 = Profit(ticket_s_1); profit_s_2 = Profit(ticket_s_2); if(Two_close==ON) { if(ticket_b_1==0 && ticket_b_2==0)lot_b=StartLot; if(ticket_b_1==ticket_b_2) { pips_b=(profit_b_1/SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE))/Lot(ticket_b_1); if(profit_b_1<0) lot_b=volume(_Symbol,MathAbs(profit_b_1),Take_Profit); //lot_b=Lot(ticket_b_1); } if(ticket_b_1!=ticket_b_2 && ticket_b_1>0 && ticket_b_2>0) { pips_b=(profit_b_1+profit_b_2/SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE))/(Lot(ticket_b_1)+Lot(ticket_b_2)); if(profit_b_1<0 && profit_b_2<0) lot_b=volume(_Symbol,MathAbs(profit_b_1+profit_b_2),Take_Profit); //lot_b=(Lot(ticket_b_1)+Lot(ticket_b_2)); } if(ticket_s_1==0 && ticket_s_2==0)lot_s=StartLot; if(ticket_s_1==ticket_s_2) { pips_s=(profit_s_1/SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE))/Lot(ticket_s_1); if(profit_s_1<0) lot_s=volume(_Symbol,MathAbs(profit_s_1),Take_Profit); //lot_s=Lot(ticket_s_1); } if(ticket_s_1!=ticket_s_2 && ticket_s_1>0 && ticket_s_2>0) { pips_s=(profit_s_1+profit_s_2/SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE))/(Lot(ticket_s_1)+Lot(ticket_s_2)); if(profit_s_1<0 && profit_s_2<0) lot_s=volume(_Symbol,MathAbs(profit_s_1+profit_s_2),Take_Profit); //lot_s=(Lot(ticket_s_1)+Lot(ticket_s_2)); } if(total_order_b==0) { if(OrderOpen(OP_BUY,lot_b)) { new_bars_b=Time[0]; } } if(total_order_s==0) { if(OrderOpen(OP_SELL,lot_s)) { new_bars_s=Time[0]; } } if(total_order_b>0) { if(price_open_b!=0) if(NormalizeDouble(Ask,_Digits)<=NormalizeDouble(price_open_b-distanse*_Point,_Digits)) if(Signal==OP_BUY && new_bars_b!=Time[0]) { if(OrderOpen(OP_BUY,lot_b)) { new_bars_b=Time[0]; } } } if(total_order_s>0) { if(price_open_s!=0) if(NormalizeDouble(Bid,_Digits)>=NormalizeDouble(price_open_s+distanse*_Point,_Digits)) if(Signal==OP_SELL && new_bars_s!=Time[0]) { if(OrderOpen(OP_SELL,lot_s)) { new_bars_s=Time[0]; } } } if(total_order_b==1) { pr_b=profit(_Symbol,Lot(ticket_b_1),Take_Profit); if(profit_b_1>=pr_b) if(OrderCloseTicket(ticket_b_1)) { ticket_b_1=0; ticket_b_2=0; } } if(total_order_s==1) { pr_s=profit(_Symbol,Lot(ticket_s_1),Take_Profit); if(profit_s_1>=pr_s) if(OrderCloseTicket(ticket_s_1)) { ticket_s_1=0; ticket_s_2=0; } } if(total_order_b>1) { pr_b=profit(_Symbol,Lot(ticket_b_1),Take_Profit); if(profit_b_1+profit_b_2>=pr_b) { if(OrderCloseTicket(ticket_b_2) && OrderCloseTicket(ticket_b_1)) { ticket_b_1=0; ticket_b_2=0; } } } if(total_order_s>1) { pr_s=profit(_Symbol,Lot(ticket_s_1),Take_Profit); if(profit_s_1+profit_s_2>=pr_s) { if(OrderCloseTicket(ticket_s_2) && OrderCloseTicket(ticket_s_1)) { ticket_b_1=0; ticket_b_2=0; } } } } else { profit_b=total_profit(Magic,OP_BUY,lots_b); profit_s=total_profit(Magic,OP_SELL,lots_s); if(total_order_b==0) { lot_b=StartLot; if(OrderOpen(OP_BUY,lot_b)) { new_bars_b=Time[0]; } } if(total_order_s==0) { lot_s=StartLot; if(OrderOpen(OP_SELL,lot_s)) { new_bars_s=Time[0]; } } if(total_order_b>0) { lot_b=volume(_Symbol,MathAbs(profit_b),Take_Profit); if(price_open_b!=0) if(NormalizeDouble(Ask,_Digits)<=NormalizeDouble(price_open_b-distanse*_Point,_Digits)) if(Signal==OP_BUY && new_bars_b!=Time[0]) { if(OrderOpen(OP_BUY,lot_b)) { new_bars_b=Time[0]; } } } if(total_order_s>0) { lot_s=volume(_Symbol,MathAbs(profit_s),Take_Profit); if(price_open_s!=0) if(NormalizeDouble(Bid,_Digits)>=NormalizeDouble(price_open_s+distanse*_Point,_Digits)) if(Signal==OP_SELL && new_bars_s!=Time[0]) { if(OrderOpen(OP_SELL,lot_s)) { new_bars_s=Time[0]; } } } if(total_order_b!=0) { profit_b=total_profit(Magic,OP_BUY,lots_b); profit_s=total_profit(Magic,OP_SELL,lots_s); pr_b=profit(_Symbol,Lot(ticket_b_1),Take_Profit); pr_s=profit(_Symbol,Lot(ticket_s_1),Take_Profit); if(profit_b>=pr_b)close_b=true; if(profit_s>=pr_s)close_s=true; } if(close_b) { if(OrderCloseType(OP_BUY)) { close_b=false; //lots_b=0; } } if(close_s) { if(OrderCloseType(OP_SELL)) { close_s=false; //lots_s=0; } } } Comment( "\n","Time= ",TimeCurrent(), "\n","Signal= ",TypeToStr(Signal), "\n","Take_Profit = ",Take_Profit, "\n","ticket_b_1 = ",ticket_b_1," profit_b_1 = ",profit_b_1, "\n","ticket_b_2 = ",ticket_b_2," profit_b_2 = ",profit_b_2, "\n","profit_b_1+profit_b_2 = ",profit_b_1+profit_b_2, "\n","pips = ",pips_b, "\n","lot_b = ",lot_b, "\n","profit close = ",pr_b, "\n","total_order_b = ",total_order_b, "\n"+"price_open_b = ",price_open_b, "\n"+"ticket_s_1 = ",ticket_s_1," profit_s_1 = ",profit_s_1, "\n"+"ticket_s_2 = ",ticket_s_2," profit_s_2 = ",profit_s_2, "\n"+"profit_s_1+profit_s_2 = ",profit_s_1+profit_s_2, "\n"+"pips = ",pips_s, "\n"+"lot_s = ",lot_s, "\n"+"profit close = ",pr_s, "\n"+"total_order_b = ",total_order_s, "\n"+"price_open_b = ",price_open_s, "\n"+"profit_b = ",profit_b, "\n"+"profit_s = ",profit_s, "\n"+"lots_b = ",lots_b, "\n"+"lots_s = ",lots_s ); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- } //+------------------------------------------------------------------+ int GetSignal() { if(filtr==MA) { double slow_ma_1=iMA(_Symbol,PERIOD_CURRENT,ma_period_slow,0,ma_method_slow,ma_price_slow,1); double slow_ma_2=iMA(_Symbol,PERIOD_CURRENT,ma_period_slow,0,ma_method_slow,ma_price_slow,2); double fast_ma_1=iMA(_Symbol,PERIOD_CURRENT,ma_period_fast,0,ma_method_fast,ma_price_fast,1); double fast_ma_2=iMA(_Symbol,PERIOD_CURRENT,ma_period_fast,0,ma_method_fast,ma_price_fast,2); if(fast_ma_1>slow_ma_1 && fast_ma_2slow_ma_2) return(OP_SELL); } if(filtr==RSI) { double rsi_1 = iRSI(_Symbol,PERIOD_CURRENT,period_rsi,rsi_price,1); double rsi_2 = iRSI(_Symbol,PERIOD_CURRENT,period_rsi,rsi_price,2); if(rsi_1>=rsi_level_dw && rsi_2<=rsi_level_dw)return(OP_BUY); if(rsi_1<=rsi_level_up && rsi_2>=rsi_level_up)return(OP_SELL); } if(filtr==CCI) { double CCI_S1=0.0; double CCI_S2=0.0; double CCI_F1=0.0; double CCI_F2=0.0; int cci_trend=-1; if(iBars(_Symbol,_Period)iBars(_Symbol,_Period))break; CCI_S1=iCCI(_Symbol,_Period,cci_period_t,cci_price,1+i); CCI_S2=iCCI(_Symbol,_Period,cci_period_t,cci_price,2+i); if(CCI_S1>cci_level_up_t){cci_trend=OP_BUY;break;} if(CCI_S1cci_level_up_t && CCI_S2cci_level_dw_t){cci_trend=OP_SELL;break;} i++; } while(icci_level_dw_s)return(OP_BUY); if(Variant_cci_03==ON && CCI_F1>cci_level_dw_s && CCI_F2cci_level_up_s && CCI_F2cci_level_up_s)return(OP_BUY); } if(cci_trend==OP_SELL) { if(Variant_cci_01==ON && CCI_F1>cci_level_up_s)return(OP_SELL); if(Variant_cci_02==ON && CCI_F1>cci_level_up_s && CCI_F2cci_level_up_s)return(OP_SELL); if(Variant_cci_04==ON && CCI_F1cci_level_dw_s)return(OP_SELL); if(Variant_cci_05==ON && CCI_F10) { return(true); } else Print("Ошибка открытия ордера № - ",GetLastError()); return(false); } //+------------------------------------------------------------------+ double price_order(int type) { double value=0; int total=OrdersTotal(); for(int i=0; iMaxLot)lot=MaxLot; return(NormalizeDouble(lot,volume_digits)); } //+------------------------------------------------------------------+ double Dynamic_Stop(string symbol,double k) { double value=0.0; double point=SymbolInfoDouble(symbol,SYMBOL_POINT); double stop_level=(double)SymbolInfoInteger(symbol,SYMBOL_TRADE_STOPS_LEVEL); double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE); if(iBars(symbol,TimeFrames_ATR)=0; i--) { if(!OrderSelect(i,SELECT_BY_POS))continue; if(OrderMagicNumber()!=Magic)continue; if(OrderSymbol()!=_Symbol)continue; if(OrderType()!=type)continue; if(type==OP_BUY)price_close=NormalizeDouble(Bid,_Digits); if(type==OP_SELL)price_close=NormalizeDouble(Ask,_Digits); bool res=OrderClose(OrderTicket(),OrderLots(),price_close,Slippage); if(!res) { Print("Ошибка закрытия ордера № - ",GetLastError()); return(false); } } return(true); } //+------------------------------------------------------------------+ double profit(string symbol,double lot,double sl) { double pr=0.0; double tc = SymbolInfoDouble(symbol,SYMBOL_TRADE_CONTRACT_SIZE); double tv = SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_VALUE); double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE); double point=SymbolInfoDouble(symbol,SYMBOL_POINT); switch((int)MarketInfo(symbol,MODE_PROFITCALCMODE)) { case 0: pr=sl*tv*lot;break; case 1:pr=sl*point*tc*lot;break; case 2:if(ts!=0) pr=sl*point*(tv/ts)*lot;break; } return(NormalizeDouble(pr,2)); } //+------------------------------------------------------------------+ double total_profit(int magic,int type,double &lot) { double value=0; lot=0; int total=OrdersTotal(); for(int i=0; i