Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: อยากให้ ea เปิดออเดอร์แค่ชุดเดียวต่อ 1 แท่ง  (Read 21511 times)

be

  • Newbie
  • *
  • Posts: 32
ผมทดลองเขียน ea แบบนี้ครับ ใ้ห้ ea pending ทั้ง buy stop และ sell stop ที่ระยะห่างจากราคาเปิดของแท่งเทียน (ผมเรียกว่า 1 ชุด)
เมื่อราคาวิ่งไปติดทางใดทางหนึ่ง ก็ให้ลบ pending อีกข้างหนึ่งออก
แต่ปัญหาคือ เมื่อราคาวิ่งต่อไปจนชน TP หรือ SL ภายในแท่งนั้น
ea กลับเปิดออเดอร์ต่ออีกภายในแท่งเดิม
ผมอยากให้ ea เปิดออเดอร์แค่ชุดเดียวต่อ 1 แท่ง ต้องแก้อย่างไรครับ

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

รบกวนขอ code ตัวอย่างด้วยครับ

ขอบคุณครับ

อันนี้เป็น code ที่ผมเขียนไว้ครับ



extern double Lots=0.5;
extern double StartHours = 6;
extern double EndHours = 8;

int start()
{    


int total=OrdersTotal();
if(total==0)

if ((Hour()>StartHours)&&(Hour()<EndHours))

double closeprice;
   closeprice=iClose( NULL,0,1);


{
    OrderSend(Symbol(), OP_BUYSTOP, Lots, closeprice+200*Point, 3, closeprice, closeprice+400*Point, "ea", 4321, CurTime()+PERIOD_H1*60, Green);
   OrderSend(Symbol(), OP_SELLSTOP, Lots, closeprice-200*Point, 3, closeprice, closeprice-400*Point, "ea", 1234, CurTime()+PERIOD_H1*60, Pink);
  }
  
      
      if(total==2)
      {   int buy ,sell;
    
        for(int i=0;i<total;i++)
        {
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
             if(OrderType()==OP_BUY)
             { buy=buy+1;
             }
            
              if(OrderType()==OP_SELL)
             {
              sell=sell+1;
             }
            
          
    
         }
         if(buy==1 || sell==1)
         {
              for( i=0;i<total;i++)
        {
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
             if(OrderType()==OP_BUYSTOP)
             { OrderDelete( OrderTicket());
             }
            
              if(OrderType()==OP_SELLSTOP)
             {
            OrderDelete( OrderTicket());
             }
            
          
    
         }
        
         }
    
    
    
    
      }
      
      
      
      
        return (0);
 }
« Last Edit: มีนาคม 24, 2013, 04:22:00 pm by be »

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ใช้ orderselect ตรวจสอบ history ก่อน ว่าออเดอร์ที่ปิด ชน tp/sl ไปก่อนหน้านี้นั่น  เปิดที่แท่งไหน
ถ้าเป็นแท่งเดียวกัน  ก็ไม่ต้องวาง pending ใหม่ครับ

be

  • Newbie
  • *
  • Posts: 32
ใช้ orderselect ตรวจสอบ history ก่อน ว่าออเดอร์ที่ปิด ชน tp/sl ไปก่อนหน้านี้นั่น  เปิดที่แท่งไหน
ถ้าเป็นแท่งเดียวกัน  ก็ไม่ต้องวาง pending ใหม่ครับ

ขอบคุณครับท่าน D_Diamond
แต่พอจะมีตัวอย่างไหมครับ ผมเขียนเองไม่เป็น

ขอบคุณครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
แล้วอันนั้นใครเขียนละครับ  ก็ใช้ orderselect เหมือนกัน  แค่เปลี่ยนจาก MODE_TRADES เป็น MODE_HISTORY เองครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ตัวอย่างโค้ดครับ

ฟังก์ชั่นนี้เอาไว้ ตรวจดูว่า ออเดอร์ ที่เทรดเสีย ในแท่งนี้ iBarShift(Symbol(),PERIOD_M1,OrderCloseTime()) == 0
มีกี่ออเดอร์แล้ว  ของผมถ้าเทรดเสียแท่งเดียวกัน 3 ครั้งจะหยุดเทรด

ของท่านก็เอา count ไปใช้ ถ้า count มากกว่า 0 แสดงว่าออเดอร์ปิดขาดทุน แท่งนี้
ถ้าจะเอาทั้ง tp sl ก็ลบ  if ( OrderOpenPrice() > OrderClosePrice() )  ทิ้ง

int LastBarLoss(int type)
{
int count=0;

   int  total = OrdersHistoryTotal();
      for (int po = total-1; po >=0; po--)
      {
         OrderSelect( po, SELECT_BY_POS, MODE_HISTORY );
         if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic )
         {
            if ( OrderType()== type )
            {
               if ( OrderType()== OP_BUY )
               {
                  if ( iBarShift(Symbol(),PERIOD_M1,OrderCloseTime()) == 0 )
                  {
                     if ( OrderOpenPrice() > OrderClosePrice() )
                     count++;
                  }
               
               }
               
               else if ( OrderType()== OP_SELL )
               {
                  if ( iBarShift(Symbol(),PERIOD_M1,OrderCloseTime()) == 0 )
                  {
                     if ( OrderOpenPrice() < OrderClosePrice() )
                     count++;
                  }
               }
               
           
            }
         
         }
      }
return(count);

}

be

  • Newbie
  • *
  • Posts: 32
ขอบคุณครับท่าน D_Diamond
code ข้างบนผมเป็นคนเรียบเรียงเองครับ แต่จะให้ผมเขียนทั้งหมดผมเขียนไม่ได้ครับ
ผมอาศัยความเข้าใจหลักการทำงานเอาครับ แล้วก็เอา code ที่คนอื่นเขียนมารวมๆกันเอาครับ

ส่วน code  orderselect ด้านบน admin ที่นี่เป็นคนเขียนไว้ครับ ผมค้นเจอแล้วจับมารวมๆกันครับ

ส่วน code ตัวอย่างที่ท่าน D_Diamond เขียนทิ้งไว้ให้ ผมขอไปทำความเข้าใจก่อนนะครับ ได้เรื่องยังไงจะกลับมาบอกครับ

ขอบคุณครับ
« Last Edit: มีนาคม 25, 2013, 10:05:44 pm by be »

be

  • Newbie
  • *
  • Posts: 32
ผมลองเอาไปแปะแบบนี้ก่อน แล้วจะเขียนคำสั่งให้หยุดเทรดเพื่อรอไปเทรดครั้งต่อไปยังไงหรอครับ
รบกวนแนะนำด้วยครับ

ขอบคุณครับ

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



extern double Lots=0.5;
extern double StartHours = 15;
extern double EndHours = 17;

int start()
{    


int total=OrdersTotal();
if(total==0)

if ((Hour()>StartHours)&&(Hour()<EndHours))

double closeprice;
   closeprice=iClose( NULL,0,1);


{
    OrderSend(Symbol(), OP_BUYSTOP, Lots, closeprice+200*Point, 3, closeprice, closeprice+400*Point, "ea", 4321, CurTime()+PERIOD_H1*60, Green);
   OrderSend(Symbol(), OP_SELLSTOP, Lots, closeprice-200*Point, 3, closeprice, closeprice-400*Point, "ea", 1234, CurTime()+PERIOD_H1*60, Pink);
  
  }
  
      
      if(total==2)
      {   int buy ,sell;
    
        for(int i=0;i<total;i++)
        {
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
             if(OrderType()==OP_BUY)
             { buy=buy+1;
             }
            
              if(OrderType()==OP_SELL)
             {
              sell=sell+1;
             }
            
          
    
         }
         if(buy==1 || sell==1)
         {
              for( i=0;i<total;i++)
        {
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
             if(OrderType()==OP_BUYSTOP)
             { OrderDelete( OrderTicket());
             }
            
              if(OrderType()==OP_SELLSTOP)
             {
            OrderDelete( OrderTicket());
             }
            
          
    
         }
        
         }
    
    
    
    
      }
      
    
{
int type;
int count=0;

   int  total2 = OrdersHistoryTotal();
      for (int po = total2-1; po >=0; po--)
      {
         OrderSelect( po, SELECT_BY_POS, MODE_HISTORY );
         if (OrderSymbol() == Symbol()  )
         {
            if ( OrderType()== type )
            {
               if ( OrderType()== OP_BUY )
               {
                  if ( iBarShift(Symbol(),PERIOD_H1,OrderCloseTime()) == 0 )
                  {
                    
                     count++;
                  }
              
               }
              
               else if ( OrderType()== OP_SELL )
               {
                  if ( iBarShift(Symbol(),PERIOD_H1,OrderCloseTime()) == 0 )
                  {
                    
                     count++;
                  }
               }
              
          
            }
        
         }
      }
return(count);

}
}
« Last Edit: มีนาคม 25, 2013, 11:21:26 pm by be »

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
มันคงไม่หยุดเทรด  เพราะท่านยังไม่ได้เอา count ไปใช้ตรงไหนเลยครับ

โพสก่อนผมบอกให้ท่านเอา count ไปใช้
วิธีใช้ก็ เอาไปดักไว้ก่อนเปิดออเดอร์  ถ้า count > 0 ไม่ต้องเปิด  ถ้า count = 0 จึงเปิด

ส่วนที่ถามว่าจะรอเทรดครั้งต่อไปได้ยังไง

จากที่ผมบอกไปแล้วว่า count จะมากกว่า 0 ถ้ามีออเดอร์ที่ปิดไปก่อนนี้  ปิดในกราฟแท่งเดียวกัน
ดังนั้น พอกราฟเดินต่อไป มันจะเป็นคนละแท่งกัน count มันก็กลายเป็น 0 เอง  แล้วมันก็จะเทรดต่อเองครับ

จากคำสั่งนี้  iBarShift(Symbol(),PERIOD_H1,OrderCloseTime())
หมายความว่าให้มันตรวจสอบ หาแท่งกราฟ 1H ว่าผ่านไปแล้วกี่แท่ง  เทียบจากเวลาปิดออเดอร์

be

  • Newbie
  • *
  • Posts: 32
มันคงไม่หยุดเทรด  เพราะท่านยังไม่ได้เอา count ไปใช้ตรงไหนเลยครับ

โพสก่อนผมบอกให้ท่านเอา count ไปใช้
วิธีใช้ก็ เอาไปดักไว้ก่อนเปิดออเดอร์  ถ้า count > 0 ไม่ต้องเปิด  ถ้า count = 0 จึงเปิด

ส่วนที่ถามว่าจะรอเทรดครั้งต่อไปได้ยังไง

จากที่ผมบอกไปแล้วว่า count จะมากกว่า 0 ถ้ามีออเดอร์ที่ปิดไปก่อนนี้  ปิดในกราฟแท่งเดียวกัน
ดังนั้น พอกราฟเดินต่อไป มันจะเป็นคนละแท่งกัน count มันก็กลายเป็น 0 เอง  แล้วมันก็จะเทรดต่อเองครับ

จากคำสั่งนี้  iBarShift(Symbol(),PERIOD_H1,OrderCloseTime())
หมายความว่าให้มันตรวจสอบ หาแท่งกราฟ 1H ว่าผ่านไปแล้วกี่แท่ง  เทียบจากเวลาปิดออเดอร์


ขอบคุณครับ