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.
//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+