//+------------------------------------------------------------------+ //| 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); } }
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
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.
Author: Amanda Vitoria De Paula Pereira