//+------------------------------------------------------------------+ //| rrr.mq4 | //| Copyright 2017, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ extern int time_in=1; extern int frame_stop=1; extern int max_stop=1000; extern int max_spreed=70; extern bool from_balance=FALSE; extern bool is_stop=FALSE; extern bool only_trend=FALSE; extern bool stop_blue=TRUE; extern string now_trend="none"; /* enum trendname { "none", "buy", // Sunday "sell" // Saturday }; //--- input parameters input trendname my; */ extern double Lots=0.01; extern int first_frame=5; //30 extern int first_num=10; extern string tang="123"; //4 extern int stop_num=1; //5 extern double risk_proc=0.5; extern double min_open=3.01; extern int max_buy=1; extern int max_sell=1; int buystopid, sellstopid; void OnInit() { //--- if(now_trend=="none") now_trend=isho_trend(5); //Alert(now_trend); //--- // return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ string in_tang(string tang_id,int shift=0){ string out="null"; double price_bot=ObjectGet(tang_id,OBJPROP_PRICE1); double price_top=ObjectGet(tang_id,OBJPROP_PRICE2); double now_price=iOpen(Symbol(),5,shift); if(shift==0)now_price=Bid; if(now_price>price_top)out="top"; if(now_priceprice_bot && now_priceOrderOpenPrice() && OrderStopLoss()0)OrderDelete(sellstopid); } buy_id=OrderTicket(); } if(OrderType()==OP_SELL ){ pricetop_5=pricetop_5+MarketInfo(Symbol(),MODE_SPREAD)*Point+5*Point; if(pricetop_50)OrderDelete(buystopid); } order_sell_c++; sell_id=OrderTicket(); } } /* if((order_buy_c<1 && (make_money(1)=="buy" || make_money(time_in)=="buy")) || (order_sell_c<1 && (make_money(1)=="sell" || make_money(time_in)=="sell"))){ open_order(make_money(time_in)); //open_order(make_money(1)); if(make_money(1)=="buy" && order_sell_c>0)my_close(sell_id); if(make_money(1)=="sell" && order_buy_c>0)my_close(buy_id); } */ double price1=ObjectGet(tang,OBJPROP_PRICE1); double price2=ObjectGet(tang,OBJPROP_PRICE2); Comment(now_trend,"--",all_tag(),"-",order_buy_c," ",order_sell_c,"is5-",isho_trend(5)," all",check_all(),make_take(240,"sell"),"b0=",bband(time_in,"up",0)-bband(time_in,"down",0)," b1=",bband(time_in,"up",1)-bband(time_in,"down",1),"==",(bband(time_in,"up",0)-bband(time_in,"down",0))-(bband(time_in,"up",1)-bband(time_in,"down",1))," ",b_flat(),"pr ",in_tang(tang)); double line_low=iLow(Symbol(),first_frame,iLowest(Symbol(),first_frame,MODE_LOW,first_num,2)); double line_top=iHigh(Symbol(),first_frame,iHighest(Symbol(),first_frame,MODE_HIGH,first_num,2)); make_line("top_line",line_top); make_line("bot",line_low); double pricetop=ObjectGet("top",OBJPROP_PRICE2); double pricebottom=ObjectGet("bottom",OBJPROP_PRICE1); double fr5=make_level_before("bot_price","bot",1,5); RectangleDelete(0,"bottom_5"); RectangleDelete(0,"top_5"); make_level("bottom",find_level("bottom",1,0,5),5,"bottom_5",clrAqua); make_level("top",find_level("top",1,0,5),5,"top_5",clrBrown); //make_level( //if(make_level_before("top_price","top",find_level("top"))!=pricetop){ RectangleDelete(0,"top"); RectangleDelete(0,"bottom"); RectangleDelete(0,"bottom2"); RectangleDelete(0,"top2"); make_level("top",find_level("top")); make_level("bottom",find_level("bottom")); make_level("top",find_level("top",find_level("top")+1,1),60,"top2"); make_level("bottom",find_level("bottom",find_level("bottom")+1,1),60,"bottom2"); double f_max=find_max(); double f_min=find_min(); make_line("l_top",f_max,clrYellow,to_price(f_max)); make_line("l_bot",f_min,clrYellow,to_price(f_min)); ChartRedraw(); //} // open new StringSubstr if(buy_id>sell_id && buy_id>0)now_trend="buy"; if(buy_id0)now_trend="sell"; if(order_buy_cto_price(f_min) && /*StringSubstr(all_tag(),0,3)=="buy" && iClose(Symbol(),5,1)>line_top &&*/ ((iLow(Symbol(),5,1)ObjectGet("top_5",OBJPROP_PRICE2)) || (iLow(Symbol(),5,1)ObjectGet("bottom_5",OBJPROP_PRICE2)) )&& now_trend!="buy"){open_order2("buy",StringSubstr(all_tag(),4));my_close(sell_id);now_trend="buy";} if(order_sell_cObjectGet("top_5",OBJPROP_PRICE2) && iOpen(Symbol(),5,0)0)OrderDelete(buystopid); if(buy_id==0 && sellstopid>0)OrderDelete(sellstopid); } double make_level_before(string want="top_price",string to="top",int shift=0, int frame=60){ double bot_price,top_price,pr1,pr2,out; int shift2=shift+1; // string out=to; if(to=="top"){ bot_price=iOpen(Symbol(),frame,shift); pr1=iHigh(Symbol(),frame,shift); pr2=iHigh(Symbol(),frame,shift2); if(pr1>pr2)top_price=pr1; else top_price=pr2; } if(to=="bottom"){ top_price=iOpen(Symbol(),frame,shift); pr1=iLow(Symbol(),frame,shift); pr2=iLow(Symbol(),frame,shift2); if(pr1iOpen(Symbol(),frame,0))break; if(to=="bottom" && iOpen(Symbol(),frame,b)iClose(Symbol(),frame,last) && iClose(Symbol(),frame,shift)>iOpen(Symbol(),frame,shift) && iOpen(Symbol(),frame,last3)> iOpen(Symbol(),frame,last) ) out="bottom"; if(iOpen(Symbol(),frame,last)0){ if(OrderType()==OP_BUY){OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);OrderDelete(sellstopid);} if(OrderType()==OP_SELL){OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);OrderDelete(buystopid);} } } string stoch_trend(int frame){ string out="null"; if(iStochastic(Symbol(),frame,5,3,3,MODE_SMA,0,MODE_MAIN,0)>iStochastic(Symbol(),frame,5,3,3,MODE_SMA,0,MODE_SIGNAL,0))out="buy"; else out="sell"; return out; } string stoch(int frame){ string out="null"; double st=iStochastic(Symbol(),frame,5,3,3,MODE_SMA,0,MODE_SIGNAL,0); if(st>70)out="sell"; if(st<30)out="buy"; return out; } double stoch_db(int frame){ return iStochastic(Symbol(),frame,5,3,3,MODE_SMA,0,MODE_SIGNAL,0); } string check_stoch(int frame){ string out="not"; if(stoch(frame)==stoch_trend(frame))out=stoch(frame); return out; } string bar_op(int frame){ string out="null"; double low_last=iLow(Symbol(),frame,1); double close_last=iClose(Symbol(),frame,1); double open_last=iOpen(Symbol(),frame,1); double high_last=iHigh(Symbol(),frame,1); double open_now=iOpen(Symbol(),frame,0); double half_buy=(open_last-close_last)/2+open_last; double half_sell=(close_last-open_last)/2-close_last; if(open_last>close_last && close_last-low_last>2*Point && Bid>half_buy)out="buy"; if(close_last>open_last && high_last-close_last>2*Point && half_buy>Bid)out="sell"; return out; } string isho_trend(int frame){ string out="null"; double span_a=iIchimoku(Symbol(),frame,9,26,52,MODE_SENKOUSPANA,0); double span_b=iIchimoku(Symbol(),frame,9,26,52,MODE_SENKOUSPANB,0); if(Bidspan_a && Bid>span_b)out="buy"; return out; } string check_all(){ int arr[4]={5,15,30,60}; int i; string out; out=isho_trend(60); for(i=0;i<4;i++){ if(isho_trend(arr[i])!=out)out=StringConcatenate(out," in ",arr[i],"-",isho_trend(arr[i])); } //Alert(out); return out; } double find_max(int to=5){ int arr[5]={1,5,15,30,60}; int i; double out,out1; out=0; for(i=0;iout)out=out1; } return out; } double find_min(int to=5){ int arr[5]={1,5,15,30,60}; int i; double out,out1; out=10000000; for(i=0;ispan_b){span_high=span_a;span_low=span_b;} else{span_high=span_b;span_low=span_a;} if(only_trend==FALSE){ if(isho_trend(60)!=isho_trend(frame) && isho_trend(1)!="null" && isho_trend(60)==check_all()){ if(isho_trend(frame)=="sell" && check_stoch(frame)=="sell" && bar_op(frame)=="sell" && stoch_db(5)>40)out="sell"; if(isho_trend(frame)=="buy" && check_stoch(frame)=="buy" && bar_op(frame)=="buy" && stoch_db(5)<60)out="buy"; } } /* if(isho_trend(60)==isho_trend(frame) && isho_trend(1)!="null"){ if(isho_trend(frame)=="sell" && check_stoch(frame)=="sell" && bar_op(frame)=="sell" && stoch_db(5)>40)out="sell"; if(isho_trend(frame)=="buy" && check_stoch(frame)=="buy" && bar_op(frame)=="buy" && stoch_db(5)<60)out="buy"; } */ if(frame>4){ if(stoch_db(time_in)>0){ if(red_last>=blue_last && blue>red && Bidred && Bidred && green>close26 && in_cloud(frame)==FALSE)out="buy"; if(in_cloud(frame,1)==TRUE && in_cloud(frame)==FALSE && bluered && green>close26 && isho_trend(frame)=="buy" && red>span_low && red>span_high)out="buy"; } } return out; } string b_flat(){ string out="null"; double b0=(bband(time_in,"up",0)-bband(time_in,"down",0))/Point; double b1=(bband(time_in,"up",1)-bband(time_in,"down",1))/Point; if(b0-b1<5)out="flat"; //Alert(b0); if(b0<20)out="flat"; return out; } string open_order(string in, string oo="null"){ string comm=StringConcatenate("iSHO ",time_in," tr H4-",isho_trend(240)," tr H1-",isho_trend(60)); if(MarketInfo(Symbol(),MODE_SPREAD)min_open )OrderSend(Symbol(),OP_SELL,make_lot("OP_SELL"),Bid,3,stop_lost_f("OP_SELL"),make_take(240,"sell"), comm,12345,0,Red); if(in=="buy" // && to_price(make_take(240,"buy"))/to_price(stop_lost_f("OP_BUY"))>min_open )OrderSend(Symbol(),OP_BUY,make_lot("OP_BUY"),Ask,3,stop_lost_f("OP_BUY"),make_take(240,"buy"), comm,12345,0,Green); } return 0; } string open_order2(string in, string oo="null"){ string comm=StringConcatenate("new ",time_in," ",oo," tr H4-",isho_trend(240)," tr H1-",isho_trend(60)); // double pricetop=ObjectGet("top",OBJPROP_PRICE1); //double pricebottom=ObjectGet("bottom",OBJPROP_PRICE2); double pricetop=ObjectGet(oo,OBJPROP_PRICE2)+MarketInfo(Symbol(),MODE_SPREAD)*Point+10*Point; double pricebottom=ObjectGet(oo,OBJPROP_PRICE1)-10*Point; pricetop=find_max(5)+MarketInfo(Symbol(),MODE_SPREAD)*Point+10*Point; pricebottom=find_min(5)-10*Point; if(to_price(pricetop)min_open // stop_lost_f("OP_SELL") ){ OrderSend(Symbol(),OP_SELL,make_lot2("OP_SELL",pricetop),Bid,3,pricetop,0, comm,12345,0,Red); OrderSend(Symbol(),OP_BUYSTOP,make_lot2("OP_SELL",pricetop),pricetop,3,Bid,0, comm,12345,0,Red); } if(in=="buy" // && to_price(make_take(240,"buy"))/to_price(stop_lost_f("OP_BUY"))>min_open // stop_lost_f("OP_BUY") ){OrderSend(Symbol(),OP_BUY,make_lot2("OP_BUY",pricebottom),Ask,3,pricebottom,0, comm,12345,0,Green); OrderSend(Symbol(),OP_SELLSTOP,make_lot2("OP_BUY",pricebottom),pricebottom,3,Ask,0, comm,12345,0,Green); } } return 0; } // проверка лота double make_lot(string to){ int points=to_price(stop_lost_f(to),to); double max_money; if(from_balance==TRUE) max_money=AccountBalance()*risk_proc/100; else max_money=AccountEquity()*risk_proc/100; double price1=MarketInfo(Symbol(),MODE_TICKVALUE); double out_lot=max_money/points/price1; out_lot=NormalizeDouble(MathAbs(out_lot),2); if(out_lot<0.01) out_lot=0.01; return out_lot; } double make_lot2(string to,double stop_price){ int points=to_price(stop_price,to); double max_money; if(from_balance==TRUE) max_money=AccountBalance()*risk_proc/100; else max_money=AccountEquity()*risk_proc/100; double price1=MarketInfo(Symbol(),MODE_TICKVALUE); double out_lot=max_money/points/price1; out_lot=NormalizeDouble(MathAbs(out_lot),2); if(out_lot<0.01) out_lot=0.01; return out_lot; } // установка стоплоса аллигатор double stop_lost_f(string or="null"){ double out,out2; //if(or!="null"){ if(or=="OP_BUY"){ out=iLow(Symbol(),first_frame,iLowest(Symbol(),first_frame,MODE_LOW,first_num,0)); out2=find_min(stop_num); if(out2max_stop)out=Ask-max_stop*Point; if(to_price(out)max_stop)out=Bid+max_stop*Point; out2=find_max(stop_num); if(out2>out)out=out2; out=out+MarketInfo(Symbol(),MODE_SPREAD)*Point+7*Point; if(to_price(out)span_b){span_high=span_a;span_low=span_b;} else{span_high=span_b;span_low=span_a;} if(price>span_low && pricespan_b){span_high=span_a;span_low=span_b;} else{span_high=span_b;span_low=span_a;} blue=red; if(stop_blue==TRUE){span_high=blue;span_low=blue;} if(OrderType()==OP_BUY){ if(Bid>span_high && to_price(span_low,"OP_BUY")>50 && span_low-OrderOpenPrice()>10*Point && span_low>OrderStopLoss() && stoch_db(1)<50 ) OrderModify(OrderTicket(),OrderOpenPrice(),span_low-5*Point,OrderTakeProfit(),0,clrDarkViolet); } //Alert(OrderType()); if(OrderType()==OP_SELL){ double set_stop=span_high+MarketInfo(Symbol(),MODE_SPREAD)*Point+7*Point; if( span_low>Ask && to_price(span_high)>50 && OrderOpenPrice()-set_stop>10*Point && (set_stop50 ){ OrderModify(OrderTicket(),OrderOpenPrice(),set_stop,OrderTakeProfit(),0,clrDarkViolet); // Alert("Ok"); } } return 0; //Alert(Symbol()," ",to_price(span_b)," ",OrderOpenPrice()-span_b); } bool make_line(string name,double price,color col=Magenta,string dis=""){ ObjectDelete(name); ObjectCreate(name,OBJ_HLINE,0,0,price); ObjectSet(name,OBJPROP_COLOR,col); ObjectSet(name,OBJPROP_STYLE,STYLE_DASHDOTDOT); ObjectSetString(0,name,OBJPROP_TEXT,dis); return true; } bool RectangleCreate(const long chart_ID=0, // ID графика const string name="Rectangle", // имя прямоугольника const int sub_window=0, // номер подокна datetime time1=0, // время первой точки double price1=0, // цена первой точки datetime time2=0, // время второй точки double price2=0, // цена второй точки const color clr=clrOrange, // цвет прямоугольника const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий прямоугольника const int width=1, // толщина линий прямоугольника const bool fill=true, // заливка прямоугольника цветом const bool back=true, // на заднем плане const bool selection=true, // выделить для перемещений const bool hidden=false, // скрыт в списке объектов const long z_order=0) // приоритет на нажатие мышью { //--- установим координаты точек привязки, если они не заданы //ChangeRectangleEmptyPoints(time1,price1,time2,price2); //--- сбросим значение ошибки ResetLastError(); //--- создадим прямоугольник по заданным координатам if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE,0,time1,price1,time2,price2)) { Print(__FUNCTION__, ": не удалось создать прямоугольник! Код ошибки = ",GetLastError()); return(false); } //--- установим цвет прямоугольника ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- установим стиль линий прямоугольника ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- установим толщину линий прямоугольника ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- включим (true) или отключим (false) режим выделения прямоугольника для перемещений //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection //--- по умолчанию равен true, что позволяет выделять и перемещать этот объект ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- успешное выполнение return(true); } //+------------------------------------------------------------------+ //| Перемещает точку привязки прямоугольника | //+------------------------------------------------------------------+ bool RectanglePointChange(const long chart_ID=0, // ID графика const string name="Rectangle", // имя прямоугольника const int point_index=0, // номер точки привязки datetime time=0, // координата времени точки привязки double price=0) // координата цены точки привязки { //--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid if(!time) time=TimeCurrent(); if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- сбросим значение ошибки ResetLastError(); //--- переместим точку привязки if(!ObjectMove(chart_ID,name,point_index,time,price)) { Print(__FUNCTION__, ": не удалось переместить точку привязки! Код ошибки = ",GetLastError()); return(false); } //--- успешное выполнение return(true); } void my_ret(){ } bool RectangleDelete(const long chart_ID=0, // ID графика const string name="Rectangle") // имя прямоугольника { //--- сбросим значение ошибки ResetLastError(); //--- удалим прямоугольник if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": не удалось удалить прямоугольник! Код ошибки = ",GetLastError()); return(false); } //--- успешное выполнение return(true); } //+------------------------------------------------------------------+