Blessing 2 v5.1

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

Professional Logic Overview: Blessing 2 v5.1

This document provides a non-technical explanation of the logic used by the "Blessing 2" automated trading script. The system is designed as a Grid Trading Robot that uses dynamic spacing, trend detection, and automated money management to manage open positions.


1. Core Trading Strategy: Grid System

The primary logic of this script is based on a "Grid." Instead of trying to predict a single exact price point, the robot places multiple orders at specific intervals (the "Grid Size").

  • Dynamic Spacing: The distance between these orders can change automatically based on market volatility (using an ATR indicator).
  • Tiered Progression: The script features different levels. As the trade moves deeper into a grid (e.g., from Level 1 to Level 2), the distance between orders and the target profit goals increase automatically. This helps the robot handle sustained movements in one direction.

2. Market Analysis & Trend Detection

The robot identifies what kind of market it is currently trading in to determine which direction to favor:

  • Moving Average Filter: It uses an Exponential Moving Average (EMA) to detect trends. If the price is above the average, it prioritizes "Long" (Buy) positions; if below, it focuses on "Short" (Sell) positions.
  • Market Condition Modes: The logic can be set to specifically target different environments:
    • Uptrend/Downtrend: Based on the moving average.
    • Ranging Market: Specifically designed for markets that move sideways without a clear trend.

3. Money & Risk Management

The script includes several automated layers to protect the account balance:

  • Portion Trading: Users can define what percentage of the total account should be used for a specific currency pair, preventing one pair from consuming the entire balance.
  • Dynamic Lot Sizing (MM): If enabled, the robot calculates the number of "lots" (trade size) based on the current account balance. It uses a multiplier to ensure that as the grid expands, the lot sizes increase mathematically to help reach profit targets faster.
  • Equity Protection: A safety "circuit breaker." If the floating loss exceeds a specific percentage of your account balance, the robot will automatically close all positions to prevent further losses.
  • Power Out Stop Loss: This is a unique safety feature that calculates a "hard" stop loss price based on the current value of open trades and the risk percentage. It ensures that if the market moves against the grid too quickly, the trades are liquidated at a predetermined safety point.

4. Order Execution Logic

  • Entry Timing: To avoid opening too many trades during high-speed market spikes, the script includes a "Time Grid" (a minimum rest period between opening new orders).
  • Automatic Order Cleanup: If it detects any stray orders that do not match its specific parameters (like incorrect lot sizes), it will delete them to maintain the integrity of the grid.
  • Take Profit Synchronization: When the robot opens multiple positions in a grid, it often adjusts the "Take Profit" levels of all those positions simultaneously so they target the same exit price as a single unit.

5. Summary of Operation Flow

  1. Analyze: Check the trend (Moving Average) and volatility (ATR).
  2. Calculate: Determine the correct lot size based on account balance and current grid level.
  3. Deploy: Place "Limit" or "Stop" orders at calculated price intervals.
  4. Monitor: Constantly check for "Equity Protection" breaches or the need to move Stop Losses.
  5. Adjust: As prices move, open new orders at wider gaps and increase lot sizes according to the multiplier settings until the collective profit target is hit.
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
27 Views
6 Downloads
0 Favorites
Blessing 2 v5.1
//+------------------------------------------------------------------+
//|                                                  Blessing 2 v5.1 |
//|                              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.                       |
//+------------------------------------------------------------------+

#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      = 2500; 

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             = false; // Auto calculation of TakeProfit and Grid size;

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,PERIOD_D1,21,0);
    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

NZD/USD Oct 2024 - Jan 2025
12.69
Total Trades 49
Won Trades 43
Lost trades 6
Win Rate 87.76 %
Expected payoff 17.42
Gross Profit 926.46
Gross Loss -73.02
Total Net Profit 853.44
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
7.55
Total Trades 119
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff 26.14
Gross Profit 3585.54
Gross Loss -475.22
Total Net Profit 3110.32
-100%
-50%
0%
50%
100%
USD/CHF Jan 2025 - Jul 2025
5.24
Total Trades 198
Won Trades 166
Lost trades 32
Win Rate 83.84 %
Expected payoff 32.50
Gross Profit 7952.75
Gross Loss -1517.86
Total Net Profit 6434.89
-100%
-50%
0%
50%
100%
AUD/USD Jul 2025 - Sep 2025
4.60
Total Trades 39
Won Trades 29
Lost trades 10
Win Rate 74.36 %
Expected payoff 24.95
Gross Profit 1243.50
Gross Loss -270.50
Total Net Profit 973.00
-100%
-50%
0%
50%
100%
AUD/USD Jul 2025 - Sep 2025
4.58
Total Trades 39
Won Trades 29
Lost trades 10
Win Rate 74.36 %
Expected payoff 24.91
Gross Profit 1242.54
Gross Loss -271.22
Total Net Profit 971.32
-100%
-50%
0%
50%
100%
USD/CHF Jul 2025 - Sep 2025
3.43
Total Trades 38
Won Trades 28
Lost trades 10
Win Rate 73.68 %
Expected payoff 25.81
Gross Profit 1384.01
Gross Loss -403.39
Total Net Profit 980.62
-100%
-50%
0%
50%
100%
USD/CHF Jul 2025 - Sep 2025
3.40
Total Trades 36
Won Trades 27
Lost trades 9
Win Rate 75.00 %
Expected payoff 25.83
Gross Profit 1317.92
Gross Loss -387.94
Total Net Profit 929.98
-100%
-50%
0%
50%
100%
USD/CAD Jul 2025 - Sep 2025
3.15
Total Trades 41
Won Trades 26
Lost trades 15
Win Rate 63.41 %
Expected payoff 16.29
Gross Profit 979.07
Gross Loss -311.17
Total Net Profit 667.90
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
2.84
Total Trades 23
Won Trades 12
Lost trades 11
Win Rate 52.17 %
Expected payoff 23.51
Gross Profit 835.00
Gross Loss -294.37
Total Net Profit 540.63
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
2.84
Total Trades 23
Won Trades 12
Lost trades 11
Win Rate 52.17 %
Expected payoff 23.51
Gross Profit 835.00
Gross Loss -294.37
Total Net Profit 540.63
-100%
-50%
0%
50%
100%
GBP/AUD Jul 2025 - Sep 2025
2.68
Total Trades 136
Won Trades 103
Lost trades 33
Win Rate 75.74 %
Expected payoff 19.67
Gross Profit 4264.50
Gross Loss -1589.51
Total Net Profit 2674.99
-100%
-50%
0%
50%
100%
GBP/AUD Jul 2025 - Sep 2025
2.63
Total Trades 112
Won Trades 84
Lost trades 28
Win Rate 75.00 %
Expected payoff 21.57
Gross Profit 3902.14
Gross Loss -1485.88
Total Net Profit 2416.26
-100%
-50%
0%
50%
100%
USD/CAD Jul 2025 - Sep 2025
2.42
Total Trades 45
Won Trades 29
Lost trades 16
Win Rate 64.44 %
Expected payoff 14.84
Gross Profit 1138.56
Gross Loss -470.65
Total Net Profit 667.91
-100%
-50%
0%
50%
100%
GBP/AUD Jan 2025 - Jul 2025
2.27
Total Trades 592
Won Trades 442
Lost trades 150
Win Rate 74.66 %
Expected payoff 16.96
Gross Profit 17921.95
Gross Loss -7880.14
Total Net Profit 10041.81
-100%
-50%
0%
50%
100%
USD/JPY Jul 2025 - Sep 2025
2.12
Total Trades 144
Won Trades 97
Lost trades 47
Win Rate 67.36 %
Expected payoff 17.12
Gross Profit 4670.48
Gross Loss -2205.67
Total Net Profit 2464.81
-100%
-50%
0%
50%
100%
GBP/CAD Jul 2025 - Sep 2025
1.99
Total Trades 85
Won Trades 65
Lost trades 20
Win Rate 76.47 %
Expected payoff 17.86
Gross Profit 3045.21
Gross Loss -1526.81
Total Net Profit 1518.40
-100%
-50%
0%
50%
100%
USD/JPY Jul 2025 - Sep 2025
1.88
Total Trades 147
Won Trades 99
Lost trades 48
Win Rate 67.35 %
Expected payoff 11.67
Gross Profit 3659.78
Gross Loss -1944.39
Total Net Profit 1715.39
-100%
-50%
0%
50%
100%
GBP/CAD Jul 2025 - Sep 2025
1.47
Total Trades 58
Won Trades 41
Lost trades 17
Win Rate 70.69 %
Expected payoff 11.13
Gross Profit 2005.95
Gross Loss -1360.16
Total Net Profit 645.79
-100%
-50%
0%
50%
100%
USD/JPY Jan 2025 - Jul 2025
0.85
Total Trades 375
Won Trades 282
Lost trades 93
Win Rate 75.20 %
Expected payoff -4.79
Gross Profit 10111.41
Gross Loss -11908.58
Total Net Profit -1797.17
-100%
-50%
0%
50%
100%
GBP/USD Jan 2025 - Jul 2025
0.50
Total Trades 103
Won Trades 67
Lost trades 36
Win Rate 65.05 %
Expected payoff -36.91
Gross Profit 3870.00
Gross Loss -7671.43
Total Net Profit -3801.43
-100%
-50%
0%
50%
100%
GBP/CAD Jan 2025 - Jul 2025
0.37
Total Trades 76
Won Trades 49
Lost trades 27
Win Rate 64.47 %
Expected payoff -56.02
Gross Profit 2487.82
Gross Loss -6745.14
Total Net Profit -4257.32
-100%
-50%
0%
50%
100%
NZD/USD Jan 2025 - Jul 2025
0.33
Total Trades 66
Won Trades 43
Lost trades 23
Win Rate 65.15 %
Expected payoff -64.18
Gross Profit 2052.50
Gross Loss -6288.20
Total Net Profit -4235.70
-100%
-50%
0%
50%
100%
EUR/USD Oct 2025 - Feb 2026
0.31
Total Trades 62
Won Trades 42
Lost trades 20
Win Rate 67.74 %
Expected payoff -70.28
Gross Profit 1957.50
Gross Loss -6314.55
Total Net Profit -4357.05
-100%
-50%
0%
50%
100%
GBP/AUD Oct 2025 - Feb 2026
0.19
Total Trades 71
Won Trades 45
Lost trades 26
Win Rate 63.38 %
Expected payoff -67.24
Gross Profit 1147.16
Gross Loss -5920.85
Total Net Profit -4773.69
-100%
-50%
0%
50%
100%
USD/CAD Jan 2025 - Jul 2025
0.16
Total Trades 67
Won Trades 45
Lost trades 22
Win Rate 67.16 %
Expected payoff -69.21
Gross Profit 895.93
Gross Loss -5533.18
Total Net Profit -4637.25
-100%
-50%
0%
50%
100%
GBP/CAD Oct 2025 - Feb 2026
0.10
Total Trades 34
Won Trades 20
Lost trades 14
Win Rate 58.82 %
Expected payoff -142.01
Gross Profit 508.02
Gross Loss -5336.22
Total Net Profit -4828.20
-100%
-50%
0%
50%
100%
AUD/USD Jan 2025 - Jul 2025
0.00
Total Trades 81
Won Trades 55
Lost trades 26
Win Rate 67.90 %
Expected payoff -17996.96
Gross Profit 2272.50
Gross Loss -1460026.10
Total Net Profit -1457753.60
-100%
-50%
0%
50%
100%
EUR/USD Jan 2025 - Jul 2025
0.00
Total Trades 48
Won Trades 29
Lost trades 19
Win Rate 60.42 %
Expected payoff -24470.11
Gross Profit 1772.50
Gross Loss -1176337.69
Total Net Profit -1174565.19
-100%
-50%
0%
50%
100%
EUR/USD Jul 2025 - Sep 2025
0.00
Total Trades 8
Won Trades 6
Lost trades 2
Win Rate 75.00 %
Expected payoff -5259.36
Gross Profit 130.00
Gross Loss -42204.92
Total Net Profit -42074.92
-100%
-50%
0%
50%
100%
EUR/USD Jul 2025 - Sep 2025
0.00
Total Trades 8
Won Trades 6
Lost trades 2
Win Rate 75.00 %
Expected payoff -5259.37
Gross Profit 130.00
Gross Loss -42204.96
Total Net Profit -42074.96
-100%
-50%
0%
50%
100%
GBP/USD Jul 2025 - Sep 2025
0.00
Total Trades 11
Won Trades 1
Lost trades 10
Win Rate 9.09 %
Expected payoff -453.68
Gross Profit 20.00
Gross Loss -5010.48
Total Net Profit -4990.48
-100%
-50%
0%
50%
100%

Comments