Indicators: Institutional Kyle's Lambda Market Impact Engine

 

Institutional Kyle's Lambda Market Impact Engine:

An institutional market microstructure indicator for MT4 that computes Kyle's Lambda and Amihud Illiquidity ratios to identify institutional order absorption and toxic liquidity vacuums.

Institutional Kyle's Lambda Market Impact Engine

Author: Amanda Vitoria De Paula Pereira

 
//+------------------------------------------------------------------+
//|                          Prop_ATR_Trail_Manager.mq4              |
//|                          Copyright 2026, Amanda V                |
//+------------------------------------------------------------------+
#property copyright "Amanda V"
#property version   "1.04"
#property strict

//--- Inputs
input int    InpATRPeriod     = 14;      // ATR Period
input double InpATRMultiplier = 2.0;     // ATR Multiplier
input int    InpBEActivation  = 20;      // Pips in profit to activate BE
input int    InpBELockProfit  = 2;       // Pips to lock in profit (covers fees)
input int    InpMagicNumber   = 0;       // Magic Number (0 = Manual Trades)

double pt;
double pip_mult;

// Runtime toggles
bool UseBreakeven = true;
bool UseTrailing  = true;

//+------------------------------------------------------------------+
int OnInit()
  {
   pt = Point;
   pip_mult = (Digits == 3 || Digits == 5) ? 10.0 : 1.0;

   // Create chart buttons
   CreateButton("btnBE","Breakeven: ON",10,20,120,20,clrGreen);
   CreateButton("btnTR","Trailing: ON",10,50,120,20,clrBlue);

   // Create dashboard labels
   CreateLabel("lblATR","ATR: --",150,20,clrWhite);
   CreateLabel("lblTrail","Trail Dist: --",150,40,clrWhite);
   CreateLabel("lblStatus","Status: --",150,60,clrWhite);

   Print("ATR Trail Manager Initialized.");
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete("btnBE");
   ObjectDelete("btnTR");
   ObjectDelete("lblATR");
   ObjectDelete("lblTrail");
   ObjectDelete("lblStatus");
  }

//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      if(sparam=="btnBE")
        {
         UseBreakeven = !UseBreakeven;
         ObjectSetString(0,"btnBE",OBJPROP_TEXT,UseBreakeven?"Breakeven: ON":"Breakeven: OFF");
         ObjectSetInteger(0,"btnBE",OBJPROP_BGCOLOR,UseBreakeven?clrGreen:clrRed);
      }
      else if(sparam=="btnTR")
        {
         UseTrailing = !UseTrailing;
         ObjectSetString(0,"btnTR",OBJPROP_TEXT,UseTrailing?"Trailing: ON":"Trailing: OFF");
         ObjectSetInteger(0,"btnTR",OBJPROP_BGCOLOR,UseTrailing?clrBlue:clrRed);
      }
     }
  }

//+------------------------------------------------------------------+
void OnTick()
  {
   double atr_value = iATR(Symbol(),PERIOD_CURRENT,InpATRPeriod,1);
   double trail_distance = atr_value * InpATRMultiplier;

   double be_activation_pts = InpBEActivation * pip_mult * pt;
   double be_lock_pts       = InpBELockProfit * pip_mult * pt;

   // Update dashboard
   ObjectSetString(0,"lblATR",OBJPROP_TEXT,"ATR: "+DoubleToString(atr_value,Digits));
   ObjectSetString(0,"lblTrail",OBJPROP_TEXT,"Trail Dist: "+DoubleToString(trail_distance,Digits));
   ObjectSetString(0,"lblStatus",OBJPROP_TEXT,
                   "BE: "+(UseBreakeven?"ON":"OFF")+" | TR: "+(UseTrailing?"ON":"OFF"));

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()!=Symbol()) continue;
         if(InpMagicNumber!=0 && OrderMagicNumber()!=InpMagicNumber) continue;

         double open_price = OrderOpenPrice();
         double current_sl = OrderStopLoss();
         int type = OrderType();

         if(type==OP_BUY)
           {
            double bid = Bid;

            // Breakeven
            if(UseBreakeven && bid >= open_price+be_activation_pts)
              {
               double new_be_sl = open_price+be_lock_pts;
               if((current_sl<new_be_sl || current_sl==0) && new_be_sl<bid)
                 {
                  if(!OrderModify(OrderTicket(),open_price,new_be_sl,OrderTakeProfit(),0,clrGreen))
                     Print("OrderModify failed BUY BE ",GetLastError());
                  else current_sl=new_be_sl;
                 }
              }

            // Trailing
            if(UseTrailing)
              {
               double new_trail_sl = bid-trail_distance;
               if(new_trail_sl>current_sl && new_trail_sl<bid)
                 {
                  if(current_sl==0 || new_trail_sl-current_sl>(2*pip_mult*pt))
                    {
                     if(!OrderModify(OrderTicket(),open_price,new_trail_sl,OrderTakeProfit(),0,clrBlue))
                        Print("OrderModify failed BUY trail ",GetLastError());
                    }
                 }
              }
           }

         else if(type==OP_SELL)
           {
            double ask = Ask;

            // Breakeven
            if(UseBreakeven && ask <= open_price-be_activation_pts)
              {
               double new_be_sl = open_price-be_lock_pts;
               if((current_sl>new_be_sl || current_sl==0) && new_be_sl>ask)
                 {
                  if(!OrderModify(OrderTicket(),open_price,new_be_sl,OrderTakeProfit(),0,clrGreen))
                     Print("OrderModify failed SELL BE ",GetLastError());
                  else current_sl=new_be_sl;
                 }
              }

            // Trailing
            if(UseTrailing)
              {
               double new_trail_sl = ask+trail_distance;
               if((current_sl==0 || new_trail_sl<current_sl) && new_trail_sl>ask)
                 {
                  if(current_sl==0 || current_sl-new_trail_sl>(2*pip_mult*pt))
                    {
                     if(!OrderModify(OrderTicket(),open_price,new_trail_sl,OrderTakeProfit(),0,clrRed))
                        Print("OrderModify failed SELL trail ",GetLastError());
                    }
                 }
              }
           }
        }
     }
  }

//+------------------------------------------------------------------+
// Helpers
void CreateButton(string name,string text,int x,int y,int w,int h,color bg)
  {
   if(ObjectFind(0,name)<0)
     {
      ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
      ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
      ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
      ObjectSetInteger(0,name,OBJPROP_XSIZE,w);
      ObjectSetInteger(0,name,OBJPROP_YSIZE,h);
      ObjectSetInteger(0,name,OBJPROP_BGCOLOR,bg);
      ObjectSetInteger(0,name,OBJPROP_COLOR,clrWhite);
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10);
      ObjectSetString(0,name,OBJPROP_TEXT,text);
     }
  }

void CreateLabel(string name,string text,int x,int y,color col)
  {
   if(ObjectFind(0,name)<0)
     {
      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,col);
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10);
      ObjectSetString(0,name,OBJPROP_TEXT,text);
     }
  }