Selasa, 20 Mei 2014

HedgeLot_EA.mq4

//+------------------------------------------------------------------+
//|                                                  HedgeLot_EA.mq4 |
//|                                     Copyright © 2009, metropolis |
//|                                           metropolisfx@yahoo.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, metropolis"
#property link      "metropolisfx@yahoo.com"

extern int  TP = 35;
extern int  SL = 10;
extern double InstantLot = 0.1;
extern double PendingLot = 0.3;

#define Slippage 2
#define id1 12345
#define id2 67890

//global variables
static datetime lastB = -1;
static datetime lastS = -1;
static datetime lastClose = -1;
static double nextLot;
static double levelBuy;
static double levelSell;
static bool firstRun;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
Comment("\n", "     Broker Time         : ",TimeToStr(TimeCurrent()),"\n",
        "\n", "     Stop Level           : ",MarketInfo(Symbol(),MODE_STOPLEVEL),
        "\n", "     Orders Total        : ",OrdersTotal(),"\n",
        "\n", "     Copyright © 2009, metropolis - metropolisfx@yahoo.com");
        
if(!IsTradeAllowed())
{
   Print("Server tidak mengizinkan trade");
   Sleep(5000);
   return(0);
}
if(IsTradeContextBusy())
{
   Print("Trade context is busy. Tunggu sebentar");
   Sleep(5000);
   return(0);
}
if(!IsConnected())
{
   Print("Nggak ada koneksi untuk order dari EA ke server");
   Sleep(5000);
   return(0);
}
if(MarketInfo(Symbol(),MODE_STOPLEVEL)>TP || MarketInfo(Symbol(),MODE_STOPLEVEL)>SL)
{
   Print("Stop Level lebih besar dari pada SL atau TP");
   return(0);


if(!firstRun)
{      
   for (int i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==id2 && OrderProfit()>0 )
      {
         if(OrderType()==OP_SELL && OrderOpenTime()==lastS)
         { 
            deleteAll(OP_BUYSTOP);
            lastS = -1;
            Sleep(5000);
         }
          
         if(OrderType()==OP_BUY && OrderOpenTime()==lastB)
         { 
            deleteAll(OP_SELLSTOP); 
            lastB = -1;
            Sleep(5000);
         }
      }
   }        
}

manageTrade();

if(OrdersTotal()==0) firstRun();

  
//----
   return(0);
  }
//+------------------------------------------------------------------+

double p()
{
   double p;
   if(Digits==5 || Digits==3) p = 10*(MarketInfo(Symbol(),MODE_POINT));
   else p = MarketInfo(Symbol(),MODE_POINT);
   return (p);


void openOrder(string simbol, int trade, double lotsize, double price, double sl, double tp,string pesan, int magic, color warna)
{                    
   int tiket=OrderSend(simbol,trade,lotsize,price,Slippage,sl,tp,pesan,magic,0,warna);                             
   if(tiket>0)
   { 
        if(OrderSelect(tiket,SELECT_BY_TICKET,MODE_TRADES)) OrderPrint();
   }
   else Print("Tidak bisa buka order karena : ",GetLastError());       
}

void firstRun()
{//

   RefreshRates();
   int spread = MarketInfo(Symbol(),MODE_SPREAD);

   //buy
   double buyTP = Ask+(TP-spread)*p();
   double buySL = Ask-SL*p();
   openOrder(Symbol(),OP_BUY,InstantLot,Ask,buySL,buyTP,"buy awal",id1,Blue);
   levelBuy = Ask;
  
   //sell
   double sellTP = Bid-(TP-spread)*p();
   double sellSL = Bid+SL*p();
   openOrder(Symbol(),OP_SELL,InstantLot,Bid,sellSL,sellTP,"sell awal",id1,Red);
   levelSell = Bid;
  
   //buystop
   openOrder(Symbol(),OP_BUYSTOP,PendingLot,buyTP+spread*p(),Bid,buyTP+TP*p(),"buy lanjut",id2,Blue);
  
   //sellstop
   openOrder(Symbol(),OP_SELLSTOP,PendingLot,sellTP-spread*p(),Ask,sellTP-TP*p(),"sell lanjut",id2,Red);
  
   nextLot = PendingLot*2;
   firstRun = true;
}

void manageTrade()
{
   int i;
   int spread = MarketInfo(Symbol(),MODE_SPREAD);
   bool NewBuyExist = false;
   bool NewSellExist = false;
  
   for (i=OrdersTotal()-1;i>=0;i--)// mencari  order terakhir buystop yang menjadi buy
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==id2 && OrderType()==OP_BUY)
         {
            if(lastB != OrderOpenTime())
            {
               lastB = OrderOpenTime();
               levelBuy = OrderOpenPrice();
               NewBuyExist = true;
               break;
            } 
         }
      }
   }
  
  
   for (i=OrdersTotal()-1;i>=0;i--)// mencari order terakhir sell stop yang menjadi sell
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==id2 && OrderType()==OP_SELL)
         {
            if(lastS != OrderOpenTime())
            {
               lastS = OrderOpenTime(); // order terakhir sell dicatet waktunya
               levelSell = OrderOpenPrice();
               NewSellExist = true;
               break;
            } 
         }
      }
   }
  
   if(NewBuyExist)
   {
      if(firstRun)
      {
         for(i=0;i<OrdersTotal();i++)
         {
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==id2 && OrderType()==OP_SELLSTOP)
            {
               OrderDelete(OrderTicket());
               firstRun = false;
            } 
         }
      }
     
      if(!firstRun)
      {
         double sellTP = levelSell-(TP-spread)*p();
         double sellSL = levelSell+SL*p();
         openOrder(Symbol(),OP_SELLSTOP,nextLot,levelSell,sellSL,sellTP,"sell lanjut",id2,Red);
         nextLot *= 2;
      }
  
   }
  
   if(NewSellExist)
   {
      if(firstRun)
      {
         for(i=0;i<OrdersTotal();i++)
         {
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==id2 && OrderType()==OP_BUYSTOP)
            {
               OrderDelete(OrderTicket());
               firstRun = false;
            } 
         }
      }
     
      if(!firstRun)
      {
         double buyTP = levelBuy+(TP-spread)*p();
         double buySL = levelBuy-SL*p();
         openOrder(Symbol(),OP_BUYSTOP,nextLot,levelBuy,buySL,buyTP,"buy lanjut",id2,Blue);
         nextLot *= 2;
      }
   }

//---

}//


void deleteAll( int trade)
{
   int i;
  
   for (i=0;i<OrdersTotal();i++)
   OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
   if(OrderSymbol()==Symbol())
   {
      if(OrderType()==trade) OrderDelete(OrderTicket());
   }
}

Tidak ada komentar:

Posting Komentar