Hi, I am trying to include a money management function in an EA (actuallly it shouldn’t be called MM, as it should only calculates how many lots can I buy so that when I hit my stop loss I only loss a certain percentage of my account). EA code is below.
I created the EA with a code generator, I`m not a programmer, so I dont know how to code it and where to include it. Feel free to modify this EA to include any changes.
Any help would be appreciated, thank you!
extern int MagicNumber=10001;
extern double Lots=0.1
extern double StopLoss=150;
extern double TakeProfit=300;
extern int TrailingStop=10;
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[3]>iMA(NULL,0,39,3,MODE_SMA,PRICE_CLOSE,3))&&(Close[2]>iMA(NULL,0,39,2,MODE_SMA,PRICE_CLOSE,2))&&(Close[1]>iMA(NULL,0,39,1,MODE_SMA,PRICE_CLOSE,1))&&(iMA(NULL,0,3,2,MODE_EMA,PRICE_CLOSE,2)<iMA(NULL,0,13,2,MODE_EMA,PRICE_CLOSE,2))&&(iMA(NULL,0,3,1,MODE_EMA,PRICE_CLOSE,1)>iMA(NULL,0,13,1,MODE_EMA,PRICE_CLOSE,1))) // Here is your open buy rule
{
result=OrderSend(Symbol(),OP_BUY,AdvancedMM(),Ask,Slippage,0,0,MagicNumber,0,Blue);
if(result>0)
{
TheStopLoss=0;
TheTakeProfit=0;
if(TakeProfit>0) TheTakeProfit=Ask+TakeProfitMyPoint;
if(StopLoss>0) TheStopLoss=Ask-StopLossMyPoint;
OrderSelect(result,SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
}
return(0);
}
if((Close[3]<iMA(NULL,0,39,3,MODE_SMA,PRICE_CLOSE,3))&&(Close[2]<iMA(NULL,0,39,2,MODE_SMA,PRICE_CLOSE,2))&&(Close[1]<iMA(NULL,0,39,1,MODE_SMA,PRICE_CLOSE,1))&&(iMA(NULL,0,3,2,MODE_EMA,PRICE_CLOSE,2)>iMA(NULL,0,13,2,MODE_EMA,PRICE_CLOSE,2))&&(iMA(NULL,0,3,1,MODE_EMA,PRICE_CLOSE,1)<iMA(NULL,0,13,1,MODE_EMA,PRICE_CLOSE,1))) // Here is your open Sell rule
{
result=OrderSend(Symbol(),OP_SELL,AdvancedMM(),Bid,Slippage,0,0,MagicNumber,0,Red);
if(result>0)
{
TheStopLoss=0;
TheTakeProfit=0;
if(TakeProfit>0) TheTakeProfit=Bid-TakeProfitMyPoint;
if(StopLoss>0) TheStopLoss=Bid+StopLossMyPoint;
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(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>MyPointTrailingStop)
{
if(OrderStopLoss()<Bid-MyPointTrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStopMyPoint,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else
{
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(MyPointTrailingStop))
{
if((OrderStopLoss()>(Ask+MyPointTrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPointTrailingStop,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);
}
double AdvancedMM()
{
int i;
double AdvancedMMLots = 0;
bool profit1=false;
int SystemHistoryOrders=0;
for( i=0;i<OrdersHistoryTotal();i++)
{ OrderSelect(i,SELECT_BY_POS ,MODE_HISTORY);
if (OrderMagicNumber()==MagicNumber) SystemHistoryOrders++;
}
bool profit2=false;
int LO=0;
if(SystemHistoryOrders<2) return(Lots);
for( i=OrdersHistoryTotal()-1;i>=0;i–)
{
if(OrderSelect(i,SELECT_BY_POS ,MODE_HISTORY))
if (OrderMagicNumber()==MagicNumber)
{
if(OrderProfit()>=0 && profit1) return(Lots);
if( LO==0)
{ if(OrderProfit()>=0) profit1=true;
if(OrderProfit()<0) return(OrderLots());
LO=1;
}
if(OrderProfit()>=0 && profit2) return(AdvancedMMLots);
if(OrderProfit()>=0) profit2=true;
if(OrderProfit()<0 )
{ profit1=false;
profit2=false;
AdvancedMMLots+=OrderLots();
}
}
}
return(AdvancedMMLots);
}