Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: ถามเรื่องการ Close Order โดย อิงจาก Indicator ต่าง Timeframe หน่อยครับ  (Read 11548 times)

Big303

  • Newbie
  • *
  • Posts: 11
สมมติว่า ผมรัน EA ใน M15 แล้วกำหนดเงื่อนไขออกออเดอร์ใน M5

เช่น ผมประกาศตัวแปรดังนี้
   double ema1 = iMA(NULL,PERIOD_M5,1,0,1,0,0);
   double ema7 = iMA(NULL,PERIOD_M5,7,0,1,0,0);

แล้วผมอยากให้มัน ปิดออเดอร์เองเมื่อมีเงื่อนไข (ใน M5) ดังนี้

ออเดอร์ buy : ema1<ema7 <<<(ให้ปิดออเดอร์ buy ทันที)
ออเดอร์ sell : ema1>ema7 <<<(ให้ปิดออเดอร์ sell ทันที)

ผมลองเขียนออกมาแบบนี้

   if(OrdersTotal()== MaxOrder)
   {
         for(int i=0;i<OrdersTotal();i++)
      {
          OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
               if(OrderType()==OP_BUY && ema1<ema7)
           {
               OrderClose(OrderTicket(),lot,Bid,3,Black);
           }
               if(OrderType()==OP_SELL && ema1>ema7)
           {
                 OrderClose(OrderTicket(),lot,Ask,3,Black);
           }
      }
   }

ผลออกมามันเปิดๆ ปิดๆ ที่ซ้ำๆ กัน จนล้างพอร์ตเลย ขอคำแนะนำด้วยครับ

ขอบคุณครับ
« Last Edit: มิถุนายน 04, 2012, 10:57:30 am by Big303 »

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
มีแต่โค้ด ปิด แล้วโค้ด เปิด ละครับ

เวลาจะเขียนเงื่อนไขการปิดออเดอร์  ต้องแน่ใจก่อนครับว่า  เงื่อนไขเปิดกับปิดมันไม่ทับซ้อนกัน
ไม่งั้นปิดเสร็จมันก็เปิดใหม่  เปิดเสร็จมันก็ปิดใหม่  แบบนี้แหละครับ

Big303

  • Newbie
  • *
  • Posts: 11
มีแต่โค้ด ปิด แล้วโค้ด เปิด ละครับ

เวลาจะเขียนเงื่อนไขการปิดออเดอร์  ต้องแน่ใจก่อนครับว่า  เงื่อนไขเปิดกับปิดมันไม่ทับซ้อนกัน
ไม่งั้นปิดเสร็จมันก็เปิดใหม่  เปิดเสร็จมันก็ปิดใหม่  แบบนี้แหละครับ

โทดทีคับ ๆ นี่คับ โค้ดเปิด + โค้ดปิด

 if(OrdersTotal()< MaxOrder){

     if(( var1 > var2 ) && ( var2 > var4 ) && ( var5 > xx ) && ( var6 < xx )){
      OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+sl*Point,Bid-tp*Point,"Big303 New Generation 2012",123,0,Green);
}
     if(( var1 < var2 ) && ( var2 < var4 ) && ( var5 < xx ) && ( var6 > xx )) {
      OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-sl*Point,Ask+tp*Point,"Big303 New Generation 2012",123,0,Green);
}
}
  

if(OrdersTotal()== MaxOrder)
   {
         for(int i=0;i<OrdersTotal();i++)
      {
          OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
               if(OrderType()==OP_BUY && ema1<ema7)
           {
               OrderClose(OrderTicket(),lot,Bid,3,Black);
           }
               if(OrderType()==OP_SELL && ema1>ema7)
           {
                 OrderClose(OrderTicket(),lot,Ask,3,Black);
           }
      }
   }

}

return(0) ;

}
« Last Edit: มิถุนายน 03, 2012, 03:51:04 pm by Big303 »

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ผมอ่านโค้ดไม่ออก  เพราะท่านให้มาไม่หมด   เอาเป็นว่าผมขอเดา

ท่านต้องการ MA2 เส้น เทรดตอนมันตัดกัน

ถ้าเส้นตัดขึ้น  ท่านจะปิด sell และเปิด buy
ถ้าเส้นตัดลง  ท่านจะปิด buy และเปิด sell

ถ้าเป็นนี้จะใช้ไม่ได้ครับ   

สมมุติว่ากราฟกำลังยักยักยังสับสนในตัวเองว่าจะขึ้นหรือลงดี  เดี๋ยวมันก็กระตุกขึ้น  เดี๋ยวก็กระตุกลง  แน่นอนเส้น ma ก็จะกระตุกตาม เดี๋ยวตัดขึ้น เดี๋ยวตัดลง
อีเอมันก็เลยเปิด-ปิดๆๆๆๆๆๆๆๆๆๆ

อาจจะแก้อย่างง่ายคือ รอให้เห็นชัดๆไปเลยว่ามันตัดกันไปแล้ว จะไม่ตัดกลับมาอีก  โดยการรอให้ผ่านไปก่อน 1 แท่งครับ

โดยเพิ่ม ma แท่งที่แล้วไปด้วย
double ema1_1 = iMA(NULL,PERIOD_M5,1,0,1,0,1);
double ema7_0 = iMA(NULL,PERIOD_M5,7,0,1,0,1);

แล้วเอา ma ที่เพิ่มมานี้ไปเพิ่มในเงื่อนไขเดิม  อาจจะเป็นแบบนี้ครับ

if ( ema1 < ema7 && ema1_1 > ema7_0 )

Big303

  • Newbie
  • *
  • Posts: 11
if(OrdersTotal()< MaxOrder)
{

     if(( var1 > var2 ) && ( var2 > var4 ) && ( var5 > xx ) && ( var6 < xx ))
  {
      OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+sl*Point,Bid-tp*Point,"Big303 New Generation 2012",123,0,Green);
  }
     if(( var1 < var2 ) && ( var2 < var4 ) && ( var5 < xx ) && ( var6 > xx ))
  {
      OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-sl*Point,Ask+tp*Point,"Big303 New Generation 2012",123,0,Green);
  }
}



  if(OrdersTotal()== MaxOrder)
   {
         for(int i=0;i<OrdersTotal();i++)
      {
          OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
               if(OrderType()==OP_BUY && ema1<ema7 && ema1_1 < ema7_0 )
           {
               OrderClose(OrderTicket(),lot,Bid,3,Black);
           }
               if(OrderType()==OP_SELL && ema1>ema7 && ema1_1 > ema7_0)
           {
                 OrderClose(OrderTicket(),lot,Ask,3,Black);
           }
      }
   }


คือเปิดออเดอร์กับปิดออเดอร์ ผมแยกส่วนกันน่ะครับ คือเงื่อนไขการเปิดออเดอร์จะเยอะกว่า ( Code สีเขียว )

และเงื่อนไขปิดออเดอร์มีอย่างเดียวเลยคือ ema1 ตัดเส้น ema7

ไม่ได้หมายความว่า ตัดขึ้นปิด sell เปิด buy ตัดลงปิด buy เปิด sell อย่างที่ท่านเข้าใจน่ะครับ เดี๋ยวจะงง

ผมลองใส่ Code ที่ท่านเพิ่มมาให้แล้ว แบบนี้ถูกรึเปล่าครับ ผมไม่แน่ใจ

แต่พอรัน มันก็ปิด TP เหมือนเดิม ไม่ได้ออกออเดอร์ ตอนที่ ema ตัดกัน ดังเงื่อนไขที่วางไว้ ผมงงมากเลย

ปล. ผม PM โค้ด ตัวเต็มไปให้แล้วนะครับ แนะนำด้วยครับ ขอบคุณล่วงหน้าครับผม  :)

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
เดี๋ยวดูให้ครับ  เช้าๆยังมึนอยู่  ช่วงนี้แอดมินไม่อยู่  ผมเฝ้าบอร์ดแทน

อยากให้โพสรูปหน้าจอ  การเข้า ออก ที่ต้องการด้วยครับ  จะได้รู้ว่าถูกหรือเปล่า  เพราะถ้าให้ดูแต่โค้ดแล้วโค้ดมันผิดก็จะไม่รู้ครับ

Big303

  • Newbie
  • *
  • Posts: 11
เขียนคำอธิบายการเข้า ออเดอร์ให้แล้วนะครับ ขอบคุณครับผม

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
เท่าที่ดูไม่มีอะไรผิดครับ  ผิดตรง ma ที่ใช้

ท่านใช้ period 1 ซึ่งมันแกว่งมากสุดๆ  เดี๋ยวมันก็ตัดขึ้น  เดี๋ยวก็ตัดลง  ผลก็ออกมาอย่างที่เห็นครับ

ตัวอย่างนะครับ  นี่โค้ดเปิด sell แก้ให้อ่านง่าย

( ma20 < ma100 ) && ( ma20 < ma1 ) && ( sto < 20 ) && ( macd > 0.0005 )

ส่วนน้โค้ดปิดออเดอร์(คัตลอส)  แก้ใหม่ให้อ่านง่าย
         if(OrderType()==OP_SELL )
            {
                 if ( ema1>ema7  && ema1_1 > ema7_0  )
                 OrderClose(OrderTicket(),lot,Ask,3,Black);
            }
ตรงนี้ไม่ค่อยเกี่ยวเลยว่าจะใช้ ema1 หรือ ema1_1 หรือใช้ทั้งคู่

ตอนคุณ sell ma1 มันอยู่ข้างบนอยู่แล้ว พอเปิดออเดอร์ปุ๊บ มันก็เลยปิด   ตรงนี้ไม่รู้ท่านเขียนผิดหรือตั้งใจ  อย่างที่บอกว่าถ้ามีรูปจะเข้าใจง่ายกว่า

Big303

  • Newbie
  • *
  • Posts: 11
ตอนนี้ได้แล้วครับผม ขอบคุณท่าน D_Diamond มาก ๆ

สรุปคือ เอา ema1 ออก ตามที่ท่านว่า มันแกว่งจริง ๆ ด้วย เลยเปิด ๆ ปิด ๆ