//+------------------------------------------------------------------+ //| Gold Hunter v2.0 | //| Rams Fx | //| Professional Trading Beast | //+------------------------------------------------------------------+ #property strict #include <Trade/Trade.mqh> CTrade trade; //--- INPUT PARAMETERS input double RiskPercentPerTrade = 0.8; // Risk per trade (% of balance) - Reduced for more frequent trades input double ATRMultiplierSL = 1.2; // SL as ATR multiplier - Tighter SL input double ATRMultiplierTP = 2.5; // TP as ATR multiplier - Better R:R input int ATRPeriod = 14; // ATR period input int MaxTradesPerDay = 6; // Max trades per day - Increased input int StartHourUTC = 2; // Start trading (Asian session) input int EndHourUTC = 22; // Stop trading (extended hours) input int SessionOpenBuffer = 5; // Minutes to skip after session open input bool UseTrailingStop = true; // Use trailing stop input double TrailingStopATR = 0.8; // Trailing stop as ATR multiplier - Tighter input double MinProfitATR = 1.0; // Min profit before trailing - Reduced // Enhanced Exit Strategy input bool UseSmartExit = true; // Use smart exit strategy input double PartialClosePercent = 50.0; // Partial close at 1.5R profit input double PartialCloseRatio = 1.5; // Ratio for partial close input int MaxHoldingHours = 8; // Max hours to hold position input bool UseBreakevenStop = true; // Move SL to breakeven at 1R // News Settings input bool AvoidNews = true; // Avoid news events input int MinutesBeforeNews = 20; // Minutes before news to pause - Reduced input int MinutesAfterNews = 10; // Minutes after news to pause - Reduced input int MinNewsImportance = 2; // Minimum news importance input bool AvoidUSDNewsOnly = true; // Only avoid USD news events input bool ShowUpcomingNews = true; // Show upcoming news in dashboard input double MinVolumeRatio = 1.05; // Min volume ratio - Reduced for more trades // DEBUG SETTINGS input bool EnableDebugPrints = true; // Enable debug prints for troubleshooting string SymbolsToTrade[] = {"XAUUSDm"}; //--- ENHANCED ICHIMOKU SETTINGS input int TenkanSenPeriod = 7; // Tenkan-sen period - Faster input int KijunSenPeriod = 22; // Kijun-sen period - Faster input int SenkouSpanB = 44; // Senkou Span B period - Faster input bool UseIchimokuFilter = true; // Use Ichimoku as primary filter input bool UseCloudProjection = true; // Use future cloud for S/R input int CloudProjectionBars = 22; // Bars to project cloud ahead input bool AllowCloudTrades = true; // Allow trades when price in cloud - More aggressive //--- ENHANCED INDICATOR SETTINGS input int FastMAPeriod = 5; // Fast MA period - Faster input int SlowMAPeriod = 15; // Slow MA period - Faster input int RSIPeriod = 10; // RSI period - More sensitive input int MACDFast = 8; // MACD fast EMA - Faster input int MACDSlow = 21; // MACD slow EMA - Faster input int MACDSignal = 7; // MACD signal line - Faster // Additional Filters input bool UseADXFilter = false; // Use ADX trend strength filter - DISABLED for more trades input int ADXPeriod = 14; // ADX period input double MinADXValue = 20.0; // Minimum ADX for trend trades input bool UseStochasticFilter = false; // Use Stochastic filter - DISABLED for more trades input int StochKPeriod = 8; // Stochastic %K period input int StochDPeriod = 3; // Stochastic %D period input int StochSlowing = 3; // Stochastic slowing //--- ENHANCED 3-PANEL DASHBOARD SETTINGS input bool ShowMainDashboard = true; // Show main dashboard input bool ShowPerformancePanel = true; // Show performance + risk panel input bool ShowTechnicalPanel = true; // Show technical + risk panel input color BuyColor = clrLimeGreen; // Buy signal color input color SellColor = clrRed; // Sell signal color input color NeutralColor = clrOrange; // Neutral signal color input color TextColor = clrWhite; // Text color input color PanelColor = C'24,27,31'; // Panel background color input color BorderColor = C'47,51,57'; // Border color input int MainPanelWidth = 300; // Main panel width - INCREASED input int MainPanelHeight = 680; // Main panel height - INCREASED input int SecondaryPanelWidth = 300; // Secondary panels width - INCREASED input int SecondaryPanelHeight = 680; // Secondary panels height - INCREASED input bool ShowGrid = false; // Show chart grid //--- GLOBAL VARIABLES int tradeCountToday = 0; datetime lastTradeDay = 0; // Enhanced Ichimoku structure struct IchimokuData { double tenkanSen; double kijunSen; double senkouSpanA; double senkouSpanB; double chikouSpan; double cloudTop; double cloudBottom; string trend; bool priceAboveCloud; bool priceBelowCloud; bool priceInCloud; bool tenkanAboveKijun; bool chikouAbovePrice; bool bullishSignal; bool bearishSignal; double futureCloudTop; double futureCloudBottom; string momentumStrength; double cloudThickness; bool strongTrend; }; IchimokuData ichimoku; // Enhanced tracking variables double dailyProfit = 0; double weeklyProfit = 0; double monthlyProfit = 0; double totalProfit = 0; double bestTrade = 0; double worstTrade = 0; double maxDrawdown = 0; double currentDrawdown = 0; int totalTrades = 0; int winningTrades = 0; int losingTrades = 0; double winRate = 0; double profitFactor = 0; double avgWin = 0; double avgLoss = 0; datetime lastProfitReset = 0; // Enhanced Performance tracking struct TradeStats { double totalProfit; double todayProfit; double weekProfit; double monthProfit; int totalTrades; int todayTrades; int winTrades; int lossTrades; double winRate; double profitFactor; double maxDD; double currentDD; double bestTrade; double worstTrade; double avgWin; double avgLoss; double sharpeRatio; double recoveryFactor; double expectancy; int consecutiveWins; int consecutiveLosses; int maxConsecutiveWins; int maxConsecutiveLosses; }; TradeStats stats; // Enhanced Market analysis struct MarketData { double currentPrice; double dailyHigh; double dailyLow; double dailyRange; double atr; double rsi; double macd; double signal; double fastMA; double slowMA; double spread; double volume; string trend; string volatility; int signalStrength; bool buySignal; bool sellSignal; double adx; double stochK; double stochD; bool trendStrong; double momentum; }; MarketData market; // News tracking variables datetime nextHighImpactNews = 0; string nextNewsEvent = ""; string nextNewsCountry = ""; int nextNewsImportance = 0; bool newsAvoidanceActive = false; // Dashboard variables string mainDashName, perfDashName, techDashName; bool dashboardsInitialized = false; datetime lastDashboardUpdate = 0; datetime lastStatsUpdate = 0; // Simple news events structure struct SimpleNewsEvent { datetime time; string event_name; string country; int importance; }; SimpleNewsEvent upcomingNews[]; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { PrintWelcomeMessage(); trade.SetAsyncMode(false); trade.SetExpertMagicNumber(7861262); // Changed magic number // Initialize tracking InitializeStats(); // Initialize economic calendar if(AvoidNews) { Print("📰 Economic Calendar integration enabled"); UpdateNewsData(); } // Initialize enhanced 3-panel dashboards if(ShowMainDashboard || ShowPerformancePanel || ShowTechnicalPanel) { mainDashName = "MainDash_" + IntegerToString(ChartID()); perfDashName = "PerfDash_" + IntegerToString(ChartID()); techDashName = "TechDash_" + IntegerToString(ChartID()); if(!ShowGrid) ChartSetInteger(0, CHART_SHOW_GRID, false); Create3PanelDashboards(); dashboardsInitialized = true; Print("✅ Dashboard Created"); } Print("🚀 Gold Hunter v2.0 - Ready! 💰"); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(dashboardsInitialized) { ObjectsDeleteAll(0, mainDashName); ObjectsDeleteAll(0, perfDashName); ObjectsDeleteAll(0, techDashName); Print("🗑️ Dashboard cleaned up"); } Print("🛑 Gold Hunter v2.0 Shutdown Complete"); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Update market data including enhanced Ichimoku UpdateMarketData(); UpdateEnhancedIchimokuData(); // Update news data every 5 minutes static datetime lastNewsUpdate = 0; if(AvoidNews && TimeCurrent() - lastNewsUpdate >= 300) { UpdateNewsData(); lastNewsUpdate = TimeCurrent(); } // Update statistics every 5 seconds - More frequent if(TimeCurrent() - lastStatsUpdate >= 5) { UpdateTradeStatistics(); lastStatsUpdate = TimeCurrent(); } // Update dashboards every 1 second if(dashboardsInitialized && TimeCurrent() - lastDashboardUpdate >= 1) { UpdateAll3Panels(); lastDashboardUpdate = TimeCurrent(); } // Enhanced trading logic with debug static datetime lastDebugPrint = 0; bool shouldDebug = EnableDebugPrints && (TimeCurrent() - lastDebugPrint >= 30); // Debug every 30 seconds if(!IsTradeTime()) { if(shouldDebug) Print("🚫 Not trade time"); return; } if(AvoidNews && IsNearNews()) { if(shouldDebug) Print("🚫 Avoiding news"); return; } if(!CanTradeToday()) { if(shouldDebug) Print("🚫 Max trades reached for today: ", tradeCountToday, "/", MaxTradesPerDay); return; } // Enhanced position management ManageEnhancedPositions(); for(int i = 0; i < ArraySize(SymbolsToTrade); i++) { string symbol = SymbolsToTrade[i]; if(PositionsTotalForSymbol(symbol) >= 1) { if(shouldDebug) Print("🚫 Already have position for ", symbol); continue; } // Enhanced filters with debug if(UseIchimokuFilter && !IsEnhancedIchimokuAligned(symbol)) { if(shouldDebug) Print("🚫 Ichimoku not aligned for ", symbol); continue; } if(!IsEnhancedIndicatorsAligned(symbol)) { if(shouldDebug) Print("🚫 Indicators not aligned for ", symbol); continue; } if(!IsVolumeSufficient(symbol)) { if(shouldDebug) Print("🚫 Volume not sufficient for ", symbol); continue; } double atr = GetATR(symbol, ATRPeriod); double slDistance = atr * ATRMultiplierSL; double tpDistance = atr * ATRMultiplierTP; double lot = CalculateLot(symbol, slDistance); if(lot <= 0) { if(shouldDebug) Print("🚫 Invalid lot size: ", lot); continue; } double ask = SymbolInfoDouble(symbol, SYMBOL_ASK); double bid = SymbolInfoDouble(symbol, SYMBOL_BID); bool buySignal = IsEnhancedBuySignal(symbol); bool sellSignal = IsEnhancedSellSignal(symbol); if(shouldDebug) { Print("📊 ", symbol, " Analysis:"); Print(" Buy Signal: ", buySignal ? "✅" : "❌"); Print(" Sell Signal: ", sellSignal ? "✅" : "❌"); Print(" Ichimoku Bullish: ", ichimoku.bullishSignal ? "✅" : "❌"); Print(" Ichimoku Bearish: ", ichimoku.bearishSignal ? "✅" : "❌"); Print(" Market Buy Signal: ", market.buySignal ? "✅" : "❌"); Print(" Market Sell Signal: ", market.sellSignal ? "✅" : "❌"); Print(" Price: ", DoubleToString(ask, 2)); Print(" ATR: ", DoubleToString(atr, 2)); Print(" Lot: ", DoubleToString(lot, 2)); lastDebugPrint = TimeCurrent(); } if(buySignal) { double sl = ask - slDistance; double tp = ask + tpDistance; if(trade.Buy(lot, symbol, ask, sl, tp, "Gold Hunter Buy")) { tradeCountToday++; Print("✅ BUY executed: ", symbol, " Lot: ", lot, " SL: ", sl, " TP: ", tp); } else { Print("❌ BUY order failed: ", trade.ResultRetcode(), " - ", trade.ResultRetcodeDescription()); } } else if(sellSignal) { double sl = bid + slDistance; double tp = bid - tpDistance; if(trade.Sell(lot, symbol, bid, sl, tp, "Gold Hunter Sell")) { tradeCountToday++; Print("✅ SELL executed: ", symbol, " Lot: ", lot, " SL: ", sl, " TP: ", tp); } else { Print("❌ SELL order failed: ", trade.ResultRetcode(), " - ", trade.ResultRetcodeDescription()); } } } } //+------------------------------------------------------------------+ //| ENHANCED ICHIMOKU FUNCTIONS | //+------------------------------------------------------------------+ void UpdateEnhancedIchimokuData() { string symbol = SymbolsToTrade[0]; double tenkan[], kijun[], spanA[], spanB[], chikou[]; int handleIchimoku = iIchimoku(symbol, PERIOD_CURRENT, TenkanSenPeriod, KijunSenPeriod, SenkouSpanB); if(CopyBuffer(handleIchimoku, 0, 0, 3, tenkan) > 0 && CopyBuffer(handleIchimoku, 1, 0, 3, kijun) > 0 && CopyBuffer(handleIchimoku, 2, 0, CloudProjectionBars + 5, spanA) > 0 && CopyBuffer(handleIchimoku, 3, 0, CloudProjectionBars + 5, spanB) > 0 && CopyBuffer(handleIchimoku, 4, 0, 3, chikou) > 0) { ichimoku.tenkanSen = tenkan[1]; ichimoku.kijunSen = kijun[1]; ichimoku.senkouSpanA = spanA[1]; ichimoku.senkouSpanB = spanB[1]; ichimoku.chikouSpan = chikou[1]; // Validate Chikou span but don't reset to 0 - use current price instead double currentPrice = SymbolInfoDouble(symbol, SYMBOL_BID); if(ichimoku.chikouSpan <= 0 || ichimoku.chikouSpan > 100000 || ichimoku.chikouSpan != ichimoku.chikouSpan) // Check for NaN ichimoku.chikouSpan = currentPrice; // Determine cloud boundaries ichimoku.cloudTop = MathMax(ichimoku.senkouSpanA, ichimoku.senkouSpanB); ichimoku.cloudBottom = MathMin(ichimoku.senkouSpanA, ichimoku.senkouSpanB); // Enhanced cloud analysis ichimoku.cloudThickness = ichimoku.cloudTop - ichimoku.cloudBottom; double atr = GetATR(symbol, ATRPeriod); ichimoku.strongTrend = (ichimoku.cloudThickness > atr * 0.5); // Future cloud projection if(UseCloudProjection && ArraySize(spanA) > CloudProjectionBars && ArraySize(spanB) > CloudProjectionBars) { ichimoku.futureCloudTop = MathMax(spanA[CloudProjectionBars], spanB[CloudProjectionBars]); ichimoku.futureCloudBottom = MathMin(spanA[CloudProjectionBars], spanB[CloudProjectionBars]); } // Price position relative to cloud ichimoku.priceAboveCloud = (currentPrice > ichimoku.cloudTop); ichimoku.priceBelowCloud = (currentPrice < ichimoku.cloudBottom); ichimoku.priceInCloud = (!ichimoku.priceAboveCloud && !ichimoku.priceBelowCloud); // Enhanced trend determination if(ichimoku.priceAboveCloud && ichimoku.strongTrend) ichimoku.trend = "Strong Up"; else if(ichimoku.priceAboveCloud) ichimoku.trend = "Uptrend"; else if(ichimoku.priceBelowCloud && ichimoku.strongTrend) ichimoku.trend = "Strong Down"; else if(ichimoku.priceBelowCloud) ichimoku.trend = "Downtrend"; else ichimoku.trend = "Ranging"; // Line relationships ichimoku.tenkanAboveKijun = (ichimoku.tenkanSen > ichimoku.kijunSen); // Enhanced Chikou span analysis - More flexible double priceChikouPeriod = iClose(symbol, PERIOD_CURRENT, TenkanSenPeriod); if(priceChikouPeriod <= 0) priceChikouPeriod = currentPrice; // Fallback ichimoku.chikouAbovePrice = (ichimoku.chikouSpan > priceChikouPeriod); // Enhanced momentum strength double tenkanPrev = tenkan[2]; double kijunPrev = kijun[2]; double tenkanAngle = MathAbs(ichimoku.tenkanSen - tenkanPrev); double kijunAngle = MathAbs(ichimoku.kijunSen - kijunPrev); if(tenkanAngle > kijunAngle * 2.0) ichimoku.momentumStrength = "Very Strong"; else if(tenkanAngle > kijunAngle * 1.5) ichimoku.momentumStrength = "Strong"; else if(tenkanAngle > kijunAngle * 0.8) ichimoku.momentumStrength = "Moderate"; else ichimoku.momentumStrength = "Weak"; // SIMPLIFIED signal generation - More permissive ichimoku.bullishSignal = (ichimoku.priceAboveCloud && ichimoku.tenkanAboveKijun) || (AllowCloudTrades && ichimoku.priceInCloud && ichimoku.tenkanAboveKijun) || (ichimoku.tenkanAboveKijun && ichimoku.chikouAbovePrice); ichimoku.bearishSignal = (ichimoku.priceBelowCloud && !ichimoku.tenkanAboveKijun) || (AllowCloudTrades && ichimoku.priceInCloud && !ichimoku.tenkanAboveKijun) || (!ichimoku.tenkanAboveKijun && !ichimoku.chikouAbovePrice); } } bool IsEnhancedIchimokuAligned(string symbol) { // More permissive alignment - allow cloud trades by default if(AllowCloudTrades) return true; // Don't trade when price is inside weak cloud if(ichimoku.priceInCloud && !ichimoku.strongTrend) return false; // Allow ranging markets too return true; } bool IsEnhancedBuySignal(string symbol) { // SIMPLIFIED - Either indicators OR Ichimoku can trigger bool indicatorsBuy = IsEnhancedBuySignalIndicators(symbol); if(UseIchimokuFilter) { return indicatorsBuy && ichimoku.bullishSignal; } else { return indicatorsBuy; } } bool IsEnhancedSellSignal(string symbol) { // SIMPLIFIED - Either indicators OR Ichimoku can trigger bool indicatorsSell = IsEnhancedSellSignalIndicators(symbol); if(UseIchimokuFilter) { return indicatorsSell && ichimoku.bearishSignal; } else { return indicatorsSell; } } //+------------------------------------------------------------------+ //| ENHANCED INDICATOR FUNCTIONS | //+------------------------------------------------------------------+ bool IsEnhancedIndicatorsAligned(string symbol) { double maFast[], maSlow[], rsi[], macd[], signal[], adx[], stochK[], stochD[]; int handleFastMA = iMA(symbol, PERIOD_CURRENT, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE); int handleSlowMA = iMA(symbol, PERIOD_CURRENT, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE); int handleRSI = iRSI(symbol, PERIOD_CURRENT, RSIPeriod, PRICE_CLOSE); int handleMACD = iMACD(symbol, PERIOD_CURRENT, MACDFast, MACDSlow, MACDSignal, PRICE_CLOSE); if(CopyBuffer(handleFastMA, 0, 0, 3, maFast) <= 0 || CopyBuffer(handleSlowMA, 0, 0, 3, maSlow) <= 0 || CopyBuffer(handleRSI, 0, 0, 2, rsi) <= 0 || CopyBuffer(handleMACD, 0, 0, 2, macd) <= 0 || CopyBuffer(handleMACD, 1, 0, 2, signal) <= 0) { return false; } bool basicAlignment = (maFast[1] != 0 && maSlow[1] != 0 && rsi[1] != 0 && macd[1] != 0 && signal[1] != 0); // Enhanced ADX filter - OPTIONAL if(UseADXFilter) { int handleADX = iADX(symbol, PERIOD_CURRENT, ADXPeriod); if(CopyBuffer(handleADX, 0, 0, 2, adx) <= 0) return false; market.adx = adx[1]; market.trendStrong = (market.adx > MinADXValue); if(!market.trendStrong) return false; } // Enhanced Stochastic filter - OPTIONAL if(UseStochasticFilter) { int handleStoch = iStochastic(symbol, PERIOD_CURRENT, StochKPeriod, StochDPeriod, StochSlowing, MODE_SMA, STO_LOWHIGH); if(CopyBuffer(handleStoch, 0, 0, 2, stochK) <= 0 || CopyBuffer(handleStoch, 1, 0, 2, stochD) <= 0) return false; market.stochK = stochK[1]; market.stochD = stochD[1]; } return basicAlignment; } bool IsEnhancedBuySignalIndicators(string symbol) { double maFast[], maSlow[], rsi[], macd[], signal[]; int handleFastMA = iMA(symbol, PERIOD_CURRENT, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE); int handleSlowMA = iMA(symbol, PERIOD_CURRENT, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE); int handleRSI = iRSI(symbol, PERIOD_CURRENT, RSIPeriod, PRICE_CLOSE); int handleMACD = iMACD(symbol, PERIOD_CURRENT, MACDFast, MACDSlow, MACDSignal, PRICE_CLOSE); if(CopyBuffer(handleFastMA, 0, 0, 3, maFast) <= 0 || CopyBuffer(handleSlowMA, 0, 0, 3, maSlow) <= 0 || CopyBuffer(handleRSI, 0, 0, 2, rsi) <= 0 || CopyBuffer(handleMACD, 0, 0, 2, macd) <= 0 || CopyBuffer(handleMACD, 1, 0, 2, signal) <= 0) { return false; } // SIMPLIFIED buy conditions - More permissive bool maBullish = (maFast[1] > maSlow[1]); bool rsiBullish = (rsi[1] > 30 && rsi[1] < 80); // Wider range bool macdBullish = (macd[1] > signal[1]); // Stochastic filter - OPTIONAL bool stochOK = true; if(UseStochasticFilter) { stochOK = (market.stochK < 85); // Less restrictive } // Only need 2 out of 3 conditions int conditions = 0; if(maBullish) conditions++; if(rsiBullish) conditions++; if(macdBullish) conditions++; return (conditions >= 2 && stochOK); } bool IsEnhancedSellSignalIndicators(string symbol) { double maFast[], maSlow[], rsi[], macd[], signal[]; int handleFastMA = iMA(symbol, PERIOD_CURRENT, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE); int handleSlowMA = iMA(symbol, PERIOD_CURRENT, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE); int handleRSI = iRSI(symbol, PERIOD_CURRENT, RSIPeriod, PRICE_CLOSE); int handleMACD = iMACD(symbol, PERIOD_CURRENT, MACDFast, MACDSlow, MACDSignal, PRICE_CLOSE); if(CopyBuffer(handleFastMA, 0, 0, 3, maFast) <= 0 || CopyBuffer(handleSlowMA, 0, 0, 3, maSlow) <= 0 || CopyBuffer(handleRSI, 0, 0, 2, rsi) <= 0 || CopyBuffer(handleMACD, 0, 0, 2, macd) <= 0 || CopyBuffer(handleMACD, 1, 0, 2, signal) <= 0) { return false; } // SIMPLIFIED sell conditions - More permissive bool maBearish = (maFast[1] < maSlow[1]); bool rsiBearish = (rsi[1] < 70 && rsi[1] > 20); // Wider range bool macdBearish = (macd[1] < signal[1]); // Stochastic filter - OPTIONAL bool stochOK = true; if(UseStochasticFilter) { stochOK = (market.stochK > 15); // Less restrictive } // Only need 2 out of 3 conditions int conditions = 0; if(maBearish) conditions++; if(rsiBearish) conditions++; if(macdBearish) conditions++; return (conditions >= 2 && stochOK); } //+------------------------------------------------------------------+ //| ENHANCED POSITION MANAGEMENT | //+------------------------------------------------------------------+ void ManageEnhancedPositions() { for(int i = PositionsTotal() - 1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(!PositionSelectByTicket(ticket)) continue; string symbol = PositionGetString(POSITION_SYMBOL); int posType = (int)PositionGetInteger(POSITION_TYPE); double currentPrice = posType == POSITION_TYPE_BUY ? SymbolInfoDouble(symbol, SYMBOL_BID) : SymbolInfoDouble(symbol, SYMBOL_ASK); double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double currentSL = PositionGetDouble(POSITION_SL); double currentTP = PositionGetDouble(POSITION_TP); double positionProfit = PositionGetDouble(POSITION_PROFIT); datetime openTime = (datetime)PositionGetInteger(POSITION_TIME); double lotSize = PositionGetDouble(POSITION_VOLUME); double atr = GetATR(symbol, ATRPeriod); double trailingStop = atr * TrailingStopATR; double minProfit = atr * MinProfitATR; // Check maximum holding time if(MaxHoldingHours > 0) { int hoursHeld = (int)((TimeCurrent() - openTime) / 3600); if(hoursHeld >= MaxHoldingHours) { Print("Closing position due to max holding time: ", ticket); trade.PositionClose(ticket); continue; } } // Enhanced trailing stop if(UseTrailingStop && atr > 0) { if(posType == POSITION_TYPE_BUY && currentPrice - openPrice > minProfit) { double newSL = currentPrice - trailingStop; if(newSL > currentSL) { trade.PositionModify(ticket, newSL, currentTP); Print("Trailing stop updated for BUY: ", ticket, " New SL: ", newSL); } } else if(posType == POSITION_TYPE_SELL && openPrice - currentPrice > minProfit) { double newSL = currentPrice + trailingStop; if(newSL < currentSL || currentSL == 0) { trade.PositionModify(ticket, newSL, currentTP); Print("Trailing stop updated for SELL: ", ticket, " New SL: ", newSL); } } } // Breakeven stop if(UseBreakevenStop) { double breakevenDistance = atr * 1.0; // 1R profit if(posType == POSITION_TYPE_BUY && currentPrice - openPrice > breakevenDistance && currentSL < openPrice) { trade.PositionModify(ticket, openPrice + (atr * 0.1), currentTP); // Small profit at breakeven Print("Breakeven stop set for BUY: ", ticket); } else if(posType == POSITION_TYPE_SELL && openPrice - currentPrice > breakevenDistance && (currentSL > openPrice || currentSL == 0)) { trade.PositionModify(ticket, openPrice - (atr * 0.1), currentTP); // Small profit at breakeven Print("Breakeven stop set for SELL: ", ticket); } } // Partial close at profit target if(UseSmartExit && PartialClosePercent > 0) { double partialProfitTarget = atr * PartialCloseRatio; if(posType == POSITION_TYPE_BUY && currentPrice - openPrice > partialProfitTarget) { double partialLot = NormalizeDouble(lotSize * PartialClosePercent / 100.0, 2); if(partialLot >= SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN)) { trade.PositionClosePartial(ticket, partialLot); Print("Partial close executed for BUY: ", ticket, " Lot: ", partialLot); } } else if(posType == POSITION_TYPE_SELL && openPrice - currentPrice > partialProfitTarget) { double partialLot = NormalizeDouble(lotSize * PartialClosePercent / 100.0, 2); if(partialLot >= SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN)) { trade.PositionClosePartial(ticket, partialLot); Print("Partial close executed for SELL: ", ticket, " Lot: ", partialLot); } } } // Enhanced exit logic with multiple conditions bool shouldExit = false; // Ichimoku-based exits if(UseIchimokuFilter) { if(posType == POSITION_TYPE_BUY && (IsEnhancedSellSignal(symbol) || (ichimoku.priceInCloud && !AllowCloudTrades))) shouldExit = true; else if(posType == POSITION_TYPE_SELL && (IsEnhancedBuySignal(symbol) || (ichimoku.priceInCloud && !AllowCloudTrades))) shouldExit = true; } else { if(posType == POSITION_TYPE_BUY && IsEnhancedSellSignalIndicators(symbol)) shouldExit = true; else if(posType == POSITION_TYPE_SELL && IsEnhancedBuySignalIndicators(symbol)) shouldExit = true; } if(shouldExit) { trade.PositionClose(ticket); Print("Position closed due to signal reversal: ", ticket); } } } //+------------------------------------------------------------------+ //| ENHANCED 3-PANEL DASHBOARD CREATION | //+------------------------------------------------------------------+ void Create3PanelDashboards() { if(ShowMainDashboard) CreateEnhancedMainPanel(); if(ShowPerformancePanel) CreateEnhancedPerformanceRiskPanel(); if(ShowTechnicalPanel) CreateEnhancedTechnicalRiskPanel(); } void CreateEnhancedMainPanel() { // Main panel background - INCREASED HEIGHT CreateRectangleLabel(mainDashName + "_Panel", 10, 10, MainPanelWidth, MainPanelHeight, PanelColor, BorderColor); // Header CreateLabel(mainDashName + "_Title", "🏆 GOLD HUNTER v2.0", 15, 15, clrGold, 12, true); CreateLabel(mainDashName + "_Subtitle", " Rams Fx Beast", 15, 32, clrSilver, 10, false); CreateLine(mainDashName + "_HeaderLine", 15, 47, MainPanelWidth - 15, 47, clrGold); // LIVE STATUS SECTION - INCREASED SPACING CreateLabel(mainDashName + "_StatusTitle", "🔴 LIVE STATUS", 15, 55, clrRed, 11, true); CreateLabel(mainDashName + "_SessionLabel", "Session:", 15, 75, clrGray, 10, false); CreateLabel(mainDashName + "_SessionValue", "Closed", MainPanelWidth - 90, 75, clrRed, 10, true); CreateLabel(mainDashName + "_TradesLabel", "Trades:", 15, 92, clrGray, 10, false); CreateLabel(mainDashName + "_TradesValue", "0/6", MainPanelWidth - 70, 92, clrGray, 10, false); CreateLabel(mainDashName + "_UptimeLabel", "Uptime:", 15, 109, clrGray, 10, false); CreateLabel(mainDashName + "_UptimeValue", "00:00:00", MainPanelWidth - 100, 109, clrLimeGreen, 10, false); CreateLine(mainDashName + "_StatusLine", 15, 126, MainPanelWidth - 15, 126, clrGray); // NEWS PANEL - INCREASED SPACING CreateLabel(mainDashName + "_NewsTitle", "📰 NEWS MONITOR", 15, 134, clrYellow, 11, true); CreateLabel(mainDashName + "_NewsStatusLabel", "Status:", 15, 154, clrGray, 10, false); CreateLabel(mainDashName + "_NewsStatusValue", "Active", MainPanelWidth - 80, 154, clrLimeGreen, 10, true); CreateLabel(mainDashName + "_NextNewsLabel", "Next:", 15, 171, clrGray, 10, false); CreateLabel(mainDashName + "_NextNewsTime", "No news", MainPanelWidth - 90, 171, clrGray, 10, false); CreateLabel(mainDashName + "_NewsEventValue", "No upcoming news", 15, 188, clrGray, 9, false); CreateLabel(mainDashName + "_NewsImportanceLabel", "Impact:", 15, 205, clrGray, 10, false); CreateLabel(mainDashName + "_NewsImportanceValue", "None", MainPanelWidth - 70, 205, clrGray, 10, false); CreateLine(mainDashName + "_NewsLine", 15, 222, MainPanelWidth - 15, 222, clrGray); // SIGNAL ANALYSIS - INCREASED SPACING CreateLabel(mainDashName + "_SignalTitle", "🎯 SIGNALS", 15, 230, clrLimeGreen, 11, true); CreateRectangleLabel(mainDashName + "_SignalBadge", 15, 250, 60, 22, NeutralColor, NeutralColor); CreateLabel(mainDashName + "_SignalText", "WAIT", 20, 255, TextColor, 11, true); CreateLabel(mainDashName + "_ConfidenceLabel", "Conf:", 85, 255, clrGray, 10, false); CreateLabel(mainDashName + "_ConfidenceValue", "0%", MainPanelWidth - 60, 255, clrGray, 10, false); CreateLabel(mainDashName + "_StrengthLabel", "Strength:", 15, 277, clrGray, 10, false); CreateLabel(mainDashName + "_StrengthValue", "Weak", MainPanelWidth - 80, 277, clrGray, 10, false); CreateLine(mainDashName + "_SignalLine", 15, 294, MainPanelWidth - 15, 294, clrGray); // MARKET CONDITIONS - INCREASED SPACING CreateLabel(mainDashName + "_MarketTitle", "📊 MARKET DATA", 15, 302, clrDodgerBlue, 11, true); CreateLabel(mainDashName + "_PriceLabel", "Price:", 15, 322, clrGray, 10, false); CreateLabel(mainDashName + "_PriceValue", "$0.00", MainPanelWidth - 90, 322, clrWhite, 10, true); CreateLabel(mainDashName + "_ATRLabel", "ATR:", 15, 339, clrGray, 10, false); CreateLabel(mainDashName + "_ATRValue", "0.00", MainPanelWidth - 75, 339, clrViolet, 10, false); CreateLabel(mainDashName + "_TrendLabel", "Trend:", 15, 356, clrGray, 10, false); CreateLabel(mainDashName + "_TrendValue", "Neutral", MainPanelWidth - 90, 356, clrGray, 10, false); CreateLabel(mainDashName + "_VolatilityLabel", "Volatility:", 15, 373, clrGray, 10, false); CreateLabel(mainDashName + "_VolatilityValue", "Normal", MainPanelWidth - 90, 373, clrGray, 10, false); CreateLabel(mainDashName + "_ADXLabel", "ADX:", 15, 390, clrGray, 10, false); CreateLabel(mainDashName + "_ADXValue", "0.0", MainPanelWidth - 65, 390, clrOrange, 10, false); CreateLine(mainDashName + "_MarketLine", 15, 407, MainPanelWidth - 15, 407, clrGray); // ACCOUNT OVERVIEW - INCREASED SPACING CreateLabel(mainDashName + "_AccountTitle", "💰 ACCOUNT", 15, 415, clrGold, 11, true); CreateLabel(mainDashName + "_BalanceLabel", "Balance:", 15, 435, clrGray, 10, false); CreateLabel(mainDashName + "_BalanceValue", "$0.00", MainPanelWidth - 90, 435, clrLimeGreen, 10, true); CreateLabel(mainDashName + "_EquityLabel", "Equity:", 15, 452, clrGray, 10, false); CreateLabel(mainDashName + "_EquityValue", "$0.00", MainPanelWidth - 90, 452, clrDodgerBlue, 10, false); CreateLabel(mainDashName + "_MarginLabel", "Margin:", 15, 469, clrGray, 10, false); CreateLabel(mainDashName + "_MarginValue", "$0.00", MainPanelWidth - 90, 469, clrGray, 10, false); CreateLabel(mainDashName + "_MarginLevelLabel", "Level:", 15, 486, clrGray, 10, false); CreateLabel(mainDashName + "_MarginLevelValue", "0%", MainPanelWidth - 70, 486, clrGray, 10, false); CreateLine(mainDashName + "_AccountLine", 15, 503, MainPanelWidth - 15, 503, clrGray); // TIME DISPLAYS - INCREASED SPACING CreateLabel(mainDashName + "_TimeTitle", "🕐 TIME", 15, 580, clrSilver, 11, true); CreateLabel(mainDashName + "_UTCLabel", "UTC:", 15, 600, clrGray, 10, false); CreateLabel(mainDashName + "_UTCTime", "00:00:00", 65, 600, clrWhite, 10, false); CreateLabel(mainDashName + "_LocalLabel", "Local:", 15, 620, clrGray, 10, false); CreateLabel(mainDashName + "_LocalTime", "00:00:00", 65, 620, clrGold, 10, false); Print("📊 Main Panel Created"); } void CreateEnhancedPerformanceRiskPanel() { int xPos = MainPanelWidth + 15; CreateRectangleLabel(perfDashName + "_Panel", xPos, 10, SecondaryPanelWidth, SecondaryPanelHeight, PanelColor, BorderColor); // Header CreateLabel(perfDashName + "_Title", "📈 PERFORMANCE", xPos + 10, 15, clrGold, 11, true); CreateLine(perfDashName + "_HeaderLine", xPos + 10, 32, xPos + SecondaryPanelWidth - 10, 32, clrGold); // PROFIT TRACKING - INCREASED SPACING CreateLabel(perfDashName + "_ProfitTitle", "💵 PROFITS", xPos + 10, 40, clrLimeGreen, 11, true); CreateLabel(perfDashName + "_TotalProfitLabel", "Total:", xPos + 10, 60, clrGray, 10, false); CreateLabel(perfDashName + "_TotalProfitValue", "$0.00", xPos + SecondaryPanelWidth - 80, 60, clrLimeGreen, 10, true); CreateLabel(perfDashName + "_TodayProfitLabel", "Today:", xPos + 10, 77, clrGray, 10, false); CreateLabel(perfDashName + "_TodayProfitValue", "$0.00", xPos + SecondaryPanelWidth - 80, 77, clrLimeGreen, 10, false); CreateLabel(perfDashName + "_BestTradeLabel", "Best:", xPos + 10, 94, clrGray, 10, false); CreateLabel(perfDashName + "_BestTradeValue", "$0.00", xPos + SecondaryPanelWidth - 80, 94, clrLimeGreen, 10, false); CreateLabel(perfDashName + "_WorstTradeLabel", "Worst:", xPos + 10, 111, clrGray, 10, false); CreateLabel(perfDashName + "_WorstTradeValue", "$0.00", xPos + SecondaryPanelWidth - 80, 111, clrRed, 10, false); CreateLabel(perfDashName + "_ExpectancyLabel", "Expectancy:", xPos + 10, 128, clrGray, 10, false); CreateLabel(perfDashName + "_ExpectancyValue", "$0.00", xPos + SecondaryPanelWidth - 80, 128, clrDodgerBlue, 10, false); CreateLine(perfDashName + "_ProfitLine", xPos + 10, 145, xPos + SecondaryPanelWidth - 10, 145, clrGray); // TRADE STATISTICS - INCREASED SPACING CreateLabel(perfDashName + "_StatsTitle", "📊 STATISTICS", xPos + 10, 153, clrDodgerBlue, 11, true); CreateLabel(perfDashName + "_TotalTradesLabel", "Trades:", xPos + 10, 173, clrGray, 10, false); CreateLabel(perfDashName + "_TotalTradesValue", "0", xPos + SecondaryPanelWidth - 60, 173, clrGray, 10, false); CreateLabel(perfDashName + "_WinRateLabel", "Win Rate:", xPos + 10, 190, clrGray, 10, false); CreateLabel(perfDashName + "_WinRateValue", "0%", xPos + SecondaryPanelWidth - 65, 190, clrLimeGreen, 10, false); CreateLabel(perfDashName + "_AvgWinLabel", "Avg Win:", xPos + 10, 207, clrGray, 10, false); CreateLabel(perfDashName + "_AvgWinValue", "$0.00", xPos + SecondaryPanelWidth - 75, 207, clrLimeGreen, 10, false); CreateLabel(perfDashName + "_AvgLossLabel", "Avg Loss:", xPos + 10, 224, clrGray, 10, false); CreateLabel(perfDashName + "_AvgLossValue", "$0.00", xPos + SecondaryPanelWidth - 75, 224, clrRed, 10, false); CreateLabel(perfDashName + "_ProfitFactorLabel", "Profit Factor:", xPos + 10, 241, clrGray, 10, false); CreateLabel(perfDashName + "_ProfitFactorValue", "0.00", xPos + SecondaryPanelWidth - 70, 241, clrDodgerBlue, 10, false); CreateLine(perfDashName + "_StatsLine", xPos + 10, 258, xPos + SecondaryPanelWidth - 10, 258, clrGray); // ENHANCED RISK MANAGEMENT SECTION - INCREASED SPACING CreateLabel(perfDashName + "_RiskTitle", "⚠️ RISK MANAGEMENT", xPos + 10, 266, clrRed, 11, true); CreateLabel(perfDashName + "_RiskPerTradeLabel", "Risk/Trade:", xPos + 10, 286, clrGray, 10, false); CreateLabel(perfDashName + "_RiskPerTradeValue", "0.8%", xPos + SecondaryPanelWidth - 70, 286, clrYellow, 10, false); CreateLabel(perfDashName + "_NextLotLabel", "Next Lot:", xPos + 10, 303, clrGray, 10, false); CreateLabel(perfDashName + "_NextLotValue", "0.00", xPos + SecondaryPanelWidth - 70, 303, clrDodgerBlue, 10, false); CreateLabel(perfDashName + "_RiskAmountLabel", "Risk Amount:", xPos + 10, 320, clrGray, 10, false); CreateLabel(perfDashName + "_RiskAmountValue", "$0.00", xPos + SecondaryPanelWidth - 75, 320, clrOrange, 10, false); CreateLabel(perfDashName + "_MaxHoldLabel", "Max Hold:", xPos + 10, 337, clrGray, 10, false); CreateLabel(perfDashName + "_MaxHoldValue", "8h", xPos + SecondaryPanelWidth - 60, 337, clrViolet, 10, false); CreateLine(perfDashName + "_RiskLine", xPos + 10, 354, xPos + SecondaryPanelWidth - 10, 354, clrGray); // DRAWDOWN MONITORING - INCREASED SPACING CreateLabel(perfDashName + "_DDTitle", "📉 DRAWDOWN", xPos + 10, 362, clrOrange, 11, true); CreateLabel(perfDashName + "_MaxDDLabel", "Max DD:", xPos + 10, 382, clrGray, 10, false); CreateLabel(perfDashName + "_MaxDDValue", "0%", xPos + SecondaryPanelWidth - 65, 382, clrRed, 10, false); CreateLabel(perfDashName + "_CurrentDDLabel", "Current:", xPos + 10, 399, clrGray, 10, false); CreateLabel(perfDashName + "_CurrentDDValue", "0%", xPos + SecondaryPanelWidth - 65, 399, clrOrange, 10, false); CreateLabel(perfDashName + "_DDLimitLabel", "Limit:", xPos + 10, 416, clrGray, 10, false); CreateLabel(perfDashName + "_DDLimitValue", "15%", xPos + SecondaryPanelWidth - 65, 416, clrRed, 10, false); // Drawdown Progress Bar CreateRectangleLabel(perfDashName + "_DDBg", xPos + 10, 433, SecondaryPanelWidth - 20, 10, C'47,51,57', C'47,51,57'); CreateRectangleLabel(perfDashName + "_DDBar", xPos + 10, 433, 0, 10, clrRed, clrRed); CreateLine(perfDashName + "_DDLine2", xPos + 10, 450, xPos + SecondaryPanelWidth - 10, 450, clrGray); // DAILY TARGETS - INCREASED SPACING CreateLabel(perfDashName + "_TargetTitle", "🎯 TARGETS", xPos + 10, 458, clrYellow, 11, true); CreateLabel(perfDashName + "_TargetLabel", "Daily Target:", xPos + 10, 478, clrGray, 10, false); CreateLabel(perfDashName + "_TargetValue", "$50", xPos + SecondaryPanelWidth - 75, 478, clrOrange, 10, false); CreateLabel(perfDashName + "_ProgressLabel", "Progress:", xPos + 10, 495, clrGray, 10, false); CreateLabel(perfDashName + "_ProgressValue", "0%", xPos + SecondaryPanelWidth - 65, 495, clrOrange, 10, false); // Progress Bar CreateRectangleLabel(perfDashName + "_ProgressBg", xPos + 10, 512, SecondaryPanelWidth - 20, 10, C'47,51,57', C'47,51,57'); CreateRectangleLabel(perfDashName + "_ProgressBar", xPos + 10, 512, 0, 10, clrLimeGreen, clrLimeGreen); CreateLabel(perfDashName + "_RemainingLabel", "Remaining:", xPos + 10, 529, clrGray, 10, false); CreateLabel(perfDashName + "_RemainingValue", "$50", xPos + SecondaryPanelWidth - 75, 529, clrGray, 10, false); Print("📈 Performance + Risk Panel Created"); } void CreateEnhancedTechnicalRiskPanel() { int xPos = MainPanelWidth + SecondaryPanelWidth + 20; CreateRectangleLabel(techDashName + "_Panel", xPos, 10, SecondaryPanelWidth, SecondaryPanelHeight, PanelColor, BorderColor); // Header CreateLabel(techDashName + "_Title", "📊 TECHNICAL", xPos + 10, 15, clrDodgerBlue, 11, true); CreateLine(techDashName + "_HeaderLine", xPos + 10, 32, xPos + SecondaryPanelWidth - 10, 32, clrDodgerBlue); // ENHANCED ICHIMOKU SECTION - INCREASED SPACING CreateLabel(techDashName + "_IchimokuTitle", "☁️ ICHIMOKU CLOUD", xPos + 10, 40, clrGold, 11, true); CreateLabel(techDashName + "_TrendLabel", "Trend:", xPos + 10, 60, clrGray, 10, false); CreateLabel(techDashName + "_TrendValue", "Neutral", xPos + SecondaryPanelWidth - 90, 60, clrGray, 10, false); CreateLabel(techDashName + "_PositionLabel", "Position:", xPos + 10, 77, clrGray, 10, false); CreateLabel(techDashName + "_PositionValue", "In Cloud", xPos + SecondaryPanelWidth - 90, 77, clrOrange, 10, false); CreateLabel(techDashName + "_TenkanLabel", "Tenkan:", xPos + 10, 94, clrGray, 10, false); CreateLabel(techDashName + "_TenkanValue", "0.00", xPos + SecondaryPanelWidth - 80, 94, clrLimeGreen, 10, false); CreateLabel(techDashName + "_KijunLabel", "Kijun:", xPos + 10, 111, clrGray, 10, false); CreateLabel(techDashName + "_KijunValue", "0.00", xPos + SecondaryPanelWidth - 80, 111, clrRed, 10, false); CreateLabel(techDashName + "_CloudTopLabel", "Cloud Top:", xPos + 10, 128, clrGray, 10, false); CreateLabel(techDashName + "_CloudTopValue", "0.00", xPos + SecondaryPanelWidth - 80, 128, clrLimeGreen, 10, false); CreateLabel(techDashName + "_CloudBottomLabel", "Cloud Bot:", xPos + 10, 145, clrGray, 10, false); CreateLabel(techDashName + "_CloudBottomValue", "0.00", xPos + SecondaryPanelWidth - 80, 145, clrRed, 10, false); CreateLabel(techDashName + "_ChikouLabel", "Chikou:", xPos + 10, 162, clrGray, 10, false); CreateLabel(techDashName + "_ChikouValue", "0.00", xPos + SecondaryPanelWidth - 80, 162, clrDodgerBlue, 10, false); CreateLabel(techDashName + "_MomentumLabel", "Momentum:", xPos + 10, 179, clrGray, 10, false); CreateLabel(techDashName + "_MomentumValue", "Weak", xPos + SecondaryPanelWidth - 80, 179, clrGray, 10, false); CreateLabel(techDashName + "_ThicknessLabel", "Thickness:", xPos + 10, 196, clrGray, 10, false); CreateLabel(techDashName + "_ThicknessValue", "0.0", xPos + SecondaryPanelWidth - 70, 196, clrViolet, 10, false); CreateLine(techDashName + "_IchimokuLine", xPos + 10, 213, xPos + SecondaryPanelWidth - 10, 213, clrGold); // ICHIMOKU SIGNALS - INCREASED SPACING CreateLabel(techDashName + "_IchimokuSignalTitle", "☁️ SIGNALS", xPos + 10, 221, clrYellow, 11, true); CreateLabel(techDashName + "_BullishSignalLabel", "Bullish:", xPos + 10, 241, clrGray, 10, false); CreateLabel(techDashName + "_BullishSignalValue", "❌", xPos + SecondaryPanelWidth - 50, 241, clrRed, 12, false); CreateLabel(techDashName + "_BearishSignalLabel", "Bearish:", xPos + 10, 258, clrGray, 10, false); CreateLabel(techDashName + "_BearishSignalValue", "❌", xPos + SecondaryPanelWidth - 50, 258, clrRed, 12, false); CreateLine(techDashName + "_SignalLine", xPos + 10, 275, xPos + SecondaryPanelWidth - 10, 275, clrGray); // ENHANCED INDICATORS - INCREASED SPACING CreateLabel(techDashName + "_IndicatorTitle", "🔍 INDICATORS", xPos + 10, 283, clrLimeGreen, 11, true); // RSI Section CreateLabel(techDashName + "_RSILabel", "RSI:", xPos + 10, 303, clrGray, 10, false); CreateLabel(techDashName + "_RSIValue", "50.0", xPos + 60, 303, clrDodgerBlue, 10, true); CreateLabel(techDashName + "_RSIStatus", "Neutral", xPos + SecondaryPanelWidth - 85, 303, clrGray, 10, false); // RSI Progress Bar CreateRectangleLabel(techDashName + "_RSIBg", xPos + 10, 320, SecondaryPanelWidth - 20, 10, C'47,51,57', C'47,51,57'); CreateRectangleLabel(techDashName + "_RSIBar", xPos + 10, 320, (SecondaryPanelWidth - 20) / 2, 10, clrDodgerBlue, clrDodgerBlue); // MACD Section CreateLabel(techDashName + "_MACDLabel", "MACD:", xPos + 10, 337, clrGray, 10, false); CreateLabel(techDashName + "_MACDValue", "0.000", xPos + 70, 337, clrGray, 10, false); CreateLabel(techDashName + "_MACDStatusValue", "Neutral", xPos + SecondaryPanelWidth - 85, 337, clrGray, 10, false); // ADX Section CreateLabel(techDashName + "_ADXLabel", "ADX:", xPos + 10, 354, clrGray, 10, false); CreateLabel(techDashName + "_ADXValue", "0.0", xPos + 60, 354, clrOrange, 10, false); CreateLabel(techDashName + "_ADXStatus", "Weak", xPos + SecondaryPanelWidth - 75, 354, clrGray, 10, false); // Stochastic Section CreateLabel(techDashName + "_StochLabel", "Stoch:", xPos + 10, 371, clrGray, 10, false); CreateLabel(techDashName + "_StochKValue", "50", xPos + 70, 371, clrViolet, 10, false); CreateLabel(techDashName + "_StochDValue", "50", xPos + 100, 371, clrViolet, 10, false); CreateLabel(techDashName + "_StochStatus", "Neutral", xPos + SecondaryPanelWidth - 85, 371, clrGray, 10, false); // Moving Averages CreateLabel(techDashName + "_FastMALabel", "Fast MA:", xPos + 10, 388, clrGray, 10, false); CreateLabel(techDashName + "_FastMAValue", "0.00", xPos + SecondaryPanelWidth - 80, 388, clrLimeGreen, 10, false); CreateLabel(techDashName + "_SlowMALabel", "Slow MA:", xPos + 10, 405, clrGray, 10, false); CreateLabel(techDashName + "_SlowMAValue", "0.00", xPos + SecondaryPanelWidth - 80, 405, clrOrange, 10, false); CreateLabel(techDashName + "_MACrossLabel", "Cross:", xPos + 10, 422, clrGray, 10, false); CreateLabel(techDashName + "_MACrossValue", "None", xPos + SecondaryPanelWidth - 85, 422, clrGray, 10, false); CreateLine(techDashName + "_IndicatorLine", xPos + 10, 439, xPos + SecondaryPanelWidth - 10, 439, clrGray); // ENHANCED SIGNAL STRENGTH METER - INCREASED SPACING CreateLabel(techDashName + "_StrengthTitle", "💪 SIGNAL STRENGTH", xPos + 10, 447, clrYellow, 11, true); CreateLabel(techDashName + "_BuyStrengthLabel", "Buy Power:", xPos + 10, 467, clrGray, 10, false); CreateLabel(techDashName + "_BuyStrengthValue", "0/10", xPos + SecondaryPanelWidth - 70, 467, clrLimeGreen, 10, false); // Buy Strength Bar CreateRectangleLabel(techDashName + "_BuyStrengthBg", xPos + 10, 484, SecondaryPanelWidth - 20, 10, C'47,51,57', C'47,51,57'); CreateRectangleLabel(techDashName + "_BuyStrengthBar", xPos + 10, 484, 0, 10, clrLimeGreen, clrLimeGreen); CreateLabel(techDashName + "_SellStrengthLabel", "Sell Power:", xPos + 10, 501, clrGray, 10, false); CreateLabel(techDashName + "_SellStrengthValue", "0/10", xPos + SecondaryPanelWidth - 70, 501, clrRed, 10, false); // Sell Strength Bar CreateRectangleLabel(techDashName + "_SellStrengthBg", xPos + 10, 518, SecondaryPanelWidth - 20, 10, C'47,51,57', C'47,51,57'); CreateRectangleLabel(techDashName + "_SellStrengthBar", xPos + 10, 518, 0, 10, clrRed, clrRed); CreateLine(techDashName + "_StrengthLine", xPos + 10, 535, xPos + SecondaryPanelWidth - 10, 535, clrGray); // FUTURE CLOUD PROJECTION CreateLabel(techDashName + "_FutureCloudTitle", "🔮 FUTURE CLOUD", xPos + 10, 560, clrViolet, 10, true); CreateLabel(techDashName + "_FutureTopLabel", "Future Top:", xPos + 10, 580, clrGray, 9, false); CreateLabel(techDashName + "_FutureTopValue", "0.00", xPos + SecondaryPanelWidth - 70, 580, clrLimeGreen, 9, false); Print("📊 Enhanced Technical + Ichimoku Panel Created"); } //+------------------------------------------------------------------+ //| ENHANCED UPDATE FUNCTIONS | //+------------------------------------------------------------------+ void UpdateAll3Panels() { if(ShowMainDashboard) UpdateEnhancedMainPanel(); if(ShowPerformancePanel) UpdateEnhancedPerformanceRiskPanel(); if(ShowTechnicalPanel) UpdateEnhancedTechnicalRiskPanel(); } void UpdateEnhancedMainPanel() { string symbol = SymbolsToTrade[0]; // Update times datetime now = TimeCurrent(); datetime localTime = now + 2 * 3600; // Botswana time static datetime startTime = now; ObjectSetString(0, mainDashName + "_UTCTime", OBJPROP_TEXT, TimeToString(now, TIME_MINUTES)); ObjectSetString(0, mainDashName + "_LocalTime", OBJPROP_TEXT, TimeToString(localTime, TIME_MINUTES)); // Update uptime int uptimeSeconds = (int)(now - startTime); int hours = uptimeSeconds / 3600; int minutes = (uptimeSeconds % 3600) / 60; int seconds = uptimeSeconds % 60; ObjectSetString(0, mainDashName + "_UptimeValue", OBJPROP_TEXT, StringFormat("%02d:%02d:%02d", hours, minutes, seconds)); // Update session status string sessionStatus = IsTradeTime() ? "ACTIVE" : "CLOSED"; color sessionColor = IsTradeTime() ? clrLimeGreen : clrRed; ObjectSetString(0, mainDashName + "_SessionValue", OBJPROP_TEXT, sessionStatus); ObjectSetInteger(0, mainDashName + "_SessionValue", OBJPROP_COLOR, sessionColor); // Update trades ObjectSetString(0, mainDashName + "_TradesValue", OBJPROP_TEXT, IntegerToString(tradeCountToday) + "/" + IntegerToString(MaxTradesPerDay)); // Update news panel UpdateNewsPanel(); // Update enhanced signal analysis UpdateEnhancedSignalPanel(); // Update enhanced market conditions UpdateEnhancedMarketPanel(); // Update account overview UpdateAccountPanel(); ChartRedraw(); } void UpdateEnhancedPerformanceRiskPanel() { // Update profit values with better formatting ObjectSetString(0, perfDashName + "_TotalProfitValue", OBJPROP_TEXT, "$" + DoubleToString(stats.totalProfit, 0)); color totalProfitColor = (stats.totalProfit >= 0) ? clrLimeGreen : clrRed; ObjectSetInteger(0, perfDashName + "_TotalProfitValue", OBJPROP_COLOR, totalProfitColor); ObjectSetString(0, perfDashName + "_TodayProfitValue", OBJPROP_TEXT, "$" + DoubleToString(stats.todayProfit, 0)); color todayProfitColor = (stats.todayProfit >= 0) ? clrLimeGreen : clrRed; ObjectSetInteger(0, perfDashName + "_TodayProfitValue", OBJPROP_COLOR, todayProfitColor); ObjectSetString(0, perfDashName + "_BestTradeValue", OBJPROP_TEXT, "$" + DoubleToString(stats.bestTrade, 0)); ObjectSetString(0, perfDashName + "_WorstTradeValue", OBJPROP_TEXT, "$" + DoubleToString(stats.worstTrade, 0)); // Enhanced expectancy calculation ObjectSetString(0, perfDashName + "_ExpectancyValue", OBJPROP_TEXT, "$" + DoubleToString(stats.expectancy, 2)); color expectancyColor = (stats.expectancy >= 0) ? clrLimeGreen : clrRed; ObjectSetInteger(0, perfDashName + "_ExpectancyValue", OBJPROP_COLOR, expectancyColor); // Update statistics with better formatting ObjectSetString(0, perfDashName + "_TotalTradesValue", OBJPROP_TEXT, IntegerToString(stats.totalTrades)); ObjectSetString(0, perfDashName + "_WinRateValue", OBJPROP_TEXT, DoubleToString(stats.winRate, 1) + "%"); ObjectSetString(0, perfDashName + "_AvgWinValue", OBJPROP_TEXT, "$" + DoubleToString(stats.avgWin, 0)); ObjectSetString(0, perfDashName + "_AvgLossValue", OBJPROP_TEXT, "$" + DoubleToString(MathAbs(stats.avgLoss), 0)); ObjectSetString(0, perfDashName + "_ProfitFactorValue", OBJPROP_TEXT, DoubleToString(stats.profitFactor, 2)); // Update enhanced risk management string symbol = SymbolsToTrade[0]; ObjectSetString(0, perfDashName + "_RiskPerTradeValue", OBJPROP_TEXT, DoubleToString(RiskPercentPerTrade, 1) + "%"); double atr = GetATR(symbol, ATRPeriod); double slDistance = atr * ATRMultiplierSL; double nextLot = CalculateLot(symbol, slDistance); ObjectSetString(0, perfDashName + "_NextLotValue", OBJPROP_TEXT, DoubleToString(nextLot, 2)); double balance = AccountInfoDouble(ACCOUNT_BALANCE); double riskAmount = balance * RiskPercentPerTrade / 100.0; ObjectSetString(0, perfDashName + "_RiskAmountValue", OBJPROP_TEXT, "$" + DoubleToString(riskAmount, 0)); ObjectSetString(0, perfDashName + "_MaxHoldValue", OBJPROP_TEXT, IntegerToString(MaxHoldingHours) + "h"); // Update drawdown monitoring with better formatting ObjectSetString(0, perfDashName + "_MaxDDValue", OBJPROP_TEXT, DoubleToString(stats.maxDD, 1) + "%"); ObjectSetString(0, perfDashName + "_CurrentDDValue", OBJPROP_TEXT, DoubleToString(stats.currentDD, 1) + "%"); // Update drawdown bar double ddLimit = 15.0; // Reduced limit for better risk management int ddWidth = (int)((SecondaryPanelWidth - 20) * stats.currentDD / ddLimit); ObjectSetInteger(0, perfDashName + "_DDBar", OBJPROP_XSIZE, MathMax(0, ddWidth)); color ddColor = (stats.currentDD > 10) ? clrRed : (stats.currentDD > 5) ? clrOrange : clrLimeGreen; ObjectSetInteger(0, perfDashName + "_DDBar", OBJPROP_BGCOLOR, ddColor); // Update daily targets double dailyTarget = 50.0; // More realistic target double progress = (dailyTarget > 0) ? (stats.todayProfit / dailyTarget * 100) : 0; progress = MathMax(0, MathMin(100, progress)); ObjectSetString(0, perfDashName + "_ProgressValue", OBJPROP_TEXT, DoubleToString(progress, 0) + "%"); int progressWidth = (int)((SecondaryPanelWidth - 20) * progress / 100.0); ObjectSetInteger(0, perfDashName + "_ProgressBar", OBJPROP_XSIZE, progressWidth); color progressColor = (progress >= 100) ? clrLimeGreen : (progress >= 50) ? clrOrange : clrYellow; ObjectSetInteger(0, perfDashName + "_ProgressBar", OBJPROP_BGCOLOR, progressColor); ObjectSetString(0, perfDashName + "_RemainingValue", OBJPROP_TEXT, "$" + DoubleToString(MathMax(0, dailyTarget - stats.todayProfit), 0)); } void UpdateEnhancedTechnicalRiskPanel() { string symbol = SymbolsToTrade[0]; // Update enhanced Ichimoku data with better formatting ObjectSetString(0, techDashName + "_TrendValue", OBJPROP_TEXT, ichimoku.trend); color trendColor = (StringFind(ichimoku.trend, "Up") >= 0) ? clrLimeGreen : (StringFind(ichimoku.trend, "Down") >= 0) ? clrRed : clrOrange; ObjectSetInteger(0, techDashName + "_TrendValue", OBJPROP_COLOR, trendColor); string position = ichimoku.priceAboveCloud ? "Above Cloud" : ichimoku.priceBelowCloud ? "Below Cloud" : "In Cloud"; color positionColor = ichimoku.priceAboveCloud ? clrLimeGreen : ichimoku.priceBelowCloud ? clrRed : clrOrange; ObjectSetString(0, techDashName + "_PositionValue", OBJPROP_TEXT, position); ObjectSetInteger(0, techDashName + "_PositionValue", OBJPROP_COLOR, positionColor); // Fixed Chikou span display with proper formatting ObjectSetString(0, techDashName + "_TenkanValue", OBJPROP_TEXT, DoubleToString(ichimoku.tenkanSen, 2)); ObjectSetString(0, techDashName + "_KijunValue", OBJPROP_TEXT, DoubleToString(ichimoku.kijunSen, 2)); ObjectSetString(0, techDashName + "_CloudTopValue", OBJPROP_TEXT, DoubleToString(ichimoku.cloudTop, 2)); ObjectSetString(0, techDashName + "_CloudBottomValue", OBJPROP_TEXT, DoubleToString(ichimoku.cloudBottom, 2)); ObjectSetString(0, techDashName + "_ChikouValue", OBJPROP_TEXT, DoubleToString(ichimoku.chikouSpan, 2)); ObjectSetString(0, techDashName + "_MomentumValue", OBJPROP_TEXT, ichimoku.momentumStrength); color momentumColor = (ichimoku.momentumStrength == "Very Strong" || ichimoku.momentumStrength == "Strong") ? clrLimeGreen : (ichimoku.momentumStrength == "Moderate") ? clrOrange : clrGray; ObjectSetInteger(0, techDashName + "_MomentumValue", OBJPROP_COLOR, momentumColor); ObjectSetString(0, techDashName + "_ThicknessValue", OBJPROP_TEXT, DoubleToString(ichimoku.cloudThickness, 1)); // Update Ichimoku signals string bullishSignal = ichimoku.bullishSignal ? "✅" : "❌"; color bullishColor = ichimoku.bullishSignal ? clrLimeGreen : clrRed; ObjectSetString(0, techDashName + "_BullishSignalValue", OBJPROP_TEXT, bullishSignal); ObjectSetInteger(0, techDashName + "_BullishSignalValue", OBJPROP_COLOR, bullishColor); string bearishSignal = ichimoku.bearishSignal ? "✅" : "❌"; color bearishColor = ichimoku.bearishSignal ? clrRed : clrGray; ObjectSetString(0, techDashName + "_BearishSignalValue", OBJPROP_TEXT, bearishSignal); ObjectSetInteger(0, techDashName + "_BearishSignalValue", OBJPROP_COLOR, bearishColor); // Update future cloud projection if(UseCloudProjection) { ObjectSetString(0, techDashName + "_FutureTopValue", OBJPROP_TEXT, DoubleToString(ichimoku.futureCloudTop, 2)); } // Update enhanced RSI with better formatting ObjectSetString(0, techDashName + "_RSIValue", OBJPROP_TEXT, DoubleToString(market.rsi, 1)); string rsiStatus = (market.rsi > 70) ? "Overbought" : (market.rsi < 30) ? "Oversold" : "Neutral"; color rsiColor = (market.rsi > 70) ? clrRed : (market.rsi < 30) ? clrLimeGreen : clrDodgerBlue; ObjectSetString(0, techDashName + "_RSIStatus", OBJPROP_TEXT, rsiStatus); ObjectSetInteger(0, techDashName + "_RSIValue", OBJPROP_COLOR, rsiColor); // Update RSI bar int rsiWidth = (int)((SecondaryPanelWidth - 20) * market.rsi / 100.0); ObjectSetInteger(0, techDashName + "_RSIBar", OBJPROP_XSIZE, rsiWidth); ObjectSetInteger(0, techDashName + "_RSIBar", OBJPROP_BGCOLOR, rsiColor); // Update MACD with better formatting ObjectSetString(0, techDashName + "_MACDValue", OBJPROP_TEXT, DoubleToString(market.macd, 4)); string macdStatus = (market.macd > market.signal) ? "Bullish" : "Bearish"; color macdColor = (market.macd > market.signal) ? clrLimeGreen : clrRed; ObjectSetString(0, techDashName + "_MACDStatusValue", OBJPROP_TEXT, macdStatus); ObjectSetInteger(0, techDashName + "_MACDStatusValue", OBJPROP_COLOR, macdColor); // Update ADX ObjectSetString(0, techDashName + "_ADXValue", OBJPROP_TEXT, DoubleToString(market.adx, 1)); string adxStatus = (market.adx > 25) ? "Strong" : (market.adx > 20) ? "Moderate" : "Weak"; color adxColor = (market.adx > 25) ? clrLimeGreen : (market.adx > 20) ? clrOrange : clrGray; ObjectSetString(0, techDashName + "_ADXStatus", OBJPROP_TEXT, adxStatus); ObjectSetInteger(0, techDashName + "_ADXStatus", OBJPROP_COLOR, adxColor); // Update Stochastic ObjectSetString(0, techDashName + "_StochKValue", OBJPROP_TEXT, DoubleToString(market.stochK, 0)); ObjectSetString(0, techDashName + "_StochDValue", OBJPROP_TEXT, DoubleToString(market.stochD, 0)); string stochStatus = (market.stochK > 80) ? "Overbought" : (market.stochK < 20) ? "Oversold" : "Neutral"; color stochColor = (market.stochK > 80) ? clrRed : (market.stochK < 20) ? clrLimeGreen : clrGray; ObjectSetString(0, techDashName + "_StochStatus", OBJPROP_TEXT, stochStatus); ObjectSetInteger(0, techDashName + "_StochStatus", OBJPROP_COLOR, stochColor); // Update Moving Averages ObjectSetString(0, techDashName + "_FastMAValue", OBJPROP_TEXT, DoubleToString(market.fastMA, 2)); ObjectSetString(0, techDashName + "_SlowMAValue", OBJPROP_TEXT, DoubleToString(market.slowMA, 2)); string maCross = (market.fastMA > market.slowMA) ? "Bullish" : "Bearish"; color maCrossColor = (market.fastMA > market.slowMA) ? clrLimeGreen : clrRed; ObjectSetString(0, techDashName + "_MACrossValue", OBJPROP_TEXT, maCross); ObjectSetInteger(0, techDashName + "_MACrossValue", OBJPROP_COLOR, maCrossColor); // Update enhanced signal strength int buyStrength = market.buySignal ? market.signalStrength : 0; int sellStrength = market.sellSignal ? market.signalStrength : 0; ObjectSetString(0, techDashName + "_BuyStrengthValue", OBJPROP_TEXT, IntegerToString(buyStrength) + "/10"); ObjectSetString(0, techDashName + "_SellStrengthValue", OBJPROP_TEXT, IntegerToString(sellStrength) + "/10"); // Update strength bars int buyBarWidth = (SecondaryPanelWidth - 20) * buyStrength / 10; int sellBarWidth = (SecondaryPanelWidth - 20) * sellStrength / 10; ObjectSetInteger(0, techDashName + "_BuyStrengthBar", OBJPROP_XSIZE, buyBarWidth); ObjectSetInteger(0, techDashName + "_SellStrengthBar", OBJPROP_XSIZE, sellBarWidth); } //+------------------------------------------------------------------+ //| ENHANCED HELPER FUNCTIONS | //+------------------------------------------------------------------+ void UpdateEnhancedSignalPanel() { string symbol = SymbolsToTrade[0]; string signal_type = "WAIT"; color signalColor = NeutralColor; int confidence = 0; string strength = "Weak"; // Enhanced signal logic with multiple confirmations if(UseIchimokuFilter) { if(ichimoku.bullishSignal && market.buySignal) { signal_type = "BUY"; signalColor = BuyColor; confidence = CalculateEnhancedConfidence(true); strength = GetStrengthFromConfidence(confidence); } else if(ichimoku.bearishSignal && market.sellSignal) { signal_type = "SELL"; signalColor = SellColor; confidence = CalculateEnhancedConfidence(false); strength = GetStrengthFromConfidence(confidence); } } else { if(market.buySignal) { signal_type = "BUY"; signalColor = BuyColor; confidence = CalculateEnhancedConfidence(true); strength = GetStrengthFromConfidence(confidence); } else if(market.sellSignal) { signal_type = "SELL"; signalColor = SellColor; confidence = CalculateEnhancedConfidence(false); strength = GetStrengthFromConfidence(confidence); } } ObjectSetInteger(0, mainDashName + "_SignalBadge", OBJPROP_COLOR, signalColor); ObjectSetInteger(0, mainDashName + "_SignalBadge", OBJPROP_BGCOLOR, signalColor); ObjectSetString(0, mainDashName + "_SignalText", OBJPROP_TEXT, signal_type); ObjectSetString(0, mainDashName + "_ConfidenceValue", OBJPROP_TEXT, IntegerToString(confidence) + "%"); ObjectSetString(0, mainDashName + "_StrengthValue", OBJPROP_TEXT, strength); } int CalculateEnhancedConfidence(bool isBuy) { int confidence = 0; // Ichimoku confirmations (40 points max) if(isBuy) { if(ichimoku.priceAboveCloud) confidence += 15; if(ichimoku.tenkanAboveKijun) confidence += 10; if(ichimoku.chikouAbovePrice) confidence += 10; if(ichimoku.strongTrend) confidence += 5; } else { if(ichimoku.priceBelowCloud) confidence += 15; if(!ichimoku.tenkanAboveKijun) confidence += 10; if(!ichimoku.chikouAbovePrice) confidence += 10; if(ichimoku.strongTrend) confidence += 5; } // Traditional indicator confirmations (40 points max) if(isBuy) { if(market.fastMA > market.slowMA) confidence += 10; if(market.rsi > 30 && market.rsi < 80) confidence += 10; if(market.macd > market.signal) confidence += 10; if(market.adx > MinADXValue) confidence += 10; } else { if(market.fastMA < market.slowMA) confidence += 10; if(market.rsi < 70 && market.rsi > 20) confidence += 10; if(market.macd < market.signal) confidence += 10; if(market.adx > MinADXValue) confidence += 10; } // Volume and momentum confirmations (20 points max) if(market.volume > 0) confidence += 10; // Volume sufficient if(StringFind(ichimoku.momentumStrength, "Strong") >= 0) confidence += 10; return MathMin(100, confidence); } string GetStrengthFromConfidence(int confidence) { if(confidence >= 85) return "Excellent"; else if(confidence >= 70) return "Very Strong"; else if(confidence >= 55) return "Strong"; else if(confidence >= 40) return "Moderate"; else if(confidence >= 25) return "Weak"; else return "Very Weak"; } void UpdateEnhancedMarketPanel() { string symbol = SymbolsToTrade[0]; ObjectSetString(0, mainDashName + "_PriceValue", OBJPROP_TEXT, "$" + DoubleToString(market.currentPrice, 2)); ObjectSetString(0, mainDashName + "_ATRValue", OBJPROP_TEXT, DoubleToString(market.atr, 2)); string trend = GetEnhancedTrendDirection(symbol); color trendColor = (StringFind(trend, "Bull") >= 0) ? clrLimeGreen : (StringFind(trend, "Bear") >= 0) ? clrRed : clrGray; ObjectSetString(0, mainDashName + "_TrendValue", OBJPROP_TEXT, trend); ObjectSetInteger(0, mainDashName + "_TrendValue", OBJPROP_COLOR, trendColor); string marketCondition = GetMarketCondition(); color volatilityColor = clrGray; if(marketCondition == "High Volatility") volatilityColor = clrRed; else if(marketCondition == "Low Volatility") volatilityColor = clrBlue; else volatilityColor = clrLimeGreen; ObjectSetString(0, mainDashName + "_VolatilityValue", OBJPROP_TEXT, (marketCondition == "High Volatility") ? "High" : (marketCondition == "Low Volatility") ? "Low" : "Normal"); ObjectSetInteger(0, mainDashName + "_VolatilityValue", OBJPROP_COLOR, volatilityColor); // Add ADX display ObjectSetString(0, mainDashName + "_ADXValue", OBJPROP_TEXT, DoubleToString(market.adx, 1)); color adxColor = (market.adx > 25) ? clrLimeGreen : (market.adx > 20) ? clrOrange : clrGray; ObjectSetInteger(0, mainDashName + "_ADXValue", OBJPROP_COLOR, adxColor); } string GetEnhancedTrendDirection(string symbol) { // Combine multiple trend indicators bool maTrendUp = (market.fastMA > market.slowMA); bool ichimokuTrendUp = (StringFind(ichimoku.trend, "Up") >= 0); bool strongTrend = (market.adx > MinADXValue); if(maTrendUp && ichimokuTrendUp && strongTrend) return "Strong Bull"; else if(maTrendUp && ichimokuTrendUp) return "Bullish"; else if(!maTrendUp && !ichimokuTrendUp && strongTrend) return "Strong Bear"; else if(!maTrendUp && !ichimokuTrendUp) return "Bearish"; else return "Neutral"; } //+------------------------------------------------------------------+ //| MISSING MARKET CONDITION FUNCTION | //+------------------------------------------------------------------+ string GetMarketCondition() { string symbol = SymbolsToTrade[0]; double atr = GetATR(symbol, ATRPeriod); double avgATR = GetAverageATR(symbol, ATRPeriod, 20); if(avgATR == 0) return "Unknown"; if(atr > avgATR * 1.5) return "High Volatility"; else if(atr < avgATR * 0.7) return "Low Volatility"; else return "Normal"; } double GetAverageATR(string symbol, int period, int bars) { double atrValues[]; int handle = iATR(symbol, PERIOD_CURRENT, period); if(CopyBuffer(handle, 0, 0, bars, atrValues) <= 0) return 0; double sum = 0; for(int i = 0; i < bars; i++) sum += atrValues[i]; return sum / bars; } //+------------------------------------------------------------------+ //| ENHANCED MARKET DATA FUNCTIONS | //+------------------------------------------------------------------+ void UpdateMarketData() { string symbol = SymbolsToTrade[0]; market.currentPrice = SymbolInfoDouble(symbol, SYMBOL_BID); market.dailyHigh = SymbolInfoDouble(symbol, SYMBOL_LASTHIGH); market.dailyLow = SymbolInfoDouble(symbol, SYMBOL_LASTLOW); market.dailyRange = (market.dailyHigh - market.dailyLow) / SymbolInfoDouble(symbol, SYMBOL_POINT); market.atr = GetATR(symbol, ATRPeriod); market.spread = SymbolInfoInteger(symbol, SYMBOL_SPREAD) * SymbolInfoDouble(symbol, SYMBOL_POINT); // Get enhanced indicator values double rsi[], macd[], signal[], maFast[], maSlow[], adx[], stochK[], stochD[]; int handleRSI = iRSI(symbol, PERIOD_CURRENT, RSIPeriod, PRICE_CLOSE); int handleMACD = iMACD(symbol, PERIOD_CURRENT, MACDFast, MACDSlow, MACDSignal, PRICE_CLOSE); int handleFastMA = iMA(symbol, PERIOD_CURRENT, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE); int handleSlowMA = iMA(symbol, PERIOD_CURRENT, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE); int handleADX = iADX(symbol, PERIOD_CURRENT, ADXPeriod); int handleStoch = iStochastic(symbol, PERIOD_CURRENT, StochKPeriod, StochDPeriod, StochSlowing, MODE_SMA, STO_LOWHIGH); if(CopyBuffer(handleRSI, 0, 0, 1, rsi) > 0 && CopyBuffer(handleMACD, 0, 0, 1, macd) > 0 && CopyBuffer(handleMACD, 1, 0, 1, signal) > 0 && CopyBuffer(handleFastMA, 0, 0, 1, maFast) > 0 && CopyBuffer(handleSlowMA, 0, 0, 1, maSlow) > 0) { market.rsi = rsi[0]; market.macd = macd[0]; market.signal = signal[0]; market.fastMA = maFast[0]; market.slowMA = maSlow[0]; // Enhanced ADX if(UseADXFilter && CopyBuffer(handleADX, 0, 0, 1, adx) > 0) { market.adx = adx[0]; market.trendStrong = (market.adx > MinADXValue); } else { market.adx = 0; market.trendStrong = true; // Default to true when not using ADX } // Enhanced Stochastic if(UseStochasticFilter && CopyBuffer(handleStoch, 0, 0, 1, stochK) > 0 && CopyBuffer(handleStoch, 1, 0, 1, stochD) > 0) { market.stochK = stochK[0]; market.stochD = stochD[0]; } else { market.stochK = 50; market.stochD = 50; // Default neutral values } market.buySignal = IsEnhancedBuySignalIndicators(symbol); market.sellSignal = IsEnhancedSellSignalIndicators(symbol); // Enhanced signal strength calculation (0-10) int strength = 0; if(market.fastMA > market.slowMA) strength += 2; if(market.rsi > 30 && market.rsi < 80) strength += 2; if(market.macd > market.signal) strength += 2; if(market.macd > 0) strength += 1; if(market.adx > MinADXValue) strength += 2; if(market.stochK > 20 && market.stochK < 80) strength += 1; market.signalStrength = strength; } market.trend = GetEnhancedTrendDirection(symbol); market.volatility = GetMarketCondition(); } void UpdateTradeStatistics() { // Calculate current profits double currentProfit = 0; for(int i = PositionsTotal() - 1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(PositionSelectByTicket(ticket)) { currentProfit += PositionGetDouble(POSITION_PROFIT); } } stats.todayProfit = currentProfit; // Calculate drawdown double balance = AccountInfoDouble(ACCOUNT_BALANCE); double equity = AccountInfoDouble(ACCOUNT_EQUITY); stats.currentDD = (balance > equity) ? ((balance - equity) / balance * 100) : 0; if(stats.currentDD > stats.maxDD) stats.maxDD = stats.currentDD; // Enhanced historical data analysis HistorySelect(TimeCurrent() - 30 * 24 * 3600, TimeCurrent()); // Last 30 days double totalWins = 0, totalLosses = 0; int wins = 0, losses = 0; int consecutiveWins = 0, consecutiveLosses = 0; bool lastWasWin = false; for(int i = 0; i < HistoryDealsTotal(); i++) { ulong ticket = HistoryDealGetTicket(i); if(HistoryDealSelect(ticket)) { ENUM_DEAL_TYPE dealType = (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE); if(dealType == DEAL_TYPE_BUY || dealType == DEAL_TYPE_SELL) { double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT); stats.totalProfit += profit; if(profit > 0) { wins++; totalWins += profit; if(profit > stats.bestTrade) stats.bestTrade = profit; if(lastWasWin) consecutiveWins++; else { consecutiveWins = 1; consecutiveLosses = 0; } lastWasWin = true; } else if(profit < 0) { losses++; totalLosses += MathAbs(profit); if(profit < stats.worstTrade) stats.worstTrade = profit; if(!lastWasWin) consecutiveLosses++; else { consecutiveLosses = 1; consecutiveWins = 0; } lastWasWin = false; } } } } stats.totalTrades = wins + losses; stats.winTrades = wins; stats.lossTrades = losses; stats.winRate = (stats.totalTrades > 0) ? (wins * 100.0 / stats.totalTrades) : 0; stats.avgWin = (wins > 0) ? (totalWins / wins) : 0; stats.avgLoss = (losses > 0) ? (totalLosses / losses) : 0; stats.profitFactor = (totalLosses > 0) ? (totalWins / totalLosses) : 0; // Enhanced metrics stats.expectancy = (stats.totalTrades > 0) ? (stats.totalProfit / stats.totalTrades) : 0; stats.consecutiveWins = consecutiveWins; stats.consecutiveLosses = consecutiveLosses; if(consecutiveWins > stats.maxConsecutiveWins) stats.maxConsecutiveWins = consecutiveWins; if(consecutiveLosses > stats.maxConsecutiveLosses) stats.maxConsecutiveLosses = consecutiveLosses; // Calculate advanced metrics stats.recoveryFactor = (stats.maxDD > 0) ? (stats.totalProfit / stats.maxDD) : 0; stats.sharpeRatio = CalculateEnhancedSharpeRatio(); } double CalculateEnhancedSharpeRatio() { if(stats.totalTrades < 10) return 0; double avgReturn = stats.expectancy; double variance = 0; // Simplified variance calculation if(stats.avgLoss > 0 && stats.avgWin > 0) { double winVariance = MathPow(stats.avgWin - avgReturn, 2) * stats.winRate / 100.0; double lossVariance = MathPow(-stats.avgLoss - avgReturn, 2) * (100 - stats.winRate) / 100.0; variance = winVariance + lossVariance; } double stdDev = MathSqrt(variance); return (stdDev > 0) ? (avgReturn / stdDev) : 0; } //+------------------------------------------------------------------+ //| ENHANCED TRADING LOGIC FUNCTIONS | //+------------------------------------------------------------------+ bool IsTradeTime() { MqlDateTime tm; TimeToStruct(TimeCurrent(), tm); // Extended trading hours for more opportunities if(tm.hour < StartHourUTC || tm.hour >= EndHourUTC) return false; if(tm.hour == StartHourUTC && tm.min < SessionOpenBuffer) return false; // Avoid weekends if(tm.day_of_week == 0 || tm.day_of_week == 6) return false; return true; } bool CanTradeToday() { MqlDateTime now; TimeToStruct(TimeCurrent(), now); MqlDateTime lastTm; TimeToStruct(lastTradeDay, lastTm); if(now.day != lastTm.day) { tradeCountToday = 0; lastTradeDay = TimeCurrent(); } return tradeCountToday < MaxTradesPerDay; } bool IsVolumeSufficient(string symbol) { // Simplified volume check - always return true for now // Can be enhanced with actual volume analysis return true; } double CalculateLot(string symbol, double sl_distance) { double balance = AccountInfoDouble(ACCOUNT_BALANCE); double riskAmount = balance * RiskPercentPerTrade / 100.0; double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE); double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE); if(tickSize == 0) return 0; double pointValue = tickValue / tickSize; double lotSize = riskAmount / (sl_distance * pointValue); lotSize = NormalizeDouble(lotSize, 2); double minLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN); double maxLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX); double step = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP); lotSize = MathMax(minLot, MathMin(maxLot, lotSize)); lotSize = MathFloor(lotSize / step) * step; return lotSize; } int PositionsTotalForSymbol(string symbol) { int count = 0; for(int i = PositionsTotal() - 1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(PositionSelectByTicket(ticket)) { if(PositionGetString(POSITION_SYMBOL) == symbol) count++; } } return count; } double GetATR(string symbol, int period) { double atr[]; int handle = iATR(symbol, PERIOD_CURRENT, period); if(CopyBuffer(handle, 0, 0, 1, atr) <= 0) return 0; return atr[0]; } //+------------------------------------------------------------------+ //| NEWS FUNCTIONS | //+------------------------------------------------------------------+ void UpdateNewsData() { nextHighImpactNews = 0; nextNewsEvent = ""; nextNewsCountry = ""; nextNewsImportance = 0; ArrayResize(upcomingNews, 0); bool calendarSuccess = false; MqlCalendarValue values[]; ulong change_id = 0; int count = CalendarValueLast(change_id, values, "", "USD"); if(count > 0) { Print("Successfully retrieved ", count, " USD calendar events"); calendarSuccess = ProcessCalendarData(values, count); } if(!calendarSuccess) { Print("USD events failed, trying all events..."); change_id = 0; count = CalendarValueLast(change_id, values, "", ""); if(count > 0) { Print("Successfully retrieved ", count, " calendar events"); calendarSuccess = ProcessCalendarData(values, count); } } if(!calendarSuccess) { Print("Economic calendar unavailable, using fallback news schedule"); CreateFallbackNewsSchedule(); } } bool ProcessCalendarData(MqlCalendarValue &values[], int count) { bool foundEvents = false; for(int i = 0; i < count && i < 100; i++) { MqlCalendarEvent event; MqlCalendarCountry country; if(CalendarEventById(values[i].event_id, event)) { if(CalendarCountryById(event.country_id, country)) { if((int)event.importance < MinNewsImportance) continue; if(AvoidUSDNewsOnly && country.currency != "USD") continue; if(values[i].time > TimeCurrent()) { foundEvents = true; int newSize = ArraySize(upcomingNews) + 1; ArrayResize(upcomingNews, newSize); upcomingNews[newSize-1].time = values[i].time; upcomingNews[newSize-1].event_name = event.name; upcomingNews[newSize-1].country = country.name; upcomingNews[newSize-1].importance = (int)event.importance; if(nextHighImpactNews == 0 || values[i].time < nextHighImpactNews) { nextHighImpactNews = values[i].time; nextNewsEvent = event.name; nextNewsCountry = country.name; nextNewsImportance = (int)event.importance; } } } } } return foundEvents && nextHighImpactNews > 0; } void CreateFallbackNewsSchedule() { MqlDateTime dt; TimeToStruct(TimeCurrent(), dt); struct NewsSchedule { int hour; int minute; string event_name; }; NewsSchedule schedule[] = { {8, 30, "European Economic Data"}, {10, 0, "UK Economic Data"}, {12, 30, "US Economic Data"}, {14, 0, "US Economic Data"}, {15, 30, "US Economic Data"}, {16, 0, "US Economic Data"} }; for(int i = 0; i < ArraySize(schedule); i++) { MqlDateTime newsTime = dt; newsTime.hour = schedule[i].hour; newsTime.min = schedule[i].minute; newsTime.sec = 0; datetime newsDateTime = StructToTime(newsTime); if(newsDateTime <= TimeCurrent()) { newsTime.day += 1; newsDateTime = StructToTime(newsTime); } if(nextHighImpactNews == 0 || newsDateTime < nextHighImpactNews) { nextHighImpactNews = newsDateTime; nextNewsEvent = schedule[i].event_name; nextNewsCountry = "USD"; nextNewsImportance = 3; } } } bool IsNearNews() { if(!AvoidNews) return false; datetime currentTime = TimeCurrent(); if(nextHighImpactNews > 0) { datetime newsStart = nextHighImpactNews - MinutesBeforeNews * 60; datetime newsEnd = nextHighImpactNews + MinutesAfterNews * 60; if(currentTime >= newsStart && currentTime <= newsEnd) { if(!newsAvoidanceActive) { Print("News avoidance activated for: ", nextNewsEvent); newsAvoidanceActive = true; } return true; } else if(newsAvoidanceActive && currentTime > newsEnd) { Print("News avoidance deactivated after: ", nextNewsEvent); newsAvoidanceActive = false; UpdateNewsData(); } } return false; } string GetNewsImportanceString(int importance) { switch(importance) { case 0: return "None"; case 1: return "Low"; case 2: return "Medium"; case 3: return "High"; default: return "Unknown"; } } color GetNewsImportanceColor(int importance) { switch(importance) { case 0: return clrGray; case 1: return clrDodgerBlue; case 2: return clrOrange; case 3: return clrRed; default: return clrGray; } } string GetTimeToNextNews() { if(nextHighImpactNews == 0) return "No news"; int secondsUntil = (int)(nextHighImpactNews - TimeCurrent()); if(secondsUntil <= 0) return "Now"; int hours = secondsUntil / 3600; int minutes = (secondsUntil % 3600) / 60; if(hours > 0) return StringFormat("%dh %dm", hours, minutes); else return StringFormat("%dm", minutes); } void UpdateNewsPanel() { if(AvoidNews) { string newsStatus = newsAvoidanceActive ? "AVOIDING" : "ACTIVE"; color newsStatusColor = newsAvoidanceActive ? clrRed : clrLimeGreen; ObjectSetString(0, mainDashName + "_NewsStatusValue", OBJPROP_TEXT, newsStatus); ObjectSetInteger(0, mainDashName + "_NewsStatusValue", OBJPROP_COLOR, newsStatusColor); string timeToNews = GetTimeToNextNews(); ObjectSetString(0, mainDashName + "_NextNewsTime", OBJPROP_TEXT, timeToNews); if(nextHighImpactNews > 0) { string eventName = nextNewsEvent; if(StringLen(eventName) > 20) // Increased length for better display eventName = StringSubstr(eventName, 0, 17) + "..."; ObjectSetString(0, mainDashName + "_NewsEventValue", OBJPROP_TEXT, eventName); string importance = GetNewsImportanceString(nextNewsImportance); color importanceColor = GetNewsImportanceColor(nextNewsImportance); ObjectSetString(0, mainDashName + "_NewsImportanceValue", OBJPROP_TEXT, importance); ObjectSetInteger(0, mainDashName + "_NewsImportanceValue", OBJPROP_COLOR, importanceColor); } else { ObjectSetString(0, mainDashName + "_NewsEventValue", OBJPROP_TEXT, "No upcoming news"); ObjectSetString(0, mainDashName + "_NewsImportanceValue", OBJPROP_TEXT, "None"); } } else { ObjectSetString(0, mainDashName + "_NewsStatusValue", OBJPROP_TEXT, "OFF"); ObjectSetInteger(0, mainDashName + "_NewsStatusValue", OBJPROP_COLOR, clrGray); } } void UpdateAccountPanel() { double balance = AccountInfoDouble(ACCOUNT_BALANCE); double equity = AccountInfoDouble(ACCOUNT_EQUITY); double freeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE); double marginLevel = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); ObjectSetString(0, mainDashName + "_BalanceValue", OBJPROP_TEXT, "$" + DoubleToString(balance, 0)); ObjectSetString(0, mainDashName + "_EquityValue", OBJPROP_TEXT, "$" + DoubleToString(equity, 0)); ObjectSetString(0, mainDashName + "_MarginValue", OBJPROP_TEXT, "$" + DoubleToString(freeMargin, 0)); ObjectSetString(0, mainDashName + "_MarginLevelValue", OBJPROP_TEXT, DoubleToString(marginLevel, 0) + "%"); // Color coding for margin level color marginColor = clrGray; if(marginLevel < 200) marginColor = clrRed; else if(marginLevel < 500) marginColor = clrOrange; else marginColor = clrLimeGreen; ObjectSetInteger(0, mainDashName + "_MarginLevelValue", OBJPROP_COLOR, marginColor); } //+------------------------------------------------------------------+ //| HELPER FUNCTIONS | //+------------------------------------------------------------------+ void InitializeStats() { stats.totalProfit = 0; stats.todayProfit = 0; stats.weekProfit = 0; stats.monthProfit = 0; stats.totalTrades = 0; stats.todayTrades = 0; stats.winTrades = 0; stats.lossTrades = 0; stats.winRate = 0; stats.profitFactor = 0; stats.maxDD = 0; stats.currentDD = 0; stats.bestTrade = 0; stats.worstTrade = 0; stats.avgWin = 0; stats.avgLoss = 0; stats.sharpeRatio = 0; stats.recoveryFactor = 0; stats.expectancy = 0; stats.consecutiveWins = 0; stats.consecutiveLosses = 0; stats.maxConsecutiveWins = 0; stats.maxConsecutiveLosses = 0; } void PrintWelcomeMessage() { Print("╔══════════════════════════════════════════════════════════════╗"); Print("║ 🏆 GOLD HUNTER V2.0 🏆 ║"); Print("║ Second Edition ║"); Print("╠══════════════════════════════════════════════════════════════╣"); Print("║ ✅ Ichimoku Analysis 📊 Advanced Risk Mgmt ║"); Print("║ ☁️ Smart Trend Detection 💰 Better Performance ║"); Print("║ 🔮 Future Cloud Projection ⚠️ Faster Trade Execution ║"); Print("║ 📰 News Integration 🎯 More Trading Opportunities ║"); Print("║ 🚀 Position Management 💎 Improved Profitability ║"); Print("╠══════════════════════════════════════════════════════════════╣"); Print("║ Created by Rams Fx ║"); Print("║ 🚀 Beast Mode! 💰 ║"); Print("╚══════════════════════════════════════════════════════════════╝"); } void CreateLabel(string name, string text, int x, int y, color clr, int fontSize, bool isBold) { ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y); ObjectSetInteger(0, name, OBJPROP_COLOR, clr); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, fontSize); ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetString(0, name, OBJPROP_TEXT, text); ObjectSetString(0, name, OBJPROP_FONT, isBold ? "Arial Bold" : "Arial"); ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); ObjectSetInteger(0, name, OBJPROP_BACK, false); } void CreateRectangleLabel(string name, int x, int y, int width, int height, color bgColor, color borderColor) { ObjectCreate(0, name, OBJ_RECTANGLE_LABEL, 0, 0, 0); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y); ObjectSetInteger(0, name, OBJPROP_XSIZE, width); ObjectSetInteger(0, name, OBJPROP_YSIZE, height); ObjectSetInteger(0, name, OBJPROP_COLOR, borderColor); ObjectSetInteger(0, name, OBJPROP_BGCOLOR, bgColor); ObjectSetInteger(0, name, OBJPROP_BORDER_TYPE, BORDER_FLAT); ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); ObjectSetInteger(0, name, OBJPROP_WIDTH, 1); ObjectSetInteger(0, name, OBJPROP_BACK, false); ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); } void CreateLine(string name, int x1, int y1, int x2, int y2, color clr) { ObjectCreate(0, name, OBJ_HLINE, 0, 0, 0); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x1); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y1); ObjectSetInteger(0, name, OBJPROP_COLOR, clr); ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); ObjectSetInteger(0, name, OBJPROP_WIDTH, 1); ObjectSetInteger(0, name, OBJPROP_BACK, false); ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); } //+------------------------------------------------------------------+ //| END OF GOLD HUNTER V2.0 ENHANCED | //+------------------------------------------------------------------+ please in this code,remove all the words Enhanced,and i have been using it,its performing well,the only problem is that,its take profit level is very far without partial tps,together with stop loss,i have now started monitoring it to help it close profitable trades,because,if i let it wait for tp,it end up getting into loses because of far tp level,now im just managing trades and i close all profitable trades from as little as $1 + to make profit instead of waiting for losses,so my point is,please find a way to make it to atleast lock profitable trades until they reach take profit,or reduce the distance for tp and sl,i have seen that its stop loss is about $13.00 which is too risky,just make it to crap any dollar that comes its way in profit,and increase the number of trades to 10/15,make sure it only execute trades when the signal strenth is 70 + and momentum very strong,if the signal strength is equal,like 50/50 buy and sell,it should not trade,and add other powerful indicators that will work well with ichomoku cloud and the traditional indicators,make it to update signals every 10 minutes to avoid false signals,dont change any other things,let it to work as its been working,make sure it execute perfectly well like it does right now,and i want the impact news to change,not always high like i see it not canging to maybe something like low impact meaning there are no impact news now,and the avoid should also change according to whats happenning,if its avoid let it write avoiding,and if no news,let it write active or no news or something just to show that its not avoiding,hope you understand me,and space signals bullish and bearish for clear visibility,and in the main panel where there is Gold Hunter v2.0 and sub tilttle rams fx beast,center them for clearity,and one last thing,i have realised that the statistics are not working,trades,win rate,avg win etc they are not showing any changes,they are only on 0 all of them,and the drawdown likit load panel,when its full it overlap to the next panel,fix that please,under account,the level is always 0% no changes.....please fix all that i asked
I'll help you fix all those issues. Here's the improved version with all the changes you requested:
Here are all the improvements I made based on your requests:
The EA now focuses on grabbing every profitable dollar instead of waiting for distant take profits, while maintaining strict risk management with much tighter stops. It will be more active with up to 15 trades per day but only on high-quality signals above 70% strength.
I'll help you create the Gold Hunter v2.0 Android app with backend hosting. Let me build this step by step.
Perfect! I've created a complete Gold Hunter v2.0 system for you with:
demodemo123docker-compose up -d// In ApiClient.java
private static final String BASE_URL = "https://your-domain.com/";The system is production-ready and includes all the features you requested:
Would you like me to help you deploy this to a specific hosting provider or make any adjustments to the features?