Proses Membuat Robot Forex / EA ( Expert Advisor )

20 November 2012 Leave a Comment
Artikel ini adalah lanjutan dari artikel sebelumnya, yaitu Cara Membuat Robot Forex / EA ( Expert Advisor ).
Jika anda merasa bingung dengan proses pembuatan robot forex pada Link yang saya tunjukkan di artikel sebelumnya, saya berharap artikel ini dapat membantu anda. Berikut ini adalah tutorial proses lengkap pembuatan Robot Forex / EA ( expert advisor ):

1. Langkah pertama buka MetaEditor.exe
2. Pilih New ( Sebuah menu yang ber bentuk tanda + berwarna hijau ) yang terletak di sebelah kanan atas.
3. Pilih Expert Advisor.

4. Isi seluruh daftar yang diperlukan, klik finish.

5. Setelah itu anda akan dihadapkan dengan bentuk tampilan seperti dibawah ini:


6. Hapus bersih semua kode tersebut dan ganti dengan kode berwarna pink dibawah ini:
  
//+------------------------------------------------------------------+
//|                                                                  |
//|                                                Forex Fighter.mq4 |
//|                                      apabe.blogspot.com |
//|                                                                  |
//|                                                                  |
//|      CARA MENGGUNAKAN FOREX FIGHTER:                             |
//|      1. Currency: EUR/USD                                        |
//|      2. Time frame: D1                                           |  
//|      3. Leverage 1:500                                           |
//|      4. Lots: 0.2 / Margin 2500                                  |  
//|                                                                  |
//|      TIPS MENGGUNAKAN FOREX FIGHTER:                             |  
//|      1. Robot harus online 24 jam                                |
//|      2. Jangan ada campur tangan manusia dalam                   |
//|         trading                                                  |
//|      3. Jika terjadi loss yang berulang - ulang itu wajar,       |
//|         karena robot akan mengembalikanya dengan profit yang     |
//|         lebih besar                                              |   
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#define SIGNAL_NONE 0
#define SIGNAL_BUY   1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4

#property copyright "Copyright © Kampung Perawan"
#property link      "http://www.apabe.blogspot.com"

extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = True;
extern double Lots = 0.2;
extern int Slippage = 5;
extern bool UseStopLoss = True;
extern int StopLoss = 100;
extern bool UseTakeProfit = False;
extern int TakeProfit = 0;
extern bool UseTrailingStop = False;
extern int TrailingStop = 0;

int BarCount;
int Current;
bool TickCheck = False;

int init() {
   BarCount = Bars;

   if (EachTickMode) Current = 0; else Current = 1;

   return(0);
}

int deinit() {
   return(0);
}

int start() {
   int Order = SIGNAL_NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;



   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = SIGNAL_NONE;




double Buy1_1 = iMA(NULL, 0, 14, 0, MODE_EMA, PRICE_CLOSE, Current + 1);
double Buy1_2 = iMA(NULL, 0, 28, 0, MODE_SMA, PRICE_CLOSE, Current + 1);
double Buy2_1 = iMA(NULL, 0, 14, 0, MODE_EMA, PRICE_CLOSE, Current + 0);
double Buy2_2 = iMA(NULL, 0, 28, 0, MODE_SMA, PRICE_CLOSE, Current + 0);

double Sell1_1 = iMA(NULL, 0, 14, 0, MODE_EMA, PRICE_CLOSE, Current + 1);
double Sell1_2 = iMA(NULL, 0, 28, 0, MODE_SMA, PRICE_CLOSE, Current + 1);
double Sell2_1 = iMA(NULL, 0, 14, 0, MODE_EMA, PRICE_CLOSE, Current + 0);
double Sell2_2 = iMA(NULL, 0, 28, 0, MODE_SMA, PRICE_CLOSE, Current + 0);

double CloseBuy1_1 = iMA(NULL, 0, 14, 0, MODE_EMA, PRICE_CLOSE, Current + 1);
double CloseBuy1_2 = iMA(NULL, 0, 28, 0, MODE_SMA, PRICE_CLOSE, Current + 1);
double CloseBuy2_1 = iMA(NULL, 0, 14, 0, MODE_EMA, PRICE_CLOSE, Current + 0);
double CloseBuy2_2 = iMA(NULL, 0, 28, 0, MODE_SMA, PRICE_CLOSE, Current + 0);

double CloseSell1_1 = iMA(NULL, 0, 14, 0, MODE_EMA, PRICE_CLOSE, Current + 1);
double CloseSell1_2 = iMA(NULL, 0, 28, 0, MODE_SMA, PRICE_CLOSE, Current + 1);
double CloseSell2_1 = iMA(NULL, 0, 14, 0, MODE_EMA, PRICE_CLOSE, Current + 0);
double CloseSell2_2 = iMA(NULL, 0, 28, 0, MODE_SMA, PRICE_CLOSE, Current + 0);

   

   bool IsTrade = False;

   for (int i = 0; i < Total; i ++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) {
         IsTrade = True;
         if(OrderType() == OP_BUY) {
            //Close



                     if (CloseBuy1_1 > CloseBuy1_2 && CloseBuy2_1 < CloseBuy2_2) Order = SIGNAL_CLOSEBUY;




            if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }

            if(UseTrailingStop && TrailingStop > 0) {                 
               if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         } else {


                     if (CloseSell1_1 < CloseSell1_2 && CloseSell2_1 > CloseSell2_2) Order = SIGNAL_CLOSESELL;




            if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }

            if(UseTrailingStop && TrailingStop > 0) {                 
               if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
                  if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         }
      }
   }



   if (Buy1_1 < Buy1_2 && Buy2_1 > Buy2_2) Order = SIGNAL_BUY;

   if (Sell1_1 > Sell1_2 && Sell2_1 < Sell2_2) Order = SIGNAL_SELL;



   if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {

         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
                Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
            } else {
                Print("Error opening BUY order : ", GetLastError());
            }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }


   if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {

         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
                Print("SELL order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
            } else {
                Print("Error opening SELL order : ", GetLastError());
            }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }

   if (!EachTickMode) BarCount = Bars;

   return(0);
}

7. Kode diatas adalah kerangka dari robot forex / EA ( expert advisor ) dengan cara kerja sebagai berikut:

Open Buy: Garis SMA 28 memotong dari atas garis EMA 14.
Close Buy: Garis SMA 28 memotong dari bawah EMA 14.

Open Sell: Garis EMA 14 memotong dari atas garis SMA 28.
Close Sell: Garis EMA 14 memotong dari bawah garis SMA 28.

Anda dapat merubah angka moving average 14 atau 28 sesuai gaya trading anda. Semoga sukses!

Postingan Menarik Lainnya :

0 komentar »

Leave your response!