FxIgorDynBOSystem1-1ea

Author: Copyright � 2006, MetaQuotes Software Corp.
Profit factor:
1.08

Okay, here's a breakdown of what this MetaTrader script does, explained in a way that someone who doesn't code can understand.

Overall Goal:

The script is designed to automatically open and close trades in the Forex market, aiming to profit from price movements. It uses a system based on daily price ranges and a few configurable parameters.

Here's how it works step-by-step:

  1. Setup and Configuration:
  • The script starts by defining some settings that the user can adjust. These settings control things like:

    • Lot Size: The amount of currency to trade in each transaction. This determines how much profit or loss you make per pip (a small unit of price change).

    • Money Management: Whether or not to automatically adjust the lot size based on the amount of money in the trading account (to manage risk). If enabled, you can set:

      • The percentage of your account balance to risk on a single trade.
      • Minimum and maximum lot sizes to ensure the trade sizes stay within acceptable bounds.
    • Slippage: A tolerance level for the difference between the requested price and the actual price at which a trade is executed.

    • Magic Number: A unique identifier that helps the script manage its own trades separately from other trades.

    • Hour to Close: The hour of the day when the script will automatically close any open trades.

  1. Daily Calculations:
  • Once a day (when a new day starts), the script calculates the average daily price range. This involves:

    • Looking at the highest and lowest prices for the previous 1, 5, 10, and 20 days.
    • Calculating the difference between the high and low for each of those periods (the daily range).
    • Averaging those ranges to get a general idea of how much the price typically moves in a day.
    • It then divides this average range in half. This half-range value is used to determine:
      • The "Trailing Stop": How far the price has to move in your favor before the stop-loss order (described later) starts to follow the price to protect profits.
      • The "Stop Loss": How far the price can move against you before the trade is automatically closed to limit losses.
  1. Managing Existing Trades:
  • The script constantly checks for existing trades that it has opened (using the "Magic Number" to identify them).

    • Trailing Stop Functionality: If a trade is making a profit, the script adjusts the stop-loss order to "trail" behind the price. This means that as the price moves further into profit, the stop-loss order is moved along with it, securing some of those profits.
    • End-of-Day Closing: If it's past the specified "hourtoclose", the script automatically closes any open trades (both buy and sell). This helps to avoid holding positions overnight, which can be riskier.
  1. Opening New Trades:
  • If there are no existing trades open (or if the script has closed the existing trades for the day), the script looks for opportunities to open new trades.
  • Buying and Selling Logic:
    • The script calculates a "buying price" and a "selling price" based on the day's high and low prices, adjusted by the calculated half-range value.
    • If the current price is higher than the "buying price", the script opens a "buy" order (hoping the price will continue to rise).
    • If the current price is lower than the "selling price", the script opens a "sell" order (hoping the price will continue to fall).
    • Each trade is opened with a "stop-loss" order to limit potential losses.
    • A limit is put in place to only allow a maximum of 2 trades to be placed

In Simple Terms:

Imagine the script as a robot trader that:

  1. Learns how much the price usually moves each day.
  2. Waits for the price to break above or below a certain level, based on the day's high/low and the usual price movement.
  3. Opens a trade, betting that the price will continue in that direction.
  4. If the trade starts making money, it moves the "safety net" (stop-loss) to protect those profits.
  5. Closes all trades at a specific time each day.
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
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
11 Views
2 Downloads
1 Favorites
FxIgorDynBOSystem1-1ea
//+------------------------------------------------------------------+
//|                                            FXIgorSystem1.1.mq4   |
//|                                               Diego G. Almeida   |
//|           Magic number and MM added by Project1972               |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


extern double lots= 0.01; // 0.01 is a single micro lot
extern bool MM = false;       // if true the lots size will increase based on account balance 
extern int risk=1;           // percent of account balance to risk on each trade (only if mm is enabled)
extern double MinLots=0.1;   // minimal lots you want to trade or your broker allow (only if mm is enabled)
extern double MAXLots=10;    // max lots you want to trade or your broker allow (only if mm is enabled)               
//extern double takeProfit   = 0;                         
extern double slippage     = 10;
int      MagicNumber = 123787;
extern int hourtoclose = 20; //default 18 Alpari Fibogroup and MIG, 19 Northfinance and FXDD, 17 IBFX
double highday=0,lowday=0,h=0,l=0,media=0,mediacalc=0,pcompra=0,pvenda=0,TrailingStop=0,lotsi=0,stopLoss=0;
int cnt,dia=0,op=0,limitepos=0;
int init() 
{
   return(0);
}
int start()
{

if (MM==true) {{ lotsi=NormalizeDouble(AccountBalance()*risk/100000.0,1); }
if (lotsi<MinLots){ lotsi=MinLots; }
if (lotsi>MAXLots){ lotsi=MAXLots; }
}
else { lotsi=lots; }   
if(AccountFreeMargin() < 1000*lotsi) {
  Print("Not enough money to trade ");
      return(0); }
           
int orders=0,horas=0;
if(Day() != dia)
{
int R1=0,R5=0,R10=0,R20=0,RAvg=0;
int i=0;

   R1 =  (iHigh(NULL,PERIOD_D1,1)-iLow(NULL,PERIOD_D1,1))/Point;
   for(i=1;i<=5;i++)
      R5    =    R5  +  (iHigh(NULL,PERIOD_D1,i)-iLow(NULL,PERIOD_D1,i))/Point;
   for(i=1;i<=10;i++)
      R10   =    R10 +  (iHigh(NULL,PERIOD_D1,i)-iLow(NULL,PERIOD_D1,i))/Point;
   for(i=1;i<=20;i++)
      R20   =    R20 +  (iHigh(NULL,PERIOD_D1,i)-iLow(NULL,PERIOD_D1,i))/Point;

   R5 = R5/5;
   R10 = R10/10;
   R20 = R20/20;
   RAvg  =  (R1+R5+R10+R20)/4;    
   media=RAvg/2;
   mediacalc=MathCeil(media);
   TrailingStop=mediacalc;
   stopLoss=mediacalc;
   h=0;
   l=0;
   dia=Day();
   op=0;
   limitepos=0;
}
   highday=iHigh(NULL,PERIOD_D1,0);
   lowday=iLow(NULL,PERIOD_D1,0);

if(highday > h)
   h=highday;
if(lowday < l)
   l=lowday;
Print("Trailing stop ",TrailingStop);
Print("Mediacalc ",mediacalc);

horas=hourtoclose - Hour();

int total=OrdersTotal();
  if(total>0)
   { 
   for(cnt=0;cnt<total;cnt++)
   {
      if(OrderSymbol() == Symbol() && OrderType() == OP_BUY)
      {
         op=1;
      }
      if(OrderSymbol() == Symbol() && OrderType() == OP_SELL)
      {
         op=2;
      }
   } 
   for(cnt=0;cnt<total;cnt++)
    {
     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
      {
      if(TrailingStop > 0) {             
               if(Bid-OrderOpenPrice() > TrailingStop*Point)
                {
                  if(OrderStopLoss() < (Bid - TrailingStop*Point))
                     //if(OrderTakeProfit() == 0)
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Blue);
               }
            }
         
      }   else {                              
            if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
            {
            if(TrailingStop > 0) {             
               if(OrderOpenPrice() - Ask > TrailingStop*Point)
                {
                  if(OrderStopLoss() == 0 || OrderStopLoss() > Ask + TrailingStop*Point)
                     //if(OrderTakeProfit() == 0)
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Red);
                }           
            }
          } 
        }
      if(OrderSymbol()==Symbol() && OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber)
      {
         if(Hour() >= hourtoclose && Hour() < 23)
            OrderClose(OrderTicket(),OrderLots(),Bid,3,Lime);
         orders=1;
      }
      if(OrderSymbol()==Symbol() && OrderType() == OP_SELL && OrderMagicNumber()==MagicNumber)
      {
         if(Hour() >= hourtoclose && Hour() < 23)
            OrderClose(OrderTicket(),OrderLots(),Ask,3,Lime);
          orders=1;
      }
    
   
    }

  } 
else
{
   //horas=hourtoclose - Hour();
   if(horas >= 1)
   {
   
      if(orders == 0 && op == 2 && limitepos <2)
      {
         OrderSend(Symbol(),OP_BUY,lotsi,Ask,slippage,Ask-stopLoss*Point,0,"Power:Buy",MagicNumber,0,Lime);
         limitepos+=1;
      }
      if(orders == 0 && op == 1 && limitepos <2)
      {
         OrderSend(Symbol(),OP_SELL,lotsi,Bid,slippage,Bid+stopLoss*Point,0,"Power:Sell",MagicNumber,0,Red);
         limitepos+=1;
      }
   }
}

if(horas >=1)
{

if(orders == 0 && op == 0 && limitepos <2)
{
   pcompra=lowday+mediacalc*Point;
   pvenda=highday-mediacalc*Point;
   
   Comment("\n Break Channel: ",mediacalc," pips \n Buying Price: ",pcompra,"\n Selling Price: ",pvenda,"\n Lots: ",lotsi);
   
   Print("Buying Price: ",pcompra);
   Print("Selling Price: ",pvenda);
   Print("Lots: ",lotsi);
   if(Bid >= pcompra)
   {
      Print("Buy");
      OrderSend(Symbol(),OP_BUY,lotsi,Ask,slippage,Ask-stopLoss*Point,0,"Power:Buy",MagicNumber,0,Lime);      
      limitepos+=1;
   }

if(Bid <= pvenda)
{
      Print("Sell");
      OrderSend(Symbol(),OP_SELL,lotsi,Bid,slippage,Bid+stopLoss*Point,0,"Power:Sell",MagicNumber,0,Red);
      limitepos+=1;
}

}
}
return(0);
}

Profitability Reports

EUR/USD Jan 2025 - Jul 2025
0.82
Total Trades 170
Won Trades 84
Lost trades 86
Win Rate 49.41 %
Expected payoff -0.31
Gross Profit 238.02
Gross Loss -290.85
Total Net Profit -52.83
-100%
-50%
0%
50%
100%
AUD/USD Jan 2025 - Jul 2025
1.24
Total Trades 169
Won Trades 90
Lost trades 79
Win Rate 53.25 %
Expected payoff 0.22
Gross Profit 193.94
Gross Loss -156.32
Total Net Profit 37.62
-100%
-50%
0%
50%
100%
USD/CAD Oct 2024 - Jan 2025
1.42
Total Trades 76
Won Trades 42
Lost trades 34
Win Rate 55.26 %
Expected payoff 0.30
Gross Profit 76.12
Gross Loss -53.48
Total Net Profit 22.64
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
1.06
Total Trades 81
Won Trades 39
Lost trades 42
Win Rate 48.15 %
Expected payoff 0.05
Gross Profit 68.87
Gross Loss -64.75
Total Net Profit 4.12
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
0.83
Total Trades 87
Won Trades 44
Lost trades 43
Win Rate 50.57 %
Expected payoff -0.27
Gross Profit 118.42
Gross Loss -141.97
Total Net Profit -23.55
-100%
-50%
0%
50%
100%
AUD/USD Oct 2024 - Jan 2025
1.10
Total Trades 87
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff 0.09
Gross Profit 90.29
Gross Loss -82.21
Total Net Profit 8.08
-100%
-50%
0%
50%
100%

Comments

does anyone tried this on EURUSD ?