Risk Percent and MaxSpread

I

Igor Gontijo

Guest
Good afternoon,
I have a simple script that I developed:

Buy Close ( 1 ) > Close ( 2) / Sell Close ( 1 ) < Close (2)

that serves me well in the type of strategy and asset use .

However wanted to add two parameters :
RiskPercent - Percentage of capital allocated to each operation , the batch varies according to the accumulated assets .
MaxSpread - maximum Spreed accepted to enter into a transaction.

Anyone can help me?

See the code below:
MQL4:
extern int MagicNumber=10001;
extern double Lots =0.01;
extern double StopLoss=0;
extern double TakeProfit=0;
extern int TrailingStop=0;
extern int Slippage=3;
//+------------------------------------------------------------------+
//    expert start function
//+------------------------------------------------------------------+
int start()
{
  double MyPoint=Point;
  if(Digits==3 || Digits==5) MyPoint=Point*10;
 
  double TheStopLoss=0;
  double TheTakeProfit=0;
  if( TotalOrdersCount()==0 )
  {
     int result=0;
     if((Close[1]>Close[2])) // Here is your open buy rule
     {
        result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"EA Generator",MagicNumber,0,Blue);
        if(result>0)
        {
         TheStopLoss=0;
         TheTakeProfit=0;
         if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
         if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
         OrderSelect(result,SELECT_BY_TICKET);
         OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
     }
     if((Close[1]<Close[2])) // Here is your open Sell rule
     {
        result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"EA Generator",MagicNumber,0,Red);
        if(result>0)
        {
         TheStopLoss=0;
         TheTakeProfit=0;
         if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint;
         if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint;
         OrderSelect(result,SELECT_BY_TICKET);
         OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
     }
  }
 
  for(int cnt=0;cnt<OrdersTotal();cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && 
         OrderSymbol()==Symbol() &&
         OrderMagicNumber()==MagicNumber
         )
        {
         if(OrderType()==OP_BUY)
           {
              if((Close[1]<Close[2])) //here is your close buy rule
              {
                   OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
              }
            if(TrailingStop>0)
              {               
               if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-MyPoint*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else
           {
                if((Close[1]>Close[2])) // here is your close sell rule
                {
                   OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
                }
            if(TrailingStop>0)
              {               
               if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
}
 
int TotalOrdersCount()
{
  int result=0;
  for(int i=0;i<OrdersTotal();i++)
  {
     OrderSelect(i,SELECT_BY_POS ,MODE_TRADES);
     if (OrderMagicNumber()==MagicNumber) result++;
 
   }
  return (result);
}
 
Last edited by a moderator:

Enivid

Administrator
Staff member
Nov 30, 2008
16,136
836
144
Odessa
www.earnforex.com
Adding MaxSpread condition is easy. First, you add it as an input parameter:

MQL4:
extern int MaxSpread = 10;

Then, you check spread before opening any trades and proceed only if the current spread is lower or equal:

MQL4:
if ((TotalOrdersCount() == 0) && (MarketInfo(Symbol(), MODE_SPREAD) <= MaxSpread))

Edit: this line should replace the following line:
MQL4:
  if( TotalOrdersCount()==0 )

Adding RiskPercent can be anywhere from very easy to very tricky, depending on the formula and conditions you want to use here.
 
I

Igor Gontijo

Guest
Adding MaxSpread condition is easy. First, you add it as an input parameter:

MQL4:
extern int MaxSpread = 10;

Then, you check spread before opening any trades and proceed only if the current spread is lower or equal:

MQL4:
if ((TotalOrdersCount() == 0) && (MarketInfo(Symbol(), MODE_SPREAD) <= MaxSpread))

Edit: this line should replace the following line:
MQL4:
  if( TotalOrdersCount()==0 )

Thank you very much for your help!

The script is not calculating the lot size corectly yet.

When the total amout of capital is low, like 15 dolars, and I set the risk to 5% the script doesn't open the operation.

And when it gets higher than 48.18 lots he doesnt operate too.

Here is the code:
Code:
Lots=((AccountBalance()/100)*RiskPercent)/(MarketInfo(Symbol(),MODE_MINLOT)*MarketInfo(Symbol(),MODE_LOTSIZE));

Can you help me?
 

Enivid

Administrator
Staff member
Nov 30, 2008
16,136
836
144
Odessa
www.earnforex.com
When the total amout of capital is low, like 15 dolars, and I set the risk to 5% the script doesn't open the operation.

Of course, it does not. With those settings, it would try to open a trade of 0.00075 lot. It's not possible in MetaTrader.

And when it gets higher than 48.18 lots he doesnt operate too.

What goes higher than 48.18 lots? Calculated Lots variable? If so, there is probably a limit of about that value (try 50) for the maximum position size in your platform/broker.
 
I

Igor Gontijo

Guest
Of course, it does not. With those settings, it would try to open a trade of 0.00075 lot. It's not possible in MetaTrader.

What goes higher than 48.18 lots? Calculated Lots variable? If so, there is probably a limit of about that value (try 50) for the maximum position size in your platform/broker.

How I set a rule that, If the lot gets below the min. size, the EA operates at the minimum?
About the maximum limit, it is 50. I want to set it at 50 in this case, so it doesnt stop at 48.18

Can you help me?