KOG Comprehensive EA v4.48

MetaTrader 5 Expert Advisor with on-chart telemetry HUD, automatic take-profit and trailing stop-loss, confluence scoring, and spread filter. Uses magic number 8882026.

Download v4.48 .mq5 file
//+------------------------------------------------------------------+
//|                                            KOG_Comprehensive_EA_v4_48.mq5 |
//|                        Copyright 2026, fjbanks                     |
//|                       Red Box Confluences Edition v4.48            |
//+------------------------------------------------------------------+
#property copyright "fjbanks"
#property version   "4.48"
#property script_show_inputs
#property strict
#property description "Red Box Confluences EA v4.48 - multi-confluence trading with HUD, TP/SL, trailing."

#include <Trade\Trade.mqh>
CTrade trade;

input double   Input_TP_Pips                =30.0;
input double   Input_SL_Pips                =20.0;
input bool     Input_Enable_Trailing        =true;
input double   Input_Trailing_Start_Pips    =15.0;
input double   Input_Trailing_Step_Pips     =5.0;
input double   Max_Allowed_Spread           =5.0;
input int      MagicNumber                  =8882026;
input int      ConfluenceMinScore           =3;

datetime   last_gui_update = 0;
int        timer_handle    = 0;

double PriceToPips(double price)
  {
   return (price - SymbolInfoDouble(_Symbol,SYMBOL_BID))*MathPow(10,SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
  }

int OnInit()
  {
   timer_handle=EventSetTimer(1);
   if(timer_handle==0) { Print("Failed to create timer"); return(INIT_FAILED); }
   DrawHUD();
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   if(timer_handle!=0) EventKillTimer();
   ObjectsDeleteAll(0,OBJ_RECTANGLE_LABEL);
   ObjectsDeleteAll(0,OBJ_LABEL);
   ObjectsDeleteAll(0,OBJ_RECTANGLE);
  }

int GetConfluenceScore()
  {
   int score=0;
   double ema50=iMA(_Symbol,PERIOD_H1,50,0,MODE_EMA,PRICE_CLOSE,0);
   double ema20=iMA(_Symbol,PERIOD_H1,20,0,MODE_EMA,PRICE_CLOSE,0);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(bid>ema50 && bid>ema20) score++;
   if(ema20>ema50) score++;
   double sma50=iMA(_Symbol,PERIOD_H1,50,0,MODE_SMA,PRICE_CLOSE,0);
   if(bid>sma50) score++;
   double spread=(SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SymbolInfoDouble(_Symbol,SYMBOL_BID))/Point;
   if(spread<Max_Allowed_Spread*0.6) score++;
   return score;
  }

void DrawRedBoxes(int score)
  {
   string box_name="RED_BOX_CONFLUENCE";
   ObjectDelete(0,box_name);
   if(score>=ConfluenceMinScore)
     {
      ObjectCreate(0,box_name,OBJ_RECTANGLE,0,0,0);
      datetime t1=TimeCurrent()-PeriodSeconds(PERIOD_CURRENT)*5;
      datetime t2=TimeCurrent();
      double high=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+100*Point;
      double low=SymbolInfoDouble(_Symbol,SYMBOL_BID)-100*Point;
      ObjectSetInteger(0,box_name,OBJPROP_TIME1,t1);
      ObjectSetInteger(0,box_name,OBJPROP_TIME2,t2);
      ObjectSetDouble(0,box_name,OBJPROP_PRICE1,high);
      ObjectSetDouble(0,box_name,OBJPROP_PRICE2,low);
      ObjectSetInteger(0,box_name,OBJPROP_COLOR,clrRed);
      ObjectSetInteger(0,box_name,OBJPROP_WIDTH,2);
      ObjectSetInteger(0,box_name,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSetInteger(0,box_name,OBJPROP_BACK,false);
      ObjectSetInteger(0,box_name,OBJPROP_FILL,true);
      ObjectSetInteger(0,box_name,OBJPROP_TRANSPARENT,180);
      Print("Red Box drawn - confluence score: ",score);
     }
  }

void OnTick()
  {
   static double ema50_prev=0;
   double ema50=iMA(_Symbol,PERIOD_H1,50,0,MODE_EMA,PRICE_CLOSE,0);
   int score=GetConfluenceScore();
   DrawRedBoxes(score);
   if(ema50_prev!=0 && ema50>ema50_prev && PositionsTotal()==0 && score>=ConfluenceMinScore)
     {
      double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      double tp_price=ask+Input_TP_Pips*Point;
      double sl_price=ask-Input_SL_Pips*Point;
      trade.Buy(0.1,_Symbol,ask,sl_price,tp_price,MagicNumber);
      Print("Buy entered with confluence score: ",score);
     }
   ema50_prev=ema50;
  }

void OnTimer()
  {
   if(TimeCurrent()-last_gui_update>=1) { DrawHUD(); last_gui_update=TimeCurrent(); }
   for(int i=0;i<PositionsTotal();i++)
     {
      ulong ticket=PositionGetTicket(i);
      if(!PositionSelectByTicket(ticket)) continue;
      if(PositionGetInteger(POSITION_MAGIC)!=MagicNumber) continue;
      double tp=PositionGetDouble(POSITION_TP);
      if(tp==0.0)
        {
         double entry=PositionGetDouble(POSITION_PRICE_OPEN);
         double new_tp=entry+((PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)? Input_TP_Pips:-Input_TP_Pips)*Point;
         trade.PositionModify(ticket,new_tp,PositionGetDouble(POSITION_SL));
        }
     }
   if(Input_Enable_Trailing)
     {
      for(int i=0;i<PositionsTotal();i++)
        {
         ulong ticket=PositionGetTicket(i);
         if(!PositionSelectByTicket(ticket)) continue;
         if(PositionGetInteger(POSITION_MAGIC)!=MagicNumber) continue;
         double profit_pips=0.0;
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
            profit_pips=(SymbolInfoDouble(_Symbol,SYMBOL_BID)-PositionGetDouble(POSITION_PRICE_OPEN))/Point;
         else
            profit_pips=(PositionGetDouble(POSITION_PRICE_OPEN)-SymbolInfoDouble(_Symbol,SYMBOL_ASK))/Point;
         if(profit_pips>=Input_Trailing_Start_Pips)
           {
            double current_sl=PositionGetDouble(POSITION_SL);
            double new_sl=0.0;
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
               new_sl=PositionGetDouble(POSITION_PRICE_OPEN)+(profit_pips-Input_Trailing_Step_Pips)*Point;
            else
               new_sl=PositionGetDouble(POSITION_PRICE_OPEN)-(profit_pips-Input_Trailing_Step_Pips)*Point;
            if(new_sl>current_sl || current_sl==0.0)
               trade.PositionModify(ticket,PositionGetDouble(POSITION_TP),new_sl);
           }
        }
     }
  }

void DrawHUD()
  {
   ObjectsDeleteAll(0,OBJ_RECTANGLE_LABEL);
   ObjectsDeleteAll(0,OBJ_LABEL);
   string rect_name="HUD_BG";
   if(!ObjectCreate(0,rect_name,OBJ_RECTANGLE_LABEL,0,0,0)) Print("Failed to create HUD background");
   ObjectSetInteger(0,rect_name,OBJPROP_XSIZE,260);
   ObjectSetInteger(0,rect_name,OBJPROP_YSIZE,170);
   ObjectSetInteger(0,rect_name,OBJPROP_CORNER,CORN_LEFT_UPPER);
   ObjectSetInteger(0,rect_name,OBJPROP_COLOR,clrBlack);
   ObjectSetInteger(0,rect_name,OBJPROP_BACK,true);
   ObjectSetInteger(0,rect_name,OBJPROP_TRANSPARENT,true);
   string hdr="KOG EA v4.48 | RED BOX CONFLUENCES";
   string hdr_name="HUD_HDR";
   ObjectCreate(0,hdr_name,OBJ_LABEL,0,0,0);
   ObjectSetString(0,hdr_name,OBJPROP_TEXT,hdr);
   ObjectSetInteger(0,hdr_name,OBJPROP_CORNER,CORN_LEFT_UPPER);
   ObjectSetInteger(0,hdr_name,OBJPROP_XDISTANCE,5);
   ObjectSetInteger(0,hdr_name,OBJPROP_YDISTANCE,5);
   ObjectSetInteger(0,hdr_name,OBJPROP_COLOR,clrWhite);
   string acct=StringFormat("Balance: %.2f  Equity: %.2f  Free: %.2f",AccountInfoDouble(ACCOUNT_BALANCE),AccountInfoDouble(ACCOUNT_EQUITY),AccountInfoDouble(ACCOUNT_MARGIN_FREE));
   string acct_name="HUD_ACCT";
   ObjectCreate(0,acct_name,OBJ_LABEL,0,0,0);
   ObjectSetString(0,acct_name,OBJPROP_TEXT,acct);
   ObjectSetInteger(0,acct_name,OBJPROP_CORNER,CORN_LEFT_UPPER);
   ObjectSetInteger(0,acct_name,OBJPROP_XDISTANCE,5);
   ObjectSetInteger(0,acct_name,OBJPROP_YDISTANCE,25);
   ObjectSetInteger(0,acct_name,OBJPROP_COLOR,clrLime);
   int score=GetConfluenceScore();
   string conf=StringFormat("Confluence Score: %d/%d",score,ConfluenceMinScore);
   string conf_name="HUD_CONF";
   ObjectCreate(0,conf_name,OBJ_LABEL,0,0,0);
   ObjectSetString(0,conf_name,OBJPROP_TEXT,conf);
   ObjectSetInteger(0,conf_name,OBJPROP_CORNER,CORN_LEFT_UPPER);
   ObjectSetInteger(0,conf_name,OBJPROP_XDISTANCE,5);
   ObjectSetInteger(0,conf_name,OBJPROP_YDISTANCE,45);
   ObjectSetInteger(0,conf_name,OBJPROP_COLOR,clrRed);
   string trend="H1 Trend: " + (iMA(_Symbol,PERIOD_H1,50,0,MODE_EMA,PRICE_CLOSE,0)>iMA(_Symbol,PERIOD_H1,50,1,MODE_EMA,PRICE_CLOSE,1) ? "Bullish" : "Bearish");
   string spread=StringFormat("Spread: %.1f (max %.1f)", (SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SymbolInfoDouble(_Symbol,SYMBOL_BID))/Point, Max_Allowed_Spread);
   string market=trend+" | "+spread;
   string market_name="HUD_MKT";
   ObjectCreate(0,market_name,OBJ_LABEL,0,0,0);
   ObjectSetString(0,market_name,OBJPROP_TEXT,market);
   ObjectSetInteger(0,market_name,OBJPROP_CORNER,CORN_LEFT_UPPER);
   ObjectSetInteger(0,market_name,OBJPROP_XDISTANCE,5);
   ObjectSetInteger(0,market_name,OBJPROP_YDISTANCE,65);
   ObjectSetInteger(0,market_name,OBJPROP_COLOR,clrYellow);
   int pos_cnt=PositionsTotal();
   double total_lots=0.0;
   for(int i=0;i<pos_cnt;i++) { if(!PositionSelect(i)) continue; if(PositionGetInteger(POSITION_MAGIC)!=MagicNumber) continue; total_lots+=PositionGetDouble(POSITION_VOLUME); }
   string posinfo=StringFormat("Positions: %d  Lots: %.2f",pos_cnt,total_lots);
   string pos_name="HUD_POS";
   ObjectCreate(0,pos_name,OBJ_LABEL,0,0,0);
   ObjectSetString(0,pos_name,OBJPROP_TEXT,posinfo);
   ObjectSetInteger(0,pos_name,OBJPROP_CORNER,CORN_LEFT_UPPER);
   ObjectSetInteger(0,pos_name,OBJPROP_XDISTANCE,5);
   ObjectSetInteger(0,pos_name,OBJPROP_YDISTANCE,85);
   ObjectSetInteger(0,pos_name,OBJPROP_COLOR,clrAqua);
   string tt=StringFormat("TP: %.1f  SL: %.1f  Trail: %s (S%.1f/St%.1f)",Input_TP_Pips,Input_SL_Pips,Input_Enable_Trailing?"On":"Off",Input_Trailing_Start_Pips,Input_Trailing_Step_Pips);
   string tt_name="HUD_TGT";
   ObjectCreate(0,tt_name,OBJ_LABEL,0,0,0);
   ObjectSetString(0,tt_name,OBJPROP_TEXT,tt);
   ObjectSetInteger(0,tt_name,OBJPROP_CORNER,CORN_LEFT_UPPER);
   ObjectSetInteger(0,tt_name,OBJPROP_XDISTANCE,5);
   ObjectSetInteger(0,tt_name,OBJPROP_YDISTANCE,105);
   ObjectSetInteger(0,tt_name,OBJPROP_COLOR,clrOrange);
   string rb=StringFormat("Red Box: %s",(score>=ConfluenceMinScore)?"ACTIVE":"waiting");
   string rb_name="HUD_RB";
   ObjectCreate(0,rb_name,OBJ_LABEL,0,0,0);
   ObjectSetString(0,rb_name,OBJPROP_TEXT,rb);
   ObjectSetInteger(0,rb_name,OBJPROP_CORNER,CORN_LEFT_UPPER);
   ObjectSetInteger(0,rb_name,OBJPROP_XDISTANCE,5);
   ObjectSetInteger(0,rb_name,OBJPROP_YDISTANCE,125);
   ObjectSetInteger(0,rb_name,OBJPROP_COLOR,(score>=ConfluenceMinScore)?clrRed:clrGray);
  }
//+------------------------------------------------------------------+