Open Forex4you Account

Server รัน EA 1000 / ปี

สั่งชื้อคู่มือการโปรแรกม MQL4

Author Topic: ล็อตเกินแล้วไม่เทรดต่อ  (Read 10263 times)

kiiyoo

  • Newbie
  • *
  • Posts: 49
ล็อตเกินแล้วไม่เทรดต่อ
« on: สิงหาคม 19, 2011, 11:30:26 pm »
ผมเขียนอีเอแล้วมันมีปัญหาตรงที่ว่า พอมันเบิ้ลลอตจนไม่สามารถเข้าออเดอได้แล้วมันหยุดเทรดไปเลย จะแก้ปัญหายังไงดีครับ

อยากจะตั้งให้ว่าหากเกินล็อตที่เรากำหนดให้ไปเริ่มต้นใหม่เช่น

จากอีเอที่ผมเขียนจะต้องใส่ค่าใน Input คือ
TP
SL
Lots

ผมอยากให้มี Max Lots ด้วยเช่นว่า

ใส่ค่า
TP85
SL60
Lots0.5
Max Lots 4.0

พออีเอเริ่มเทรด
Lots 0.5 เสีย
Lots 1 เสีย
Lots 2 เสีย
Lots 4 เสีย
ให้เริ่มLots 0.5 ใหม่
นี่เป็นโค๊ดอีเอผมครับ
#property copyright "Copyright ฉ 2005, Alejandro Galindo"
#property link      "http://elCactus.com"

extern int TP = 25;
extern double Lots = 0.1;
extern int SL = 20;


int  OpenOrders=0, cnt=0;
int  slippage=2;
double sl=0;
double BuyPrice=0, SellPrice=0;
double lotsi=0, mylotsi=0;
int mode=0;

double M1,M2,cci46,cci42,RSi;
double M11, M21;
double PClose,POpen;

int ticket, order_Type;
datetime openTime, closeTime;
double orderSize, openPrice, closePrice, sf, tf, comm, swap, profit;
string order_Symbol, order_TypeToStr;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   if(MarketInfo("EURUSD",MODE_DIGITS)==5)
   {
      TP =  TP*10;
      SL = SL*10;   
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int handle;
   
   for(int i=0;i<OrdersHistoryTotal();i++)
     {
         GetHistoryOrder(i,MODE_HISTORY);
         if(order_Type==0)
            order_TypeToStr="buy";
         if(order_Type==1)   
            order_TypeToStr="sell";
         handle=FileOpen("getOrderHistory.csv", FILE_CSV|FILE_READ|FILE_WRITE, ';');
         if(handle>0)
           {
            if(FileSeek(handle,0,SEEK_SET)==true)
               FileWrite(handle, "Order","Open Time","Type","Size","Symbol","Open Price","S/L","T/F","Close Time","Close Price","Comission","Swap","Profit");
            FileSeek(handle, 0, SEEK_END);
            //---- add data to the end of file
            FileWrite(handle, ticket,TimeToStr(openTime,TIME_DATE|TIME_SECONDS),order_TypeToStr, orderSize, order_Symbol, openPrice, sf, tf, TimeToStr(closeTime,TIME_DATE|TIME_SECONDS), comm, swap, profit);
            FileClose(handle);
            handle=0;
           }       
     }


   OpenOrders=0;
   for(cnt=0;cnt<OrdersTotal();cnt++)   
   {
     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
     if (OrderSymbol()==Symbol())
     {            
          OpenOrders++;
     }
   }     

   M1    =  iMACD(NULL,0,18,39,4,PRICE_CLOSE,MODE_MAIN,0);
 
   M2    =  iMACD(NULL,0,18,39,4,PRICE_CLOSE,MODE_SIGNAL,0);
   
   cci46 =  iCCI(NULL,0,42,PRICE_CLOSE,1);
   
   cci42 =  iCCI(NULL,0,35,PRICE_CLOSE,1);
   
   RSi    =  iRSI(NULL,0,14,PRICE_CLOSE,0);
   

   PClose   = iClose(NULL,0,1);
   POpen    = OrderOpenPrice();
/*   
   Comment  (
             "\nLots = ",Lots,
             "\norderSize = ",orderSize,
             "\nprofit = ",profit);
*/
if (OpenOrders<1)
   {
     if (((M2>0.003)||(RSi>70))&&(cci42>250))
      {   
          SellPrice=Bid;            
          if (SL==0) { sl=0; }
          else { sl=SellPrice+SL*Point;  }
          if (profit>=0) {mylotsi = Lots;}
          else {mylotsi = NormalizeDouble(orderSize*2,1);}
          OrderSend(Symbol(),OP_SELL,mylotsi,SellPrice,slippage,sl,0,NULL,0,0,Red);                   
          return(0);
      }
     
     if (((M2<0.003)||(RSi<30))&&(cci42<-250))
      {
          BuyPrice=Ask;
          if (SL==0)  { sl=0; }
          else { sl=BuyPrice-SL*Point; }
          if (profit>=0) {mylotsi = Lots;}
          else {mylotsi = NormalizeDouble(orderSize*2,1);}
          OrderSend(Symbol(),OP_BUY,mylotsi,BuyPrice,slippage,sl,0,NULL,0,0,Blue);         
          return(0);
      }   
   
   }
//-------------------------------------Cut OrderClose-----------------------------

if(OpenOrders!=0 && PClose-POpen>=TP*Point)
  {
     for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
          mode=OrderType();
        if (OrderSymbol()==Symbol())
        {
         if (mode==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Blue); }
        }
     }
  }

if(OpenOrders!=0 && POpen-PClose>=TP*Point)
  {
     for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
          mode=OrderType();
        if (OrderSymbol()==Symbol())
        {
         if (mode==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red); }
        }
     }
  }
//----
   return(0);
  }
//+------------------------------------------------------------------+
void GetHistoryOrder(int count,int mode)
  {
    if(OrderSelect(count, SELECT_BY_POS, mode)==true)
    {
      ticket=OrderTicket();
      order_Type=OrderType();
      openTime=OrderOpenTime();
      closeTime=OrderCloseTime();
      orderSize=OrderLots();
      openPrice=OrderOpenPrice();
      closePrice=OrderClosePrice();
      sf=OrderStopLoss();
      tf=OrderTakeProfit();
      comm=OrderCommission();
      swap=OrderSwap();
      profit=OrderProfit();
      order_Symbol=OrderSymbol();   
    }
    else
      Print("OrderSelect returned the error of ",GetLastError());
  }

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: ล็อตเกินแล้วไม่เทรดต่อ
« Reply #1 on: สิงหาคม 19, 2011, 11:40:20 pm »
คุ้นๆๆนะเหมือนผมเคยเขียน EA ลักษณะนี้ไวแล้ว เดียวลองหาดูก่อน  แต่จริงคุณ kiiyoo ทำเองก็ได้ครับโดยการ เซ็คจาก history ว่า Order สุดท้ายที่ปิดไปเป็นลบหรือเปล่า ถ้าเป้นลบแล้ว lot เท่ากับ 4 ให้กำหนด lot ใหม่เป็น 0.5 ครับ