Thaiforexea ,Free EA ,Free Server Run EA ,เขียน EA ,พัฒนาและสร้าง EA ด้วยตนเอง
ธันวาคม 14, 2017, 03:21:55 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
ข่าว: ใครมี Facebook ก็สามารถ add มาคุยกับ admin ได้แล้วนะครับ
 
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  

Open Forex4you Account

Server รัน EA 1000 / ปี

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

Join with us
หน้า: [1]
  พิมพ์  
ผู้เขียน หัวข้อ: คำสั่ง OrderModify() และ Trailing Stop  (อ่าน 23824 ครั้ง)
admin
Administrator
Hero Member
*****
กระทู้: 2367



« เมื่อ: ตุลาคม 13, 2010, 01:39:54 am »

คำสั่ง OrderModify เป็นคำสั่ง ที่ใช้แก้ไข SL TP ของ Order ที่เปิดแล้วหรือแก้ไขราคาเปิด ของ Pending Order

OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)

ตัวอย่างเช่น

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);

คำสั่งด้านบนเป็นบางส่วนของ คำสั่งที่ใช้ทำ Trailing Stop แต่ในการใช้งานจริงเราต้องใช้คำสั่ง
OrderSelect() ช่วย ผมจะนำข้อมูลจากหัวข้อ OrderSelect บางส่วนบางใช้นะครับใครงงให้กลับไปดูที่ Orderselect ประกอบนะครับ
จากหัวข้อ orderselect เรามี order อยู่ 3 order ถ้าต้องการปิด order ทั้งหมดเราต้องใช้ orderselect ช่วย

1 BUY  0.1 lot
2 SELL 0.1 lot
3 BUY  0.1 lot

for(int i=0;i<OrderTotal();i++)
{
   OrderSelect( i,SELECT_BY_POS,MODE_TRADE) ;
   
     if(Bid-OrderOpenPrice()>Point*TrailingStop)
       {
        if(OrderStopLoss()<Bid-Point*TrailingStop)
          {
           OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);
           return(0);
          }
       }
   


}

ข้างบนคือบางส่วนของ code Trailing Stop
Trailing Stop  คือรูปแบบในการรักษา Profit อย่างหนึ่งกล่าวคือ หากราคาของ คู่เงิน เป็นบวกในจำนวนที่มากกว่า pip ที่กำหนด ตัว Trailiing Stop จะเริ่มทำการแก้ไข
SL ของ order ให้กลับมาเท่ากับราคาที่เปิด หากราคาของคู่เงินเปลี่ยนทาง Order ที่เราเปิดไวก็จะไม่ขาดทุน แต่หากราคาของคู่เงินที่เราเปิดไวกลับบวกไปเรื่อยๆๆ Trailing Stop ก็จำทำการแก้ไข SL
ตามราคาไปเรื่อยๆๆโดย SL ใหม่จะอยู่หากราคาปัจจุบันตามที่เรากำหนดเสมอ
บันทึกการเข้า

thanakrit
Newbie
*
กระทู้: 13



« ตอบ #1 เมื่อ: ตุลาคม 14, 2010, 09:29:57 am »

ขอบคุณครับ หัวข้อ MT4 Code Libary เป็นประโยชน์มากๆเลยนะครับ


หัวข้อต่อไปขอเป็น คำสั่ง NormalizeDouble()
อยากทราบรายละเอียด คำอธิบายวิธีการใช้ และตัวอย่าง
 Grinขอบคุณอีกครั้ง
บันทึกการเข้า
admin
Administrator
Hero Member
*****
กระทู้: 2367



« ตอบ #2 เมื่อ: ตุลาคม 14, 2010, 12:24:13 pm »

ขอบคุณครับ หัวข้อ MT4 Code Libary เป็นประโยชน์มากๆเลยนะครับ


หัวข้อต่อไปขอเป็น คำสั่ง NormalizeDouble()
อยากทราบรายละเอียด คำอธิบายวิธีการใช้ และตัวอย่าง
 Grinขอบคุณอีกครั้ง

ขอบคุณสำหรับคำแนะนำครับผมจะค่อยๆๆเขียนออกมาเรื่อยๆตามเวลาที่มีครับ
บันทึกการเข้า

thanakrit
Newbie
*
กระทู้: 13



« ตอบ #3 เมื่อ: ตุลาคม 15, 2010, 10:31:22 am »

อยากขอให้ Admin ช่วยยกตัวอย่างกรณี Modify TP ด้วยได้ไหมครับ
ผมเปิดหลายOrder เป็นแบบเบิ้ลล๊อต ใช้คำสั่ง แบบ Profit Level & OrderClosed all
แต่มีปัญหาว่ากว่าจะปิดครบทุก Poisition บางครั้งราคามันวิ่งติดลบกลับมา ทำให้ขาดทุนได้
เลยอยากใช้แบบ Modify TP ให้ TP ทุก Position ตรงกับ Order ล่าสุด

ถ้า Admin ว่างๆ ขอรบกวนอธิบายพร้อมยกตัวอย่างให้ด้วยนะครับ
ขอบคุณมากครับ Grin
บันทึกการเข้า
admin
Administrator
Hero Member
*****
กระทู้: 2367



« ตอบ #4 เมื่อ: ตุลาคม 16, 2010, 12:35:49 am »

อยากขอให้ Admin ช่วยยกตัวอย่างกรณี Modify TP ด้วยได้ไหมครับ
ผมเปิดหลายOrder เป็นแบบเบิ้ลล๊อต ใช้คำสั่ง แบบ Profit Level & OrderClosed all
แต่มีปัญหาว่ากว่าจะปิดครบทุก Poisition บางครั้งราคามันวิ่งติดลบกลับมา ทำให้ขาดทุนได้
เลยอยากใช้แบบ Modify TP ให้ TP ทุก Position ตรงกับ Order ล่าสุด

ถ้า Admin ว่างๆ ขอรบกวนอธิบายพร้อมยกตัวอย่างให้ด้วยนะครับ
ขอบคุณมากครับ Grin

จริงๆๆก็ไม่ได้ต่างอะไรมากกับการตั้ง SL ครับทุกอย่างเหมือนกันแต่ต่างกันตรง พารามิเตอร์ใน OrderModify เท่านั่นเองครับ
โคยเริ่มจากการใช้ for เพื่อวนรอบ การใช้ OrderSelect เพื่อบอกให้ EA ทราบถึง Order ที่เราต้องการแก้ไข
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ราคาใหม่ที่ต้องการตั้ง TP,0,Blue);
บันทึกการเข้า

gagoi
Jr. Member
**
กระทู้: 62


« ตอบ #5 เมื่อ: พฤศจิกายน 26, 2010, 10:17:09 am »

ขอบคุณครับ กลับมากอ่านหลายรอบเลย Grin Grin
บันทึกการเข้า
tomkah
Jr. Member
**
กระทู้: 50


« ตอบ #6 เมื่อ: กรกฎาคม 19, 2015, 02:26:41 am »

ขอบคุณครับมีประโยชน์มาก
บันทึกการเข้า
Zero
Newbie
*
กระทู้: 3


« ตอบ #7 เมื่อ: ตุลาคม 08, 2015, 12:14:47 pm »

รบกวนช่วยดูให้หน่อยครับ คือตั้งใจจะให้มัน TP จุดเดียวที่ออเดอร์ล่าสุดที่เปิดครับ
คือออเดอร์ล่าสุดเปิดมาจะตั้ง TP ให้ครับ พอตั้งให้แล้วอยากให้ออเดอร์ที่เหลือเปลี่ยน TP เดิมมาใช้ของออเดอร์ล่าสุด


ผมเขียนแบบนี้ครับแก้มาหลายวันแล้วครับแต่ก็ได้แบบในรูปครับ

double Getlastsellprice(int Type)
  {
   double lastsellprice=0;

   for(int i=0;i<OrdersTotal();i++){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderMagicNumber()==MagicNumberSell){
            if(OrderSymbol()==Symbol()){
               if(OrderType()==Type){
                     if(OrderOpenPrice()!=lastsellprice){
                        lastsellprice=OrderOpenPrice();
                     }
                  }
               }
            }
         }
      }
   return lastsellprice;
  }


void AdjustTPS()
  {
   for(int i=OrdersTotal()-1;i >= 0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderMagicNumber()==MagicNumberSell){
            if(OrderSymbol()==Symbol()){
               if(OrderType() == OP_SELL){
                  if(OrderTakeProfit() < Ask-(TakeProfitSell*2)*Point){
                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(lastsellprice-(TakeProfitSell)*Point),0,clrRed);
                 }
               }
            }
         }
      }
   }
}
บันทึกการเข้า
Zero
Newbie
*
กระทู้: 3


« ตอบ #8 เมื่อ: ตุลาคม 08, 2015, 09:51:40 pm »

รบกวนช่วยดูให้หน่อยครับ คือตั้งใจจะให้มัน TP จุดเดียวที่ออเดอร์ล่าสุดที่เปิดครับ
คือออเดอร์ล่าสุดเปิดมาจะตั้ง TP ให้ครับ พอตั้งให้แล้วอยากให้ออเดอร์ที่เหลือเปลี่ยน TP เดิมมาใช้ของออเดอร์ล่าสุด


ผมเขียนแบบนี้ครับแก้มาหลายวันแล้วครับแต่ก็ได้แบบในรูปครับ

double Getlastsellprice(int Type)
  {
   double lastsellprice=0;

   for(int i=0;i<OrdersTotal();i++){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderMagicNumber()==MagicNumberSell){
            if(OrderSymbol()==Symbol()){
               if(OrderType()==Type){
                     if(OrderOpenPrice()!=lastsellprice){
                        lastsellprice=OrderOpenPrice();
                     }
                  }
               }
            }
         }
      }
   return lastsellprice;
  }


void AdjustTPS()
  {
   for(int i=OrdersTotal()-1;i >= 0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderMagicNumber()==MagicNumberSell){
            if(OrderSymbol()==Symbol()){
               if(OrderType() == OP_SELL){
                  if(OrderTakeProfit() < Ask-(TakeProfitSell*2)*Point){
                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(lastsellprice-(TakeProfitSell)*Point),0,clrRed);
                 }
               }
            }
         }
      }
   }
}

แต่คิดๆแล้วแบบนี้มันตายตัวไปครับ อยากให้เป็น CloseAll ออเดอร์ที่เปิดอยู่โดยอิงจาก TP ที่ปิดไปล่าสุดครับ แบบนี้ EA ทำงานไป เราก็สามารถตั้ง TP ให้มันปิดไว้ปิดช้าได้ครับ แค่เราเลื่อน TP ของออเดอร์ไดออเดอร์หน้าก็ได้พอมา ถึง TP ที่ใกล้ที่สุดก็ทำการปิดออเดอร์ที่เหลือให้ด้วย ขอเป็นแบบนี้แทนละกันครับ ผมต้องเอาค่าจากอะไรมาใส่ในนี้ครับ Admin

//+------------------------------------------------------------------+
//+=====================Close Order Sell Function====================+
//+------------------------------------------------------------------+
void CloseOrderSell(){
   for(int i= OrdersTotal()-1;i >=0;i--){
      if(OrderSelect(i,SELECT_BY_POS)==true){
         if((OrderMagicNumber() == MagicNumber) && OrderSymbol()== Symbol())
            if(OrderType() == OP_SELL)
               if(OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),0,clrRed))Print("");
         }
      }
  }
//+------------------------------------------------------------------+
« แก้ไขครั้งสุดท้าย: ตุลาคม 08, 2015, 10:13:04 pm โดย Zero » บันทึกการเข้า
admin
Administrator
Hero Member
*****
กระทู้: 2367



« ตอบ #9 เมื่อ: ตุลาคม 08, 2015, 10:36:17 pm »

lastsellprice เป็นตัวแปรของฟังก์ชั่น Getlastsellprice แล้วคุณเอาตัวแปรนี้ไปใช้ที่ฟังก์ชั่น AdjustTPS()  ยังไงอ่ะครับ ถ้าไม่ทำให้มันเป็นตัวแปรแบบ global ก่อนอ่ะครับ
บันทึกการเข้า

Zero
Newbie
*
กระทู้: 3


« ตอบ #10 เมื่อ: ตุลาคม 08, 2015, 11:11:56 pm »

lastsellprice เป็นตัวแปรของฟังก์ชั่น Getlastsellprice แล้วคุณเอาตัวแปรนี้ไปใช้ที่ฟังก์ชั่น AdjustTPS()  ยังไงอ่ะครับ ถ้าไม่ทำให้มันเป็นตัวแปรแบบ global ก่อนอ่ะครับ
พอจะมีให้อ่านไหมครับผมไม่เข้าใจ global ครับ Cry Huh?
บันทึกการเข้า
admin
Administrator
Hero Member
*****
กระทู้: 2367



« ตอบ #11 เมื่อ: ตุลาคม 09, 2015, 11:32:49 am »

ประกาศตัวแปรเอาไวส่วนบนของ EA ครับให้ทุกฟังก์ชั่นมันเรียกใช้งานได้หมด ส่วน code คุณถ้าไม่ประกาศแบบที่ว่า ตรงฟังก์ชั่น Modify คุณก็ต้องเรียกใช้งานฟังก์ชั่น Getlastsellprice() แทนการใช้ตัวแปร lastsellprice ครับ
บันทึกการเข้า

nuttapat433
Newbie
*
กระทู้: 2


« ตอบ #12 เมื่อ: พฤษภาคม 25, 2017, 12:42:13 am »

ใช้คำสั่งยังไงหรอคับให้มันเลื่อน TP แบบในรูปนี้ (มือใหม่หัดเขียนคับ)
บันทึกการเข้า
gunlanutt
Newbie
*
กระทู้: 35


« ตอบ #13 เมื่อ: พฤษภาคม 30, 2017, 09:00:32 pm »

เรียน Admin ครับ

ผมเขียนคำสั่งประมาณว่าหากมีออเดอร์เกินห้าออร์เดอร์แล้วให้ modify takeprofit = 0  ให้หมด
มันก็เปลี่ยน Take profit เป็น ศูนย์นะครับ แต่มันขึ้น OrderModify error 1 ไม่รู้มันผิดตรงไหนครับ ช่วยดูให้หน่อยได้ไหมครับ

if(OrderBuy>=ORDER_MaxRisk)
  {
     for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
          mode=OrderType();
        if (OrderSymbol()==Symbol())
        {
         if (mode==OP_BUY)
         {   OrderModify(OrderTicket(),OrderOpenPrice(),0,0,800,Yellow);
         }
        }
      }
   }
if(OrderSell>=ORDER_MaxRisk)
  {
     for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
          mode=OrderType();
        if (OrderSymbol()==Symbol())
        {
         if (mode==OP_SELL)
           {           
            OrderModify(OrderTicket(),OrderOpenPrice(),0,0,800,Purple);
           }
          }
     }
   }
 ขอบคุณครับ
« แก้ไขครั้งสุดท้าย: พฤษภาคม 30, 2017, 09:03:44 pm โดย gunlanutt » บันทึกการเข้า
admin
Administrator
Hero Member
*****
กระทู้: 2367



« ตอบ #14 เมื่อ: มิถุนายน 14, 2017, 12:44:30 am »

ใส่ตัวแปร รับค่า return ที่หน้าฟังก์ชั่น OrderModify ครับ
บันทึกการเข้า

หน้า: [1]
  พิมพ์  
 
กระโดดไป:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines | Thai language by ThaiSMF

Theme Blue Smile by AX

Valid XHTML 1.0! Valid CSS!