//+------------------------------------------------------------------+ //| ZZ_Scalper.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "#Copyright © 2008, XrustSolution.#" #property link "#http://www.xrust.ucoz.net#" #include <stdlib.mqh> //-------------------------------------------------------------------+ extern string a="ÎÑÍÎÂÍÛÅ ÏÀÐÀÌÅÒÐÛ ÑÎÂÅÒÍÈÊÀ"; extern string b="Ìàêñèìàëüíîå êîëè÷åñòâî îðäåðîâ=20"; extern int MaxOrd_1=15; extern string c="Ñòîïëîññ: äëÿ ðåæèìà ïèïñîâêè =0"; extern int StopLoss=0; extern string d="Òåéêïðîôèò: äëÿ ðåæèìà ïèïñîâêè=0"; extern int TakeProfit=0; extern string e="Ñòàðòîâûé Ëîò ñîâåòíèêà=0,01"; extern double StartLots=0.01; extern string f="Çíà÷åíèå íà êîòîðîå áóäåò óâåëè÷èâàòüñÿ ëîò=0,01"; extern double LotsIncrementValue=0.01; extern string g="Ðàçðåøåíèå íà àâòîîïðåäåëåíèå ëîòà"; extern bool AutoLot=true; extern string h="Ïðîöåíò ðèñêà íà îäíó ñäåëêó"; extern double Risk=10; extern string ga="Ïðîôèò ïðè êîòîðîì çàêðîåòñÿ ïà÷êà îðäåðîâ=0"; extern double MInProfit=0; extern string í="Ïàóçà ìåæäó îòêðûòèåì îðäåðîâ â ìèíóòàõ=10"; extern int MinTradePause=10; extern string j="Øàã òðàëà îäèíî÷íîãî îðäåðà â ïóíêòàõ=5"; extern int TralStep=5; extern string k="Øàã òðàëà ïî Ýêâèòè ñ÷åòà â âàëþòå äåïîçèòà=5"; extern int EqvTralStep=5; extern string l="ÐÀÇÐÅØÅÍÈß È ÔËÀÃÈ"; extern string m="Ðàçðåøåíèå íà îãðàíè÷åíèå òîðãîâëè ïî âðåìåíè"; extern bool TradeOfTime=false; extern string n="×àñ íà÷àëà òîðãîâëè"; extern int StartTradeHour=0; extern string o="×àñ êîíöà òîðãîâëè"; extern int EndTradeHour=9; extern string p="Ðàçðåøåíèå íà âûâîä èíôîðìàöèè â îñíîâíîå îêíî"; extern bool ShowComment=true; extern string r="Ðàçðåøåíèå íà ðàáîòó ñ íåäîñòàòî÷íîé ìàðæîé"; extern bool MargineVarning=true; extern int SecurityCode=0; //----Variables for KimIV funcions ---------------------------------+ bool NumberOfTry=3,UseSound=false,print=false; string NameFileSound = "expert.wav"; // Íàèìåíîâàíèå çâóêîâîãî ôàéëà color clOpenBuy = Blue; // Öâåò çíà÷êà îòêðûòèÿ Buy color clOpenSell = Red; // Öâåò çíà÷êà îòêðûòèÿ Sell bool MarketWatch=false; bool gbDisabled = False; // Áëîêèðîâêà int BuyMagic1=2891,BuyMagic2=2892,BuyMagic3=2893; int SellMagic1=73351,SellMagic2=73352,SellMagic3=73353; static int PrevTime=0;double Lot; double MinLot, MaxLot, MarginMinLot; int MinLotDgts,period,GrossPeriod,GrossTrand=0; int Slippage=3; //------------------------------------------------------------------+ static double StartDepo, gEqviti; static double gPriseAp,gPriseDn,gMidPrise; int gFrChSize,tP; static bool asd=false; int BuySell_1=0,BuySell_2=0,BuySell_3=0; int gCountBuy_1=1,gCountSell_1=1; double lot; static string gTime; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ void init() { StartDepo = AccountBalance(); if(StartLots<MarketInfo(Symbol(),MODE_MINLOT)){ StartLots=MarketInfo(Symbol(),MODE_MINLOT); } if(LotsIncrementValue!=MarketInfo(Symbol(),MODE_LOTSTEP)){ LotsIncrementValue=MarketInfo(Symbol(),MODE_LOTSTEP); } lot=StartLots; return; } //+------------------------------------------------------------------+ void deinit(){Comment(" ");return(0);} //deinit | //+------------------------------------------------------------------+ int start() { if(MargineVarning){if(Varning()){Sleep(10000);return(0);}} //if(AccountNumber()!=1592739){return(0);} //if(SecurityCode!=586501){return(0);} EcvitiTral(); BuySell_1=0;BuySell_2=0;BuySell_3=0; //---- OneOrdTral(BuyMagic1,TralStep); OneOrdTral(SellMagic1,TralStep); if(NevBar()){ Info(); CloseBy(); DelOppositeOrder(); DelVs(); lot=StartLots; if(GrPorfit()>MInProfit*(CountOpOrd("0",-1,BuyMagic1)+CountOpOrd("0",-1,SellMagic1))){CloseAll();} if(TradeTime()){ IfZZ(); if(BuySell_1<0){ if(CountOpOrd("0")<MaxOrd_1&&TimeOfTrade(BuyMagic1)&&OneOrdTral(BuyMagic1,TralStep)){ lot=LotsIncrementValue*gCountBuy_1; if(AutoLot){lot=CalcLotsAuto()*gCountBuy_1;} if(lot<StartLots){lot=StartLots;} if(PorfitBuySell(1)>=PorfitBuySell(0)){OpenPosition("",0,lot,StopLoss,TakeProfit,BuyMagic1);} if(PorfitBuySell(1)<PorfitBuySell(0)){OpenPosition("",1,lot,StopLoss,TakeProfit,BuyMagic1);} } } if(BuySell_1>0){ if(CountOpOrd("0")<MaxOrd_1&&TimeOfTrade(SellMagic1)&&OneOrdTral(SellMagic1,TralStep)){ lot=LotsIncrementValue*gCountSell_1; if(AutoLot){lot=CalcLotsAuto()*gCountSell_1;} if(lot<StartLots){lot=StartLots;} if(PorfitBuySell(0)>=PorfitBuySell(1)){OpenPosition("",1,lot,StopLoss,TakeProfit,SellMagic1);} if(PorfitBuySell(0)<PorfitBuySell(1)){OpenPosition("",0,lot,StopLoss,TakeProfit,BuyMagic1);} } } } } //---- return(0); } //+------------------------------------------------------------------+ //| Ðàñ÷åò ëîòà ñîîòâ ðèñêó è áàëàíñó | //+------------------------------------------------------------------+ double CalcLotsAuto() {static double Sredstva; if(OrdersTotal()<1){Sredstva=AccountBalance();} double LotOpt,LotNeOpt,Zalog; RefreshRates(); double Marga=AccountFreeMargin(); double Balans=AccountBalance(); double LotMin=MarketInfo(Symbol(),MODE_MINLOT); double LotMax=MarketInfo(Symbol(),MODE_MAXLOT); double StepLot=MarketInfo(Symbol(),MODE_LOTSTEP); double StopLv=AccountStopoutLevel(); int PrsMinLot=1000*LotMin; if(Risk<0)Risk=0; if(Risk>100)Risk=100; if(StepLot==0.01){int step=2;}else{step=1;} //--------------------------- Zalog=(Sredstva*(Risk/100)); LotOpt=NormalizeDouble((Zalog/1000),step); if(LotOpt>LotMax)LotOpt=LotMax; return(LotOpt); } //-----------------------------------------------------------------------------+ // Âûâîäèò èíôîðìàöèþ íà ýêðàí | //-----------------------------------------------------------------------------+ void Info(){ Comment("Âñåãî Ñðåäñòâ íà ñ÷åòó ="+(DoubleToStr(AccountBalance()+PorfitBuySell(0)+PorfitBuySell(1),1))+"$\n"+ "Ñâîáîäíûõ ñðåäñòâ ="+(DoubleToStr(AccountFreeMargin(),1))+"$\n"+ "Òåêóùàÿ ïðèáûëü ="+(DoubleToStr(PorfitBuySell(0)+PorfitBuySell(1),1))+"$\n"+ "Ïðèáûëü ñ íà÷àëà òîðãîâëè ="+(DoubleToStr(AccountBalance()-StartDepo,1))+"$\n"+ gTime ); return; } //-----------------------------------------------------------------------------+ // Âûâîäèò ïðåäóïðåæäàþùåå ñîîáùåíèå | //-----------------------------------------------------------------------------+ bool Varning(){int ord;double depo; if((MarketInfo(Symbol(),MODE_MARGINREQUIRED)*StartLots*MaxOrd_1*2)>StartDepo){ depo=MarketInfo(Symbol(),MODE_MARGINREQUIRED)*StartLots*MaxOrd_1*2; ord=StartDepo/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*StartLots*2); Alert("ÍÅÄÎÑÒÀÒÎ×ÍÎ ÑÐÅÄÑÒ ÍÀ Ñ×ÅÒÅ"+"\n"+ "Äëÿ òàêîãî êîëè÷åñòâà îðäåðîâ íåîáõîäèìî"+"\n"+ "Ñòàðòîâûé Äåïîçèò ="+depo+" $\n"+ "íà Âàøè ñðåäñòâà ìîæíî îòêðûòü "+ord+" Îðäåðîâ"+"\n"+ "Ïîïîëíèòå Âàø ñ÷åò ïîæàëóéñòà"+"\n"+ "èëè óìåíüøèòå êîëè÷åñòâî îðäåðîâ"+"\n"+ "èëè óìåíüøèòå òîðãóåìûé ëîò"+"\n"+ "èëè îòêëþ÷èòå ñèãíàëèçàöèþ"); return(true); } return(false); } //-----------------------------------------------------------------------------+ // Ôóíêöèÿ êîíòðîëÿ âðåìåíè òîðãîâëè | //-----------------------------------------------------------------------------+ bool TradeTime(){ if(!TradeOfTime){ gTime="ÐÀÁÎÒÀÅÌ ÁÅÇ ÏÅÐÅÐÛÂÎÂ"; return(true);} if(TimeDayOfWeek(TimeCurrent())==5){StartTradeHour=0;} if(TimeDayOfWeek(TimeCurrent())==1){StartTradeHour=1;} if(StartTradeHour<EndTradeHour){ if(TimeHour(TimeCurrent())>=StartTradeHour&&TimeHour(TimeCurrent())<EndTradeHour ||(CountOpOrd("0")+CountOpOrd("1"))){ gTime=StringConcatenate("Äîêîíöà òîðãîâîé ñåññèè :",DoubleToStr((EndTradeHour-TimeHour(TimeCurrent())),0)," ×àñîâ"); return(true);}} if(StartTradeHour>EndTradeHour){ if(TimeHour(TimeCurrent())>=StartTradeHour||TimeHour(TimeCurrent())<EndTradeHour ||(CountOpOrd("0")+CountOpOrd("1"))){ gTime=StringConcatenate("Äîêîíöà òîðãîâîé ñåññèè :",DoubleToStr((EndTradeHour-TimeHour(TimeCurrent())),0)," ×àñîâ"); return(true);}} gTime=StringConcatenate("ÎÒÄÛÕÀÅÌ ÄÎ : ",StartTradeHour,": 00"); return(false); } //-----------------------------------------------------------------------------+ // Óñëîâèÿ âõîäà â ðûíîê | //-----------------------------------------------------------------------------+ int IfZZ(){ if(Close[1]>Open[0]){ BuySell_1=-1; gCountBuy_1++; gCountSell_1=1; return(1);} if(Close[1]<Open[0]){ BuySell_1=1; gCountBuy_1=1; gCountSell_1++; return(-1);} BuySell_1=0; return(0); } //+----------------------------------------------------------------------------+ // Óñðåäíåíèå óäàëåíèåì + //-----------------------------------------------------------------------------+ void DelVs(){int tick1=0,tick2=0,typ;double pr1=0,pr2=0; if(OrdersTotal()<2){return;} for(int n=0;n<OrdersTotal();n++){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder(0)){ tick1=OrderTicket(); pr1=OrderProfit(); if(OrderType()==0){typ=1;} if(OrderType()==1){typ=0;} if(pr1>0){ for(int x=OrdersTotal()+1;x>=0;x--){ if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder(0,typ)){ tick2=OrderTicket(); pr2=OrderProfit(); if(pr1-pr2==0){ Comment("DelVs"); if(tick2!=0){del(tick2);} if(tick1!=0){del(tick1);} return; } } } } } } } } return; } //+----------------------------------------------------------------------------+ // Âñòðå÷íîå çàêðûòèå + //-----------------------------------------------------------------------------+ void CloseBy(){ double profit1=0, profit2=0; int i, n, tip, tip2 ,ticket1=0, ticket2=0; if(OrdersTotal()<2){return;} for(n=0;n<OrdersTotal();n++){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder("0")){ if(OrderProfit()<0){ tip=OrderType(); profit1=OrderProfit(); ticket1=OrderTicket(); if(tip==1){tip2=0;} if(tip==0){tip2=1;} for(n=0;n<OrdersTotal();n++){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder("0",tip2)){ if((OrderProfit()+profit1)>=0){ if(ticket1!=0&&OrderTicket()!=0){OrderCloseBy(ticket1,OrderTicket(),White);} } } } } } } } } } //+----------------------------------------------------------------------------+ // Âîçâðàùàåò ñàìûé äàëüíèé îðäåð + //-----------------------------------------------------------------------------+ double OrderDistanse(double prise=0){double gprise=0;int n; if(OrdersTotal()<2){return;} if(prise==0){ for(n=0;n<OrdersTotal();n++){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder("0")){ if(OrderProfit()<0){ if(MathAbs(Bid-OrderOpenPrice())>prise){ prise=OrderOpenPrice(); } } } } } return(prise); } if(prise!=0){ for(n=0;n<OrdersTotal();n++){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder("0")){ if(OrderProfit()<0){ if(MathAbs(Bid-OrderOpenPrice())>gprise&&(OrderOpenPrice()!=prise)){ gprise=OrderOpenPrice(); } } } } } return(gprise); } return(0); } //+----------------------------------------------------------------------------+ // Åùå îäíî óñðåäíåíèå 2 + //-----------------------------------------------------------------------------+ void DelOppositeOrder(){ double prise=0,profit=0,Grprofit=0; int n, tick=0,tip=-1,tip2=-1,countord=0; int ticket[100]; //for(n=0;n<CountOpOrd(0);n++){ Grprofit=0; for(n=0;n<OrdersTotal();n++){ if(OrderDistanse(prise)!=0){ prise=OrderDistanse(prise); tick=OrderTicket(); profit=OrderProfit(); tip=OrderType(); } if(tip==1){tip2=0;} if(tip==0){tip2=1;} if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder("0",tip2)){ if(OrderProfit()>0){ Grprofit=Grprofit+OrderProfit(); ticket[countord]=OrderTicket(); countord++; } } } } if(profit+Grprofit>MInProfit){ ArrayResize(ticket,countord+1); double profit2=0; if(OrderSelect(tick,SELECT_BY_TICKET,MODE_TRADES)){ if(OrderCloseTime()==0){ for(int i=0;i<CountOpOrd("0")+1;i++){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if(OrderProfit()>profit2){ if(OrderType()==tip2){ if(OrderCloseTime()==0){ profit2=OrderProfit(); int ticket2=OrderTicket(); } } } } } if(ticket2!=0&&tick>0){OrderCloseBy(tick,ticket2,White);} for(i=0;i<countord+1;i++){ if(OrderSelect(ticket[i],SELECT_BY_TICKET,MODE_TRADES)){ if(OrderCloseTime()==0){del(OrderTicket());} } } return; } } } } //+------------------------------------------------------------------+ //|Òðàë ïî ýêâèòè | //+------------------------------------------------------------------+ void EcvitiTral(){int i, n ,x;double Gpr=0; if(OrdersTotal()<1){gEqviti=AccountBalance();return;} for(i=0;i<OrdersTotal();i++){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ Gpr=Gpr+OrderProfit()+OrderSwap()+OrderCommission(); } } if((AccountBalance()+Gpr)-EqvTralStep>gEqviti){gEqviti=gEqviti+EqvTralStep;} else{if(gEqviti>AccountBalance()&&gEqviti>StartDepo){ CloseAll();if(OrdersTotal()<1){gEqviti=AccountBalance();return;}}} return; } //+------------------------------------------------------------------+ //| ïðîâåðÿåò ðûíî÷íûé îðäåð íà ïðèíàäëåæíîñòü ñîãëàñíî óñëîâèÿì | //+------------------------------------------------------------------+ bool IfOrder(string Sy="",int Typ=-1,int Magik=-1){ if(Sy=="0"){Sy=Symbol();} if(OrderSymbol()==Sy||Sy==""){ if(OrderType()==Typ||Typ==(-1)){ if(OrderMagicNumber()==Magik||Magik==(-1)){ return(true); } } } return(false); } //+------------------------------------------------------------------+ //| Ïîäñ÷èòûâàåò êîëè÷åñòâî îòêðûòûõ îðäåðîâ ñîãëàñíî óñëîâèÿì | //+------------------------------------------------------------------+ int CountOpOrd(string Sy="",int Typ=-1,int Magik=-1){int count=0; if(Sy=="0"){Sy=Symbol();} for(int i=0;i<OrdersTotal();i++){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if(OrderSymbol()==Sy||Sy==""){ if(OrderType()==Typ||Typ==(-1)){ if(OrderMagicNumber()==Magik||Magik==(-1)){ count++; } } } } } return(count); } //+----------------------------------------------------------------------------+ // Ïîäñ÷èòûâàåò Îáùóþ íå ðåàëèçîâàííóþ ïðèáûëü íà äàííîì èíñòðóìåíòå + //-----------------------------------------------------------------------------+ double GrPorfit(){double grpr=0; if(OrdersTotal()<2){return(0);} for(int n=0;n<OrdersTotal();n++){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(OrderSymbol()==Symbol()){grpr=grpr+OrderProfit();} } } return(grpr); } //+----------------------------------------------------------------------------+ // Ïîäñ÷èòûâàåò Îáùóþ íå ðåàëèçîâàííóþ ïðèáûëü íà äàííîì èíñòðóìåíòå + //-----------------------------------------------------------------------------+ double PorfitBuySell(int tip){double grpr=0; if(OrdersTotal()<1){return(-1);} for(int n=OrdersTotal()+1;n>=0;n--){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder("0",tip)){grpr=grpr+OrderProfit();} } } return(grpr); } //+----------------------------------------------------------------------------+ // Çàêðûâàåò âñå îðäåðà íà äàííîì èíñòðóìåíòå + //-----------------------------------------------------------------------------+ void CloseAll(){ //if(IfOrder(0)==true){ for(int n=OrdersTotal()+1;n>=0;n--){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder("0")){del(OrderTicket());} } } //} return; } //+----------------------------------------------------------------------------+ // Çàäàåò ïàóçó ìåæäó óñòàíîâêàìè îðäåðîâ + //-----------------------------------------------------------------------------+ bool TimeOfTrade(int mag){int count=0; if(OrdersTotal()<1){return(true);} for(int n=0;n<OrdersTotal();n++){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(OrderSymbol()==Symbol()){ if(OrderOpenTime()>count){count=OrderOpenTime();} } } } if((TimeCurrent()-count)>((MinTradePause)*60)){return(true);} return(false); } //+----------------------------------------------------------------------------+ // Òðàë îäíîãî îðäåðà + //-----------------------------------------------------------------------------+ bool OneOrdTral(int mag,double step){int n,count=0,StPr=0;static int PrewStPr=0; if(OrdersTotal()<1){return(true);} for(n=OrdersTotal()+1;n>=0;n--){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder("0",-1,mag)){count++;} } } if(count>1){return(true);} if(count==1){ for(n=OrdersTotal()+1;n>=0;n--){ if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ if(IfOrder("0",-1,mag)){ //Comment(OrderProfit()); if((OrderProfit()*OrderLots()*1000*Bid)>step){ StPr=(OrderProfit()*OrderLots()*1000*Bid)/step; if(StPr>=PrewStPr){PrewStPr=StPr;} else{del(OrderTicket());PrewStPr=0;return(true);} } } } } } if(OrderProfit()<0){return(true);} return(false); } //-----------------------------------------------------------------------------+ // Ôóíêöèÿ êîíòðîëÿ íîâîãî áàðà | //-----------------------------------------------------------------------------+ bool NevBar(){ static int PrevTime=0; if (PrevTime==Time[0]) return(false); PrevTime=Time[0]; return(true);} //-----------------------------------------------------------------------------+ //Óäàëÿåò ðûíî÷íûé îðäåð ñ óêàçàííûì åé òèêåòîì | //+----------------------------------------------------------------------------+ void del(int ticket){int err; for(int i=0;i<1;i++){ GetLastError();//îáíóëÿåì îøèêó OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); string symbol = OrderSymbol(); if(OrderType()==OP_BUY){RefreshRates(); double prise = MarketInfo(symbol,MODE_BID); if(!OrderClose(ticket,OrderLots(),prise,3,Green)){err = GetLastError();}} if(OrderType()==OP_SELL){RefreshRates(); prise = MarketInfo(symbol,MODE_ASK); if(!OrderClose(ticket,OrderLots(),prise,3,Green)){err = GetLastError();}} if(err == 0){PlaySound("expert.wav");break;} if(err != 0){PlaySound("timeout.wav");Print("Error for Close Funtion =",err);} while(!IsTradeAllowed()){Sleep(5000);}// åñëè ðûíîê çàíÿò òî ïîäîæäåì 5 ñåê if (err==146) while (IsTradeContextBusy()) Sleep(1000*11); } } //-----------------------------------------------------------------------------+ //___________________ÊÈÌÓ_______ÐÅÑÏÅÊÒ________È_____ÓÂÀÆÓÕÀ___________________| //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 01.09.2005 | //| Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| m - òåêñò ñîîáùåíèÿ | //+----------------------------------------------------------------------------+ void Message(string m) { //Comment(m); if (StringLen(m)>0) Print(m); } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. 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=White; 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(OrderType()==0||OrderType()==2||OrderType()==4){if(Ask-stoplevel<sl||Bid+stoplevel>tp){return;}} //if(OrderType()==1||OrderType()==3||OrderType()==5){if(Bid+stoplevel>sl||Ask-stoplevel<tp){return;}} //if(MathAbs(sl-Ask)<stoplevel||MathAbs(tp-Ask)<stoplevel){return;} if(pp==op&&sl==os&&tp==ot){return;} if ((sl==os&&(os!=0||sl!=0))&& (tp==ot&&(ot!=0||tp!=0))) {return;} for (it=1; it<=NumberOfTry; it++) { //if ((!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl); if (fm) { if (UseSound) PlaySound(NameFileSound); break; } else { er=GetLastError(); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); if(print){Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it); Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(), " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);} Sleep(1000*10); //if(er==130){del(OrderTicket());} } } //} } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 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); } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 01.09.2005 | //| Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè | //+----------------------------------------------------------------------------+ string GetNameOP(int op) { switch (op) { case OP_BUY : return("Buy"); case OP_SELL : return("Sell"); case OP_BUYLIMIT : return("BuyLimit"); case OP_SELLLIMIT: return("SellLimit"); case OP_BUYSTOP : return("BuyStop"); case OP_SELLSTOP : return("SellStop"); default : return("Unknown Operation"); } } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 10.04.2008 | //| Îïèñàíèå : Îòêðûâàåò ïîçèöèþ ïî ðûíî÷íîé öåíå. | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| sy - íàèìåíîâàíèå èíñòðóìåíòà (NULL èëè "" - òåêóùèé ñèìâîë) | //| op - îïåðàöèÿ | //| ll - ëîò | //| sl - óðîâåíü ñòîï | //| tp - óðîâåíü òåéê | //| mn - MagicNumber | //+----------------------------------------------------------------------------+ void OpenPosition(string sy, int op, double ll, double Sl=0, double Tp=0, int mn=0) { color clOpen; datetime ot; double pp, pa, pb, tp ,sl; int dg, err, it, ticket=0; string lsComm=""; if (sy=="" || sy=="0") sy=Symbol(); int stoplevel=MarketInfo(sy,MODE_STOPLEVEL); int spread=MarketInfo(sy,MODE_SPREAD); if(Tp!=0&&Tp<stoplevel+spread){Tp=stoplevel;} if (op<1){ if (Sl>0) {sl=MarketInfo(Symbol(),MODE_ASK)-Sl*Point; }else {sl=0;} if (Tp>0) {tp=MarketInfo(Symbol(),MODE_ASK)+Tp*Point; }else{ tp=0;} }else{ if (Sl>0) {sl=MarketInfo(Symbol(),MODE_BID)+Sl*Point; }else{ sl=0;} if (Tp>0) {tp=MarketInfo(Symbol(),MODE_BID)-Tp*Point;} else {tp=0;}} if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell; for (it=1; it<=NumberOfTry; it++) { if (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, lsComm, mn, 0, clOpen); else ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen); if (ticket>0) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); if (pa==0 && pb==0) Message("Ïðîâåðüòå â Îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy); // Âûâîä ñîîáùåíèÿ îá îøèáêå if(print){ Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it); Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op), " pp=",pp," sl=",sl," tp=",tp," mn=",mn);} // Áëîêèðîâêà ðàáîòû ñîâåòíèêà if (err==2 || err==64 || err==65 || err==133) { gbDisabled=True; 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)) { if (UseSound) PlaySound(NameFileSound); 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)) ModifyOrder(-1, sl, tp); } } //+----------------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
It automatically opens orders when conditions are reached
Other Features:
It issuies visual alerts to the screen
It plays sound alerts