Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: ถามเรื่องการกำหนด TP คู่กับ indicator ที่เป็น Histogram หน่อยครับ  (Read 39311 times)

swensens

  • Newbie
  • *
  • Posts: 14
เงื่อนไขของผมคือ
1. ถ้าhistogram เหนือ 0 ให้เปิด order Buy โดยการตั้ง TP=200
2. ถ้าราคาชน TP แล้วให้รอจนกว่า histogram จะอยู่ใต้ 0 จึงเปิด order Sell

แบบนี้ต้องเขียนประมาณไหรเหรอครับ แนะนำหน่อยครับ

ปล.
เป็น custom indicator ที่ผมใช้โปรแกรม icustom ดู buffer
ถ้า histogram เหนือ 0 , buffer0 = 1
ถ้า histogram ใต้ 0, buffer1 = 1

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ไม่มีไรยากนิครับในเมื่อคุณหาตำแหน่งของ Histogram ที่ต้องการได้แล้วนี้ครับถ้า ถ้าเหนือ 0 คือ buffer0 ถ้าต่ำกว่า 0 คือ buffer 1 คุณแค่เรียกค่า buffer ทั้งสองตัวมาเก็บในตัวแปรก่อนจากนั่นสร้างเงื่อนไขตรวจสอบว่าขณะนี้ indicator คุณอยู่ในสถานะไหนจากนั่นก็เขียน code สิ่งที่คุณต้องการลงไปในเงื่อน แค่นี้เองครับ

swensens

  • Newbie
  • *
  • Posts: 14

ครับ ผมลองเขียนตามเงื่อนไขข้างล่างได้แล้ว คือ
1. เปิด buy ตอน buffer0=1
2. เปิด Sell ตอน buffer1=1
3. check order (OrdersTotal) ด้วย ถ้ามีอยู่แล้ว 1 order && buffer0=1 ให้ทำการปิด Order Sell
4. check order (OrdersTotal) ด้วย ถ้ามีอยู่แล้ว 1 order && buffer1=1 ให้ทำการปิด Order Buy

แต่ว่าถ้าผมตั้ง TP=200 แล้วมันขึ้นจนชน TP , order buy ผมก็จะถูกปิด -> พอถูกปิด มันก็จะเปิด order buy ต่อจากเงื่อนไขข้อ 1. ด้านบน

แต่ผมต้องการว่าถ้าชน TP ให้รอจนกว่าเกิดสัญญาณตรงข้าม ค่อยเปิด ไม่อยากให้เปิดซ้ำอะครับ
เช่น
-ถ้าเปิด order buy แล้วชน TP แล้ว buffer0=1 อยู่ ให้ไม่ต้องทำอะไร จนกว่า buffer1=1 ค่อยเปิด Sell
-ในทางกลับกัน ถ้าเปิด order sell แล้วชน TP แล้ว buffer1=1 อยู่ ให้ไม่ต้องทำอะไร จนกว่า buffer0=1 ค่อยเปิด Buy

swensens

  • Newbie
  • *
  • Posts: 14
ได้แล้วครับบบ เพิ่ม && เข้าไปตรงเงือนไข order buy , sell รบกวนช่วยดูให้หน่อยว่าโอเคมั้ยครับ แต่ผมลอง BackTest ก็เห็นว่าน่าจะใช้ได้ครับ แฮะๆ เพิ่งอ่านหนังสือจบครับ


double up=iCustom(NULL,0,"Hist",0,1);
double down=iCustom(NULL,0,"Hist",1,1);

if(OrdersTotal()==0)
      { if( (up>0)&&(iCustom(NULL,0,"Hist",0,2)!=1))
        {OrderSend(Symbol(),OP_BUY,0.2,Ask,3,Ask-Point*50,Ask+Point*150,"EX2",0,0,Green);}
        if( (down>0)&&(iCustom(NULL,0,"Hist",1,2)!=1))
        {OrderSend(Symbol(),OP_SELL,0.2,Bid,3,Ask+Point*50,Ask-Point*150,"EX2",0,0,Red);}
      }

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
แต่ผมต้องการว่าถ้าชน TP ให้รอจนกว่าเกิดสัญญาณตรงข้าม ค่อยเปิด ไม่อยากให้เปิดซ้ำอะครับ
เช่น
-ถ้าเปิด order buy แล้วชน TP แล้ว buffer0=1 อยู่ ให้ไม่ต้องทำอะไร จนกว่า buffer1=1 ค่อยเปิด Sell
-ในทางกลับกัน ถ้าเปิด order sell แล้วชน TP แล้ว buffer1=1 อยู่ ให้ไม่ต้องทำอะไร จนกว่า buffer0=1 ค่อยเปิด Buy

ต้องสร้างตัวแปรแบบ gboal เอาไวเก็บค่าทิศทางของ Histogram ด้วยครับแล้วเวลาตรวจสอบเงื่อนไขก็ต้องเอามาใช้ด้วยครับถึงได้ตามที่คุณต้องการ

swensens

  • Newbie
  • *
  • Posts: 14
เขียนแบบผมก่อนหน้ามีปัญหาจริงๆด้วยจากการลอง Back Test

ช่วยยกตัวอย่างหน่อยได้มั้ยครับ เกี่ยวกับการเขียน global พอดีเพิ่งหัดเขียน แฮะๆ


ผมลองดูงงๆ กับโค้ดข่างล้าง ถูกมั้ยครับ แต่งงว่าถ้าเป็น order แรก i ยังต้องเป็น 0 อยู่จะเปิด order ยังไง

double up=iCustom(NULL,0,"Hist",0,1);
double down=iCustom(NULL,0,"Hist",1,1);
int i=0;

if(OrdersTotal()==0)
      { if (up>0) && (i==2)
        {OrderSend(Symbol(),OP_BUY,0.2,Ask,3,Ask-Point*50,Ask+Point*150,"EX2",0,0,Green);
          i=1;
        }
        if (down>0) && (i==1)
        {OrderSend(Symbol(),OP_SELL,0.2,Bid,3,Ask+Point*50,Ask-Point*150,"EX2",0,0,Red);
          i=2;
        }
      }

if(OrdersTotal()==1)
      { if(up>0)
         {OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_SELL)
               {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3,Pink);}
         }
         
        if(down>0)
         {OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_BUY)
               {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3,Pink);}
         }
       }

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
int xxx=0;
int start()
  {
    double up=iCustom(NULL,0,"Hist",0,0);
   double down=iCustom(NULL,0,"Hist",1,0);

if(xxx==0)
{
   if(up >0)
    xxx=1;
    if(down >0)
    xxx=2;


}

if(OrdersTotal()==0)
      { if (up>0 && xxx==2 )
        {OrderSend(Symbol(),OP_BUY,0.2,Ask,3,Ask-Point*50,Ask+Point*150,"EX2",0,0,Green);
             xxx=1;
        }
        if (down > 0 && xxx==1)
        {OrderSend(Symbol(),OP_SELL,0.2,Bid,3,Ask+Point*50,Ask-Point*150,"EX2",0,0,Red);
            xxx=2;
        }
      }

if(OrdersTotal()==1)
      { if(up>0)
         {OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_SELL)
               {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3,Pink);}
         }
         
        if(down>0)
         {OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_BUY)
               {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3,Pink);}
         }
       }
   
   
   return(0);
  }

swensens

  • Newbie
  • *
  • Posts: 14
อ่าาา ขอบคุณมากครับ ดูง่ายดี แต่ผมคิดไม่ออก T_T

ผมลอง modify ใหม่ มันยังเปิด order ซ้ำอยู่เลย สงสัยผมอธิบายผิดเองครับ มันเปิดซ้ำในกรณีที่มันชน SL หรือ TP ครับ
เช่น
ถ้าตอนแรกเปิด Sell (down>0 , xxx=2) พอชน SL ก็จะมาเข้า if(OrdersTotal()==0) อีก แต่ค่า histogram ยังคงสั่งให้ Sell (down>0, xxx=2) ก็เลยเปิด order sell อีก
ถ้าผมต้องการให้ในกรณีที่เปิด sell ไปแล้ว ถ้าชน SL หรือ TP ก็ตาม ให้หยุด จนกว่า histrogram จะเปลี่ยนเป็น up>0 ค่อยเปิด Buy อีกครัง ต้อง idea ประมาณไหนครับ แนะนำหน่อยครับ
(ผมอธิบายงงรึเปล่าหว่า)

int xxx=0;
int start()
  {
    double up=iCustom(NULL,0,"Hist",0,0);
   double down=iCustom(NULL,0,"Hist",1,0);

if(xxx==0)
{
   if(up >0)
    xxx=1;
    if(down >0)
    xxx=2;
}

if(OrdersTotal()==0)
      { if (up>0 && xxx==1 )
        {OrderSend(Symbol(),OP_BUY,0.2,Ask,3,Ask-Point*50,Ask+Point*150,"EX2",0,0,Green);
             xxx=1;
        }
        if (down > 0 && xxx==2)
        {OrderSend(Symbol(),OP_SELL,0.2,Bid,3,Ask+Point*50,Ask-Point*150,"EX2",0,0,Red);
            xxx=2;
        }
      }

if(OrdersTotal()==1)
      { if(up>0&&xxx==2)
         {OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_SELL)
               {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3,Pink);
               xxx=1;}
         }
        
        if(down>0&&xxx==1)
         {OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_BUY)
               {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3,Pink);
               xxx=2;}
         }
       }
    
 


//----
   return(0);
  }
« Last Edit: มกราคม 24, 2013, 01:59:38 pm by swensens »

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ถ้าผมต้องการให้ในกรณีที่เปิด sell ไปแล้ว ถ้าชน SL หรือ TP ก็ตาม ให้หยุด จนกว่า histrogram
ตรงนี้คุณต้องเรียก ข้อมูลจาก history มาใช่ด้วยครับโดยการทำการตรวจสอบ Order สุดท้ายที่ปิดลงไปว่ามันโดน Sl หรือ Tp เปล่าใช้คำสั่ง

OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);

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

swensens

  • Newbie
  • *
  • Posts: 14
รบกวนอีกรอบครับ T_T
ผมเขียนผิดตรงไหนเหรอครับ มันยังเปิดซ้ำอยู่เลย 555 ขอโทษที่ถามหลายรอบครับ
ไม่มีพื้นฐานเขียนโปรแกรมเท่าไหร่  ???



int xxx=0;
int start()
{
    double up=iCustom(NULL,0,"Hist",0,1);
    double down=iCustom(NULL,0,"Hist",1,1);




   if(xxx==0)
   {
         { if(up >0)
           {xxx=1;}
         } 
         { if(down >0)
           {xxx=2;}
         }
   


          {    if(OrdersTotal()==0)
                  {  if (up>0 && xxx==1 )
                        {OrderSend(Symbol(),OP_BUY,0.2,Ask,3,Ask-Point*50,Ask+Point*150,"EX2",0,0,Green);
                        xxx=1;}
                      if (down > 0 && xxx==2)
                        {OrderSend(Symbol(),OP_SELL,0.2,Bid,3,Ask+Point*50,Ask-Point*150,"EX2",0,0,Red);
                         xxx=2;}
                 
                  }         
         }
   }

   
   if (xxx!=0)
   {  if (OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
      { if( (OrderClosePrice()!=OrderStopLoss())||(OrderClosePrice()!=OrderTakeProfit()) )
            {  if(OrdersTotal()==0)
                  {  if (up>0 && xxx==1 )
                        {OrderSend(Symbol(),OP_BUY,0.2,Ask,3,Ask-Point*50,Ask+Point*150,"EX2",0,0,Green);
                        xxx=1;}
                      if (down > 0 && xxx==2)
                        {OrderSend(Symbol(),OP_SELL,0.2,Bid,3,Ask+Point*50,Ask-Point*150,"EX2",0,0,Red);
                         xxx=2;}
                   }
             }
       }
    }       



   if(OrdersTotal()==1)
      { if(up>0&&xxx==2)
         {OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_SELL)
               {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3,Pink);
               xxx=1;}
         }
         
        if(down>0&&xxx==1)
         {OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_BUY)
               {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3,Pink);
               xxx=2;}
         }
       }
   
   


//----
   return(0);
  }
//+------------------------------------------------------------------+

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ที่เปิดซ้ำเพราะ

if(OrdersTotal()==0)
                  {  if (up>0 && xxx==1 )
                        {OrderSend(Symbol(),OP_BUY,0.2,Ask,3,Ask-Point*50,Ask+Point*150,"EX2",0,0,Green);
                        xxx=1;}
                      if (down > 0 && xxx==2)
                        {OrderSend(Symbol(),OP_SELL,0.2,Bid,3,Ask+Point*50,Ask-Point*150,"EX2",0,0,Red);
                         xxx=2;}
                 
                  } 

อยู่บนสุดก่อนเงื่อนไขอื่น โปรแกรมจะทำงานจากบนลงล่าง ซ้ายไปขวาครับ

swensens

  • Newbie
  • *
  • Posts: 14

เอ๋ แต่จาก เงื่อนไขแรก ถ้าทำการเปิด EA ครั้งแรก ถ้า เปิด order buy แล้วโดน TP หลังจากนั้น order ถูกปิด ตัวแปรก็จะเป็น xxx=1, up>0

  if(xxx==0)
   {
         { if(up >0)
           {xxx=1;}
         } 
         { if(down >0)
           {xxx=2;}
         }
   


          {    if(OrdersTotal()==0)
                  {  if (up>0 && xxx==1 )
                        {OrderSend(Symbol(),OP_BUY,0.2,Ask,3,Ask-Point*50,Ask+Point*150,"EX2",0,0,Green);
                        xxx=1;}
                      if (down > 0 && xxx==2)
                        {OrderSend(Symbol(),OP_SELL,0.2,Bid,3,Ask+Point*50,Ask-Point*150,"EX2",0,0,Red);
                         xxx=2;}
                 
                  }         
         }
   }


จากนั้นก็ควรที่จะเข้าเงื่อนไข if หลักอันที่สองที่กำหนดให้ xxx!=0 ถึงทำต่อ แล้วในเงื่อนไข if (xxx!=0) ผมก็ให้ check แล้วว่าต้องไม่ปิดด้วย SL หรือ TP ถึงทำต่อ

if (xxx!=0)
   {  if (OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
      { if( (OrderClosePrice()!=OrderStopLoss())||(OrderClosePrice()!=OrderTakeProfit()) )
            {  if(OrdersTotal()==0)
                  {  if (up>0 && xxx==1 )
                        {OrderSend(Symbol(),OP_BUY,0.2,Ask,3,Ask-Point*50,Ask+Point*150,"EX2",0,0,Green);
                        xxx=1;}
                      if (down > 0 && xxx==2)
                        {OrderSend(Symbol(),OP_SELL,0.2,Bid,3,Ask+Point*50,Ask-Point*150,"EX2",0,0,Red);
                         xxx=2;}
                   }
             }
       }
    }   


มันถูกต้องปะครับ ??? งง แล้ว 55555

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ลองเขียน หลักการทำงานของ EA ทั้งหมดมาให้ละเอียดหน่อยครับว่าสิ่งที่คุณกำลังจะเขียนจะทำงานอย่างไรมีลำดับขั่นตอนยังไงมั้งครับ

swensens

  • Newbie
  • *
  • Posts: 14
ครับ

1.  ผมมี custom indy เกี่ยวกับ histogram โดยรู้ค่าแล้วว่าถ้า indy บอกให้ซื้อค่า up>0 บอกให้ขายคือค่า down>0
 
    double up=iCustom(NULL,0,"test",0,1);
    double down=iCustom(NULL,0,"test",1,1);


2. เงื่อนไขการเข้า Trade มี SL,TP ทุกครั้ง

3. ถ้าเปิด order แล้วชน SL หรือ TP จะไม่เปิด order ใหม่ จนกว่า indy จะให้สัญญาณตรงข้าม

    เช่น เปิด order buy แล้วชน TP แต่หลังจากชนแล้วราคายังขึ้นอยู่ up>0 จะไม่เปิด order buy ซ้ำจนกว่าจะเกิดสัญญาณ Sell ค่อยเปิด order sell

4. แต่ถ้ายังไม่ชน SL หรือ TP ก็ให้ทำตามค่า up>0 buy และ down<0 sell ครับ


 
« Last Edit: มกราคม 22, 2013, 12:32:08 am by swensens »

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ลองเอาไปทดสอบดูครับผมยังไม่ได้ test นะครับเขียนเสร็จโพสเลย


int xxx=0;
int way=0;
int start()
{
    double up=iCustom(NULL,0,"Hist",0,1);
    double down=iCustom(NULL,0,"Hist",1,1);
   
   
   
   if(way==0)
   {
          if(up >0)
           way=1;
         
         if(down >0)
           way=2;
    } 
   
   

if(xxx==0 )
{
OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);
if( ( OrderClosePrice()==OrderStopLoss() ) || ( OrderClosePrice()==OrderTakeProfit()) )
        {
         xxx=1;
         
        }
}


if(xxx==1)
{
   if(up >0 && way== 2)
    {
       way=1;
       xxx=0;
    }
    if(down >0 && way== 1)
    {
       way=2;
       xxx=0;
    }

}






              if(OrdersTotal()==0)
                  {  if (up>0 && xxx==0)
                        {OrderSend(Symbol(),OP_BUY,0.2,Ask,3,Ask-Point*50,Ask+Point*150,"EX2",0,0,Green);
                        xxx=0;
                        }
                      if (down > 0 && xxx==0)
                        {OrderSend(Symbol(),OP_SELL,0.2,Bid,3,Ask+Point*50,Ask-Point*150,"EX2",0,0,Red);
                        xxx=0;
                         }
                 
                  }         
         
   

   
 

   if(OrdersTotal()==1)
      { if(up>0)
         {OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_SELL)
               {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3,Pink);
               }
         }
         
        if(down>0)
         {OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()==OP_BUY)
               {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3,Pink);
              }
         }
       }
   
   



   return(0);
  }