EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: TvT on พฤษภาคม 22, 2010, 08:24:46 am

Title: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 22, 2010, 08:24:46 am
คือทดลองเขียน EA โดยตั้งใจให้เทรดตามรูปเวลาเบรกยอด zigzag ล่าสุดเบรกขึ้นลอง เบรกลงชอร์ต แต่ลองรันแล้วมันไม่ใช้ยอดล่าสุดมารัน ใครรู้วิธีแก้บอกที

(http://www.uppicweb.com/show.php?id=e7bcae6e977c7ac1c9c8e597d3fc2ac2)

int start()
{
//----
{
double zigzaghigh, zigzaglow, zigzaghighx, zigzaglowx, zigzaghighp;
double zigzaglowp, zigzaghigha, zigzaglowa, pc;
double ticket, total, order;
int h, l;

zigzaghighx=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h);
zigzaglowx=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l);
zigzaghighp=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h+1);
zigzaglowp=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l+1);
zigzaghigha=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h-1);
zigzaglowa=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l-1);
pc=iClose(NULL,0,1);
total=OrdersTotal();

//identify top//
while(h>1)
{
if((zigzaghighx > zigzaghighp) && (zigzaghighx > zigzaghigha))
zigzaghigh=zigzaghighx;
return(0);
}
//identify buttom//
while(l>1)
{
if((zigzaglowx < zigzaglowp) && (zigzaglowx < zigzaglowa))
zigzaglow=zigzaglowx;
return(0);
}

//buy&sell//
if((total<1)&&(pc>zigzaghigh))
{ticket=OrderSend(Symbol(),OP_BUY,1,Ask,1,0,0,"buy ",0,0,Green);
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
Print("buy");
return(0);
}
if((total>0)&&(pc<zigzaglow))
{OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);
Print("sale");
return(0);
}
return;
}

//----
return(0);
}[
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: linconz on พฤษภาคม 22, 2010, 10:54:31 am
อ่านโค๊ดแล้วยังงงๆอยู่  งูๆปลาๆอยู่   อาการมันเป็นไงครับ  ค่า h เริ่มแรกมาจากไหนอะครับ
แล้ว zigzag คืนค่าอะไรออกมาบ้าง
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 22, 2010, 12:06:26 pm
ค่า h เริ่มแรกมาจากไหนอะครับ

ค่า h คือค่าที่ตั้งเป็นตัวแปรเพื่อหาตำแหน่งยอดครับ โดยมีเงื่อนไขว่า ตำแหน่ง h มีค่า zigzag สูงกว่าข้างซ้าย-ขวา ก็จะได้ตำแหน่งยอดล่าสุด l ก็ไว้หา buttom ของ zigzag ล่าสุดน่ะ

แล้ว zigzag คืนค่าอะไรออกมาบ้าง
คืนค่า zigzaghigh ครับคือพอได้ยอดล่าสุดแล้วจะเอามาเทียบกับราคาปิดถ้าเบรกก็นับเป็นสัญญาณซื้อน่ะครับ

ตอนนี้เข้าใจว่าปัญหาคือมันไม่ refresh ค่า h,l zigzaghigh ให้แต่หาค่ารอบเดียวแล้วเก็บไว้ใช้ตลอด ไม่รู้ถูกมั้ย

ไงๆก็ช่วยดูทีว่าภูกมั้ยนะครับ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: linconz on พฤษภาคม 22, 2010, 12:20:14 pm
คือทดลองเขียน EA โดยตั้งใจให้เทรดตามรูปเวลาเบรกยอด zigzag ล่าสุดเบรกขึ้นลอง เบรกลงชอร์ต แต่ลองรันแล้วมันไม่ใช้ยอดล่าสุดมารัน ใครรู้วิธีแก้บอกที

(http://www.uppicweb.com/show.php?id=e7bcae6e977c7ac1c9c8e597d3fc2ac2)

int start()
{
//----
{
double zigzaghigh, zigzaglow, zigzaghighx, zigzaglowx, zigzaghighp;
double zigzaglowp, zigzaghigha, zigzaglowa, pc;
double ticket, total, order;
int h, l;

zigzaghighx=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h);
zigzaglowx=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l);
zigzaghighp=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h+1);
zigzaglowp=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l+1);
zigzaghigha=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h-1);
zigzaglowa=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l-1);
pc=iClose(NULL,0,1);
total=OrdersTotal();

//identify top//
while(h>1)
{
if((zigzaghighx > zigzaghighp) && (zigzaghighx > zigzaghigha))
zigzaghigh=zigzaghighx;
return(0);
}
//identify buttom//
while(l>1)
{
if((zigzaglowx < zigzaglowp) && (zigzaglowx < zigzaglowa))
zigzaglow=zigzaglowx;
return(0);
}

//buy&sell//
if((total<1)&&(pc>zigzaghigh))
{ticket=OrderSend(Symbol(),OP_BUY,1,Ask,1,0,0,"buy ",0,0,Green);
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
Print("buy");
return(0);
}
if((total>0)&&(pc<zigzaglow))
{OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);
Print("sale");
return(0);
}
return;
}

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

ค่าสุดท้ายเป็น shift หรือป่าวครับ ลองเปลี่ยนเป็น 0,1,2 ดูครับ   0 = ปัจจุบัน   1= ถอยไป 1 แท่ง  2= ถอยไป 2 แท่ง

สิ่งที่คุณต้องการหาคือ ค่าที่คืนออกมา จาก zigzag  แล้วต้องเอาค่าเหล่านั้นมาประมวลผล หาจุดยอดหรือก้น เอาเอง แล้วเอาค่านั้นเก็บไว้ในตัวแปรเพื่อเปรียบเทียบกับราคา
แล้วค่า h ไม่มีการกำหนดเลย  indy มันไม่รู้ว่าจะไปเอาค่าที่แท่งเทียนไหนมาคืนให้คุณ

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

ยังไงลองดูครับ ติดขัดตรงไหนก็ถามมาได้ครับ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 22, 2010, 01:18:30 pm
ค่าสุดท้ายเป็น shift หรือป่าวครับ ลองเปลี่ยนเป็น 0,1,2 ดูครับ   0 = ปัจจุบัน   1= ถอยไป 1 แท่ง  2= ถอยไป 2 แท่ง
ที่ให้เป็น h เพราะต้องการค่าแท่งที่มีค่า zigzag สูงสุด ที่ใส่ h เพราะคิดว่า h แทนเลขจำนวนเต็ม เลยเอาเปรียบเทียบที่ h-1 = แท่งหลังจากแท่งนั้น
h+1 = แท่งก่อนหน้า ก็เลยเอาค่า zigzag ตำแหน่งที่ h ออกมาน่ะครับก็คิดว่าน่าจะเป็นค่า top น่ะ

แล้วค่า h ไม่มีการกำหนดเลย 
ให้กำหนดเป็นอะไรครับ อันนี้แหละที่ไม่เข้าใจเพราะผมตั้งเงื่อนไขตามข้างบนอย่างนี้
h = เลขจำนวนเต็มอะไรก็ได้(ศึกษาจากอินดี้ของคนอื่นเขาใช้ตัวแปรแทนตัวเลขได้น่ะครับ)
เมื่อ ค่า zigzag ที่ h > 2 แท่งข้างๆ ก็น่าจะเป็นค่ายอด
ก็สั่งให้ zigzaghigh = ค่า zigzag ที่ h (ในที่นี้ตั้งว่า zigzaghighx ) แล้วส่งค่า zigzaghigh ออกมาเทียบกับราคาล่าสุด โดยเข้าใจว่ามันจะหาค่าล่าสุดตลอด

ที่ผมเข้าใจก็ราวๆนี้เลยเขียนแบบนี้แหละครับ


จริงๆผมเขียนให้ก็ได้น๊ะครับ  
ไม่ต้องขนาดนั้นก็ได้แต่อธิบายทีว่าเข้าใจผิดตรงไหน หรือบอกตำแหน่งที่ต้องแก้-ใส่โค๊ดเพิ่มที


ปัญหาก็คือไม่รู็จะใช้ code อะไรแล้วเนี่ยแหละ ถ้าบอกวิธีแก้ก็จะดีมากเลย
ปล.บอร์ดไม่ค่อยมีคนเลย ขอบคุณที่ตอบนะครับ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: admin on พฤษภาคม 22, 2010, 01:44:43 pm
ก่อนอื่น ต้องอธิบายเรื่องค่าของ zigzag ก่อนนะครับ  ค่า zigzag ที่ได้จาก icustom มันไม่ได้ส่งค่าออกมาต่อเนื่องทุก แท่งนะครับ ตัวอย่างเช่น แท่งปัจจุบัน zigzag แทงขึ้น แทงก่อนหน้าที่ zigzag จะแทงขึ้น ค่าที่ออกจาก icustom จะเป็น 0 นะครับ ลองดูตัวอย่างที่ผมเขียนเพื่อแสดงค่า zigzag จาก http://www.thaiforexea.com/index.php/topic,20.0.html ครับ   จาก code
int h, l;
zigzaghighx=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h);
zigzaglowx=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l);
zigzaghighp=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h+1);
zigzaglowp=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l+1);
zigzaghigha=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h-1);
zigzaglowa=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l-1);

ตำแหน่งสีแดง ต้องเป็นตัวเลขครับ แต่จาก code ที่ให้มา ค่า h ,l ในที่นี้ต้องเป็นตัวเลขที่ระบุตำแหน่งของ ค่า zigzag แต่ใน code ยังไม่มีการระบุค่าให้ h หรือ l เลยนะครับ ใน icutom ตำแหน่งสีแดงทีผม แสดงให้ดูใน code ต้องเริ่มจาก 0 ครับคือค่าของกราฟในแท่งปัจจุบัน  ถ้าเป็น 1 ก้คือค่าของอินดิเคเตอร์ในกราฟแท่งก่อนหน้านี้ครับ  เท่าที่ผมดู code คุณคราวๆๆ คุณต้องการให้ EA มันรู้ว่า ค่า zigzag ปัจจุบันมีค่ามากว่ากรือน้อยกว่า ยอดหรือก้นของ ค่า zigzag ก่อนหน้านี้ใช่หรือไม่ ครับ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 22, 2010, 01:49:31 pm
ก่อนอื่น ต้องอธิบายเรื่องค่าของ zigzag ก่อนนะครับ  ค่า zigzag ที่ได้จาก icustom มันไม่ได้ส่งค่าออกมาต่อเนื่องทุก แท่งนะครับ ตัวอย่างเช่น แท่งปัจจุบัน zigzag แทงขึ้น แทงก่อนหน้าที่ zigzag จะแทงขึ้น ค่าที่ออกจาก icustom จะเป็น 0 นะครับ ลองดูตัวอย่างที่ผมเขียนเพื่อแสดงค่า zigzag จาก http://www.thaiforexea.com/index.php/topic,20.0.html ครับ   จาก code
int h, l;
zigzaghighx=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h);
zigzaglowx=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l);
zigzaghighp=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h+1);
zigzaglowp=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l+1);
zigzaghigha=iCustom(NULL,0,"ZigZag",12,5,3,MODE_HI GH,h-1);
zigzaglowa=iCustom(NULL,0,"ZigZag",12,5,3,MODE_LOW ,l-1);

ตำแหน่งสีแดง ต้องเป็นตัวเลขครับ แต่จาก code ที่ให้มา ค่า h ,l ในที่นี้ต้องเป็นตัวเลขที่ระบุตำแหน่งของ ค่า zigzag แต่ใน code ยังไม่มีการระบุค่าให้ h หรือ l เลยนะครับ ใน icutom ตำแหน่งสีแดงทีผม แสดงให้ดูใน code ต้องเริ่มจาก 0 ครับคือค่าของกราฟในแท่งปัจจุบัน  ถ้าเป็น 1 ก้คือค่าของอินดิเคเตอร์ในกราฟแท่งก่อนหน้านี้ครับ  เท่าที่ผมดู code คุณคราวๆๆ คุณต้องการให้ EA มันรู้ว่า ค่า zigzag ปัจจุบันมีค่ามากว่ากรือน้อยกว่า ยอดหรือก้นของ ค่า zigzag ก่อนหน้านี้ใช่หรือไม่ ครับ

ไม่ใช่จ้าต้องการเอาราคาปิดแท่งสุดท้ายเทียบกับยอดและก้นของ zgizag ล่าสุดจ้า คือบอก code และวิธีเขียนที่ต้องใช้เลยก็ดีนะครับ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: admin on พฤษภาคม 22, 2010, 02:14:01 pm
ถ้าจะหาค่าของ zigzag สูงกับต่ำใช้แค่นี้น่าจะได้แล้วครับ


extern double high ;
extern double low ;

int start()
  {   
       int amount=0;
       int temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                     
                      }
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                     
                      }
     
 
   return(0);
  }
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 22, 2010, 03:01:55 pm
ขอบคุณ Admin มากๆครับ
ขอถามเพิ่มหน่อยถ้าอย่างนั้นเราจะเปรียบเทียบ ได้ไหมครับว่า ยอดล่าสุดเป็น high หรือ low
ของเดิมคิดราวๆ ว่าถ้ายอดสุดท้ายเป็น top ชอร์ตอย่างเดียว
ยอดสุดท้ายเป็น buttom ลองอย่างเดียว เราจะต้องใช้ code อะไรเพื่อบอกว่ายอดสุดท้ายเป็น top/buttom ครับ

ปล.ขอโทษด้วยที่ต้องถามบ่อย เรื่อง EA นี่ค่อนข้าวใหม่นะครับ แต่ถ้าเป็น technical analysis ก็มั่นใจพอควร ยินดีช่วยตอบคำถามนะครับ ที่เลือกค่า zigzag เพราะ BEST technical indicator = price , ตอนนี้อยากนำ code ไปเขียน Eliott wave correction trading น่ะครับ ที่มีอยู่ตอนนี้ดูไม่ค่อยตรงเลย
ปล.2 ตอนนี้เอา EA ฝากมาตัวนึง เท่าที่ดูนี่เป็น EA ที่แทบไม่มีโอกาสพลาดเลยโดยใช้ทฤษฎี power wave ของ DAR WONG น่ะ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: admin on พฤษภาคม 22, 2010, 03:24:42 pm
เพิ่มไปแบบนี้ครับตัวสีแดง


extern double high ;
extern double low ;
extern int direct=0;
int start()
  {   
       int amount=0;
       int temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                     
                      }
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                     
                      }
     
 
   return(0);
  }

ที่นี้นะครับ  direct =1 ค่าล่าสุดจะเป็น bottom  ถ้าเป็น 2 ยอดล่าสุดจะเป็น top  ค่า ของ zigzag อยู่ใน high low  นะครับเอาไปใช้เปรียบเทียบต่อได้เลย
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: linconz on พฤษภาคม 23, 2010, 01:12:19 am

h = เลขจำนวนเต็มอะไรก็ได้(ศึกษาจากอินดี้ของคนอื่นเขาใช้ตัวแปรแทนตัวเลขได้น่ะครับ)


ถูกต้องครับกำหนดเป็น ตัวแปรก็ได้แต่ตัวแปรต้องมีการแทนค่า เช่น มันอาจจะอยู่ใน loop ของ for ก็ได้
ไม่งั้นมันเอาค่าออกมาให้คุณไม่ถูกครับ

ลองทดสอบกับอินดี้ตัวอื่นดูครับ ลองแทนค่าที่เป็นตัวเลขและตัวอักษรดูครับ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: linconz on พฤษภาคม 23, 2010, 01:18:59 am
ถามคุณ TvT อีกนิด   ว่า เป็นไงบ้างครับผลของ brake zigzag win:lose เท่าไหร่ครับ ได้ลองจับสถิติดูบ้างมั๊ย
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 23, 2010, 10:00:50 am
ใจเย็นครับ พอดีช่วงนี้งานหลักก็ยุ่ง จะค่อยๆทำน่ะครับเสร็จแล้วมาบอกครับ

ไอเดียนี้เอามาจาก chaloke.com น่ะครับ ค่อนข้างเป็นตามทฤษฎีพื้นฐานของการเทรดทีเดียว

ใครว่างลองไปเอาระบบ PNT 1.2 variable&fear factor มาดูนะครับมั่นใจว่าทำได้น่าจะรวยทีเดียว

อย่างที่บอกครับ EA รู้ไม่มากอยากรู้ถามเรื่อง technical จะช่วยตอบให้
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 23, 2010, 07:26:29 pm
ลองแล้วครับ ทำไมซื้อแต่ไม่ยอมขายครับ งง

รบกวนด้วยนะครับ

int start()


{
double ticket, total, pc;

int direct=0;


pc=iClose(NULL,0,1);   
total=OrdersTotal();
       
//----

 
         int amount=0;
         int temp[3];
         double tem;
         

                        for(int i=5 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
            if((temp[0]<temp[1])&&(total<1)&&(pc>temp[1]))
                      {
                         ticket=OrderSend(Symbol(),OP_BUY,1,Ask,1,0,0,"buy",0,0,Green);
                         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                         Print("buy");
                       }
            if((temp[0]>temp[1])&&(pc<temp[1]))
                      {
                        OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);
                        Print("sale");
                        return(0);
                      }
                     
 return(0);
 
 } 
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: admin on พฤษภาคม 23, 2010, 07:48:49 pm
มันข้ามขั้นตอนไปครับ       
                          if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                     
                      }
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                     
                      }

ต้องใช้ตัวแปร high กับ low ในนี้เอาไปเปรียบเทียบครับ  เพราะค่าใน temp ไม่แน่นอนครับ บางครังมันเก็บค่าสูงบางตรั้งเก็บค่าต่ำ ตามการขึ้นลงของ zigzag ครับ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: admin on พฤษภาคม 23, 2010, 07:52:07 pm
ตามข้างล่างนี้ครับหาค่า zigzag อันข้างบนมีจุดผิดตรงประกาศค่า high low  direct

static double high ;
static double low ;
static int direct=0;
int start()
  {   
       int amount=0;
       int temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                     
                      }
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                     
                      }
     
 
   return(0);
  }

Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 23, 2010, 10:48:55 pm
ผมแก้ตามที่แนะนำแล้ว แต่ว่าซื้อ แต่ไม่ยอมขายครับ

และผมก็ไม่แน่ใจว่าตำแหน่งที่ซื้อ เป็นตำแหน่งที่ถูกตามคำสั่งจริงหรือไม่

รบกวนอีกครั้งครับ

static double high ;
static double low ;
static int direct=0;


int start()
{
double ticket, total, pc;

pc=iClose(NULL,0,1);   
total=OrdersTotal();

 
       int amount=0;
       int temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                        if(pc<low)
                              {
                                 OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);
                                 Print("sale");
                                 return(0);
                              }
                      }
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                        if((total<1)&&(pc>high))
                              {
                                 ticket=OrderSend(Symbol(),OP_BUY,1,Ask,1,0,0,"buy",0,0,Green);
                                 OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                                 Print("buy");
                              }
                       
                      }
     
 
   return(0);
  }
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: admin on พฤษภาคม 23, 2010, 11:22:50 pm
code ผมแก้จนทำงานแล้วให้มัน print ออกมาพบว่าเงื่อนไข  pc> high ไม่มีทางเป็นจริงได้เลยครับเพราะถ้าราคาปิดของแท่งที่แล้วไม่มีทางมากกว่าค่าสูงสุดของ zigzag เพราะ  zigzag มันจะเลื่อนไปที่ค่าสูงสุดกับต่ำ เสมอ ลองเอาไปดูครับ


static double high ;
static double low ;
static int direct=0;


int start()
{
double ticket, total, pc;

pc=iClose(NULL,0,1);   
total=OrdersTotal();

 
       int amount=0;
       double temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                       
                      }
                     
                     
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                       
                       }
                     
                     
                     
                     
                       if((total>0) && (pc<low ))
                              {
                                 OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);
                                 Print("sale");
                                 return(0);
                              }
                     
                       if((total==0)&&(pc>high))
                              {
                                 ticket=OrderSend(Symbol(),OP_BUY,1,Ask,1,0,0,"buy",0,0,Green);
                                 OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                                 Print("buy");
                              }
                      Print("Pc ",pc);
                      Print("high ",high);
                      Print("Low ",low);
     
 
   return(0);
  }
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 24, 2010, 12:13:16 am
admin เข้าใจไม่ตรงกันนีี่เองมิน่าใช้มะได้  ;D ;D ;D

แนบรูปมาเพื่อชี้แจงที่ต้องการจ้า 1 >> 4 ตามลำดับ โดยต้องการให้ record high-low ล่าสุดตามรูป และให้รู้ว่าอันสุดท้ายเป็น high หรือ low (ที่เคยเขียนไงต้องการค่า zigzag ที่มากกว่า 2 ตำแหน่งข้างๆ เพื่อบอกว่าเป็ยอด - ก้น โดยต้องการเฉพาะยอดล่าสุดพอ)

ดูรูปตามลำดับนะ เรียงเวลามาละ คือ พอเวลาผ่านก็หายอดอันล่าสุดมาใช้ตามรูป

หวังว่าจะเข้าใจตรงกันซะที มิน่าไปคนละทางเลย

ขอบคุณจ้า  ::) :o ::)
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: admin on พฤษภาคม 24, 2010, 11:40:31 am
ถ้าต้องการทราบว่าตัวสุดท้ายเป็น low หรือ high ก็ใช่ direct ไงครับ
แบบในตัวอย่าง ยอดสุดท้ายจะเป็น low
แต่ผมอยากให้คุณลองดูตอนตลาดเปิดก่อนนะครับ ดูจากกราฟในอดีตมันจะเห็นจุด break ก็จริงแต่ zigzag ตอนทำงานมันเลื่อนจุดเองได้นะครับหากราคาไปไม่สุดมันก็เลือนขึ้นหรือเลื่อนงต่อได้นะครับผมลองดูแล้ว ราคา pc ไม่มีทางหลุดค่า high สักที เพราะ zigzag มันเลื่อนตำแหน่งเองได้นะครับ

static double high ;
static double low ;
static int direct=0;


int start()
{
double ticket, total, pc;

pc=iClose(NULL,0,1);   
total=OrdersTotal();

 
       int amount=0;
       double temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                       
                      }
                     
                     
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                       
                       }
                     
                     
                     
                      if(direct==1)
                      {
                       if((total>0) && (pc<low ))
                              {
                                 OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);
                                 Print("sale");
                                 return(0);
                              }
                     
                       if((total==0)&&(pc>high))
                              {
                                 ticket=OrderSend(Symbol(),OP_BUY,1,Ask,1,0,0,"buy",0,0,Green);
                                 OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                                 Print("buy");
                              }
                             
                      }
                      Print("Pc ",pc);
                      Print("high ",high);
                      Print("Low ",low);
     
 
   return(0);
  }
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 25, 2010, 06:02:34 am
อันนี้ขอถามเพื่อความเข้าใจใน EA  นะครับ ตอบไรได้ก็ตอบที

static double high ;
static double low ;
static int direct=0;
static นี่คือตัวแปรประเภทไหน และค่าที่ได้จะเป็นค่าล่าสุดจากสูตรเสมอใช่หรือไม่
คือตัวแปรที่เราประกาศให้มันจำค่าเดิมเอาไวถึงการทำงานของ ea จะจบลงตราบใดที่เรายังไม่ปิด ea ค่านั่นก็ยังอยู่ในระบบ
int start()
{
double ticket, total, pc;

pc=iClose(NULL,0,1);    
total=OrdersTotal();

 
       int amount=0;

       double temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
ตรงนี้เราเพิ่มเงื่อนไขว่า i>10 หรือถ้า i=จะเริ่มนับจาก 10 แล้วบวกไปทีละ 1 ??? ได้หรือไม่ ให้ไปเริ่ม จากแท่งที่ 10 แล้ว + ไปทีละ 1
ตรงนี้ต้องทำความเข้าใจอย่างมากเลยนะครับ อินดิเคเตอรื zigzag ไม่เหมือนอินดิเคเตอร์ตัวอื่นๆ zigzag จะส่งค่าออกมาก็ต่อเมื่อเกิดยอดสูงต่ำเท่านั่น ในระหว่างที่ไม่เกิดยอดสูงต่ำจะส่งค่าออกมาเป็น 0 ตลอด
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
ตรงนี้ก็ต้องเข้าใจการทำงานของ icustom ก่อนนะครับ ค่า i เป็นค่าของอินดิเคเตอรืในแต่ละแท่งเทียนของกราฟ จากที่ผมอธิบายไปแล้วว่า zigzag มันจะส่งค่าออกมาก็ต่อเมื่อว่าเกิดยอดสูงต่ำเท่านั่น ในช่วงที่ยังไม่เกิดค่าสูงต่ำมันจะส่งค่า 0 ออกมาทุกแท่งเทียน และเราก็ไม่สามารถทราบได้ว่าเมื่อไรมันจะเกิดยอดสูงต่ำ ผมจึงกำหนดให้เป็นตัวเลขมากๆๆเพื่อให้โปรแกรมย้อนกลับไปอ่านค่า ของ zigzag ให้มากที่สุดเพื่อหาค่าสูงต่ำ
ตรงนีผมเพิ่มตัวแปร tem เพิ่ม เป็นราคา zigzag 2 แท่งก่อนหน้า และสองแท่งหลังจะได้ยอดที่เป็นยอดคว่ำล่าสุดไหมโดย
                               tem1=iCustom(NULL, 0, "ZigZag",13,0,i+2);
                               tem2=iCustom(NULL, 0, "ZigZag",13,0,i-2);
                               if((tem>tem1)&&(tem>tem2))
ค่า tem น่าจะได้เป็นยอดล่าสุดที่มีระยะห่างไปไม่น้อยกว่า 5 และเป็นรูปยอดคว่ำ

ตรงนี้เพิ่มไปก้ไม่ได้ค่าสูงต่ำครับการเพิ่มลักษณะนี้เป็นแค่การเลื่อนแท่งเทียนเท่านั่นเองครับ
                               if(tem>0)
                               {
                                  temp[amount]=tem;
amount นี่ค่าไรอะคือดัชนีของ array ครับผมสร้างตัวแปร double temp[3]; เอาไวเพื่อเก็บค่าจาก loop ที่หาค่าของ zigzag ครับ
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                    
                                                      
                            }
                    
                      if(temp[0]>temp[1])
อันนี้เปลี่ยนเหมือนข้างบนได้ไหมเราไม่ค่าเอาค่าโดยดูจากแท่งล่าสุดแต่ต้องการยอดคว่ำล่าสุด
เงื่อนไขอันนี้กับข้างล่างผมเอาไวตรวจสอบว่าว่าค่า สูงต่ำคืออะไรครับ แล้วผมก็ใช้ตัวแปร direct เพื่อบอกว่ายอดล่างสุดเป็น bottom หรือ top โดยสังเกตจาก      if(temp[0]>temp[1]) ตรงนี้ก็คือการเปรียบเทียบครับ  temp[0] คือยอดล่าสุด  temp[1] คือยอดก่อนน่า ถ้ายอดล่าสุดมากกว่ายอดก่อนหน้าแล้วก็คือค่า ล่าสุดคือ top ครับ ผมก็กำหนดตัวแปร direct = 1 เพื้อที่จะนำตรงนี้ไปเปรียบเทียบหาเราต้องการทำอะไรต่อถ้าเกิดยอดสุดท้ายเป็น top ที่นี้เงื่อขไขข้างล่างก็กลับกันครับ  ส่วนค่า  high กับ low ในเงื่อนไขก็คือค่า สูงสุดต่ำสุด ล่าสุดที่ zigzag มัน  show 2 ยอดสุดท้ายครับ                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                      
                      }
                    
                      
                    
                          if(temp[0]<temp[1])
อันนี้ก็ยอดหงายล่าสุดไม่ใช่ค่าล่าสุด
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                      
                       }





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

ผมเข้าใจตามนี้แต่เรื่องภาษาและระบบคงต้องฝาก admin ดูอีกที

ขอบคุณจ้า                      
                      







Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: admin on พฤษภาคม 25, 2010, 12:24:35 pm
ผมตอบไปแล้วครับลองดูครับว่าไม่เข้าใจตรงไหน
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 26, 2010, 02:47:28 pm
ช่วงนี้งานยุ่งนิดนึง เดี๋ยวอีก 2-3 วัน จะลองใหม่ แล้วแจ้งข่าวอีกทีนะ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 30, 2010, 11:05:46 am
ผมยัง งงงง ครับ ขอถามท่าน ADMIN แบบนี้ละกัน

จะเป็นไปได้มั้ยครับถ้าเราจะบันทึกค่า Top ของ Zigzag 2 ค่าล่าสุด (A&B)  และ Bottom ของ Zigzag 2 ค่าล่าสุด (C&D)

ตามรูปครับ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: admin on พฤษภาคม 30, 2010, 02:42:13 pm
ทำได้ครับ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: TvT on พฤษภาคม 30, 2010, 03:50:21 pm
รบกวนชวยเหลือด้วยครับ
Title: Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
Post by: admin on พฤษภาคม 30, 2010, 06:44:24 pm
ตาม code ข้างล่าง  D=lastlow   A=lasthigh     C=low    B=high

static double high ;
static double low ;
static double lasthigh;
static double lastlow;

int start()
  {   
       int amount=0;
       int temp[4];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>3)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        lasthigh=temp[0];
                        lastlow=temp[1];
                       
                     
                      }
                     
                          if(temp[0]<temp[1])
                      {
                        lasthigh=temp[1];
                        lastlow=temp[0];
                           
                      }
                     
                     
                         if(temp[2]>temp[3])
                      {
                        high=temp[2];
                        low=temp[3];
                       
                     
                      }
                     
                          if(temp[2]<temp[3])
                      {
                        high=temp[3];
                        low=temp[2];
                           
                      }
                     
                     
                     
     
 
   return(0);
  }