//+------------------------------------------------------------------------------+ //| Helen.mq4 | //| Copyright © 2009 gorby777 | //| gorby_e-mail@rambler.ru | //|Îñîáîå ÑÏÀÑÈÁÎ Êèìó Èãîðþ Â. (aka KimIV, http://www.kimiv.ru) çà åãî ôóíêöèè | //+------------------------------------------------------------------------------+ #property copyright "Copyright © 2009 gorby777" #property link "gorby_e-mail@rambler.ru" extern int Hour_ = 0; // ×àñ íà÷àëà òîðãîâëè extern int Delta_ = 25; // Óðîâåíü îò áàçîâîé öåíû äî öåíû îòêðûòèÿ îòëîæåííèêà extern int StopLoss_ = 70; // Ñòîïëîññ extern int TakeProfit_ = 150; // Òåéêïðîôèò extern int TrailingStop_ = 50; // Ðàçìåð òðàëà extern int shift_ = 0; //extern int Range=50; extern string s1 = "==Íàñòðîéêà ÌÌ=="; extern double kLots = 1.0; // èíäèâèäóàëüíûé ìíîæèòåëü ê êîýôô-òó ðèñêà extern bool MM = true; // È òàê ïîíÿòíî extern bool UseTrailing = True; // Èñïîëüçîâàòü òðàë extern bool send_mail = false; // Îòïðàâêà ïî÷òû double ContinuousLot = 0.1; // Ðàçìåð ïîñòîÿííîãî ëîòà ïðè ÌÌ=false extern string s3 = "==Ðåæèì òðåéäèíãà=="; extern bool StopTrading = false; // Ïðèîñòàíîâêà òîðãîâëè âðó÷íóþ static bool TradeAllowed = true; // Îñòàíîâêà òîðãîâëè ñîâåòíèêîì bool TrailProfitOnly = true; // Òðàëèòü òîëüêî ïðîôèò int TrailingStep = 3; // Øàã òðàëà â ïóíêòàõ int Range = 100; // Ñðåäíèé îáðàçöîâûé äèàïàçîí int TF = 60; // Òàéìôðåéì int slow = 77; // Ìåäëåííàÿ ÌÀ â ôóíêöèè òðåíäà int fast = 21; // Áûñòðàÿ ÌÀ â ôóíêöèè òðåíäà bool Check_5Digits = false; // Ðàáîòà ñ 5-þ çíàêàìè â êîòèðîâêàõ int modeSetOrders = 0; // 0 - ïî çàäàííîé öåíå // 1 - ñêîððåêòèðîâàòü öåíû // 2 - âõîä ïî òåêóùèì öåíàì static int LastHour; static int Magic, MagicOfName, MagicOfSymbol; int Slippage = 0, Delta, StopLoss, TakeProfit, TrailingStop, spread; double Point_,kATR; string symbol, ExpertName, AccNumber; color clOpenBuy = LightBlue; // Öâåò çíà÷êà îòêðûòèÿ ïîêóïêè color clOpenSell = LightCoral; // Öâåò çíà÷êà îòêðûòèÿ ïðîäàæè color clCloseBuy = Blue; // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè color clCloseSell = Red; // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè color clModifyBuy = Aqua; // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè color clModifySell = Tomato; // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè bool MarketWatch = True; // Çàïðîñû ïîä èñïîëíåíèå "Market Watch". static bool SetFlag = false; // Ôëàã óñòàíîâêè ïîçèöèè int ticket11; // Òèêåò îðäåðà SELLLIMIT int ticket21; // Òèêåò îðäåðà BUYLIMIT //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int init(){ symbol = Symbol(); ExpertName = WindowExpertName(); AccNumber = DoubleToStr(AccountNumber(),0); MagicOfName = 0; for(int i=StringLen(ExpertName)-1;i>=0;i--) //Ñîñòàâíîé ìàãèê: MagicOfName=MagicOfName+StringGetChar(ExpertName,i)*(i+1); //ó÷èòûâàåò èìÿ ýêñïåðòà è MagicOfSymbol=StringGetChar(symbol,0)*StringGetChar(symbol,5)+ //íàçâàíèå òîðãóåìîé ïàðû StringGetChar(symbol,1)*StringGetChar(symbol,4)+ StringGetChar(symbol,2)*StringGetChar(symbol,3); Magic=MagicOfSymbol+MagicOfName; if (!GlobalVariableCheck(symbol+"_ticket11")) GlobalVariableSet(symbol+"_ticket11",-1); if (!GlobalVariableCheck(symbol+"_ticket21")) GlobalVariableSet(symbol+"_ticket21",-1); ///* switch(MagicOfSymbol){ case 17255: Range=71;break; case 19009: Range=118;break; case 15731: Range=77;break; case 16195: Range=66;break; default: Range=100; } //*/ Point_=Point; if(Check_5Digits == true && (Digits == 3 || Digits == 5)){ //Äëÿ êîððåêòíîé ðàáîòû ñ 5-þ çíàêàìè Alert("Digits=", Digits, " Broker quotes given in 5-digit mode. \"Point\" will be multiplied by 10"); //â êîòèðîâêàõ Point_ = 10*Point; } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int deinit(){ } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int start(){ if(LastHour!=Hour() && send_mail){ //Åæå÷àñíî ðîáîò øëåò íàì äîêëàä if(AccountMargin()!=0) string Level=DoubleToStr(100*AccountEquity()/AccountMargin(),0); //î ñîñòîÿíèè ñ÷åòà else Level = "ÌÍÎÃÎ "; SendMail(DoubleToStr(AccountNumber(),0)+" "+TimeToStr(TimeCurrent(),TIME_MINUTES), DoubleToStr(AccountEquity(),0)+", Level "+Level+"%"); LastHour=Hour(); } bool pass; int Minute5 = MathMod(Minute(),5); //Íå ñóåòèìñÿ, çà ðûíêîì if(Minute5!=0)pass=false; if(Minute5==0 && pass==false){ //ïðèñìàòðèâàåì ðàç â 5 ìèíóò pass=true; kATR = iATR(symbol,240,200,1)/(Point_*Range); //kATR = 1; spread=MarketInfo(symbol,MODE_SPREAD); TrailingStop=NormalizeDouble(TrailingStop_*kATR,0); int orders=0; int positions=0; for(int i=OrdersTotal()-1;i>=0;i--){ //Ïîäñ÷åò îðäåðîâ è ïîçèöèé OrderSelect(i,SELECT_BY_POS); if(OrderMagicNumber()!=Magic) continue; if(OrderType()<2)positions++; orders++; } if(UseTrailing && positions>0)Trailing(symbol,-1,Magic); //Òðåéëèíã int t1=GlobalVariableGet(symbol+"_ticket11"); int t2=GlobalVariableGet(symbol+"_ticket21"); OrderSelect(t1,SELECT_BY_TICKET); datetime oct1=OrderCloseTime(); OrderSelect(t2,SELECT_BY_TICKET); datetime oct2=OrderCloseTime(); if(oct1 != 0 || oct2 !=0){ OrderDelete_(-1,Magic,-1,-1); //Åñëè çàêðûëàñü ïîçèöèÿ, óäàëÿåì îðäåð GlobalVariableSet(symbol+"_ticket11",-1); //Çàïîìèíàåì òèêåòû íà ñëó÷àé GlobalVariableSet(symbol+"_ticket21",-1); //ïåðåèíèöèàëèçàöèè } if(Hour()!=Hour_)SetFlag=false; //Ïîäãîòîâêà ôëàãà óñòàíîâêè îðäåðîâ switch(orders-positions){ case 0: if(!SendOrders(positions))OrderDelete_(-1,Magic,-1,-1); //Óñòàíîâêà îðäåðîâ break; case 1: if(Trend(symbol,TF,slow,fast)==1){ OrderDelete_(OP_SELLLIMIT,Magic,-1,-1); break; } if(Trend(symbol,TF,slow,fast)==-1){ OrderDelete_(OP_BUYLIMIT,Magic,-1,-1); break; } } } return(0); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ bool SendOrders(int pos=0){ //Ô-öèÿ óñòàíîâêè îðäåðîâ if (DayOfWeek()==5 && Hour_>=20 || !TradeAllowed || StopTrading ) return(true); MathSrand(TimeCurrent()); // if (Hour()==Hour_ && Minute()> NormalizeDouble(MathRand()/1000,0) && !SetFlag && pos<=4){ if (Hour()==Hour_ && !SetFlag && pos<=4){ int shift=NormalizeDouble(Trend(symbol,TF,slow,fast)*shift_*kATR,0); double base=iOpen(symbol,60,0)+shift*Point_; //Áàçîâàÿ öåíà double StopLoss=StopLoss_*kATR; double TakeProfit=TakeProfit_*kATR; double BuyLimitOP=NormalizeDouble(base-Delta_*kATR*Point_,Digits); //Öåíà îòêðûòèÿ áàéëèìèòà double SellLimitOP=NormalizeDouble(base+Delta_*kATR*Point_,Digits); //Öåíà îòêðûòèÿ ñåëëëèìèòà double BuyLimitSL=NormalizeDouble(BuyLimitOP-StopLoss*Point_,Digits); //Öåíà ñòîïà áàéëèìèòà double SellLimitSL=NormalizeDouble(SellLimitOP+StopLoss*Point_,Digits); //Öåíâ ñòîïà ñåëëëèìèòà double BuyLimitTP=NormalizeDouble(BuyLimitOP+TakeProfit*Point_,Digits); //Öåíà ÒÐ áàéëèìèòà double SellLimitTP=NormalizeDouble(SellLimitOP-TakeProfit*Point_,Digits); //Öåíà ÒÐ ñåëëèìèòà datetime DateExp=TimeCurrent()+84400; //Âðåìÿ îòìåíû îðäåðà int orders=0; int positions=0; ticket11 = OrderSend_(symbol, OP_SELLLIMIT, Lot(StopLoss), SellLimitOP, Slippage, SellLimitSL, //Óñòàíîâêà îòëîæåííèêà SellLimitTP, ExpertName, Magic,DateExp,Red); ticket21 = OrderSend_(symbol, OP_BUYLIMIT, Lot(StopLoss), BuyLimitOP, Slippage, BuyLimitSL, //Óñòàíîâêà îòëîæåííèêà BuyLimitTP, ExpertName, Magic,DateExp,Blue); Sleep(5000); OrderDelete_(-1,Magic,ticket11,ticket21); //×èñòêà "ìóñîðà" for(int i=OrdersTotal()-1;i>=0;i--){ //Ïîäñ÷åò îðäåðîâ è ïîçèöèé OrderSelect(i,SELECT_BY_POS); if(OrderMagicNumber()!=Magic) continue; if(OrderType()<2)positions++; orders++; } if(ticket11>0 && ticket21>0){ //Ïðîâåðêà "ïðàâèëüíîñòè" GlobalVariableSet(symbol+"_ticket11",ticket11); GlobalVariableSet(symbol+"_ticket21",ticket21); SetFlag=true; } if(orders-positions!=2){ //Åùå îäíà GlobalVariableSet(symbol+"_ticket11",-1); GlobalVariableSet(symbol+"_ticket21",-1); SetFlag=false; } } return(SetFlag); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ double Lot(int StopLoss){ if(!MM)return(ContinuousLot); double Risk=GlobalVariableGet("Risk"); double tick=MarketInfo(symbol,MODE_TICKVALUE); //Ô-öèÿ ðàññ÷èòûâàåò ëîò òàêèì îáðàçîì, double lot= NormalizeDouble(AccountEquity()*Risk*kLots/(StopLoss*100*tick),2); //÷òî ëîññ ðàâåí óñòàíîâëåííîìó if(lot<0.01){ //ïðîöåíòó îò äåïîçèòà TradeAllowed=false; Alert(symbol,". NO MONEY!"); lot=0; } return(lot); } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| op - îïåðàöèÿ (-1 - ëþáîé îðäåð) | //| mn - MagicNumber (-1 - ëþáîé ìàãèê) | //| tkt1,tkt2- ïðîïóñòèòü (-1 - óäàëèòü âñå) | //+----------------------------------------------------------------------------+ bool OrderDelete_(int op=-1, int mn=-1, int tkt1=-1, int tkt2=-1) { bool res=true; int err, i, it, k=OrdersTotal(), ot; for (i=k-1; i>=0; i--){ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if(OrderTicket()==tkt1 || OrderTicket()==tkt2)continue; ot=OrderType(); if (ot>1 && ot<6){ if (op<0 || ot==op){ if (mn<0 || OrderMagicNumber()==mn){ for (it=1; it<=5; it++){ if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); res=OrderDelete(OrderTicket(), Yellow); if (res) break; else { err=GetLastError(); Print("Error(",err,"), failed delete order",", try ",it); Sleep(5000); } } } } } } } return(res); } //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| sy - íàèìåíîâàíèå èíñòðóìåíòà (NULL èëè "" - òåêóùèé ñèìâîë) | //| op - îïåðàöèÿ | //| ll - ëîò | //| pp - öåíà | //| slip-ñëèïïàäæ //| sl - óðîâåíü ñòîï | //| tp - óðîâåíü òåéê | //| co - êîììåíòàðèé //| mn - Magic Number | //| ex - Ñðîê èñòå÷åíèÿ | //| | //+----------------------------------------------------------------------------+ int OrderSend_(string sy, int op=0, double ll=0, double pp=0,double Slippage=0, double sl=0, double tp=0, string co="",int mn=0, datetime ex=0, color cl=0) { cl=IIFc(op==OP_BUYLIMIT || op==OP_BUYSTOP, clOpenBuy, clOpenSell); datetime ot; double pa, pb, mp; int err, it, ticket, msl; msl=MarketInfo(sy, MODE_STOPLEVEL); if (ex>0 && ex<TimeCurrent()) ex=0; for (it=1; it<=5; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) { Print("SetOrder(): Îñòàíîâêà ðàáîòû ôóíêöèè"); break; } while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); ot=TimeCurrent(); pp=NormalizeDouble(pp,Digits); sl=NormalizeDouble(sl,Digits); tp=NormalizeDouble(tp,Digits); ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, co, mn, ex, cl); if (ticket>0) { break; } else { err=GetLastError(); if (err==128 || err==142 || err==143) { Sleep(1000*66); if (OrderExist_(sy, op, mn, ot)) { break; } Print("Error(",err,") set order: ",", try ",it); continue; } mp=MarketInfo(sy, MODE_POINT); pa=MarketInfo(sy, MODE_ASK); pb=MarketInfo(sy, MODE_BID); Print("Error(",err,") set order: ",", try ",it); Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=", " pp=",pp," sl=",sl," tp=",tp," mn=",mn); // Íåïðàâèëüíûå ñòîïû if (err==130) { // Êîððåêòèðîâêà öåíîâûõ óðîâíåé if (modeSetOrders==1) { Sleep(1000*5.3); switch (op) { case OP_BUYLIMIT: if (pp>pa-msl*mp) pp=pa-msl*mp; if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp; if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp; break; case OP_BUYSTOP: if (pp<pa+(msl+1)*mp) pp=pa+(msl+1)*mp; if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp; if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp; break; case OP_SELLLIMIT: if (pp<pb+msl*mp) pp=pb+msl*mp; if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp; if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp; break; case OP_SELLSTOP: if (pp>pb-msl*mp) pp=pb-msl*mp; if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp; if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp; break; } Print("SetOrder(): Ñêîððåêòèðîâàíû öåíîâûå óðîâíè"); continue; } // Âõîä ïî òåêóùèì öåíàì if (modeSetOrders==2) { Print("SetOrder(): Âõîä ïî òåêóùèì öåíàì"); if (op==OP_BUYLIMIT || op==OP_BUYSTOP) OpenPosition(sy, OP_BUY, ll, sl, tp, mn, co); if (op==OP_SELLLIMIT || op==OP_SELLSTOP) OpenPosition(sy, OP_SELL, ll, sl, tp, mn, co); break; } } // Áëîêèðîâêà ðàáîòû ñîâåòíèêà if (err==2 || err==64 || err==65 || err==133) { TradeAllowed=false; break; } // Äëèòåëüíàÿ ïàóçà if (err==4 || err==131 || err==132) { Sleep(1000*300); break; } // Ñëèøêîì ÷àñòûå çàïðîñû (8) èëè ñëèøêîì ìíîãî çàïðîñîâ (141) if (err==8 || err==141) Sleep(1000*100); if (err==139 || err==140 || err==148) break; // Îæèäàíèå îñâîáîæäåíèÿ ïîäñèñòåìû òîðãîâëè if (err==146) while (IsTradeContextBusy()) Sleep(1000*11); // Îáíóëåíèå äàòû èñòå÷åíèÿ if (err==147) { ex=0; continue; } if (err!=135 && err!=138) Sleep(1000*7.7); } } return(ticket); } //+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - ëþáîé ñèìâîë, | //| NULL - òåêóùèé ñèìâîë) | //| op - îïåðàöèÿ (-1 - ëþáîé îðäåð) | //| mn - MagicNumber (-1 - ëþáîé ìàãèê) | //| ot - âðåìÿ îòêðûòèÿ ( 0 - ëþáîå âðåìÿ óñòàíîâêè) | //+----------------------------------------------------------------------------+ bool OrderExist_(string sy="", int op=-1, int mn=-1, datetime ot=0) { int i, k=OrdersTotal(), ty; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { ty=OrderType(); if (ty>1 && ty<6) { if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) { if (mn<0 || OrderMagicNumber()==mn) { if (ot<=OrderOpenTime()) return(True); } } } } } return(False); } //| Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ. | //+----------------------------------------------------------------------------+ color IIFc(bool condition, color ifTrue, color ifFalse) { if (condition) return(ifTrue); else return(ifFalse); } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 10.04.2008 | //| Îïèñàíèå : Îòêðûâàåò ïîçèöèþ ïî ðûíî÷íîé öåíå. | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| sy - íàèìåíîâàíèå èíñòðóìåíòà (NULL èëè "" - òåêóùèé ñèìâîë) | //| op - îïåðàöèÿ | //| ll - ëîò | //| sl - óðîâåíü ñòîï | //| tp - óðîâåíü òåéê | //| mn - MagicNumber | //| co - êîììåíòàðèé | //+----------------------------------------------------------------------------+ void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0, string co="") { color clOpen; datetime ot; double pp, pa, pb; int dg, err, it, ticket=0; if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell; for (it=1; it<=5; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) { Print("OpenPosition(): Îñòàíîâêà ðàáîòû ôóíêöèè"); break; } while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); dg=MarketInfo(sy, MODE_DIGITS); pa=MarketInfo(sy, MODE_ASK); pb=MarketInfo(sy, MODE_BID); if (op==OP_BUY) pp=pa; else pp=pb; pp=NormalizeDouble(pp, dg); ot=TimeCurrent(); if (MarketWatch) ticket=OrderSend(sy, op, ll, pp, Slippage, 0, 0, co, mn, 0, clOpen); else ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, co, mn, 0, clOpen); if (ticket>0) { break; } else { err=GetLastError(); // Âûâîä ñîîáùåíèÿ îá îøèáêå Print("Error(",err,") opening position: ",", try ",it); Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=", " pp=",pp," sl=",sl," tp=",tp," mn=",mn); // Áëîêèðîâêà ðàáîòû ñîâåòíèêà if (err==2 || err==64 || err==65 || err==133) { TradeAllowed=false; break; } // Äëèòåëüíàÿ ïàóçà if (err==4 || err==131 || err==132) { Sleep(1000*300); break; } if (err==128 || err==142 || err==143) { Sleep(1000*66.666); if (ExistPositions(sy, op, mn, ot)) { break; } } if (err==140 || err==148 || err==4110 || err==4111) break; if (err==141) Sleep(1000*100); if (err==145) Sleep(1000*17); if (err==146) while (IsTradeContextBusy()) Sleep(1000*11); if (err!=135) Sleep(1000*7.7); } } if (MarketWatch && ticket>0 && (sl>0 || tp>0)) { if (OrderSelect(ticket, SELECT_BY_TICKET)) OrderModify_(-1, sl, tp); } } //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 06.03.2008 | //| Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèé | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - ëþáîé ñèìâîë, | //| NULL - òåêóùèé ñèìâîë) | //| op - îïåðàöèÿ (-1 - ëþáàÿ ïîçèöèÿ) | //| mn - MagicNumber (-1 - ëþáîé ìàãèê) | //| ot - âðåìÿ îòêðûòèÿ ( 0 - ëþáîå âðåìÿ îòêðûòèÿ) | //+----------------------------------------------------------------------------+ bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) { int i, k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (ot<=OrderOpenTime()) return(True); } } } } } } return(False); } //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 28.11.2006 | //| Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà. | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| pp - öåíà óñòàíîâêè îðäåðà | //| sl - öåíîâîé óðîâåíü ñòîïà | //| tp - öåíîâîé óðîâåíü òåéêà | //| ex - äàòà èñòå÷åíèÿ | //+----------------------------------------------------------------------------+ bool OrderModify_(double pp=-1, double sl=0, double tp=0, datetime ex=0) { bool fm=true; color cl=IIFc(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell); double op, pa, pb, os, ot; int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it; if (pp<=0) pp=OrderOpenPrice(); if (sl<0 ) sl=OrderStopLoss(); if (tp<0 ) tp=OrderTakeProfit(); pp=NormalizeDouble(pp, dg); sl=NormalizeDouble(sl, dg); tp=NormalizeDouble(tp, dg); op=NormalizeDouble(OrderOpenPrice() , dg); os=NormalizeDouble(OrderStopLoss() , dg); ot=NormalizeDouble(OrderTakeProfit(), dg); if (pp!=op || sl!=os || tp!=ot) { for (it=1; it<=5; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl); if (fm){ return(true); } else { er=GetLastError(); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); Print("Error(",er,") modifying order: ",", try ",it); Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol()," pp=",pp," sl=",sl," tp=",tp); Sleep(1000*10); } } } return(fm); } //+----------------------------------------------------------------------------+ //| Ñîïðîâîæäåíèå ïîçèöèè ïðîñòûì òðàëîì | //| Ïàðàìåòðû: | //| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - òåêóùèé ñèìâîë) | //| op - îïåðàöèÿ (-1 - ëþáàÿ ïîçèöèÿ) | //| mn - MagicNumber (-1 - ëþáîé ìàãèê) | //+----------------------------------------------------------------------------+ void Trailing(string sy="", int op=-1, int mn=-1) { double p, pp; int i, k=OrdersTotal(); if (sy=="") sy=Symbol(); p=MarketInfo(sy, MODE_POINT); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy && (op<0 || OrderType()==op)) { if (mn<0 || OrderMagicNumber()==mn) { if (OrderType()==OP_BUY) { pp=MarketInfo(sy, MODE_BID); if (!TrailProfitOnly || (pp-OrderOpenPrice())>TrailingStop*p) { if (OrderStopLoss()<pp-(TrailingStop+TrailingStep-1)*p) { ModifyOrder(-1, pp-TrailingStop*p, -1, -1); } } } if (OrderType()==OP_SELL) { pp=MarketInfo(sy, MODE_ASK); if (!TrailProfitOnly || OrderOpenPrice()-pp>TrailingStop*p) { if (OrderStopLoss()>pp+(TrailingStop+TrailingStep-1)*p || OrderStopLoss()==0) { ModifyOrder(-1, pp+TrailingStop*p, -1, -1); } } } } } } } } //+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 28.11.2006 | //| Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà. | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| pp - öåíà óñòàíîâêè îðäåðà | //| sl - öåíîâîé óðîâåíü ñòîïà | //| tp - öåíîâîé óðîâåíü òåéêà | //| ex - äàòà èñòå÷åíèÿ | //+----------------------------------------------------------------------------+ void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) { bool fm; color cl=IIFc(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell); double op, pa, pb, os, ot; int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it; if (pp<=0) pp=OrderOpenPrice(); if (sl<0 ) sl=OrderStopLoss(); if (tp<0 ) tp=OrderTakeProfit(); pp=NormalizeDouble(pp, dg); sl=NormalizeDouble(sl, dg); tp=NormalizeDouble(tp, dg); op=NormalizeDouble(OrderOpenPrice() , dg); os=NormalizeDouble(OrderStopLoss() , dg); ot=NormalizeDouble(OrderTakeProfit(), dg); if (pp!=op || sl!=os || tp!=ot) { for (it=1; it<=5; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl); if (fm) { break; } else { er=GetLastError(); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); Print("Error(",er,") modifying order, try ",it); Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(), " pp=",pp," sl=",sl," tp=",tp); Sleep(1000*10); } } } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int Trend(string sym = "", int TF=0, int slow = 0, int fast = 0) { double ma1=iMA(sym,TF,slow,0,2,4,1); double ma2=iMA(sym,TF,slow,0,2,4,2); double ma3=iMA(sym,TF,fast,0,2,4,1); if (sym=="" || sym=="0") sym=Symbol(); if(ma1>=ma2 && ma1<=ma3)return(1); if(ma1<=ma2 && ma1>=ma3)return(-1); return(0); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sample
Analysis
Market Information Used:
Series array that contains open prices of each bar
Indicator Curves created:
Indicators Used:
Indicator of the average true range
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy
Other Features:
It issuies visual alerts to the screen
It sends emails