//+---------------------------------------------------------------------------+ //| Èñïîëüçîâàí, èçìåíåí Sell Percent.mq4 Scriptor èç CodeBase MQL-4.com | //| Aleksandr Pak, Alma-Ata, 03.2008 | //+---------------------------------------------------------------------------+ //Âåðñèÿ 2 ïî êîììåíòàðèþ "stace" îòñûëêà îðäåðà â äâóõ âàðèàíòàõ //1. âàðèàíò ôëàã Two_Slash=0 - îòñûëêà ïîëíîãî îðäåðà. //2. âàðèàíò Two_Slash=1 - îòñûëêà //â äâà ýòàïà - ñíà÷àëà îðäåð ñ tp/sl=0, çàòåì ìîäèôèêàöèÿ +tp +sl //äîïîëíåíà îáðàáîòêà îøèáîê, ïîâòîðíî íå îòñûëàòü åñëè áåñïîëåçíî //òàêæå èñïðàâëåíû íåóäîñòâà ñ òåêñòîâîé ñòðîêîé, èçìåíåíû èìåíà ãëîáàëüíûõ ïåðåìåííûõ, ÷òîáû â îäíî ìåñòå #property copyright "ekr-ap@mail.ru" #property copyright "mandorr@gmail.com" //ññûëêà íà èñõîäíûé Sell Percent.mq4 #include <WinUser32.mqh> double y_pipsown; int deinit() { ObjectDelete("PipsWork"); } void start() { int i,j,k,Slipp,Pop,Buy_tp,Buy_sl,Sell_tp,Sell_sl,Blank_buy,Blank_sell,err,crach,twoslash=1; double Lot,loss,profit; int ticket; string s,r="Parametrs??",p,x,ex; if (!IsCondition()) return; ObjectCreate("PipsWork",OBJ_TEXT,0,iTime(NULL,0,10),High[10]); ObjectSetText("PipsWork", "!!!", 60,"",Red); WindowRedraw(); if(GlobalVariableCheck("P_Lot")==FALSE) r=r+"1"; if(GlobalVariableCheck("P_Slippage")==FALSE) r=r+"2"; if(GlobalVariableCheck("P_Repetitions")==FALSE) r=r+"3"; if(GlobalVariableCheck("P_Buy_tp")==FALSE) r=r+"4"; if(GlobalVariableCheck("P_Buy_sl")==FALSE) r=r+"5"; if(GlobalVariableCheck("P_Sell_tp")==FALSE) r=r+"6"; if(GlobalVariableCheck("P_Sell_sl")==FALSE) r=r+"7"; if(GlobalVariableCheck("P_Blank_buy")==FALSE) r=r+"8"; if(GlobalVariableCheck("P_Blank_sell")==FALSE) r=r+"9"; if(GlobalVariableCheck("P_Two_slash")==FALSE) r=r+"10"; if(StringLen(r)>11) {MessageBox(r,"",MB_OK|MB_ICONERROR); return;} Lot =GlobalVariableGet("P_Lot"); Slipp =GlobalVariableGet("P_Slippage"); Pop =GlobalVariableGet("P_Repetitions"); Buy_tp =GlobalVariableGet("P_Buy_tp"); Buy_sl =GlobalVariableGet("P_Buy_sl"); Sell_tp =GlobalVariableGet("P_Sell_tp"); Sell_sl =GlobalVariableGet("P_Sell_sl"); Blank_buy =GlobalVariableGet("P_Blank_buy"); Blank_sell=GlobalVariableGet("P_Blank_sell"); twoslash =GlobalVariableGet("P_Two_slash"); ex="PiPsing= "+DoubleToStr(Lot,1)+" "+DoubleToStr(Slipp,0)+" "+DoubleToStr(Pop,0)+ " "+DoubleToStr(Buy_tp,0)+" "+DoubleToStr(Buy_sl,0)+ " "+DoubleToStr(Sell_tp,0)+" "+DoubleToStr(Sell_sl,0)+ " "+DoubleToStr(Blank_buy,0)+" "+DoubleToStr(Blank_sell,0)+" "+DoubleToStr(twoslash,0); i=0.3*WindowBarsPerChart(); //place for text y_pipsown=0.95*(WindowPriceMax(0)-WindowPriceMin(0))+WindowPriceMin(0); if(ObjectFind("PipsOwn2")==-1) {ObjectCreate("PipsOwn2",OBJ_TEXT,0,iTime(NULL,0,i), y_pipsown); //ObjectCreate("PipsOwn2",OBJ_TEXT,0,iTime(NULL,0,i),High[i]+40*Point); ObjectSetText("PipsOwn2", ex , 9,"",White); } else {ObjectSetText("PipsOwn2", ex , 9,"",White); if ( iBarShift ( NULL,0,ObjectGet ( "PipsOwn2",OBJPROP_TIME1),FALSE )>0.5*WindowBarsPerChart()) ObjectSet("PipsOwn2",OBJPROP_TIME1,iTime(NULL,0,i)); //åñëè çà êðàé ýêðàíà } if (AccountLots(Lot)<=0) { string title="Îøèáêà"; string msg="Íåò ñâîáîäíûõ ñðåäñòâ "; MessageBox(msg,title,MB_OK|MB_ICONERROR); return; } if(Blank_sell==0) //sb {if (twoslash==1) { ticket = send_order(0,ticket,Lot,Slipp,Pop,0,0); //send empty if(ticket>0) { //Sleep(1000); //Åñëè áðîêåð íå äàåò áûñòðî èçìåíÿòü, ñíÿòü //, ïîäîáðàòü çàäåðæêó send_order(1,ticket,Lot,Slipp,Pop,Sell_tp,Sell_sl); //modify } } else send_order(0,ticket,Lot,Slipp,Pop,Sell_tp,Sell_sl); //send +tp/sl } ObjectDelete("PipsWork"); } //.................................................... int send_order(int sm, int ticket, double Lot, int Slipp, int Pop,int _tp, int _sl) //sm=0 - send tp/sl, sm=1 send tp=0,sl=0 sm=2 modify {int err,k,crach; double loss,profit; bool result=TRUE; err=1; k=0; while(err!=0||k>=Pop) { k+=1; RefreshRates(); if (_sl>0) loss =Bid+_sl *Point; else loss=0; if (_tp>0) profit=Bid-_tp*Point; else profit=0; if(sm==0) ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slipp,loss,profit,NULL,0,0,CLR_NONE); else result=OrderModify(ticket,0,loss,profit,0,CLR_NONE); err=ShowError(Pop,k); if(err==0&&result==TRUE) break; else { Sleep(1000); } if(k>=Pop) break; //ïîâòîð òîëüêî ïðè 4, 6, 135, 136 137 138 145 146 switch(err) { case 6: crach=0; //íåò ñâÿçè case 135: crach=0;//Öåíà èçìåíèëàñü case 136: crach=0;//Íåò öåí case 137: crach=0;//Áðîêåð çàíÿò case 138: crach=0;//Íîâûå öåíû case 145: crach=0;//Ñëèøêîì áëèçêî ê ðûíêó case 146: crach=0;//Ïîäñèñòåìà òîðãîâëè çàíÿòà default : crach=1; } if(crach==1)break; //new repeat is crazy } if(err>1) ticket=-ticket; return (ticket); } double AccountLots(double Lot) { double freemargin=AccountFreeMargin(); if (freemargin<=0) return (0); double lotmargin=0; string symbol=Symbol(); string market=MarketType(symbol); if (market=="Forex" ) lotmargin=LotMarginForex (symbol); if (market=="Metalls") lotmargin=LotMarginCFD (symbol); if (market=="CFD" ) lotmargin=LotMarginCFD (symbol); if (market=="Futures") lotmargin=LotMarginFutures(symbol); if (market=="") return (0); if(Lot*lotmargin>freemargin) return (-1); else return (1); } string MarketType (string symbol) { int len=StringLen(symbol); string base; if (StringSubstr(symbol,0,1)=="_") return ("Indexes"); if (StringSubstr(symbol,0,1)=="#") { base=StringSubstr(symbol,len-1,1); if (base=="0") return ("Futures"); if (base=="1") return ("Futures"); if (base=="2") return ("Futures"); if (base=="3") return ("Futures"); if (base=="4") return ("Futures"); if (base=="5") return ("Futures"); if (base=="6") return ("Futures"); if (base=="7") return ("Futures"); if (base=="8") return ("Futures"); if (base=="9") return ("Futures"); return ("CFD"); } else { if (symbol=="GOLD" ) return ("Metalls"); if (symbol=="SILVER") return ("Metalls"); if (len==6) { base=StringSubstr(symbol,0,3); if (base=="AUD") return ("Forex"); if (base=="CAD") return ("Forex"); if (base=="CHF") return ("Forex"); if (base=="EUR") return ("Forex"); if (base=="GBP") return ("Forex"); if (base=="LFX") return ("Forex"); if (base=="NZD") return ("Forex"); if (base=="SGD") return ("Forex"); if (base=="USD") return ("Forex"); } } return (""); } double LotMarginForex (string symbol) { double lotsize=MarketInfo(symbol,MODE_LOTSIZE); double leverage=AccountLeverage(); double result=0; if (leverage>0) result=lotsize/leverage; string base=StringSubstr(symbol,0,3); string ñurrency=AccountCurrency(); double rate_ñurrency=1; if (base!=ñurrency) rate_ñurrency=MarketInfo(base+ñurrency,MODE_BID); result=rate_ñurrency*result; return (result); } double LotMarginCFD (string symbol) { double bid_symbol=MarketInfo(symbol,MODE_BID); double lotsize=MarketInfo(symbol,MODE_LOTSIZE); double leverage=10; double result=0; if (leverage>0) result=lotsize*bid_symbol/leverage; string ñurrency=AccountCurrency(); double rate_ñurrency=1; if (ñurrency!="USD") rate_ñurrency=MarketInfo(ñurrency+"USD",MODE_BID); result=rate_ñurrency*result; return (result); } double LotMarginFutures (string symbol) { int len=StringLen(symbol); double result=0; string base=StringSubstr(symbol,0,len-2); if (base=="#ENQ" ) result=3750; if (base=="#EP" ) result=3938; if (base=="#SLV" ) result=5063; if (base=="#GOLD") result=2363; if (base=="#CL" ) result=4725; if (base=="#NG" ) result=8100; if (base=="#W" ) result= 608; if (base=="#S" ) result=1148; if (base=="#C" ) result= 473; string ñurrency=AccountCurrency(); double rate_ñurrency=1; if (ñurrency!="USD") rate_ñurrency=MarketInfo(ñurrency+"USD",MODE_BID); result=rate_ñurrency*result; return (result); } bool IsCondition() { bool result=true; string field=" "; string msg; string title="Îøèáêà"; if (AccountNumber()>0)title=AccountNumber()+": "+title; if (!IsConnected()) { msg=msg+"Ñâÿçü ñ ñåðâåðîì îòñóòñòâóåò"+field; result=false; } if (!IsTradeAllowed()) { if (!result) msg=msg+"\n"; msg=msg+"Òîðãîâëÿ çàïðåùåíà"+field; result=false; } if (!result) MessageBox(msg,title,MB_OK|MB_ICONERROR); return (result); } int ShowError(int Pop, int k) { string description; int err=GetLastError(),crach; switch (err) //ïîâòîð òîëüêî ïðè 4, 6, 135, 136 137 138 145 146 { case 0: return; case 1: description="Íåò îøèáêè, íî ðåçóëüòàò íåèçâåñòåí"; break; case 2: description="Îáùàÿ îøèáêà"; break; case 3: description="Íåïðàâèëüíûå ïàðàìåòðû"; break; case 4: description="Òîðãîâûé ñåðâåð çàíÿò"; break; case 5: description="Ñòàðàÿ âåðñèÿ êëèåíòñêîãî òåðìèíàëà"; break; case 6: description="Íåò ñâÿçè ñ òîðãîâûì ñåðâåðîì"; break; case 7: description="Íåäîñòàòî÷íî ïðàâ"; break; case 8: description="Ñëèøêîì ÷àñòûå çàïðîñû"; break; case 9: description="Íåäîïóñòèìàÿ îïåðàöèÿ íàðóøàþùàÿ ôóíêöèîíèðîâàíèå ñåðâåðà"; break; case 64: description="Ñ÷åò çàáëîêèðîâàí"; break; case 65: description="Íåïðàâèëüíûé íîìåð ñ÷åòà"; break; case 128: description="Èñòåê ñðîê îæèäàíèÿ ñîâåðøåíèÿ ñäåëêè"; break; case 129: description="Íåïðàâèëüíàÿ öåíà"; break; case 130: description="Íåïðàâèëüíûå ñòîïû"; break; case 131: description="Íåïðàâèëüíûé îáúåì"; break; case 132: description="Ðûíîê çàêðûò"; break; case 133: description="Òîðãîâëÿ çàïðåùåíà"; break; case 134: description="Íåäîñòàòî÷íî äåíåã äëÿ ñîâåðøåíèÿ îïåðàöèè"; break; case 135: description="Öåíà èçìåíèëàñü"; break; case 136: description="Íåò öåí"; break; case 137: description="Áðîêåð çàíÿò"; break; case 138: description="Íîâûå öåíû"; break; case 139: description="Îðäåð çàáëîêèðîâàí è óæå îáðàáàòûâàåòñÿ"; break; case 140: description="Ðàçðåøåíà òîëüêî ïîêóïêà"; break; case 141: description="Ñëèøêîì ìíîãî çàïðîñîâ"; break; case 145: description="Ìîäèôèêàöèÿ çàïðåùåíà, òàê êàê îðäåð ñëèøêîì áëèçîê ê ðûíêó"; break; case 146: description="Ïîäñèñòåìà òîðãîâëè çàíÿòà"; break; case 147: description="Èñïîëüçîâàíèå äàòû èñòå÷åíèÿ îðäåðà çàïðåùåíî áðîêåðîì"; break; default : description="Íåèçâåñòíàÿ îøèáêà"; break; } switch(err) { case 4: crach=0; case 6: crach=0; case 135: crach=0; case 136: crach=0; case 137: crach=0; case 138: crach=0; case 146: crach=0; default : crach=1; } string field=" "; string msg="Îøèáêà #"+err+" "+description+field; string title="Îøèáêà"; if (AccountNumber()>0)title=AccountNumber()+": "+title; if(crach==1) MessageBox(msg,title,MB_OK|MB_ICONERROR); if(Pop-1==k) MessageBox(msg,title,MB_OK|MB_ICONERROR); return (err); } // End
Sample
Analysis
Market Information Used:
Series array that contains the highest prices of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy
Other Features:
It opens Message Boxes to the user