pada tutorial kali ini saya akan coba menambahkan money management pada sebuah ea.
ea yang akan diutak-atik adalah ea standard metatrader yaitu "MACD Sample".
saya akan mencoba supaya setiap ordernya hanya menggunakan 1% dari balance. jadi kalau total ordernya ada 5 bersamaan berarti margin yang terpakai cuma 5%.
"misalnya balance kita 10.000 maka 1% nya berarti 100 usd. nah di sini kita akan menghitung 100 usd itu berapa lot."
supaya settingan persen nya bisa diubah sesuai keinginan, maka pertama kita tambahkan extern input seperti ini:
untuk menghitung persentase margin, kita juga harus mengetahui berapa margin yang dibutuhkan untuk order 1 lot,Code:extern int Risk=1; // dalam percent extern double lotDigit=1; //berapa decimal lot yang diijinkan. kalau fxopen 1 digit.
untuk itu akan kita definisikan seperti ini:
nah sekarang kita masuk dalam code MM nya, yaitu menghitung berapa lot untuk order 1 persen dari balance.Code:double margin=MarketInfo(Symbol(), MODE_MARGINREQUIRED) ;
selanjutnya tinggal mengaplikasikan kode2 di atas ke dalam EA MACD Sample.Code:double LotSize() { double lot=0; lot=NormalizeDouble((AccountBalance()*Risk/100)/margin, lotDigit) ; // di sini kita sudah mendapatkan nilai lotnya if (lot>MarketInfo(Symbol(),MODE_MAXLOT)) { lot=MarketInfo(Symbol(),MODE_MAXLOT); } // di sini di filter supaya jika lotnya lebih besar dari batas maximum lot yang ditentukan broker, maka lotnya diubah sesuai batas maximum lot if (lot<MarketInfo(Symbol(),MODE_MINLOT)) { lot=MarketInfo(Symbol(),MODE_MINLOT); } // di sini juga di filter supaya jika lotnya lebih kecil dari batas minimum yang sudah ditentukan oleh broker, maka lotnya diubah sesuai batas minimum tersebut return (lot); }
semua perintah ordersend dalam ea tersebut, bagian lotnya diubah jadi LotSize() untuk memanggil fungsi MoneyManagement yang sudah kita buat di atas
contoh yang ini
diubah jadiCode:ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
Code:ticket=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
code finalnya seperti ini:
//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;
extern int Risk=1; // dalam percent
extern double lotDigit=1; //berapa decimal lot yang di ijinkan. kalau fxopen 1 digit.
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double MacdCurrent, MacdPrevious, SignalCurrent;
double SignalPrevious, MaCurrent, MaPrevious;
int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0); // check TakeProfit
}
// to simplify the coding and speed up access
// data are put into internal variables
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
total=OrdersTotal();
if(total<1)
{
// no opened orders identified
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// check for long position (BUY) possibility
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
// check for short position (SELL) possibility
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
{
ticket=OrderSend(Symbol(),OP_SELL,LotSize(),Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
// it is important to enter the market correctly,
// but it is more important to exit it correctly...
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // go to short position
{
// should it be closed?
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
double LotSize()
{
double margin=MarketInfo(Symbol(), MODE_MARGINREQUIRED);
double lot=0;
lot=NormalizeDouble((AccountBalance()*Risk/100)/margin, lotDigit) ; // di sini kita sudah mendapatkan nilai lotnya
if (lot>MarketInfo(Symbol(),MODE_MAXLOT)) { lot=MarketInfo(Symbol(),MODE_MAXLOT); } // di sini di filter supaya jika lotnya lebih besar dari batas maximum, maka lotnya diubah sesuai batas maximum lot
if (lot<MarketInfo(Symbol(),MODE_MINLOT)) { lot=MarketInfo(Symbol(),MODE_MAXLOT); } // di sini di filter supaya jika lotnya lebih kecil dari batas minimum yang sudah ditentukan oleh broker, maka lotnya diubah sesuai batas minimum tersebut
return (lot);
}
// the end.
Hey Everybody,
ReplyDeleteI've included a list of the most recommended forex brokers:
1. Best Forex Broker
2. eToro - $50 minimum deposit.
Here is a list of top forex instruments:
1. ForexTrendy - Recommended Odds Software.
2. EA Builder - Custom Strategies Autotrading.
3. Fast FX Profit - Secret Forex Strategy.
I hope you find these lists helpful...
Imagine if you had a robot with 6 years authenticated proof?
ReplyDeleteI just got done with a webinar with Mark and his partner, Antony, two days ago and it was GREAT.
During the webinar MARK and ANTONY shared their secrets to success and answered questions about their new release of the GPS Forex Robot that is coming out TODAY!