//+------------------------------------------------------------------+ //| e-mdrNightTrade.mq4 | //| Êèì Èãîðü Â. aka KimIV | //| http://www.kimiv.ru | //| | //| 14.02.2006 Íî÷íûå ïîêóïêè. Ìóëüòèäíåâíàÿ âåðñèÿ. | //| 21.02.2006 Ê ïîääåðæêå USDJPY äîáàâèë USDCHF. | //| 21.02.2006 Äîáàâèë ïîääåðæêó EURUSD è GBPUSD. | //| 23.02.2006 Âåðñèÿ äëÿ OnLine-òîðãîâëè. | //+------------------------------------------------------------------+ #property copyright "Êèì Èãîðü Â. aka KimIV" #property link "http://www.kimiv.ru" //------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà -------------------------------- extern string _P_Expert = "---------- Ïàðàìåòðû ñîâåòíèêà"; extern int MAGIC = 20060223; extern bool UseOneAccount = True; // Òîðãîâàòü òîëüêî íà îäíîì ñ÷¸òå extern int NumberAccount = 5596; // Íîìåð òîðãîâîãî ñ÷¸òà extern string Name_Expert = "e-mdrNightTrade"; extern bool UseSound = False; // Èñïîëüçîâàòü çâóêîâîé ñèãíàë extern string NameFileSound = "expert.wav"; // Íàèìåíîâàíèå çâóêîâîãî ôàéëà extern bool ShowComment = True; // Ïîêàçûâàòü êîììåíòàðèè extern string _P_Trade = "---------- Ïàðàìåòðû òîðãîâëè"; extern int Slippage = 3; // Ïðîñêàëüçûâàíèå öåíû extern int NumberOfTry = 7; // Êîëè÷åñòâî ïîïûòîê extern int PauseAfterError = 21; // Ïàóçà ïîñëå îøèáêè â ñåêóíäàõ //---- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà ------------------------------- color clOpenBuy = LightBlue; color clOpenSell = LightCoral; color clCloseBuy = Blue; color clCloseSell = Red; bool bCanTrade, bTradeBuy; int HourOpenPos, MinuteOpenPos; // Âðåìÿ îòêðûòèÿ ïîçèöèè int DepthHistory, RangeCutOff; // Äëÿ àíàëèçà äâèæåíèÿ int StopLoss, TakeProfit; // Ðàçìåðû ñòîïà è òýéêà int HourClosePos; // ×àñ çàêðûòèÿ ïîçèöèè //------- Ïîêëþ÷åíèå âíåøíèõ ìîäóëåé --------------------------------- #include <b-Lots.mqh> #include <stdlib.mqh> //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ void deinit() { if (!IsTesting()) Comment(""); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ void start() { if (!IsTesting()) { if (UseOneAccount && AccountNumber()!=NumberAccount) { Comment("Íà ñ÷¸òå "+AccountNumber()+" òîðãîâëÿ ÇÀÏÐÅÙÅÍÀ!"); return; } else Comment(""); if (Period()>PERIOD_M15) { Comment("Ñîâåòíèê "+Name_Expert+" ÍÅ ïîääåðæèâàåò ÒÔ âûøå M15!"); return; } else Comment(""); } if (InitParameters()) { if (Hour()==HourOpenPos && Minute()>=MinuteOpenPos && Minute()<=MinuteOpenPos+4) OpenPositions(); if (!IsTesting() && ShowComment) { Lots=GetSizeLot(); Comment("TimeOpen="+toTime(HourOpenPos, MinuteOpenPos)+ " Lots="+DoubleToStr(Lots, 1)+ " LS="+StopLoss+" ï. TP="+TakeProfit+" ï."+ " TimeClose="+toTime(HourClosePos)); } if (Hour()==HourClosePos) CloseAllPositions(); } } //+------------------------------------------------------------------+ //| Èíèöèàëèçàöèÿ ïàðàìåòðîâ | //+------------------------------------------------------------------+ bool InitParameters() { if (Symbol()=="EURUSD") { bTradeBuy=False; switch (DayOfWeek()) { case 1: HourOpenPos=23; MinuteOpenPos=30; DepthHistory=36; RangeCutOff=10; StopLoss=32; TakeProfit=38; HourClosePos=15; return(True); case 2: HourOpenPos=23; MinuteOpenPos=45; DepthHistory=16; RangeCutOff=4; StopLoss=36; TakeProfit=28; HourClosePos=3; return(True); case 3: HourOpenPos=23; MinuteOpenPos=45; DepthHistory=14; RangeCutOff=12; StopLoss=66; TakeProfit=20; HourClosePos=2; return(True); case 4: HourOpenPos=23; MinuteOpenPos=0; DepthHistory=36; RangeCutOff=24; StopLoss=66; TakeProfit=36; HourClosePos=15; return(True); case 5: HourOpenPos=21; MinuteOpenPos=45; DepthHistory=28; RangeCutOff=6; StopLoss=32; TakeProfit=50; HourClosePos=3; return(True); } } else if (Symbol()=="GBPUSD") { bTradeBuy=False; switch (DayOfWeek()) { case 1: HourOpenPos=23; MinuteOpenPos=15; DepthHistory=30; RangeCutOff=14; StopLoss=38; TakeProfit=27; HourClosePos=14; return(True); case 2: HourOpenPos=23; MinuteOpenPos=0; DepthHistory=14; RangeCutOff=18; StopLoss=32; TakeProfit=36; HourClosePos=3; return(True); case 3: HourOpenPos=23; MinuteOpenPos=0; DepthHistory=26; RangeCutOff=34; StopLoss=46; TakeProfit=22; HourClosePos=2; return(True); case 4: HourOpenPos=23; MinuteOpenPos=0; DepthHistory=32; RangeCutOff=27; StopLoss=37; TakeProfit=20; HourClosePos=4; return(True); case 5: HourOpenPos=21; MinuteOpenPos=45; DepthHistory=8; RangeCutOff=22; StopLoss=30; TakeProfit=20; HourClosePos=3; return(True); } } else if (Symbol()=="USDCHF") { bTradeBuy=True; switch (DayOfWeek()) { case 1: HourOpenPos=23; MinuteOpenPos=0; DepthHistory=8; RangeCutOff=4; StopLoss=38; TakeProfit=48; HourClosePos=15; return(True); case 2: HourOpenPos=23; MinuteOpenPos=45; DepthHistory=30; RangeCutOff=20; StopLoss=64; TakeProfit=36; HourClosePos=3; return(True); case 3: HourOpenPos=23; MinuteOpenPos=15; DepthHistory=12; RangeCutOff=12; StopLoss=60; TakeProfit=58; HourClosePos=3; return(True); case 4: HourOpenPos=23; MinuteOpenPos=30; DepthHistory=44; RangeCutOff=42; StopLoss=48; TakeProfit=62; HourClosePos=13; return(True); case 5: HourOpenPos=21; MinuteOpenPos=45; DepthHistory=40; RangeCutOff=40; StopLoss=40; TakeProfit=60; HourClosePos=13; return(True); } } else if (Symbol()=="USDJPY") { bTradeBuy=True; switch (DayOfWeek()) { case 1: HourOpenPos=22; MinuteOpenPos=45; DepthHistory=6; RangeCutOff=6; StopLoss=30; TakeProfit=16; HourClosePos=0; return(True); case 2: HourOpenPos=22; MinuteOpenPos=45; DepthHistory=32; RangeCutOff=26; StopLoss=56; TakeProfit=16; HourClosePos=6; return(True); case 3: HourOpenPos=20; MinuteOpenPos=45; DepthHistory=60; RangeCutOff=40; StopLoss=48; TakeProfit=14; HourClosePos=3; return(True); case 4: HourOpenPos=22; MinuteOpenPos=0; DepthHistory=16; RangeCutOff=9; StopLoss=48; TakeProfit=14; HourClosePos=1; return(True); case 5: HourOpenPos=17; MinuteOpenPos=30; DepthHistory=4; RangeCutOff=14; StopLoss=48; TakeProfit=16; HourClosePos=3; return(True); } } else { Comment("Ñîâåòíèê ÍÅ ïîääåðæèâàåò ðàáîòó ñ "+Symbol()); return(False); } } //+------------------------------------------------------------------+ //| Äîáàâëÿåò "0" | //+------------------------------------------------------------------+ string AddZero(string s) { switch (StringLen(s)) { case 0: s="00"; return(s); case 1: s="0"+s; return(s); case 2: return(s); default: return(StringSubstr(s,StringLen(s)-2)); } } //+------------------------------------------------------------------+ //| Ïðåîáðàçóåò äâà öåëûõ ÷èñëà â ôîðìàò âðåìåíè | //+------------------------------------------------------------------+ string toTime(int h=0, int m=0, int s=0) { string st=""; if (h==0) st="00:"; else st=AddZero(h)+":"; if (m==0) st=st+"00"; else st=st+AddZero(m); if (s!=0) st=st+":"+AddZero(s); return(st); } //+------------------------------------------------------------------+ //| Îòêðûòèå ïîçèöèé | //+------------------------------------------------------------------+ void OpenPositions() { double ldStop=0, ldTake=0; int bs=GetTradeSignal(); if (!ExistPosition()) { if (bs>0) { if (StopLoss!=0) ldStop=Ask-StopLoss*Point; if (TakeProfit!=0) ldTake=Ask+TakeProfit*Point; OpenPosition(OP_BUY, ldStop, ldTake); } if (bs<0) { if (StopLoss!=0) ldStop=Bid+StopLoss*Point; if (TakeProfit!=0) ldTake=Bid-TakeProfit*Point; OpenPosition(OP_SELL, ldStop, ldTake); } } } //+------------------------------------------------------------------+ //| Âîçâðàùàåò òîðãîâûé ñèãíàë: | //| 1 - ïîêóïàé | //| 0 - ñèäè, êóðè áàìáóê | //| -1 - ïðîäàâàé | //+------------------------------------------------------------------+ int GetTradeSignal() { int bs=0, nb; if (bTradeBuy) { nb=Highest(NULL, 15, MODE_HIGH, DepthHistory, 1); if (High[nb]-Close[1]>RangeCutOff*Point) bs=1; } else { nb=Lowest(NULL, 15, MODE_LOW, DepthHistory, 1); if (Close[1]-Low[nb]>RangeCutOff*Point) bs=-1; } return(bs); } //+------------------------------------------------------------------+ //| Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèè | //+------------------------------------------------------------------+ bool ExistPosition() { bool Exist=False; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { Exist=True; break; } } } } return(Exist); } //+------------------------------------------------------------------+ //| Îòêðûòèå ïîçèöèè | //| Ïàðàìåòðû: | //| op - îïåðàöèÿ | //| ldStop - óðîâåíü ñòîï | //| ldTake - óðîâåíü òåéê | //+------------------------------------------------------------------+ void OpenPosition(int op, double ldStop, double ldTake) { color clOpen; double pp; int err, it, ticket; string lsComm=GetCommentForOrder(); if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell; Lots=GetSizeLot(); for (it=1; it<=NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); if (op==OP_BUY) pp=Ask; else pp=Bid; pp=NormalizeDouble(pp, Digits); ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpen); if (ticket>0) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it); Sleep(1000*PauseAfterError); } } } //+------------------------------------------------------------------+ //| Ãåíåðèðóåò è âîçâðàùàåò ñòðîêó êîìåíòàðèÿ äëÿ îðäåðà èëè ïîçèöèè | //+------------------------------------------------------------------+ string GetCommentForOrder() { return(Name_Expert+" "+GetNameTF(Period())); } //+------------------------------------------------------------------+ //| Âîçâðàùàåò íàèìåíîâàíèå òàéìôðåéìà | //+------------------------------------------------------------------+ string GetNameTF(int TimeFrame) { switch (TimeFrame) { case PERIOD_MN1: return("Monthly"); case PERIOD_W1: return("Weekly"); case PERIOD_D1: return("Daily"); case PERIOD_H4: return("H4"); case PERIOD_H1: return("H1"); case PERIOD_M30: return("M30"); case PERIOD_M15: return("M15"); case PERIOD_M5: return("M5"); case PERIOD_M1: return("M1"); default: return("UnknownPeriod"); } } //+------------------------------------------------------------------+ //| Çàêðûòèå âñåõ ïîçèöèé ïî ðûíî÷íîé öåíå | //+------------------------------------------------------------------+ void CloseAllPositions() { bool fc; int err, it; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { fc=False; for (it=1; it<=NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); if (OrderType()==OP_BUY) { fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy); if (fc) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") closing buy: ",ErrorDescription(err),", try ",it); Sleep(1000*PauseAfterError); } } if (OrderType()==OP_SELL) { fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell); if (fc) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") closing sell: ",ErrorDescription(err),", try ",it); Sleep(1000*PauseAfterError); } } } } } } } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It Closes Orders by itself
Other Features:
It plays sound alerts