//+------------------------------------------------------------------+ //| MorninFlat_Expert.mq4 | //| Scriptong | //| | //+------------------------------------------------------------------+ #property copyright "Scriptong" #property link "" //---- input parameters extern double Lots = 0.1; extern int StartHour = 0; extern int EndHour = 8; extern double TargetLevel = 200; extern int MagicNumber = 17589 ; bool Activate, FreeMarginAlert; double Tick, Spread, StopLevel, MinLot, MaxLot, LotStep; double FUp, FDn; // Çíà÷åíèÿ ïîñëåäíèõ ôðàêòàëîâ (FUp - ïåðâûé âåðõíèé, FDn - ïåðâûé íèæíèé) int NUp, NDn; datetime LastBar, LastBuyBar, LastSellBar, EuroLast, FrancLast; int CurTrend, EuroTrend, FrancTrend; // Òåêóùåå íàïðàâëåíèå òðåíäà (0 - íå îïðåäåëåíî, 1 - âîñõîäÿùèé, 2 - íèñõîäÿùèé) double EuroLowV, EuroHighV, EuroTargetU, EuroTargetD, FrancLowV, FrancHighV, FrancTargetU, FrancTargetD; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Activate = False; Tick = MarketInfo(Symbol(), MODE_TICKSIZE); Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point); StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point+Tick); MinLot = MarketInfo(Symbol(), MODE_MINLOT); MaxLot = MarketInfo(Symbol(), MODE_MAXLOT); LotStep = MarketInfo(Symbol(), MODE_LOTSTEP); // Ïðîâåðêà êîððåêòíîñòè îáúåìà ñäåëêè if(Lots < MinLot || Lots > MaxLot) { Comment("Ïàðàìåòðîì Lots áûë çàäàí íåïðàâèëüíûé îáúåì ñäåëêè! Ñîâåòíèê îòêëþ÷åí!"); return(0); } Lots = MathRound(Lots/LotStep)*LotStep; if(StartHour < 0 || EndHour < 0 || StartHour > 23 || EndHour > 23 || StartHour >= EndHour) { Comment("Çíà÷åíèÿ StartHour è EndHour äîëæíû ëåæàòü â äèàïàçîíå îò 0 äî 24 è StartHour < EndHour."); return(0); } LastBar = 0; LastBuyBar = 0; LastSellBar = 0; EuroLast = 0; FrancLast = 0; Activate = True; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- Comment(""); //---- return(0); } //+------------------------------------------------------------------+ //| Ïðèâåäåíèå çíà÷åíèé ê òî÷íîñòè îäíîãî òèêà | //+------------------------------------------------------------------+ double ND(double A) { return(NormalizeDouble(A, Digits)); } //+------------------------------------------------------------------+ //| Îòêðûòèå ïîçèöèè | //| Âîçâðàùàåò: | //| True - Ïîçèöèÿ îòêðûòà óñïåøíî | //| False - Îøèáêà îòêðûòèÿ | //+------------------------------------------------------------------+ bool OpenOrder(int Type, double Price, double SL, double TP) { // Áëîê ïðîâåðêè äîñòàòî÷íîñòè ñâîáîäíûõ ñðåäñòâ if(AccountFreeMarginCheck(Symbol(), OP_BUY, Lots) <= 0 || GetLastError() == 134) { if(!FreeMarginAlert) { Print("Íåäîñòàòî÷íî ñðåäñòâ äëÿ îòêðûòèÿ ïîçèöèè. Free Margin = ", AccountFreeMargin()); FreeMarginAlert = True; } return; } FreeMarginAlert = False; // --------------------------------------------- if(Type == OP_BUY) string S = "BUY"; else S = "SELL"; int ticket=OrderSend(Symbol(), Type, Lots, ND(Price), 3, SL, TP, NULL, MagicNumber, 0, CLR_NONE); if(ticket<0) { Print("Îøèáêà îòêðûòèÿ ïîçèöèè ", S, ": ",GetLastError()); return(False); } return(True); } //+----------------------------------------------------------------------------------------------------------------------+ //| Çàêðûâàåò âñå ïîçèöèè òèïà Type. Åñëè çàêðûòü íå óäàëîñü èëè ïðèñóòñòâóþò ïðîòèâîïîëîæíûå ïîçèöèè, âîçâðàùàåò False | //+----------------------------------------------------------------------------------------------------------------------+ bool CheckOrders(int Type) { for(int i = OrdersTotal()-1; i >= 0; i--) if(OrderSelect(i, SELECT_BY_POS)) if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() < 2) if(OrderType() == Type) { if(Type == OP_BUY) double Pr = ND(Bid); else Pr = ND(Ask); if(!OrderClose(OrderTicket(), OrderLots(), Pr, 3)) return(False); else RefreshRates(); } else { if (OrderType() == OP_BUY) LastBuyBar = iTime(Symbol(), PERIOD_D1, 0); else LastSellBar = iTime(Symbol(), PERIOD_D1, 0); return(False); } return(True); } //+----------------------------------+ //| Ïîèñê ïðîáèòèÿ ïî îäíîé âàëþòå. | //+----------------------------------+ void CheckBit(string Pair, double& LowV, double& HighV, double& TargetU, double& TargetD, int& Trend) { datetime BeginDay = iTime(Pair, PERIOD_D1, 0); // Ðàñ÷åò âðåìåíè íà÷àëà ñóòîê int StartBar = iBarShift(Pair, PERIOD_H1, BeginDay+StartHour*3600); // Áàð, ñîîòâåòñâóþùèé íà÷àëó ñóòîê ïëþñ ñìåùåíèå â ÷àñàõ int FinishBar = iBarShift(Pair, PERIOD_H1, BeginDay+(EndHour-1)*3600); // Áàð, ñîîòâåòñòâóþùèé ïîñëåäíåìó áàðó "óòðåííåãî ôëýòà" LowV = iLow(Pair, PERIOD_H1, iLowest(Pair, PERIOD_H1, MODE_LOW, StartBar-FinishBar+1, FinishBar)); // Íèæíÿÿ ãðàíèöà HighV = iHigh(Pair, PERIOD_H1, iHighest(Pair, PERIOD_H1, MODE_HIGH, StartBar-FinishBar+1, FinishBar)); // Âåðõíÿÿ ãðàíèöà TargetU = (HighV-LowV)*(TargetLevel-100)/100+HighV; TargetD = LowV-(HighV-LowV)*(TargetLevel-100)/100; // ------------------------ // Ïîèñê ïîñëåäíåãî ïðîáèòèÿ êàíàëà Trend = 0; // Ïðîáåæêà ïî ìèíóòêàì int FinishBarM1 = iBarShift(Pair, PERIOD_M1, BeginDay+EndHour*3600); // Áàð íà Ì1, ñîîòâåòñâóþùèé íà÷àëó ÷àñà EndHour for(int i = 0; i < FinishBarM1; i++) { if(iHigh(Pair, PERIOD_M1, i) > HighV) { Trend = 1; break; } if(iLow(Pair, PERIOD_M1, i) < LowV) { Trend = 2; break; } } // --------------------- } //+------------------------------+ //| Ïðîâåðêà âîçìîæíîñòè âõîäà. | //+------------------------------+ void CheckLevels() { // ðàñ÷åò çíà÷åíèé äëÿ åâðî if (EuroLast < iTime("EURUSD", PERIOD_D1, 0)) { EuroTrend = 0; CheckBit("EURUSD", EuroLowV, EuroHighV, EuroTargetU, EuroTargetD, EuroTrend); EuroLast = iTime("EURUSD", PERIOD_D1, 0); } else if (iATR("EURUSD", PERIOD_D1, 24, 1) > 2*(EuroHighV - EuroLowV)) { if (Symbol() == "EURUSD") double Price = ND(Bid); else Price = ND(iClose("EURUSD", PERIOD_M1, 1)); if (Price > EuroHighV) EuroTrend = 1; if (Price < EuroLowV) EuroTrend = 2; } else EuroTrend = 0; // ------------------------- // ðàñ÷åò çíà÷åíèé äëÿ ôðàíêà if (FrancLast < iTime("USDCHF", PERIOD_D1, 0)) { FrancTrend = 0; CheckBit("USDCHF", FrancLowV, FrancHighV, FrancTargetU, FrancTargetD, FrancTrend); FrancLast = iTime("USDCHF", PERIOD_D1, 0); } else if (iATR("USDCHF", PERIOD_D1, 24, 1) > 2*(FrancHighV - FrancLowV)) { if (Symbol() == "USDCHF") Price = ND(Bid); else Price = ND(iClose("USDCHF", PERIOD_M1, 1)); if (Price > FrancHighV) FrancTrend = 1; if (Price < FrancLowV) FrancTrend = 2; } // -------------------------- CurTrend = 0; if(EuroTrend > 0 && FrancTrend > 0) { if(EuroTrend == 1 && FrancTrend == 2) { if(Symbol() == "EURUSD") CurTrend = 1; if(Symbol() == "USDCHF") CurTrend = 2; } if(EuroTrend == 2 && FrancTrend == 1) { if(Symbol() == "EURUSD") CurTrend = 2; if(Symbol() == "USDCHF") CurTrend = 1; } } } //+--------------------------------------------------------+ //| Ïðîâåðêà íà ïðåäìåò äîñòèæåíèÿ ïåðâîé öåëè. | //+--------------------------------------------------------+ void CheckBreakEven() { for (int i = OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { // Ïðîâåðêà äîñòèæåíèÿ öåëè double Price = 0; // Äëÿ åâðî if (Symbol() == "EURUSD") { if (EuroTargetD == 0) return; if (OrderType() == OP_BUY) { if (ND(Bid - EuroTargetU) >= 0) { Price = ND(EuroHighV+Tick); if (ND(Price - OrderOpenPrice() - Tick) < 0) Price = ND(OrderOpenPrice() + Tick); if (ND(Bid - Price - StopLevel) <= 0 || ND(Price-OrderStopLoss()) <= 0) Price = 0; } } else if (ND(EuroTargetD - Bid) >= 0) { Price = ND(EuroLowV-Tick); if (ND(Price - OrderOpenPrice() + Tick) > 0) Price = ND(OrderOpenPrice() - Tick); if (ND(Price - StopLevel - Ask) <= 0 || ND(OrderStopLoss() - Price) <= 0) Price = 0; } } // -------------- // Äëÿ ôðàíêà if (Symbol() == "USDCHF") { if (FrancTargetD == 0) return; if (OrderType() == OP_BUY) { if (ND(Bid - FrancTargetU) >= 0) { Price = ND(FrancHighV+Tick); if (ND(Price - OrderOpenPrice() - Tick) < 0) Price = ND(OrderOpenPrice() + Tick); if (ND(Bid - Price - StopLevel) <= 0 || ND(Price-OrderStopLoss()) <= 0) Price = 0; } } else if (ND(FrancTargetD - Bid) >= 0) { Price = ND(FrancLowV-Tick); if (ND(Price - OrderOpenPrice() + Tick) > 0) Price = ND(OrderOpenPrice() - Tick); if (ND(Price - StopLevel - Ask) <= 0 || ND(OrderStopLoss() - Price) <= 0) Price = 0; } } // ------------ // ---------------------------------- // Íåïîñðåäñòâåííî ìîäèôèêàöèÿ if (Price != 0) OrderModify(OrderTicket(), 0, Price, 0, 0); return; // --------------------------- } } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- if(!Activate) return(0); CheckBreakEven(); if(Hour() < EndHour) return(0); CheckLevels(); if(CurTrend == 1) if(CheckOrders(OP_SELL)) if (LastBuyBar < iTime(Symbol(), PERIOD_D1, 0)) { if(Symbol() == "EURUSD") { double TP = ND(EuroTargetU); double SL = ND(EuroTargetD); } else { TP = ND(FrancTargetU); SL = ND(FrancTargetD); } if(ND(TP - Ask - StopLevel) > 0 && ND(Bid - SL - StopLevel) > 0) if (OpenOrder(OP_BUY, Ask, SL, 0)) LastBuyBar = iTime(Symbol(), PERIOD_D1, 0); } if(CurTrend == 2) if(CheckOrders(OP_BUY)) if (LastSellBar < iTime(Symbol(), PERIOD_D1, 0)) { if(Symbol() == "EURUSD") { TP = ND(EuroTargetD + Spread); SL = ND(EuroTargetU + Spread); } else { TP = ND(FrancTargetD + Spread); SL = ND(FrancTargetU + Spread); } if(ND(Bid - TP - StopLevel) > 0 && ND(SL - Ask - StopLevel) > 0) if (OpenOrder(OP_SELL, Bid, SL, 0)) LastSellBar = iTime(Symbol(), PERIOD_D1, 0); } //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Series array that contains close prices for each bar
Indicator Curves created:
Indicators Used:
Indicator of the average true range
Custom Indicators Used:
Order Management characteristics:
It automatically opens orders when conditions are reached
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
Other Features: