OverHedgeV2

Author: Copyright � 2005
Price Data Components
Series array that contains open time of each bar
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It automatically opens orders when conditions are reached
Indicators Used
Moving average indicator
Miscellaneous
Uses files from the file systemIt writes information to file
0 Views
0 Downloads
0 Favorites

Profitability Reports

AUD/USD Oct 2024 - Jan 2025
58.00 %
Total Trades 65
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -62.04
Gross Profit 5609.70
Gross Loss -9642.20
Total Net Profit -4032.50
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
76.00 %
Total Trades 116
Won Trades 65
Lost trades 51
Win Rate 0.56 %
Expected payoff -31.29
Gross Profit 11667.40
Gross Loss -15297.00
Total Net Profit -3629.60
-100%
-50%
0%
50%
100%
OverHedgeV2
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                  OverHedgeV2.mq4 |
//|                                               Copyright © 2006,  |
//|                                                                  |
//| Written by MrPip (Robert Hill) for kmrunner                      |
//| 3/7/06  Added check of direction for first trade Buy or Sell     |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005"
#property link      "http://www.strategtbuilderfx.com"
#include <stdlib.mqh>

extern bool Debug = false;
extern string TradeLog = "TradeLog";

extern int    MagicNumber = 11111;
extern double Lots = 0.1;
extern double HedgeBase = 2.0; 
extern int Slippage = 5;
extern bool shutdownGrid = false;
extern int TunnelWidth=20;

extern double profitTarget = 100;     // if > 0, will close out all positions once the pip target has been met
extern int EMAShortPeriod=8;   // original was 7, change based on new optimization Mar06
extern int EMALongPeriod=21;   // original was 16, change based on new optimization Mar06
extern int    PauseSeconds  =     6; // Number of seconds to "sleep" before closing the next winning trade
extern int    MillisPerSec  =  1000; // DO NOT CHANGE - Standard multiplier to convert seconds to milliseconds

double TunnelSize;
string setup;
double startBuyRate, startSellRate;
int currentOpen;
int NumBuyTrades, NumSellTrades;   // Number of buy and sell trades in this symbol
bool myWantLongs;
double lotMM;
double Profit;
bool OK2Buy,OK2Sell, FirstDirSell;


//+------------------------------------------------------------------+
//| CheckDirection                                                   |
//| Check direction for trade                                        |
//| return 1 for up, -1 for down, 0 for flat                         |
//+------------------------------------------------------------------+
int CheckDirection()
{
   double SlowEMA, FastEMA;
   double Dif;
   
   FastEMA = iMA(NULL,0,EMAShortPeriod,0,MODE_EMA,PRICE_CLOSE,1);
   SlowEMA = iMA(NULL,0,EMALongPeriod,0,MODE_EMA,PRICE_CLOSE,1);
 
   Dif = FastEMA-SlowEMA;
   
   if(Dif > 0 ) return(1);
   if(Dif < 0 ) return(-1);
   return(0);
   

}

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   setup = StringConcatenate( "OverHedgeV2-", Symbol(),"-",MagicNumber );
    int err, handle;
    string filename=Symbol()+ TradeLog + ".txt";
    
//---- 
    if (Debug)
    {
      GlobalVariableSet("MyHandle",0);
      if (!GlobalVariableCheck("MyHandle"))
      {
         err = GetLastError();
         Print("Error creating Global Variable MyHandle: (" + err + ") " + ErrorDescription(err));
         return(0); 
      }
      handle = FileOpen(filename,FILE_CSV|FILE_WRITE,"\t");
      GlobalVariableSet("MyHandle",handle); 
    }
   return(0);
  }

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
     int handle;
 
    if (Debug)
    {
      if (GlobalVariableCheck("MyHandle"))
      {
         handle = GlobalVariableGet("MyHandle");
         FileFlush(handle);
         FileClose(handle);
         GlobalVariableDel("MyHandle");  
      }
    }
   return(0);
  }

//+------------------------------------------------------------------+
//| Write - writes string to debug file                              |
//+------------------------------------------------------------------+
int Write(string str)
{
   int handle;
   
   if (GlobalVariableCheck("MyHandle"))
   {
      handle = GlobalVariableGet("MyHandle");
      FileWrite(handle,str + " Time " + TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS));
   } 
}
  
//+------------------------------------------------------------------+
//| Close Open Positions                                             |
//| Close all open positions                                         |
//+------------------------------------------------------------------+
void CloseOpenPositions()
{
   int cnt, err;
   
// First close losing trades
   
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect (cnt, SELECT_BY_POS,MODE_TRADES);
//      if ( OrderSelect (cnt, SELECT_BY_POS) == false )
//      {
//        err = GetLastError();
//        if (Debug) Write("OrderSelect failed error : (" + err + ") " + ErrorDescription(err));
//        continue;
//      }
      if ( OrderSymbol() != Symbol()) continue;
      if ( OrderMagicNumber() != MagicNumber)  continue;
      
        if(OrderType() == OP_BUY && OrderProfit() < 0)
        {
          if (OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet))
          {
            if (Debug) Write("Buy Order closed for " + Symbol() + " at " + Bid + ".");
          }
          else
          {
            err=GetLastError();
            Print("Error closing order : (", err , ") " + ErrorDescription(err));
            if (Debug)
            {
              Write("Error closing order : (" +  err  + ") " + ErrorDescription(err));
            }
          }
        }
        if(OrderType() == OP_SELL && OrderProfit() < 0)
        {
          if (OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Violet))
          {
            if (Debug) Write("Sell Order closed for " + Symbol() + " at " + Ask + ".");
          }
          else
          {
            err=GetLastError();
            Print("Error closing order : (", err , ") " + ErrorDescription(err));
            if (Debug)
            {
              Write("Error closing order : (" +  err  + ") " + ErrorDescription(err));
            }
          }
        }
   }
   
// Then close winning trades
   
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect (cnt, SELECT_BY_POS,MODE_TRADES);
//      if ( OrderSelect (cnt, SELECT_BY_POS) == false )
//      {
//        err = GetLastError();
//        if (Debug) Write("OrderSelect failed error : (" + err + ") " + ErrorDescription(err));
//        continue;
//      }
      if ( OrderSymbol() != Symbol()) continue;
      if ( OrderMagicNumber() != MagicNumber)  continue;
      
        if(OrderType() == OP_BUY && OrderProfit() > 0)
        {
          Sleep(PauseSeconds*MillisPerSec);
          if (OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Gold))
          {
            if (Debug) Write("Buy Order closed for " + Symbol() + " at " + Bid + ".");
          }
          else
          {
            err=GetLastError();
            Print("Error closing order : (", err , ") " + ErrorDescription(err));
            if (Debug)
            {
              Write("Error closing order : (" +  err  + ") " + ErrorDescription(err));
            }
          }
        }
        if(OrderType() == OP_SELL && OrderProfit() > 0)
        {
          Sleep(PauseSeconds*MillisPerSec);
          if (OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Gold))
          {
            if (Debug) Write("Sell Order closed for " + Symbol() + " at " + Ask + ".");
          }
          else
          {
            err=GetLastError();
            Print(" Error closing order : (", err , ") " + ErrorDescription(err));
            if (Debug)
            {
              Write(" Error closing order : (" +  err  + ") " + ErrorDescription(err));
            }
          }
        }
   }

}

//+------------------------------------------------------------------------+
//| counts the number of open positions                                    |
//| type BUY returns number of long positions                              |
//| type SELL returns number of short positions                            |
//| type BOTH returns number of long and short positions                   |
//+------------------------------------------------------------------------+

int CheckOpenPositions(string type)
{
   int cnt, NumPositions;
   int NumBuyTrades, NumSellTrades;   // Number of buy and sell trades in this symbol
   
   NumBuyTrades = 0;
   NumSellTrades = 0;
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
//      if ( OrderSelect (cnt, SELECT_BY_POS) == false )  continue;
      if ( OrderSymbol() != Symbol()) continue;
      if ( OrderMagicNumber() != MagicNumber)  continue;
      if(OrderType() == OP_BUY )
      {
        NumBuyTrades++;
      }
      else if(OrderType() == OP_SELL)
      {
        NumSellTrades++;
      }
             
   }
   NumPositions = NumBuyTrades + NumSellTrades;
   if (type == "BUY") return (NumBuyTrades);
   if (type == "SELL") return (NumSellTrades);
   return (NumPositions);
}

//+------------------------------------------------------------------+
//| GetProfit                                                        |
//| Return Open Profit from all open positions                       |
//+------------------------------------------------------------------+
double GetProfit( )
{
   int i;
   double   openProfit = 0;

   openProfit = 0;

   for(i=OrdersTotal()-1;i>=0;i--)
   {
      OrderSelect(i, SELECT_BY_POS );
      if ( OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber )
      {
          openProfit = openProfit + MathRound(OrderProfit()/MarketInfo(Symbol(),MODE_TICKVALUE)*10);
      }
   }
   return (openProfit);
}

//+------------------------------------------------------------------+
//| OpenBuyOrder                                                     |
//+------------------------------------------------------------------+
void OpenBuyOrder(double lotM, string SetupStr)
{
   int err;
   int ticket;

   ticket = OrderSend(Symbol(),OP_BUY,lotM,Ask,Slippage,0,0,SetupStr,MagicNumber,0,Blue);
   if (Debug)
   {
      Write ("OpenBuy " + Symbol() + " for " + DoubleToStr(Ask,4));
   }
   if(ticket<=0)
   {
      err = GetLastError();
      Print("Error opening BUY order [" + SetupStr + "]: (" + err + ") " + ErrorDescription(err)); 
      if (Debug) Write("Error opening BUY order [" + SetupStr + "]: (" + err + ") " + ErrorDescription(err)); 
   }
}

//+------------------------------------------------------------------+
//| OpenSellOrder                                                    |
//+------------------------------------------------------------------+
void OpenSellOrder(double lotM, string SetupStr)
{
   int err;
   int ticket;
   
   ticket = OrderSend(Symbol(),OP_SELL,lotM,Bid,Slippage,0,0,SetupStr,MagicNumber,0,Red);
   if(Debug)
   {  
        Write ("OpenSell " + Symbol() + " for " + DoubleToStr(Bid,4));
   }
   if(ticket<=0)
   {
      err = GetLastError();
      Print("Error opening Sell order [" + SetupStr + "]: (" + err + ") " + ErrorDescription(err)); 
      if (Debug) Write("Error opening Sell order [" + SetupStr + "]: (" + err + ") " + ErrorDescription(err)); 
   }
}


//+-------------------------------------------+
//| DoTrades module cut from start            |
//|  No real changes                          |
//+-------------------------------------------+
void DoTrades(string OrdText, string SetupStr,double lotM)
{
   
   if(OrdText == "BUY")
   {
      OpenBuyOrder(lotM,SetupStr);
   }
   else if(OrdText == "SELL")
   {
      OpenSellOrder(lotM,SetupStr);
   }
}

//+------------------------------------------------------------------+
//| Check  Profit                                                    |
//| Output comment showing progit, longs, shorts, etc                |
//| If profit target is reached close all open positions             |
//+------------------------------------------------------------------+
void CheckProfit()
{
   double Profit;
   int openLongs,openShorts;
   
   Profit = GetProfit();
   if ( Profit >= profitTarget ) 
   {
       if (Debug) Write("Closing positions due to profit target");
       CloseOpenPositions();
   }
//   else
//   {
//       openLongs = CheckOpenPositions("BUY");
//       openShorts = CheckOpenPositions("SELL");
//       Comment(" Server time is ",TimeToStr(CurTime()),
//               "\n",
//               "\n","                  Open p&l  = ",Profit,
//               "\n","                  Long      = ",openLongs, 
//               "\n","                  Short     = ",openShorts, 
//               "\n",
//               "\n","                  Balance   = ",AccountBalance(),
//               "\n","                  Equity    = ",AccountEquity(),
//               "\n","                  Margin    = ",AccountMargin(),
//               "\n","                  Free mrg  = ",AccountFreeMargin());
//    }
}

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//---- 


//---- test if we want to shutdown

   if (shutdownGrid )         // close all orders. then exit.. there is nothing more to do
   {
      CloseOpenPositions();
      return(0);
   }
   
   TunnelSize = ((2*(Ask-Bid)/Point)+TunnelWidth);
   
// Check for new trade cycle
// First check if profit target is reached
// If yes then there will be no open positions
// So a new trade cycle will begin
    
   CheckProfit();
   currentOpen = CheckOpenPositions("BOTH");
   if (currentOpen == 0)
   {
// Start trades based on confirmation direction, was daily

      if (CheckDirection() == 0) return(0);
      if (CheckDirection() == 1)
      {
         OK2Buy = true;
         OK2Sell = false;
         FirstDirSell = false;
      }
      if (CheckDirection() == -1)
      {
         OK2Buy = false;
         OK2Sell = true;
         FirstDirSell = true;
      }
      if (OK2Buy)
      {
         startBuyRate = Bid ;
         if (Debug) Write("Start Buys : " + startBuyRate);
         startSellRate = Bid - TunnelSize*Point;
         if (Debug) Write("Start Sells : " + startSellRate);
      }
      if (OK2Sell)
      {
         startSellRate = Bid ;
         if (Debug) Write("Start Sells : " + startSellRate);
         startBuyRate = Bid + TunnelSize*Point;
         if (Debug) Write("Start Buys : " + startBuyRate);
      }
      
   }
   else
   {
     OK2Buy = true;
     OK2Sell = true;
   }
   
// Determine how many lots for next trade based on current number of open positions

   lotMM = Lots * MathPow(HedgeBase,currentOpen);
   if (lotMM == 0) return (0);
   
// Determine if next trade should be long or short based on current number of open positions

  myWantLongs = true;
  if (MathMod(currentOpen,2) > 0.1) myWantLongs = false;
   
   if (FirstDirSell) myWantLongs = !myWantLongs;   // added to match starting trade direction
	if (myWantLongs)
	{
//	   if (Debug) Write ("Looking for Longs at " + startBuyRate + " with Lots = " + lotMM);
	   if (Ask >=startBuyRate )
	   {
//	      if (Debug) Write ("Long at : " + Ask +  " with start buy rate at " + startBuyRate);

	      DoTrades("BUY",setup,lotMM);
	   }
	}
	else
	{
//	   if (Debug) Write ("Looking for Shorts at " + startSellRate +  " with Lots = " +  lotMM);
	   if (Ask <= startSellRate)
	   {
//	      if (Debug) Write ("Short at : " + Bid + " with start sell rate at " + startSellRate);
   	   DoTrades("SELL",setup,lotMM);
	   }
	}
	
   return(0);
}

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---