Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: ขอโค้ดหยุดเทรดเมื่อค่าสเปรดเกินที่เรากำหนด  (Read 34813 times)

ขอโค้ดหยุดเทรดเมื่อค่าสเปรดเกินที่เรากำหนด
ขอบคุณครับ
« Last Edit: ตุลาคม 17, 2012, 10:08:26 pm by คุยจนลิงหลับ(-.-) »

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
if ( Ask - Bid > XXX * Point )  return(0);

เอาไปวางไว้ก่อนถึงคำสั่งเปิดออเดอร์ครับ

ขอบคุณมากๆๆ

ถ้าให้มันหยุดเเล้วปิดออเดอร์ทั้งหมดด้วยอะ ???

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ก็เอาฟังก์ชั่นปิดออเดอร์ ไปเพิ่มรวมไว้กับ return(0); ครับ

 ;D ขอบคุณนะคับ

#property copyright "Copyright ฉ 2009, INVESTIVA"
#property link      "www.investiva.net"

extern double TakeProfit = 50;
extern double StopLoss = 29;
extern double AddPriceGap = 20;
extern int ImaPeriod = 16;
extern double PriceToClose = 2;
extern int TradeVolume = 1;
extern bool UseHourTrade = TRUE;
extern int FromHourTrade = 0;
extern int ToHourTrade = 22;
extern bool UseMaxspread = TRUE;
extern int Maxspread = 6;

int orderticket1;
int orderticket2;
int totalorders;
int buylimits = 0;
int selllimits = 0;
int buyclose = 0;
int sellclose = 0;
double orderprice;
double stoplevel;
double buymodifyprice;
double sellmodifyprice;
double ima;
double spread;
double lotsize;
double maxSlippage;

void init()
{
   stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   stoplevel = (stoplevel + 1.0) * Point;
   StopLoss = StopLoss * Point;
   TakeProfit = TakeProfit * Point;
   AddPriceGap = AddPriceGap * Point;
   PriceToClose = PriceToClose * Point;
   spread = Ask - Bid;
}

int start()
{

   if (UseHourTrade)
   {
      if (!(Hour() >= FromHourTrade && Hour() <= ToHourTrade))
      {
      CloseDeleteAll();
      CloseDeleteAllNonPending();
      CloseDeleteAllCurrent();
      CloseDeleteAllCurrentNonPending();
       return (0);
      }
   }
   
   if (UseMaxspread)
   {
      if ( Ask - Bid > Maxspread * Point )
      {     
      Comment("\n Spread Over!");
      CloseDeleteAll();
      CloseDeleteAllNonPending();
      CloseDeleteAllCurrent();
      CloseDeleteAllCurrentNonPending();
       return (0);
      }
   }

   totalorders = OrdersTotal();
   buylimits = FALSE;
   selllimits = FALSE;
   buyclose = FALSE;
   sellclose = FALSE;
   for (int l_ord_total_12 = totalorders; l_ord_total_12 >= 0; l_ord_total_12--)
   {
      if (OrderSelect(l_ord_total_12, SELECT_BY_POS) == TRUE && OrderSymbol() == Symbol())
      {
         if (OrderType() == OP_BUY)
         {
            buyclose = TRUE;
            Close_B(OrderTicket(), OrderLots());
         }
         if (OrderType() == OP_SELL)
         {
            sellclose = TRUE;
            Close_S(OrderTicket(), OrderLots());
         }
         if (OrderType() == OP_BUYLIMIT)
         {
            buymodifyprice = NormalizeDouble(OrderOpenPrice(), Digits);
            orderticket1 = OrderTicket();
            buylimits = TRUE;
         }
         if (OrderType() == OP_SELLLIMIT)
         {
            sellmodifyprice = NormalizeDouble(OrderOpenPrice(), Digits);
            orderticket2 = OrderTicket();
            selllimits = TRUE;
         }
      }
   }
   ima = iMA(NULL, 0, ImaPeriod, 0, MODE_LWMA, PRICE_TYPICAL, 0);
   Modify_order();
   Open_order();
   return/*(WARN)*/;
}

void Close_B(int a_ticket_0, double a_lots_4)
{
   if (NormalizeDouble(Bid - OrderOpenPrice(), Digits) >= PriceToClose)
   {
      OrderClose(a_ticket_0, a_lots_4, Bid, 1, Yellow);
      buyclose = FALSE;
   }
}

void Close_S(int a_ticket_0, double a_lots_4)
{
   if (NormalizeDouble(OrderOpenPrice() - Ask, Digits) >= PriceToClose)
   {
      OrderClose(a_ticket_0, a_lots_4, Ask, 1, Yellow);
      sellclose = FALSE;
   }
}

void Modify_order()
{
   if (buylimits == TRUE)
   {
      orderprice = ima - AddPriceGap;
      if (MathAbs(buymodifyprice - orderprice) > Point / 2.0)
         OrderModify(orderticket1, orderprice, orderprice - StopLoss, orderprice + TakeProfit, 0, DeepSkyBlue);
   }
   if (selllimits == TRUE)
   {
      orderprice = ima + spread + AddPriceGap;
      if (MathAbs(sellmodifyprice - orderprice) > Point / 2.0)
         OrderModify(orderticket2, orderprice, orderprice + StopLoss, orderprice - TakeProfit, 0, Pink);
   }
}

void Open_order()
{
   if (buyclose == FALSE && buylimits == FALSE)
   {
      orderprice = ima - AddPriceGap;
      if (orderprice > Ask - stoplevel)
         orderprice = Ask - stoplevel;
      orderprice = NormalizeDouble(orderprice, Digits);
      OrderSend(Symbol(), OP_BUYLIMIT, Lots(), orderprice, 3, orderprice - StopLoss, orderprice + TakeProfit, "", 0, 0, Blue);
      buylimits = TRUE;
   }
   if (sellclose == FALSE && selllimits == FALSE)
   {
      orderprice = ima + spread + AddPriceGap;
      if (orderprice < Bid + stoplevel)
         orderprice = Bid + stoplevel;
      orderprice = NormalizeDouble(orderprice, Digits);
      OrderSend(Symbol(), OP_SELLLIMIT, Lots(), orderprice, 3, orderprice + StopLoss, orderprice - TakeProfit, "", 0, 0, Red);
      selllimits = TRUE;
   }
}

double Lots()
{
   lotsize = NormalizeDouble(AccountEquity() * TradeVolume / 100.0 / 1000.0, 1);
   double l_minlot_0 = MarketInfo(Symbol(), MODE_MINLOT);
   if (lotsize == 0.0)
      lotsize = l_minlot_0;
   return (lotsize);
}


////////////////////////////////////////////////////////////////////////////////////////////////////////
bool CloseDeleteAll()
{
    int total  = OrdersTotal();
      for (int cnt = total-1 ; cnt >=0 ; cnt--)
      {
         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

         if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {
            switch(OrderType())
            {
               case OP_BUY       :
               {
                  if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),maxSlippage,Violet))
                     return(false);
               }break;                 
               case OP_SELL      :
               {
                  if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),maxSlippage,Violet))
                     return(false);
               }break;
            }             
         
           
            if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP || OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT)
               if(!OrderDelete(OrderTicket()))
               {
                  Print("Error deleting " + OrderType() + " order : ",GetLastError());
                  return (false);
               }
          }
      }
      return (true);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
// delete all on current chart
bool CloseDeleteAllCurrent()
{
    int total  = OrdersTotal();
      for (int cnt = total-1 ; cnt >=0 ; cnt--)
      {
         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

         if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {
            if(OrderSymbol()==Symbol())
            {
               switch(OrderType())
               {
                  case OP_BUY       :
                  {
                     if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),maxSlippage,Violet))
                        return(false);
                  }break;
                   
                  case OP_SELL      :
                  {
                     if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),maxSlippage,Violet))
                        return(false);
                  }break;
               }             
           
           
            if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP || OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT)
               if(!OrderDelete(OrderTicket()))
               {
                  return (false);
               }
            }
         }
      }
      return (true);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
// left pending orders
bool CloseDeleteAllNonPending()
{
    int total  = OrdersTotal();
      for (int cnt = total-1 ; cnt >=0 ; cnt--)
      {
         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

         if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {
            switch(OrderType())
            {
               case OP_BUY       :
               {
                  if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),maxSlippage,Violet))
                     return(false);
               }break;                 
               case OP_SELL      :
               {
                  if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),maxSlippage,Violet))
                     return(false);
               }break;
            }             
         }
      }
      return (true);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
// delete all on current chart left pending
bool CloseDeleteAllCurrentNonPending()
{
    int total  = OrdersTotal();
      for (int cnt = total-1 ; cnt >=0 ; cnt--)
      {
         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

         if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {
            if(OrderSymbol()==Symbol())
            {
               switch(OrderType())
               {
                  case OP_BUY       :
                  {
                     if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),maxSlippage,Violet))
                        return(false);
                  }break;
                   
                  case OP_SELL      :
                  {
                     if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),maxSlippage,Violet))
                        return(false);
                  }break;
               }             
            }
         }
      }
      return (true);
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



อย่างนี้ปะ จะใช้งานได้ไหมหนอ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ใช้กับโบรกที่สเปรดแกว่งเหรอครับ

ผมว่าอันตรายนะ ถ้าสเปรดเกินแล้วปิดออเดอร์  สมมุติว่าสเปรดมันแกว่งขึ้นๆลงตลอด  แล้วมันก็เปิดๆปิดๆ  เสียตังฟรี
แนะนำว่าให้หยุดเทรดเฉยๆก็พอ ไม่ต้องปิดออเดอร์ครับ

เหมือนอย่างอีเอ fapturbo  megadroid อีเอที่เทรดช่วงตี 4 พวกนี้จะไม่เทรดถ้าสเปรดเกิน  แต่ถ้าเทรดไปแล้วถึงเกินก็ไม่ปิด

จะลองทำตามคำเเนะนำคับ ;D

ขอโค้คตรวจจับpipต่อวินาที ถ้าวินาทีนึงมีค่าpipเกินทีเรากำหนดให้หยุดเทรด มีไหมคับ
เเล้วก็โค้ด money management ด้วยคับ ของคุณ ใส่อีเอตัวนี้เเหละ
โค้ดที่ดึงค่าของ commission ,มาใช้งาน มีป่าวคับ ??   ???
« Last Edit: ตุลาคม 17, 2012, 09:53:21 am by คุยจนลิงหลับ(-.-) »

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
อันนี้ไม่มีครับ  รอท่านแอดมินละกัน

ส่วนโค้ดดึงค่าคอมมิชชั่นก่อนเทรดทำไม่ได้ครับ  ต้องเทรดก่อนถึงจะเห็นคอมมิชชั่น

ใช้คำสั่ง Ordercommission() ตามหลัง Orderselect

  if (UseMaxspread)
   {
      if ( Ask - Bid > Maxspread * Point )
      {     
      Comment("\n Spread Over!");
      CloseDeleteAll();
      CloseDeleteAllNonPending();
      CloseDeleteAllCurrent();
      CloseDeleteAllCurrentNonPending();
       return (0);
      }
   }

Spread Over! ตรงนี้อะมันโชว์เเล้วเมื่อค่าสเปรดต่ำกว่าที่กำหนดไม่ยอมหายอะ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ถ้าใช้คำสั่ง comment มันจะค้างครับ
ต้องเคลียร์โดยการสั่ง Comment("");

โดยการตรวจสเปรดอีกครั้ง ถ้าสเปรดไม่เกินแล้วให้เคลียร์

  if ( Ask - Bid <= Maxspread * Point )
  {   
   Comment("");
  }

เพิ่มโค้ด money management ตัวนี้ด้วย

ขอโค๊ด Risk
« Last Edit: ตุลาคม 17, 2012, 08:54:08 pm by คุยจนลิงหลับ(-.-) »