web statistics


Bagian 10 - Money Management

Discussion in 'Tutorial MQL4' started by chandrawg, Dec 2, 2009.

  1. chandrawg

    chandrawg
    Expand Collapse
    Moderator

    Joined:
    Aug 30, 2008
    Messages:
    577
    Likes Received:
    2
    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:
     

    Attached Files:

    #1 chandrawg, Dec 2, 2009
    Last edited: Dec 10, 2009
  2. chandrawg

    chandrawg
    Expand Collapse
    Moderator

    Joined:
    Aug 30, 2008
    Messages:
    577
    Likes Received:
    2
    Money Management dengan risk dari Stop loss

    jika di atas kita menerapkan Money Management dari balance,
    di sini kita akan mencoba menghitung Money Management dari StopLoss. misalnya kita memberikan risk 5% dari balance, maka jika order tersebut kena stop loss hanya menghabiskan 5% dari balance kita.

    formula yang digunakan seperti ini
    Code:
    Lot=(balance*risk/100)/(stop loss * nilai per point)
    
    sekarang kita akan coba menerapkannya di EA "MACD Sample"
    pertama kita tambahkan dulu extern input seperti ini
    Code:
    extern int Risk=5; // dalam percent
    extern int StopLoss=100;
    
    lalu buat code money managementnya
    Code:
    double LotSize()
    {
       double lot=0;
       lot=NormalizeDouble((AccountBalance()*Risk/100)/(StopLoss*(MarketInfo(Symbol(),MODE_TICKVALUE)*100000/MarketInfo(Symbol(),MODE_LOTSIZE))),2); // 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);
    }
    
    ket:(MarketInfo(Symbol(),MODE_TICKVALUE)*100000/MarketInfo(Symbol(),MODE_LOTSIZE)) adalah kode untuk mendapatkan nilai profit per point untuk 1 lot.

    berikutnya tinggal menambahkan code-code di atas ke dalam EA MACD Sample.
    perlu diperhatikan untuk mengubah semua fungsi order send dalam EA tersebut untuk menggunakan LotSize() dan StopLoss. contoh:
    Code:
    ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
    
    menjadi
    Code:
    ticket=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
    
    bagaimana cukup mudah kan ;)
    silahkan kalau ingin aplikasikan kode MM tersebut ke EA anda :)
     

    Attached Files:

    #2 chandrawg, Dec 3, 2009
    Last edited: Dec 10, 2009
  3. chandrawg

    chandrawg
    Expand Collapse
    Moderator

    Joined:
    Aug 30, 2008
    Messages:
    577
    Likes Received:
    2
    reserved...
     
  4. adambm

    adambm
    Expand Collapse
    New Member

    Joined:
    Sep 25, 2008
    Messages:
    25
    Likes Received:
    1
    Ada yang aneh dengan 2 script di atas:

    if (lot<MarketInfo(Symbol(),MODE_MINLOT)) { lot=MarketInfo(Symbol(),MODE_MAXLOT); } // 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

    bukankah mestinya:

    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

    dan buat yang pakai stoploss:

    lot=NormalizeDouble((AccountBalance()*Risk)/(StopLoss*(MarketInfo(Symbol(),MODE_TICKVALUE)*100000/MarketInfo(Symbol(),MODE_LOTSIZE))),2); // di sini kita sudah mendapatkan nilai lotnya

    Bukankah mestinya risk dibagi 100 dulu, menjadi:

    lot=NormalizeDouble((AccountBalance()*Risk/100)/(StopLoss*(MarketInfo(Symbol(),MODE_TICKVALUE)*100000/MarketInfo(Symbol(),MODE_LOTSIZE))),2); // di sini kita sudah mendapatkan nilai lotnya

    ???
     
  5. chandrawg

    chandrawg
    Expand Collapse
    Moderator

    Joined:
    Aug 30, 2008
    Messages:
    577
    Likes Received:
    2
    Ops sorry [​IMG] thanks untuk koreksinya [​IMG]
     
  6. etrijuni

    etrijuni
    Expand Collapse
    New Member

    Joined:
    Mar 11, 2010
    Messages:
    12
    Likes Received:
    0
    Bro, kalo saya mau menghentikan operasi EA jika equity sudah mencapai angka tertentu gimana caranya?

    Misalnya, kalo equity udah berkurang $5000, atau udah profit $5000 dari equity awal, maka EA-nya berhenti eksekusi dan seluruh order diclose.

    Terimakasih sebelumnya.
     
    #6 etrijuni, Apr 8, 2010
    Last edited: Apr 8, 2010
  7. chandrawg

    chandrawg
    Expand Collapse
    Moderator

    Joined:
    Aug 30, 2008
    Messages:
    577
    Likes Received:
    2
    mungkin seperti ini
    Code:
    int MaxBalance=15000;
    int MinBalance=5000;
    if ((AccountEquity()>MaxBalance)||(AccountEquity()<MinBalance))
       {
          for(int k=OrdersTotal()-1;k>=0;k--)
          {
          if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES))
             {
             if ((OrderType()==0)||(OrderType()==1)) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
             }
          }
       }
    
     
  8. aguseko60

    aguseko60
    Expand Collapse
    New Member

    Joined:
    Feb 19, 2012
    Messages:
    20
    Likes Received:
    1
    tambah lot

    mau tanya nih master, coding untuk penambahan lot,misalkan OP1 sdh profit =balance bertambah,
    untuk OP2 lotnya bertambah karena sdh ada profit dari OP1 dan apabila profit lagi maka lot nya bertambah lagi dan seterusnya .
    tp apabila los maka lot kembali semua ke lot awal
    terimakasih
     
    pije76 likes this.
  9. mtgw

    mtgw
    Expand Collapse
    New Member

    Joined:
    Apr 26, 2013
    Messages:
    18
    Likes Received:
    0
    Gan .. ini cara mbaca perintahnya gimana ???
    biar ane lbih paham mengenai bahasa pemograman .... tolong dijelasin dalam bentuk bahasa perintah kepada manusia



    void CheckForOpen()
    {
    double maHigh0, maHigh1, maLow0, maLow1;
    int n, res, tot;
    int d = Get_Broker_Digit();
    tot = OrdersHistoryTotal();
    for(n = tot; n >= 0; n--)
    {
    OrderSelect(n, SELECT_BY_POS, MODE_HISTORY);
    if(OrderSymbol() == Symbol() && OrderType() <= OP_SELL && OrderMagicNumber() == MagicNum)
    {
    break;
    }
    }
    if(iBarShift(NULL, 0, OrderCloseTime()) > 0)
    {
    //----------------------------------------------------------------
    maHigh0 = iMA(NULL, 0, maPeriod_1, 3, maMethod_1, maAppPrice_1, 0);
    maHigh1 = iMA(NULL, 0, maPeriod_1, 3, maMethod_1, maAppPrice_1, 1);
    maLow0 = iMA(NULL, 0, maPeriod_2, 3, maMethod_2, maAppPrice_2, 0);
    maLow1 = iMA(NULL, 0, maPeriod_2, 3, maMethod_2, maAppPrice_2, 1);
    //----------------------------------------------------------------
    if(Close[1] < maLow1 && Bid < maLow0)
    {
    res = OrderSend(Symbol(), OP_SELL, GetLots(), Bid, 2 * d, 0, 0, "onMA4", MagicNum, 0, Red);
    if(res > 0)
    {
    OrderModify(res, Bid, Bid + SL * Point * d, Bid - TP * Point * d, 0, Red);
    }
    }
    //----
    if(Close[1] > maHigh1 && Ask > maHigh0)
    {
    res = OrderSend(Symbol(), OP_BUY, GetLots(), Ask, 2 * d, 0, 0, "onMA4", MagicNum, 0, Green);
    if(res > 0)
    {
    OrderModify(res, Ask, Ask - SL * Point * d, Ask + TP * Point * d, 0, Green);
    }
    }

    }

    }
     
  10. pije76

    pije76
    Expand Collapse
    New Member

    Joined:
    Feb 15, 2015
    Messages:
    3
    Likes Received:
    0
    pertanyaan yg ini kok belum ada jawaban ya? adakah yg bisa membantu menjawabnya?
     

Share This Page