Tuesday 18 December 2012

Bagian 10 - Money Management

http://www.forexindo.com/forum/tutorial-mql4/7518-bagian-10-money-management.html

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:
Code:
extern int Risk=1; // dalam percent
extern double lotDigit=1; //berapa decimal lot yang diijinkan. kalau fxopen 1 digit.
untuk menghitung persentase margin, kita juga harus mengetahui berapa margin yang dibutuhkan untuk order 1 lot,
untuk itu akan kita definisikan seperti ini:
Code:
double margin=MarketInfo(Symbol(), MODE_MARGINREQUIRED) ;
nah sekarang kita masuk dalam code MM nya, yaitu menghitung berapa lot untuk order 1 persen dari balance.
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);
}
selanjutnya tinggal mengaplikasikan kode2 di atas ke dalam EA MACD Sample.
semua perintah ordersend dalam ea tersebut, bagian lotnya diubah jadi LotSize() untuk memanggil fungsi MoneyManagement yang sudah kita buat di atas
contoh yang ini
Code:
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
diubah jadi
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.


2 comments:

  1. Hey Everybody,

    I'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...

    ReplyDelete
  2. Imagine if you had a robot with 6 years authenticated proof?

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

    ReplyDelete