Logika EA Martil Perkalian & Pindah Take Profit

Dalam membuat Expert Advisor (EA) maka tentu ada yang mempunyai teknik tersendiri dan salah satunya adalah : Teknik Martil, jika Open Posisi Buy terfloating Mines maka berlaku Averaging dengan jarak antara open pertama dan kedua yang sudah ditetapkan sehingga jika penetapannya adalah 20 Poin maka EA akan open posisi kembali dengan Lots yang sama atau yang berbeda baik dengan perkalian atau dengan perhitungan menggunakan rumusan yang lain.
Adapun Skrip dibawah ini adalah Script Martil dengan perkalian yang dapat kita tentukan serta sekaligus memindah take Propit ke open posisi sebelumnya.

void LaksankanPerkalian_danPemindahanTP()
{
         int      iCount      =  0;
         double   LastOP      =  0;
         double   LastLots    =  0;
         bool     LastIsBuy   =  FALSE;
         int      iTotalBuy   =  0;
         int      iTotalSell  =  0;
         int      Spread=0;
  
         Spread= MarketInfo(Symbol(), MODE_SPREAD);

        
         for(iCount=0;iCount<OrdersTotal();iCount++)
         {
                   
           OrderSelect(iCount,SELECT_BY_POS,MODE_TRADES);
          
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderComment()==EAComment && OrderMagicNumber()==EAMagicNumber)
           {
               if(LastOP==0) {LastOP=OrderOpenPrice();}
               if(LastOP>OrderOpenPrice()) {LastOP=OrderOpenPrice();}
               if(LastLots<OrderLots()) {LastLots=OrderLots();}
               LastIsBuy=TRUE;
               iTotalBuy++;
              
               /* Bila mencapai batas OP maksimal, jangan tambah OP lagi */
               if(iTotalBuy==MaxTrade) {return(0);}
           }

           if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderComment()==EAComment && OrderMagicNumber()==EAMagicNumber)
           {
               if(LastOP==0) {LastOP=OrderOpenPrice();}
               if(LastOP<OrderOpenPrice()) {LastOP=OrderOpenPrice();}        
               if(LastLots<OrderLots()) {LastLots=OrderLots();}
               LastIsBuy=FALSE;
               iTotalSell++;
              
               /* Bila mencapai batas OP maksimal, jangan tambah OP lagi */
               if(iTotalBuy==MaxTrade) {return(0);}
           }
        
         }     
        
         /* Jika arah Price adalah DOWNTREND...., Periksa nilai Bid (*/
         if(LastIsBuy)
         {
            if(Bid<=LastOP-(Spread*SetPoint)-(PipStep*SetPoint))
            {
               OrderSend(Symbol(), OP_BUY, Multiply*LastLots, Ask, Slippage, 0, Ask+TakeProfit*SetPoint, EAComment, EAMagicNumber);  
               ModifyTP();
               LastIsBuy=FALSE;
               return(0);
            }
         }
         /* Jika arah Price adalah Sell...., Periksa nilai Ask (*/
         else if(!LastIsBuy)
         {
            if(Ask>=LastOP+(Spread*SetPoint)+(PipStep*SetPoint))
            {
               OrderSend(Symbol(), OP_SELL, Multiply*LastLots, Bid, Slippage, 0, Bid-TakeProfit*SetPoint, EAComment, EAMagicNumber);          
               ModifyTP();
               return(0);
            }
         }

}

/*-- Fungsi ModifyTP ini untuk mengubah semua OP agar TP di titik yang sama --*/
void ModifyTP()
{
   int      iCount=0;
   double   NewTP=0;
       
        /*- Ambil nilai Take Profit dari Order terakhir -*/
         for(iCount=0;iCount<OrdersTotal();iCount++)
         {
          
           OrderSelect(iCount,SELECT_BY_POS,MODE_TRADES);
      
           /*-- Kalau OP-nya adalah BUY, ambil nilai TP yang paling kecil. Jadikan TP bersama --*/
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderComment()==EAComment && OrderMagicNumber()==EAMagicNumber)
           {
               if(NewTP==0) {NewTP=OrderTakeProfit();}
               if(NewTP>OrderTakeProfit()) {NewTP=OrderTakeProfit();}
              
           }
          
           /*-- Kalau OP-nya adalah SELL, ambil nilai TP yang paling besar. Jadikan TP bersama --*/
           if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderComment()==EAComment && OrderMagicNumber()==EAMagicNumber)
           {
               if(NewTP==0) {NewTP=OrderTakeProfit();}
               if(NewTP<OrderTakeProfit()) {NewTP=OrderTakeProfit();}        
           }
                    
         }

        /*- Ubah semua nilai OP TakeProfit dengan yang baru (2x lipat) -*/
         for(iCount=0;iCount<OrdersTotal();iCount++)
         {
          
           OrderSelect(iCount,SELECT_BY_POS,MODE_TRADES);
      
           /*- Kalau semua OP adalah BUY, maka ubahlah TP mereka -*/
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderComment()==EAComment && OrderMagicNumber()==EAMagicNumber)
           {
               OrderModify(OrderTicket(), OrderLots(), 0, NewTP, 0);
           }
          
           /*- Kalau semua OP adalah SELL, maka ubahlah TP mereka -*/
           if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderComment()==EAComment && OrderMagicNumber()==EAMagicNumber)
           {
               OrderModify(OrderTicket(), OrderLots(), 0, NewTP, 0);
           }            
        
         }       
}

Demikianlah Script Martil diatas semoga bermanfaat.

Komentar