Blessing 2 v5.2

Author: Copyright FiFtHeLeMeNt/J Talon LLC � 2007-2009, .
Profit factor:
1.53

Professional Logic Overview: Blessing 2 v5.2

This document provides a non-technical explanation of the operational logic for the Blessing 2 v5.2 automated trading script. The system is designed as a sophisticated grid-based trading robot that utilizes trend detection, dynamic risk management, and multi-level profit targets.


1. Core Trading Strategy: Dynamic Grid Management

The primary mechanism of this script is a Grid Trading System. Instead of looking for a single "perfect" entry to hold until a target is hit, the script places multiple orders at specific price intervals.

  • Market Condition Detection: The script uses a Moving Average (EMA) to determine the current market trend.
    • If the price is above the average, it identifies an Uptrend.
    • If the price is below the average, it identifies a Downtrend.
    • In a "Ranging" market (sideways movement), it behaves differently to accommodate lack of direction.
  • Order Placement: Based on the detected trend, the script places "Limit" or "Stop" orders at calculated distances (the "Grid"). This ensures that if the price moves against an initial position, the system is already prepared with subsequent orders to average the entry price.

2. Automated Adjustments (Volatility & Scale)

The script is "intelligent" in how it calculates these grid distances and profit targets:

  • ATR Integration: It uses the Average True Range (ATR) to measure market volatility. If the market becomes highly volatile, the script automatically widens the grid; if the market calms down, it narrows the grid.
  • Multi-Level Scaling: The system features three distinct "Levels." As the number of open positions increases (moving deeper into a grid), the script adjusts the distance between orders and the final profit targets to account for higher accumulated risk.
  • Time Buffering: To prevent the system from opening too many orders simultaneously during a fast-moving market spike, it includes a "Time Grid" buffer that requires a minimum amount of time to pass before placing the next level of orders.

3. Money Management & Risk Controls

The script includes several layers of protection to manage account health:

  • Dynamic Lot Sizing: It can automatically calculate trade sizes based on your account balance, ensuring that the "Portion" of the account being risked remains consistent as the balance grows or shrinks.
  • Equity Protection: A "hard stop" feature that monitors your floating profit/loss. If the negative balance exceeds a specific percentage of your target portion, the script will automatically close all open trades to preserve the remaining capital.
  • Power Out Stop Loss: This is a sophisticated safety net. It calculates a global stop-loss price for all active positions based on the current total volume (lots) held. This protects the account against sudden, catastrophic market gaps or "black swan" events.

4. Trade Execution Logic

  • Trend Filtering: The script prioritizes trades that align with the detected trend (e.g., only seeking long positions in an uptrend).
  • Position Syncing: When a new level of the grid is opened, the script attempts to "sync" the Take Profit levels of all existing orders. This ensures that the entire "basket" of trades moves toward a unified exit point.
  • Lot Incrementing: As positions are added to a grid, the script can increase the size of each subsequent trade (using a multiplier) to bring the average entry price closer to the current market price faster.

5. User Interface & Monitoring

The script provides a real-time visual dashboard on the trading chart. This displays:

  • Current account balance and profit/loss for the specific "Portion" being traded.
  • Real-time count of Buy and Sell positions.
  • The percentage of risk currently exposed on the account.
  • Active alerts and warnings if the balance falls below your predefined minimum requirements.
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt Closes Orders by itself It automatically opens orders when conditions are reached
Indicators Used
Indicator of the average true rangeMoving average indicator
Miscellaneous
It plays sound alertsIt opens Message Boxes to the user
20 Views
0 Downloads
0 Favorites
Blessing 2 v5.2
//+------------------------------------------------------------------+
//|                                                  Blessing 2 v5.2 |
//|                              Copyright © 2007-2009, MQLCoder.com |
//|                                                jta@jtatoday.com  |
//|                                             http://www.irxfx.com |
//|                                         fifthelement80@gmail.com |
//|  In no event will authors be liable for any damages whatsoever.  |
//|                      Use at your own risk.                       |
//+------------------------------------------------------------------+

// Added AutoCal Timeframe and Period to External Variables by Bobster

#property copyright "Copyright FiFtHeLeMeNt/J Talon LLC © 2007-2009, ."
#property link      "http://www.mqlcoder.com"
#define  NL    "\n"

extern string  InitialAccountSet   = "Initial account balance";
extern int     InitialAccount      = 1000; 

extern string  TradeComment        = "Blessing";

extern string  NumberPortionSet    = "Account Portion";
extern int     Portion             = 1;    // Portion of account you want to trade on this pair

extern bool    UseEquityProtection = true; // Close all orders when negative Float is excessive.
extern double  FloatPercent        = 50;   // Percent of portion for max Float level.
extern bool    UsePowerOutSL       = false;   

extern bool    UseMM               = 1;    // Money Management - 1 = true & 0 = false.

extern string  LotAdjustmentSet    = "Only with MM enabled. (.01 - 5.0)";
extern double  LAF                 = 1.0;  // Adjusts MM base lot for large accounts

extern string  AccountTypeSet      = "1=standard, 10=micro for penny/pip)";
extern int     Accounttype         = 1;    // Used in Money Management feature only.

extern string  ManuallotSet        = "Lots used if MM is off";
extern double  lot                 = 0.01; // Starting lots if Money Management is off

extern string  LotHedgeSet         = "Hedge Multiplier.  Adjust by +/-.01 intervals ";
extern double  Multiplier          = 1.4;  // Multiplier on each level

extern string  AutoParametersSet   = "Autocalculates the Grid based on ATR";
extern bool    AutoCal             = true; // Auto calculation of TakeProfit and Grid size;
extern int     AutoCalTF           = 1440;
extern int     AutoCalPeriod       = 21;

extern string  AutoGridAdjust      = "Widens/squishes grid (.5 - 3.0)";
extern double  GAF                 = 1.0;  // Widens/Squishes Grid on increments/decrements of .1

extern string  GridSet             = "Default Grid size in Pips";
extern int     GridSet1            = 25;   // Set 1 Grid Size
extern int     TP_Set1             = 50;   // Set 1 Take Profit
extern int     GridSet2            = 50;   // Level 2 Grid Size
extern int     TP_Set2             = 100;  // Level 2 Take Profit
extern int     GridSet3            = 100;  // Level 3 Grid Size
extern int     TP_Set3             = 200;  // Level 3 Take Profit

extern string  TimeGridSet         = "Default grid set time in seconds";
extern int     TimeGrid            = 2400; // Time Grid in seconds , to avoid opening of lots of levels in fast market

extern string  MarketConditionSet  = "Set MC to 2 for Ranging Market";
extern int     MC                  = 2;    // Market condition 0=uptrend 1=downtrend 2=range

extern string  MovingAverageSet    = "Changes MC for correct trend (up/down)";
extern bool    MCbyMA              = true; // Defines market condition by EMA , if price is above EMA,
                                           // it will take it as an uptrend and goes only long,
                                           // vice versa for below the EMA
extern int     MA_Period           = 100;   // Period of MA

extern string  MaxLevelSet         = "Default of 4 on each level, change sparingly";
extern int     Set1Count           = 4;    // Level 1 max levels
extern int     Set2Count           = 4;    // Level 2 max levels
extern int     MaxLevel            = 99;   // Level 2 max levels (stops placing orders when reaches maxlvl2)
extern int     BELevel             = 12;   // Close All level , when reaches this level, doesn't wait for TP to be hit

extern int     slippage            = 999; // Tolerance of order slips/requotes for closing

//+------------------------------------------------------------------+
//| Internal Parameters Set                                          |
//+------------------------------------------------------------------+

bool           ca                  = false;
string         EA_name             = "Blessing © FiFtHeLeMeNt/J Talon LLC";
int            magic               = 0;
double         slip                = 0;       
int            d                   = 5;      // Used to offset entry to round numbers , for example if you set d=5,
                                             // it will place its sell order on 1.5795 instead of 1.5780
double         LotInc              = 0;      // Lot Increment on each level, very dangerous
string         Filename;
int            BrokerDecimal       = 1;
string         POSL_On             = "No";
int            count;
double         PortionBalance;
double         InitialAccountMultiPortion;
double         PortionEquity;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+

int init()
  {
   if (Symbol() == "AUDCADm" || Symbol() == "AUDCAD") magic = 101101;
   if (Symbol() == "AUDJPYm" || Symbol() == "AUDJPY") magic = 101102;
   if (Symbol() == "AUDNZDm" || Symbol() == "AUDNZD") magic = 101103;
   if (Symbol() == "AUDUSDm" || Symbol() == "AUDUSD") magic = 101104;
   if (Symbol() == "CHFJPYm" || Symbol() == "CHFJPY") magic = 101105;
   if (Symbol() == "EURAUDm" || Symbol() == "EURAUD") magic = 101106;
   if (Symbol() == "EURCADm" || Symbol() == "EURCAD") magic = 101107;
   if (Symbol() == "EURCHFm" || Symbol() == "EURCHF") magic = 101108;
   if (Symbol() == "EURGBPm" || Symbol() == "EURGBP") magic = 101109;
   if (Symbol() == "EURJPYm" || Symbol() == "EURJPY") magic = 101110;
   if (Symbol() == "EURUSDm" || Symbol() == "EURUSD") magic = 101111;
   if (Symbol() == "GBPCHFm" || Symbol() == "GBPCHF") magic = 101112;
   if (Symbol() == "GBPJPYm" || Symbol() == "GBPJPY") magic = 101113;
   if (Symbol() == "GBPUSDm" || Symbol() == "GBPUSD") magic = 101114;
   if (Symbol() == "NZDJPYm" || Symbol() == "NZDJPY") magic = 101115;
   if (Symbol() == "NZDUSDm" || Symbol() == "NZDUSD") magic = 101116;
   if (Symbol() == "USDCHFm" || Symbol() == "USDCHF") magic = 101117;
   if (Symbol() == "USDJPYm" || Symbol() == "USDJPY") magic = 101118;
   if (Symbol() == "USDCADm" || Symbol() == "USDCAD") magic = 101119;
   
   if (magic == 0) magic = 701999;
   
   if(Digits==3 || Digits==5) BrokerDecimal = 10;
   
   Filename = StringConcatenate(EA_name+"_",Symbol(),"_",Period(),"_M",".txt");
   
   return(0);
  }

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+

int deinit()
  {
//----
   
//----
   return(0);
  }

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int start()
  {
   int y;
   int cb=0; // Count buy
   int cs=0; // Count sell
   int cbl=0; // Count buy limit
   int csl=0; // Count sell limit
   int cbs=0; // Count buy limit
   int css=0; // Count sell limit
   double tbl=0; //Count lot size
   double tsl=0; //Count lot size
   double tl=0; //total lots out
   double to=0; //total buy and sell order out
   double buysl=0; //stop losses are set to zero if POSL off
   double sellsl=0; //stop losses are set to zero if POSL off
   double POSL=0; //Initialize POSL
   double m,lot2;
   double lp; // last buy price
   double ll; //last lot
   double ltp; //last tp
   double lopt; // last open time
   double g2;
   double tp2;
   double entry;
   double pr=0; // profit;
   double sumlot;
   int lticket;
   double mp,mp2; // median price
  
//+------------------------------------------------------------------+
//| Calculate Total Profits and Total Orders                         |
//+------------------------------------------------------------------+ 

for (y = 0; y < OrdersTotal(); y++)
   {
      OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
      if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()==OP_BUY)) {
        cb++;
        pr=pr+OrderProfit();
        tbl=tbl+OrderLots();
      }
      if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()==OP_SELL)) {
        cs++;
        pr=pr+OrderProfit();
        tsl=tsl+OrderLots();
      }
      if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()==OP_BUYLIMIT)) cbl++;
      if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()==OP_SELLLIMIT)) csl++;
      if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()==OP_BUYSTOP)) cbs++;
      if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()==OP_SELLSTOP)) css++;
      tl=tbl+tsl;
      to=cb+cs;}
      
//+------------------------------------------------------------------+
//| Account Protection                                               |
//+------------------------------------------------------------------+ 
  
  PortionBalance = NormalizeDouble(AccountBalance()/Portion,2);
  PortionEquity  = NormalizeDouble(PortionBalance + pr,2);
  if(UseEquityProtection) {
       if ( PortionBalance - PortionEquity >= (PortionBalance * FloatPercent/100) )  
               ExitAllTrades(Red,"Equity Stop Loss Reached");}  

//+------------------------------------------------------------------+
//| Trading with EA Criteria                                         |
//+------------------------------------------------------------------+

  InitialAccountMultiPortion = InitialAccount/Portion;
      if (PortionBalance < InitialAccountMultiPortion){ 
            PlaySound("alert.wav");
            Print("Account Balance is less than Initial Account Balance setting"); 
            MessageBox( "Account Balance is less than Initial Account Balance on " + Symbol()+ Period(), "Blessing 2: Warning", 48 );
  return(0);}

//+------------------------------------------------------------------+
//| Power Out Stop Loss Protection                                   |
//+------------------------------------------------------------------+ 

  if(UsePowerOutSL) {
     POSL_On = "Yes";
     int correct = 1;
     double pipvalue=MarketInfo(Symbol(),MODE_TICKVALUE);
     if(Accounttype == 1 && pipvalue < 5) correct = 10;
     if(tl == 0){
       POSL = 600;
       if(Digits==3 || Digits==5) POSL = POSL * 10;
       buysl = Ask - POSL * Point;
       sellsl= Bid + POSL * Point;}
    
     if(tl > 0){
       POSL =  NormalizeDouble((PortionBalance * (FloatPercent + 1)/100)/(pipvalue * tl * correct),0);
       if(POSL > 600) POSL = 600;
       if(Digits==3 || Digits==5) POSL = POSL * 10;
       buysl = Ask - POSL * Point;
       sellsl= Bid + POSL * Point;}
       
     if(to == 0) count = 0;
     if(to > 0 && to > count){
     
     // sync up order stop losses
     for (int q = 0; q < OrdersTotal(); q++) {
        OrderSelect (q, SELECT_BY_POS, MODE_TRADES);
        if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()==OP_BUY)) {
            OrderModify(OrderTicket(), OrderOpenPrice(), buysl, OrderTakeProfit(), 0, Purple);}
        if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()==OP_SELL)) {
            OrderModify(OrderTicket(), OrderOpenPrice(), sellsl, OrderTakeProfit(), 0, Purple);} } } 
        count = to;}

//+------------------------------------------------------------------+
//| Money Management and Lot size coding                             |
//+------------------------------------------------------------------+
   
  if(UseMM){

  double Contracts, Factor, Lotsize;

          Contracts = (AccountBalance()/10000)/Portion;
          Factor    = Multiplier+
                MathPow(Multiplier,2)+
                MathPow(Multiplier,3)+
                MathPow(Multiplier,4)+
                MathPow(Multiplier,5)+
                MathPow(Multiplier,6);

          Lotsize=LAF*Accounttype*(Contracts/(1.0 + Factor));

    //Determine Lot size boundries from minimum to maximum

          lot=NormalizeDouble(Lotsize,2);

          if(Lotsize<0.01) lot=0.01;
          if(Lotsize>100/MathPow(Multiplier,6) && Accounttype == 1) lot=NormalizeDouble(100/MathPow(Multiplier,6),2);
          if(Lotsize>50/MathPow(Multiplier,6)  && Accounttype == 10) lot=NormalizeDouble(50/MathPow(Multiplier,6),2);}

//+------------------------------------------------------------------+
//| ATR to autocalculate the Grid                                    | 
//+------------------------------------------------------------------+     

  double GridStart,value1;
  double atrvalue = iATR(NULL,AutoCalTF,AutoCalPeriod,0);  // Bobster added external variables; default is 1440, 21
    if(AutoCal==True){
      if(Digits == 2 || Digits == 3) value1 = atrvalue*100;
      if(Digits == 4 || Digits == 5) value1 = atrvalue*10000;
      GridStart = value1*2/10;
      GridSet1  = GridStart;
      TP_Set1   = GridStart + GridSet1;
      GridSet2  = TP_Set1;
      TP_Set2   = (GridStart + GridSet1) * 2;
      GridSet3  = TP_Set2;
      TP_Set3   = (GridStart + GridSet1) * 4;}       
 
//+------------------------------------------------------------------+
//| Moving Average Indicator for Calculation of Trend Direction      |
//+------------------------------------------------------------------+      

  if (MCbyMA) {
     MC=-1;
     if (Bid<iMA(Symbol(),0,MA_Period,0,MODE_EMA,PRICE_CLOSE,0)) MC=1;
     if (Bid>iMA(Symbol(),0,MA_Period,0,MODE_EMA,PRICE_CLOSE,0)) MC=0;}

//+------------------------------------------------------------------+
//| Blessing Code                                                    |
//+------------------------------------------------------------------+   
   
  if (cs==0 && cb==0 && cbs==0 && cbl==0 && css==0 && csl==0) ca=false;
     
   slip = NormalizeDouble((slippage * BrokerDecimal),0);
  
   if (((cb>=BELevel || cs>=BELevel) && pr>0) || ca) {
     ca=true;
     for (y = 0; y < OrdersTotal(); y++){
       OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
       if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slip,Lime);
       if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)) OrderDelete(OrderTicket(),White);}
     return;}

      d = d;
      if (BrokerDecimal == 10) d=50;
      g2=GridSet1;
      tp2=TP_Set1;

   if (cb>=Set1Count || cs>=Set1Count) {
     g2=GridSet2;
     tp2=TP_Set2;}

   if (cb>=Set2Count+Set1Count || cs>=Set2Count+Set1Count) {
     g2=GridSet3;
     tp2=TP_Set3;}
   
//+------------------------------------------------------------------+
//| Broker Decimal Selection                                         |
//+------------------------------------------------------------------+ 

  if (BrokerDecimal == 10){
     g2 *= 10;
     tp2 *= 10;}

//+------------------------------------------------------------------+
//| Adjust Grid and Normalize Values                                 |
//+------------------------------------------------------------------+

  g2  = NormalizeDouble(g2*GAF,0);
  tp2 = NormalizeDouble(tp2*GAF,0);
  
//+------------------------------------------------------------------+
//| Trade Selection Logic                                            |
//+------------------------------------------------------------------+ 

   if ((cb==0) && (cs==0)) {
     for (y = 0; y < OrdersTotal(); y++)
     {
       OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
       if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderLots()>lot)) OrderDelete(OrderTicket()); }

   if (MC==0) {
        if (cbs==0) {
          m=MathMod(Ask/Point,g2);
          if ((g2-m+d)>MarketInfo(Symbol(),MODE_STOPLEVEL)) {
            OrderSend(Symbol(),OP_BUYSTOP,lot,Ask*2-Bid+(g2-m+d)*Point,0,buysl,Ask*2-Bid+(g2-m+d+tp2)*Point,TradeComment,magic,0,CLR_NONE);
            Print("s2");
            return;} }
        if (cbl==0) {
          m=MathMod(Ask/Point,g2);
          if ((m+d)>MarketInfo(Symbol(),MODE_STOPLEVEL)) {
            OrderSend(Symbol(),OP_BUYLIMIT,lot,Ask*2-Bid-(m+d)*Point,0,buysl,Ask*2-Bid-(m+d-tp2)*Point,TradeComment,magic,0,CLR_NONE);
            Print("s1");
            return;} } }

   if (MC==1) {
        if (csl==0) {
          m=MathMod(Bid/Point,g2);
          if ((g2-m-d)>MarketInfo(Symbol(),MODE_STOPLEVEL)) {
            OrderSend(Symbol(),OP_SELLLIMIT,lot,Bid+(g2-m-d)*Point,0,sellsl,Bid+(g2-m-d-tp2)*Point,TradeComment,magic,0,CLR_NONE);
            Print("s2");
            return;} }
        if (css==0) {
          m=MathMod(Bid/Point,g2);
          if ((m+d)>MarketInfo(Symbol(),MODE_STOPLEVEL)) {
            OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-(m+d)*Point,0,sellsl,Bid-(m+d+tp2)*Point,TradeComment,magic,0,CLR_NONE);
            Print("s1");
            return; } } }
       
   if (MC==2) {
        if (css==0) {
          m=MathMod(Bid/Point,g2);
          if ((m+d)>MarketInfo(Symbol(),MODE_STOPLEVEL)) {
            OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-(m+d)*Point,0,sellsl,Bid-(m+d+tp2)*Point,TradeComment,magic,0,CLR_NONE);
            Print("s1");
            return; } }
        if (cbs==0) {
          m=MathMod(Ask/Point,g2);
          if ((g2-m+d)>MarketInfo(Symbol(),MODE_STOPLEVEL)) {
            OrderSend(Symbol(),OP_BUYSTOP,lot,Ask*2-Bid+(g2-m+d)*Point,0,buysl,Ask*2-Bid+(g2-m+d+tp2)*Point,TradeComment,magic,0,CLR_NONE);
            Print("s2");
            return;} } } }

   if (cb>0 || cs>0) {
     for (y = 0; y < OrdersTotal(); y++){
        OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
        if ((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) && (OrderType()!=OP_SELL) && (OrderType()!=OP_BUY) && OrderLots()==lot) OrderDelete(OrderTicket());} }
   
   if (cb>0) {
     sumlot=0;
     mp=0;
     for (y = 0; y < OrdersTotal(); y++){
       OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
       if ((OrderMagicNumber() != magic) || (OrderType()!=OP_BUY) || (OrderSymbol()!=Symbol())) { continue; }
       lp=OrderOpenPrice();
       ll=OrderLots();
       ltp=OrderTakeProfit();
       lopt=OrderOpenTime();
       lticket=OrderTicket();
       sumlot=sumlot+ll;
       mp=mp+ll*lp;}
      
       mp=mp/sumlot;
 
   if ((TimeCurrent()-TimeGrid>lopt) && (cb<MaxLevel)) {
         if (lp>Ask) entry=NormalizeDouble(lp-(MathRound((lp-Ask)/Point/g2)+1)*g2*Point,Digits); else entry=NormalizeDouble(lp-g2*Point,Digits);
         if (ll <= 0.01) lot2=NormalizeDouble(ll*2+LotInc,2); else lot2=NormalizeDouble(ll*Multiplier+LotInc,2);
       
         if (cbl==0) {
           OrderSend(Symbol(),OP_BUYLIMIT,lot2,entry,0,buysl,entry+tp2*Point,TradeComment,magic);
           Print("s3");
           return;}

         if (cbl==1) {
           for (y = 0; y < OrdersTotal(); y++){
              OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
              if (OrderType()==OP_BUYLIMIT && OrderMagicNumber()==magic && (OrderSymbol()==Symbol()) && entry-OrderOpenPrice()>g2/2*Point) {
                OrderModify(OrderTicket(),entry,buysl,entry+tp2*Point,0);
                Print("mo1");} } } } 
         
         for (y = 0; y < OrdersTotal(); y++){ // Sync TPs
           OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
           if ((OrderMagicNumber() != magic) || (OrderType()!=OP_BUY) || (MathAbs(OrderTakeProfit()-ltp)<Point) || (OrderSymbol()!=Symbol())) { continue; }
           OrderModify(OrderTicket(),OrderOpenPrice(),buysl,ltp,0,Blue);
           Print("m1");
           return;} }

   if (cs>0) {
     sumlot=0;
     mp=0;
     for (y = 0; y < OrdersTotal(); y++){
       OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
       if ((OrderMagicNumber() != magic) || (OrderType()!=OP_SELL) || (OrderSymbol()!=Symbol())) { continue; }
       lp=OrderOpenPrice();
       ll=OrderLots();
       ltp=OrderTakeProfit();
       lopt=OrderOpenTime();
       lticket=OrderTicket();
       sumlot=sumlot+ll;
       mp=mp+ll*lp;}
      
       mp=mp/sumlot;
 
   if ((TimeCurrent()-TimeGrid>lopt) && (cs<MaxLevel)) {
         if (Bid>lp) entry=NormalizeDouble(lp+(MathRound((-lp+Bid)/Point/g2)+1)*g2*Point,Digits); else entry=NormalizeDouble(lp+g2*Point,Digits);
         if (ll <= 0.01) lot2=NormalizeDouble(ll*2+LotInc,2); else lot2=NormalizeDouble(ll*Multiplier+LotInc,2);
         
         if (csl==0) {
            OrderSend(Symbol(),OP_SELLLIMIT,lot2,entry,0,sellsl,entry-tp2*Point,TradeComment,magic);
            Print("s4");
            return;}

         if (csl==1) {
           for (y = 0; y < OrdersTotal(); y++)           {
              OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
              if (OrderType()==OP_SELLLIMIT && OrderMagicNumber()==magic && (OrderSymbol()==Symbol()) && OrderOpenPrice()-entry>g2/2*Point) {
              OrderModify(OrderTicket(),entry,sellsl,entry-tp2*Point,0);
              Print("mo2");} } } }

        for (y = 0; y < OrdersTotal(); y++){ // Sync TPs
          OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
          if ((OrderMagicNumber() != magic) || (OrderType()!=OP_SELL) || (MathAbs(OrderTakeProfit()-ltp)<Point) || (OrderSymbol()!=Symbol())) { continue; }
          OrderModify(OrderTicket(),OrderOpenPrice(),sellsl,ltp,0,Blue);
          Print("m2");
          return;} }
             
//+------------------------------------------------------------------+
//| External Script Code                                             |
//+------------------------------------------------------------------+

  string Message;

   Message = "                "+EA_name + NL +
             "                            Current Time is      " +  TimeToStr(TimeCurrent(), TIME_SECONDS) + NL + NL +                        
             "                            Initial Account Set              " + DoubleToStr(InitialAccount, 0) + NL +
             "                            Equity Protection % Set      " + DoubleToStr(FloatPercent, 0) + NL + NL +
             "                            Power Off Stop Loss on?         " + POSL_On + NL + NL +
             "                            Starting lot size                   " + DoubleToStr(lot, 2) + NL + NL +

             "                            Portion P/L                        " + DoubleToStr(pr, 2) + NL + NL +     
             
             "                            Buy   " + cb + "  Sell   " + cs + NL + NL +
             "                            Account Portion   " + DoubleToStr(Portion, 0) + "   Total Risk on Account Percent  " + DoubleToStr(FloatPercent/Portion, 0) + NL +                
             "                            Portion Balance      " + DoubleToStr(PortionBalance, 2);
             

   Comment(Message);  
      
return(0);
}
 
//+------------------------------------------------------------------+
//| Exit Trade Function                                              |
//+------------------------------------------------------------------+ 

  void ExitAllTrades(color Color, string reason){
    slip = NormalizeDouble((slippage * BrokerDecimal),0);
    bool success;
    for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt --){
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic){
         OrderDelete(OrderTicket(),Color);
         success=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slip, Color);
         if(success==true){
            Print("Closed all positions because ",reason);} } } }   

//+------------------------------------------------------------------+
//| expert end function                                              |
//+------------------------------------------------------------------+

Profitability Reports

USD/CAD Oct 2024 - Jan 2025
4.30
Total Trades 231
Won Trades 183
Lost trades 48
Win Rate 79.22 %
Expected payoff 8.55
Gross Profit 2573.48
Gross Loss -598.88
Total Net Profit 1974.60
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
3.92
Total Trades 204
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff 19.79
Gross Profit 5421.14
Gross Loss -1384.10
Total Net Profit 4037.04
-100%
-50%
0%
50%
100%
AUD/USD Jul 2025 - Sep 2025
3.45
Total Trades 156
Won Trades 114
Lost trades 42
Win Rate 73.08 %
Expected payoff 11.19
Gross Profit 2457.55
Gross Loss -712.15
Total Net Profit 1745.40
-100%
-50%
0%
50%
100%
AUD/USD Jul 2025 - Sep 2025
3.22
Total Trades 155
Won Trades 117
Lost trades 38
Win Rate 75.48 %
Expected payoff 10.58
Gross Profit 2378.18
Gross Loss -737.80
Total Net Profit 1640.38
-100%
-50%
0%
50%
100%
USD/CHF Jul 2025 - Sep 2025
3.02
Total Trades 137
Won Trades 100
Lost trades 37
Win Rate 72.99 %
Expected payoff 13.55
Gross Profit 2774.94
Gross Loss -919.21
Total Net Profit 1855.73
-100%
-50%
0%
50%
100%
USD/CHF Jul 2025 - Sep 2025
2.98
Total Trades 127
Won Trades 88
Lost trades 39
Win Rate 69.29 %
Expected payoff 19.49
Gross Profit 3725.96
Gross Loss -1251.08
Total Net Profit 2474.88
-100%
-50%
0%
50%
100%
USD/JPY Jan 2025 - Jul 2025
2.78
Total Trades 362
Won Trades 266
Lost trades 96
Win Rate 73.48 %
Expected payoff 36.36
Gross Profit 20534.97
Gross Loss -7374.00
Total Net Profit 13160.97
-100%
-50%
0%
50%
100%
GBP/AUD Jul 2025 - Sep 2025
2.57
Total Trades 147
Won Trades 113
Lost trades 34
Win Rate 76.87 %
Expected payoff 16.29
Gross Profit 3919.25
Gross Loss -1524.05
Total Net Profit 2395.20
-100%
-50%
0%
50%
100%
USD/CAD Jul 2025 - Sep 2025
2.25
Total Trades 106
Won Trades 67
Lost trades 39
Win Rate 63.21 %
Expected payoff 12.59
Gross Profit 2403.15
Gross Loss -1068.72
Total Net Profit 1334.43
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
2.21
Total Trades 164
Won Trades 117
Lost trades 47
Win Rate 71.34 %
Expected payoff 9.43
Gross Profit 2826.40
Gross Loss -1279.70
Total Net Profit 1546.70
-100%
-50%
0%
50%
100%
USD/CAD Jul 2025 - Sep 2025
2.21
Total Trades 104
Won Trades 68
Lost trades 36
Win Rate 65.38 %
Expected payoff 12.87
Gross Profit 2446.34
Gross Loss -1107.42
Total Net Profit 1338.92
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
2.18
Total Trades 113
Won Trades 78
Lost trades 35
Win Rate 69.03 %
Expected payoff 12.84
Gross Profit 2678.50
Gross Loss -1228.00
Total Net Profit 1450.50
-100%
-50%
0%
50%
100%
AUD/USD Oct 2025 - Feb 2026
1.50
Total Trades 151
Won Trades 109
Lost trades 42
Win Rate 72.19 %
Expected payoff 3.74
Gross Profit 1699.70
Gross Loss -1134.80
Total Net Profit 564.90
-100%
-50%
0%
50%
100%
EUR/USD Oct 2025 - Feb 2026
0.61
Total Trades 191
Won Trades 135
Lost trades 56
Win Rate 70.68 %
Expected payoff -17.05
Gross Profit 5002.40
Gross Loss -8259.90
Total Net Profit -3257.50
-100%
-50%
0%
50%
100%
NZD/USD Jan 2025 - Jul 2025
0.57
Total Trades 232
Won Trades 148
Lost trades 84
Win Rate 63.79 %
Expected payoff -15.64
Gross Profit 4776.60
Gross Loss -8405.96
Total Net Profit -3629.36
-100%
-50%
0%
50%
100%
USD/CHF Jan 2025 - Jul 2025
0.51
Total Trades 196
Won Trades 139
Lost trades 57
Win Rate 70.92 %
Expected payoff -19.36
Gross Profit 3972.38
Gross Loss -7766.37
Total Net Profit -3793.99
-100%
-50%
0%
50%
100%
AUD/USD Jan 2025 - Jul 2025
0.50
Total Trades 223
Won Trades 149
Lost trades 74
Win Rate 66.82 %
Expected payoff -17.35
Gross Profit 3832.20
Gross Loss -7700.95
Total Net Profit -3868.75
-100%
-50%
0%
50%
100%
GBP/USD Jan 2025 - Jul 2025
0.41
Total Trades 90
Won Trades 54
Lost trades 36
Win Rate 60.00 %
Expected payoff -46.93
Gross Profit 2875.60
Gross Loss -7099.64
Total Net Profit -4224.04
-100%
-50%
0%
50%
100%
GBP/USD Jul 2025 - Sep 2025
0.27
Total Trades 31
Won Trades 11
Lost trades 20
Win Rate 35.48 %
Expected payoff -142.12
Gross Profit 1607.60
Gross Loss -6013.19
Total Net Profit -4405.59
-100%
-50%
0%
50%
100%
USD/CAD Jan 2025 - Jul 2025
0.21
Total Trades 93
Won Trades 58
Lost trades 35
Win Rate 62.37 %
Expected payoff -49.28
Gross Profit 1251.42
Gross Loss -5834.07
Total Net Profit -4582.65
-100%
-50%
0%
50%
100%
GBP/CAD Jan 2025 - Jul 2025
0.10
Total Trades 41
Won Trades 27
Lost trades 14
Win Rate 65.85 %
Expected payoff -116.01
Gross Profit 527.31
Gross Loss -5283.59
Total Net Profit -4756.28
-100%
-50%
0%
50%
100%
GBP/CAD Oct 2025 - Feb 2026
0.10
Total Trades 42
Won Trades 22
Lost trades 20
Win Rate 52.38 %
Expected payoff -115.84
Gross Profit 538.72
Gross Loss -5403.98
Total Net Profit -4865.26
-100%
-50%
0%
50%
100%
EUR/USD Jul 2025 - Sep 2025
0.01
Total Trades 25
Won Trades 22
Lost trades 3
Win Rate 88.00 %
Expected payoff -1673.60
Gross Profit 374.80
Gross Loss -42214.84
Total Net Profit -41840.04
-100%
-50%
0%
50%
100%
EUR/USD Jan 2025 - Jul 2025
0.00
Total Trades 123
Won Trades 80
Lost trades 43
Win Rate 65.04 %
Expected payoff -13818.87
Gross Profit 2458.20
Gross Loss -1702179.60
Total Net Profit -1699721.40
-100%
-50%
0%
50%
100%
USD/JPY Jul 2025 - Sep 2025
0.00
Total Trades 12
Won Trades 1
Lost trades 11
Win Rate 8.33 %
Expected payoff -416.20
Gross Profit 13.97
Gross Loss -5008.35
Total Net Profit -4994.38
-100%
-50%
0%
50%
100%
USD/JPY Jul 2025 - Sep 2025
0.00
Total Trades 12
Won Trades 1
Lost trades 11
Win Rate 8.33 %
Expected payoff -416.20
Gross Profit 13.97
Gross Loss -5008.35
Total Net Profit -4994.38
-100%
-50%
0%
50%
100%

Comments