EA_Starter_Template

Price Data Components
Series array that contains tick volumes of each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategy
0 Views
0 Downloads
0 Favorites

Profitability Reports

AUD/USD Oct 2024 - Jan 2025
11.00 %
Total Trades 3742
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -2.67
Gross Profit 1176.00
Gross Loss -11159.10
Total Net Profit -9983.10
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
30.00 %
Total Trades 5956
Won Trades 1229
Lost trades 4727
Win Rate 0.21 %
Expected payoff -1.67
Gross Profit 4301.50
Gross Loss -14265.40
Total Net Profit -9963.90
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
0.00 %
Total Trades 2884
Won Trades 13
Lost trades 2871
Win Rate 0.00 %
Expected payoff -3.46
Gross Profit 45.50
Gross Loss -10029.70
Total Net Profit -9984.20
-100%
-50%
0%
50%
100%
EA_Starter_Template

#include       <stdlib.mqh>
#include       <stderror.mqh> 
extern int     volume=250;
extern int     StopLoss = 35;
extern int     ProfitTarget = 35;
extern double  TrailingStop = 20;                     // Change to whatever number of pips you wish to trail your position with.
extern bool    UseTrailingStop = true;
extern int     TrailingStopType = 1;                  // Type 1 moves stop immediately, Type 2 waits til value of TS is reached
extern double  Lots=0.1;



extern int     Slippage = 5;
extern int     SignalCandle=1;                        //set to 1 if you want to get the cangle close 0 for current

//+---------------------------------------------------+
//|Money Management                                   |
//+---------------------------------------------------+
extern bool    UseMoneyManagement = false;           // Change to false to shutdown money management controls.
extern int     MM_Type = 1;
//+---------------------------------------------------+
//|Money Management type 1                            |
//+---------------------------------------------------+
extern string  StrSep1 = "-----MoneyManagementType 1 -----";
extern double  MMRisk=0.15;                         // Risk Factor
extern double  LossMax=1000;                        // Maximum Loss by 1 Lot
//+---------------------------------------------------+
//|Money Management type 2                            |
//+---------------------------------------------------+
extern string  StrSep2 = "-----MoneyManagementType 2 -----";
extern bool    AccountIsMini = true;                // Change to true if trading mini account
extern double  TradeSizePercent = 15;               // Change to whatever percent of equity you wish to risk.
double         MaxLots = 10;
//+---------------------------------------------------+


int    MagicNumber;                                 // Magic number of the trades. must be unique to identify

double Lotsi=0,mav=0;

bool   TradeAllowed=true;
  
int init() 
  {
    MagicNumber = 3000 + func_Symbol2Val(Symbol())*100 + func_TimeFrame_Const2Val(Period());
  }

int start()
{
int err;
err=GetLastError();

//------------------Signal indicators go in here------------------------------//
double  v=iVolume(Symbol(),Period(),0)/2;

//-------------------------------------------------------------------------//  
double dblMinStopDistance = MarketInfo(Symbol(),MODE_STOPLEVEL)*MarketInfo(Symbol(), MODE_POINT);
  Comment ("Min Stop Distance : ",dblMinStopDistance,"    ","Volume :",v);
  
int NumTrades = 0;
  
  for (int i = 0; i < OrdersTotal(); i++)
  {
    OrderSelect(i, SELECT_BY_POS);
 
    if (OrderSymbol() == Symbol())
    {
      if (OrderType() == OP_BUY ) NumTrades++;
      if (OrderType() == OP_SELL )NumTrades++;
    }
  }

  
    if (NumTrades == 0) 
  {
    if (TradeAllowed)
      {
          if (MM_Type == 1)
            Lotsi = MoneyManagement ( UseMoneyManagement, Lots, MMRisk, LossMax);
          else
            Lotsi = GetLots();

//----------------------------------SIGNAL GENERATOR-------------------------------------//
 


            
          //----Long
           if (v > volume)//  (mav > MAvolume..insert signal here..)
           {
            OrderSend(Symbol(), OP_BUY, Lotsi, Ask, Slippage, Ask - StopLoss * Point, Ask + ProfitTarget * Point, 0); 
           }
          if (err>0)
          Print("error(",err,"): ",ErrorDescription(err));
          
          else
           
         //----Short
           if (v > volume)//  (mav > MAvolume..insert signal here..)
           {
             OrderSend(Symbol(), OP_SELL, Lotsi, Bid, Slippage, Bid + StopLoss * Point, Bid - ProfitTarget * Point, 0);
           }
          if (err>0)
          Print("error(",err,"): ",ErrorDescription(err));
          
          else
            {
             return(0);
           }
        }
     }
//------------------------------------------------TRAILING STOP FUNCTION-------------------------//  
  if (UseTrailingStop)
   {
    for (i = 0; i < OrdersTotal(); i++)
     {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

     if ( OrderSymbol() == Symbol() )
      {
       if ( OrderType() == OP_BUY )
        {
          HandleTrailingStop(OP_BUY,OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit());
          }

      if ( OrderType() == OP_SELL)
         {
          HandleTrailingStop(OP_SELL,OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit());
	  	  }
	   }
    }
  }

  return(0);
}


// --------------------------------------- Money Management, by Robert Hill--------------------//

double MoneyManagement ( bool flag, double Lots, double risk, double maxloss)
   {
     Lotsi=Lots;
	    
   if ( flag ) Lotsi=NormalizeDouble(Lots*AccountFreeMargin()*risk/maxloss,1);   
     
   if (Lotsi<0.1) Lotsi=0.1;  
   return(Lotsi);
} 

//--------------------------------- Get number of lots for this trade  --------------------//                              

double GetLots()
{
   double lot;
   
   if(UseMoneyManagement)
    {
     lot = LotsOptimized();
      }
       else
        {
         lot = Lots;
   
   
   if(AccountIsMini)
    {
     if (lot < 0.1) lot = 0.1;
      }
       else
      {
     if (lot >= 1.0) lot = MathFloor(lot); else lot = 1.0;
      }
       if (lot > MaxLots) lot = MaxLots;
        }
         return(lot);
        }




//------------------ Calculate optimal lot size based on percent of Account---------------------//                                   


double LotsOptimized()
  {
   double lot=Lots;
//---- select lot size
   lot=NormalizeDouble(MathFloor(AccountFreeMargin()*TradeSizePercent/10000)/10,1);
   
  
  if(AccountIsMini)
  {
    lot = MathFloor(lot*10)/10;
    
   }
   return(lot);
  }
  

//+------------------------------------------------------------------+
//| Modify Open Position Controls                                    |
//|  Try to modify position 3 times                                  |
//+------------------------------------------------------------------+
bool ModifyOrder(int nOrderType, int ord_ticket,double op, double price,double tp, color mColor = CLR_NONE)
{
    int cnt, err;
    double myStop;
    
    myStop = ValidStopLoss (nOrderType, price);
    cnt=0;
   
       if (OrderModify(ord_ticket,op,myStop,tp,0,mColor))
       {
         return(true);
       }
       else 
       {
          err=GetLastError();
          if (err > 1) Print(cnt," Error modifying order : (", ord_ticket , ") " + ErrorDescription(err), " err ",err);
          if (err>0) cnt++;
          Sleep (10000);
          }
       
    
    return(false);
}



//---------------------------------Adjust stop loss so that it is legal------------------------//
double ValidStopLoss(int cmd, double sl)
{
   double  v=iVolume(Symbol(),Period(),0);
   if (sl == 0) return(0.0);
   
   double mySL, myPrice;
   double dblMinStopDistance = MarketInfo(Symbol(),MODE_STOPLEVEL)*MarketInfo(Symbol(), MODE_POINT);
   mySL = sl;

// Check if SlopLoss needs to be modified

   switch(cmd)
   {
   case OP_BUY:
      myPrice = MarketInfo(Symbol(), MODE_BID);
	   if (myPrice - sl < dblMinStopDistance)
	    
		mySL = myPrice - dblMinStopDistance;	// we are long
		break;
      
   case OP_SELL:
      myPrice = MarketInfo(Symbol(), MODE_ASK);
	   if (sl - myPrice < dblMinStopDistance) 
		mySL = myPrice + dblMinStopDistance;	// we are Short
      
      
   }
   return(NormalizeDouble(mySL,MarketInfo(Symbol(), MODE_DIGITS)));
}



//+------------------------------------------------------------------+
//| HandleTrailingStop                                               |
//| Type 1 moves the stoploss without delay.                         |
//| Type 2 waits for price to move the amount of the trailStop       |
//| before moving stop loss then moves like type 1                   |
//| Type 3 uses up to 3 levels for trailing stop                     |
//|      Level 1 Move stop to 1st level                              |
//|      Level 2 Move stop to 2nd level                              |
//|      Level 3 Trail like type 1 by fixed amount other than 1      |          |
//+------------------------------------------------------------------+
int HandleTrailingStop(int type, int ticket, double op, double os, double tp)
{
    double pt, TS=0, myAsk, myBid;
    double bos,bop,opa,osa;
    
    switch(type)
    {
       case OP_BUY:
       {
		 myBid = MarketInfo(Symbol(),MODE_BID);
       switch(TrailingStopType)
       {
        case 1: pt = Point*StopLoss;
                if(myBid-os > pt)
                 ModifyOrder(type, ticket,op,myBid-pt,tp, Aqua);
                break;
        case 2: pt = Point*TrailingStop;
                if(myBid-op > pt && os < myBid - pt)
                 ModifyOrder(type, ticket,op,myBid-pt,tp, Aqua);
                break;
       }
       return(0);
       break;
       }
    case  OP_SELL:
    {
		myAsk = MarketInfo(Symbol(),MODE_ASK);
       switch(TrailingStopType)
       {
        case 1: pt = Point*StopLoss;
                if(os - myAsk > pt)
                 ModifyOrder(type, ticket,op,myAsk+pt,tp, Aqua);
                break;
        case 2: pt = Point*TrailingStop;
                if(op - myAsk > pt && os > myAsk+pt)
                 ModifyOrder(type, ticket,op,myAsk+pt,tp, Aqua);
                break;
       }
    }
    return(0);
    }
}
  
//+------------------------------------------------------------------+
//| Time frame interval appropriation  function                      |
//+------------------------------------------------------------------+

int func_TimeFrame_Const2Val(int Constant ) {
   switch(Constant) {
      case 1:  // M1
         return(1);
      case 5:  // M5
         return(2);
      case 15:
         return(3);
      case 30:
         return(4);
      case 60:
         return(5);
      case 240:
         return(6);
      case 1440:
         return(7);
      case 10080:
         return(8);
      case 43200:
         return(9);
   }
}
int func_Symbol2Val(string symbol) {
   string mySymbol = StringSubstr(symbol,0,6);
	if(mySymbol=="AUDCAD") return(1);
	if(mySymbol=="AUDJPY") return(2);
	if(mySymbol=="AUDNZD") return(3);
	if(mySymbol=="AUDUSD") return(4);
	if(mySymbol=="CHFJPY") return(5);
	if(mySymbol=="EURAUD") return(6);
	if(mySymbol=="EURCAD") return(7);
	if(mySymbol=="EURCHF") return(8);
	if(mySymbol=="EURGBP") return(9);
	if(mySymbol=="EURJPY") return(10);
	if(mySymbol=="EURUSD") return(11);
	if(mySymbol=="GBPCHF") return(12);
	if(mySymbol=="GBPJPY") return(13);
	if(mySymbol=="GBPUSD") return(14);
	if(mySymbol=="NZDUSD") return(15);
	if(mySymbol=="USDCAD") return(16);
	if(mySymbol=="USDCHF") return(17);
	if(mySymbol=="USDJPY") return(18);
	Comment("unexpected Symbol");
	return(19);
}


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 ---