//+------------------------------------------------------------------+ //| Arrow Signal EA KK (MT4) | //| Indicator to EA Robot Converter | //+------------------------------------------------------------------+ #property strict //--- Settings input string IndicatorName = "ArrowSignal"; // Custom indicator name (without .ex4) input int BuyBuffer = 0; input int SellBuffer = 1; input bool OpenOnClosedBar = false; // false = open on current candle, true = open on closed candle input bool CloseOnOpposite = true; // Close on opposite signal input double LotSize = 0.1; input double StopLossPips = 1000; input double TakeProfitPips = 1000; input int MagicNumber = 123456; input int FromHour1 = 9; input int FromMinute1 = 0; input int ToHour1 = 20; input int ToMinute1 = 0; input int FromHour2 = 0; input int FromMinute2 = 0; input int ToHour2 = 0; input int ToMinute2 = 0; input int FromHour3 = 0; input int FromMinute3 = 0; input int ToHour3 = 0; input int ToMinute3 = 0; input bool EnableNonStopTrading = false; // If true, time restrictions are disabled //--- EMA Filter Settings input bool EnableEMAFilter = true; // Enable/Disable EMA filter input int EMA_Period = 50; // EMA Period input ENUM_MA_METHOD MAMethod = MODE_SMA; input ENUM_APPLIED_PRICE MAPrice = PRICE_CLOSE; input int MAShift = 0; //--- Bollinger Bands Filter Settings input bool EnableBollingerFilter = true; // Enable/Disable Bollinger Bands filter input int BB_Period = 100; // Bollinger Bands Period input double BB_Deviation = 2.0; // Bollinger Bands Deviation //--- Változók bool tradeExecuted = false; //+------------------------------------------------------------------+ //| Időintervallum ellenőrzés | //+------------------------------------------------------------------+ bool IsWithinTimeRange() { if (EnableNonStopTrading) return true; datetime now = TimeCurrent(); string t1_from = TimeToString(now, TIME_DATE) + " " + IntegerToString(FromHour1) + ":" + IntegerToString(FromMinute1); string t1_to = TimeToString(now, TIME_DATE) + " " + IntegerToString(ToHour1) + ":" + IntegerToString(ToMinute1); string t2_from = TimeToString(now, TIME_DATE) + " " + IntegerToString(FromHour2) + ":" + IntegerToString(FromMinute2); string t2_to = TimeToString(now, TIME_DATE) + " " + IntegerToString(ToHour2) + ":" + IntegerToString(ToMinute2); string t3_from = TimeToString(now, TIME_DATE) + " " + IntegerToString(FromHour3) + ":" + IntegerToString(FromMinute3); string t3_to = TimeToString(now, TIME_DATE) + " " + IntegerToString(ToHour3) + ":" + IntegerToString(ToMinute3); return (now >= StrToTime(t1_from) && now <= StrToTime(t1_to)) || (now >= StrToTime(t2_from) && now <= StrToTime(t2_to)) || (now >= StrToTime(t3_from) && now <= StrToTime(t3_to)); } //+------------------------------------------------------------------+ //| Pozíciók zárása | //+------------------------------------------------------------------+ void CloseAllPositions() { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { int ticket = OrderTicket(); double lots = OrderLots(); if(OrderType() == OP_BUY) { if(OrderClose(ticket, lots, Bid, 3, clrRed)) Print("Buy pozíció sikeresen zárva."); else Print("Hiba a Buy zárásakor: ", GetLastError()); } if(OrderType() == OP_SELL) { if(OrderClose(ticket, lots, Ask, 3, clrRed)) Print("Sell pozíció sikeresen zárva."); else Print("Hiba a Sell zárásakor: ", GetLastError()); } } } } tradeExecuted = false; } //+------------------------------------------------------------------+ //| Van-e nyitott pozíció | //+------------------------------------------------------------------+ bool HasOpenPosition() { for(int i=0; i emaValue) return true; else return false; } bool IsPriceBelowEMA() { double emaValue = iMA(Symbol(), 0, EMA_Period, 0, MODE_SMA, PRICE_CLOSE, 0); if (Close[0] < emaValue) return true; else return false; } //+------------------------------------------------------------------+ //| Bollinger Bands szűrő | //+------------------------------------------------------------------+ bool IsPriceAboveUpperBB() { double upperBB = iBands(Symbol(), 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE, MODE_UPPER, 0); if (Close[0] > upperBB) return true; else return false; } bool IsPriceBelowLowerBB() { double lowerBB = iBands(Symbol(), 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE, MODE_LOWER, 0); if (Close[0] < lowerBB) return true; else return false; } //+------------------------------------------------------------------+ //| OnTick | //+------------------------------------------------------------------+ void OnTick() { int signalBarShift = OpenOnClosedBar ? 1 : 0; double buySignal = iCustom(Symbol(), 0, IndicatorName, BuyBuffer, signalBarShift); double sellSignal = iCustom(Symbol(), 0, IndicatorName, SellBuffer, signalBarShift); bool isTradeTime = IsWithinTimeRange(); bool hasPosition = HasOpenPosition(); tradeExecuted = hasPosition; // <-- Ez a módosítás oldja meg a hibát if(!isTradeTime) { if(hasPosition) CloseAllPositions(); return; } // EMA és Bollinger Bands szűrők ellenőrzése bool isAboveEMA = EnableEMAFilter ? IsPriceAboveEMA() : true; bool isBelowEMA = EnableEMAFilter ? IsPriceBelowEMA() : true; bool isAboveUpperBB = EnableBollingerFilter ? IsPriceAboveUpperBB() : true; bool isBelowLowerBB = EnableBollingerFilter ? IsPriceBelowLowerBB() : true; // Új pozíció nyitása if(!hasPosition && !tradeExecuted) { if(buySignal != EMPTY_VALUE && buySignal != 0 && isAboveEMA && isAboveUpperBB) { double sl = Bid - StopLossPips * Point; double tp = Bid + TakeProfitPips * Point; int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp, "Buy Signal", MagicNumber, 0, clrGreen); if(ticket > 0) { Print("Buy pozíció nyitva."); tradeExecuted = true; } else { Print("Hiba Buy nyitásakor: ", GetLastError()); } } else if(sellSignal != EMPTY_VALUE && sellSignal != 0 && isBelowEMA && isBelowLowerBB) { double sl = Ask + StopLossPips * Point; double tp = Ask - TakeProfitPips * Point; int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp, "Sell Signal", MagicNumber, 0, clrRed); if(ticket > 0) { Print("Sell pozíció nyitva."); tradeExecuted = true; } else { Print("Hiba Sell nyitásakor: ", GetLastError()); } } } // Pozíció zárása ellentétes jelre else if(CloseOnOpposite) { for(int i=0; i