EA Programing => ปัญหาที่พบในการเขียน EA => Topic started 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);
}[
-
อ่านโค๊ดแล้วยังงงๆอยู่ งูๆปลาๆอยู่ อาการมันเป็นไงครับ ค่า h เริ่มแรกมาจากไหนอะครับ
แล้ว zigzag คืนค่าอะไรออกมาบ้าง
-
ค่า h เริ่มแรกมาจากไหนอะครับ
ค่า h คือค่าที่ตั้งเป็นตัวแปรเพื่อหาตำแหน่งยอดครับ โดยมีเงื่อนไขว่า ตำแหน่ง h มีค่า zigzag สูงกว่าข้างซ้าย-ขวา ก็จะได้ตำแหน่งยอดล่าสุด l ก็ไว้หา buttom ของ zigzag ล่าสุดน่ะ
แล้ว zigzag คืนค่าอะไรออกมาบ้าง
คืนค่า zigzaghigh ครับคือพอได้ยอดล่าสุดแล้วจะเอามาเทียบกับราคาปิดถ้าเบรกก็นับเป็นสัญญาณซื้อน่ะครับ
ตอนนี้เข้าใจว่าปัญหาคือมันไม่ refresh ค่า h,l zigzaghigh ให้แต่หาค่ารอบเดียวแล้วเก็บไว้ใช้ตลอด ไม่รู้ถูกมั้ย
ไงๆก็ช่วยดูทีว่าภูกมั้ยนะครับ
-
คือทดลองเขียน 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 มันไม่รู้ว่าจะไปเอาค่าที่แท่งเทียนไหนมาคืนให้คุณ
จริงๆผมเขียนให้ก็ได้น๊ะครับ แต่อยากให้ฝึก เผื่อวันหน้าวันหลังเก่งแล้ว จะได้เขียนอินดี้เทพๆ มาแบ่งปันเพื่อนๆบ้าง
ยังไงลองดูครับ ติดขัดตรงไหนก็ถามมาได้ครับ
-
ค่าสุดท้ายเป็น 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 อะไรแล้วเนี่ยแหละ ถ้าบอกวิธีแก้ก็จะดีมากเลย
ปล.บอร์ดไม่ค่อยมีคนเลย ขอบคุณที่ตอบนะครับ
-
ก่อนอื่น ต้องอธิบายเรื่องค่าของ 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 ก่อนหน้านี้ใช่หรือไม่ ครับ
-
ก่อนอื่น ต้องอธิบายเรื่องค่าของ 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 และวิธีเขียนที่ต้องใช้เลยก็ดีนะครับ
-
ถ้าจะหาค่าของ 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);
}
-
ขอบคุณ 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 น่ะ
-
เพิ่มไปแบบนี้ครับตัวสีแดง
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 นะครับเอาไปใช้เปรียบเทียบต่อได้เลย
-
h = เลขจำนวนเต็มอะไรก็ได้(ศึกษาจากอินดี้ของคนอื่นเขาใช้ตัวแปรแทนตัวเลขได้น่ะครับ)
ถูกต้องครับกำหนดเป็น ตัวแปรก็ได้แต่ตัวแปรต้องมีการแทนค่า เช่น มันอาจจะอยู่ใน loop ของ for ก็ได้
ไม่งั้นมันเอาค่าออกมาให้คุณไม่ถูกครับ
ลองทดสอบกับอินดี้ตัวอื่นดูครับ ลองแทนค่าที่เป็นตัวเลขและตัวอักษรดูครับ
-
ถามคุณ TvT อีกนิด ว่า เป็นไงบ้างครับผลของ brake zigzag win:lose เท่าไหร่ครับ ได้ลองจับสถิติดูบ้างมั๊ย
-
ใจเย็นครับ พอดีช่วงนี้งานหลักก็ยุ่ง จะค่อยๆทำน่ะครับเสร็จแล้วมาบอกครับ
ไอเดียนี้เอามาจาก chaloke.com น่ะครับ ค่อนข้างเป็นตามทฤษฎีพื้นฐานของการเทรดทีเดียว
ใครว่างลองไปเอาระบบ PNT 1.2 variable&fear factor มาดูนะครับมั่นใจว่าทำได้น่าจะรวยทีเดียว
อย่างที่บอกครับ EA รู้ไม่มากอยากรู้ถามเรื่อง technical จะช่วยตอบให้
-
ลองแล้วครับ ทำไมซื้อแต่ไม่ยอมขายครับ งง
รบกวนด้วยนะครับ
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);
}
-
มันข้ามขั้นตอนไปครับ
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 ครับ
-
ตามข้างล่างนี้ครับหาค่า 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);
}
-
ผมแก้ตามที่แนะนำแล้ว แต่ว่าซื้อ แต่ไม่ยอมขายครับ
และผมก็ไม่แน่ใจว่าตำแหน่งที่ซื้อ เป็นตำแหน่งที่ถูกตามคำสั่งจริงหรือไม่
รบกวนอีกครั้งครับ
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);
}
-
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);
}
-
admin เข้าใจไม่ตรงกันนีี่เองมิน่าใช้มะได้ ;D ;D ;D
แนบรูปมาเพื่อชี้แจงที่ต้องการจ้า 1 >> 4 ตามลำดับ โดยต้องการให้ record high-low ล่าสุดตามรูป และให้รู้ว่าอันสุดท้ายเป็น high หรือ low (ที่เคยเขียนไงต้องการค่า zigzag ที่มากกว่า 2 ตำแหน่งข้างๆ เพื่อบอกว่าเป็ยอด - ก้น โดยต้องการเฉพาะยอดล่าสุดพอ)
ดูรูปตามลำดับนะ เรียงเวลามาละ คือ พอเวลาผ่านก็หายอดอันล่าสุดมาใช้ตามรูป
หวังว่าจะเข้าใจตรงกันซะที มิน่าไปคนละทางเลย
ขอบคุณจ้า ::) :o ::)
-
ถ้าต้องการทราบว่าตัวสุดท้ายเป็น 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);
}
-
อันนี้ขอถามเพื่อความเข้าใจใน 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 ดูอีกที
ขอบคุณจ้า
-
ผมตอบไปแล้วครับลองดูครับว่าไม่เข้าใจตรงไหน
-
ช่วงนี้งานยุ่งนิดนึง เดี๋ยวอีก 2-3 วัน จะลองใหม่ แล้วแจ้งข่าวอีกทีนะ
-
ผมยัง งงงง ครับ ขอถามท่าน ADMIN แบบนี้ละกัน
จะเป็นไปได้มั้ยครับถ้าเราจะบันทึกค่า Top ของ Zigzag 2 ค่าล่าสุด (A&B) และ Bottom ของ Zigzag 2 ค่าล่าสุด (C&D)
ตามรูปครับ
-
ทำได้ครับ
-
รบกวนชวยเหลือด้วยครับ
-
ตาม 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);
}