EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: admin on สิงหาคม 02, 2009, 01:07:45 am
-
มีปัญหาที่เกี่ยวกับ code มาโพสที่นี้นะครับหากผมแก้ไขก็จะช่วยครับหากทำไม่ได้ก็รอผู้อื่นมาช่วยตอบแทนนะครับ
-
ผม ตั้ง trailingstop = 10 ทำไมบางครั้งก็เปลี่ยน บางครั้งก็ไม่เปลียนครับ
ผมใช้ fxopen GBP/USD, EUR/USD, และอื่น ๆ อีกหลายคู่
โค๊ดที่เขียนครับ
if(OrderType() == OP_BUY)
{
if(trailingStop > 0)
{
if(Bid - OrderOpenPrice() > trailingStop*Point)
{
if(OrderStopLoss() < (Bid - trailingStop*Point))
OrderModify(OrderTicket(), OrderOpenPrice(),
Bid - trailingStop*Point, OrderTakeProfit(), 0, Blue);
}
}
}
else
{
if(trailingStop > 0)
{
if(OrderOpenPrice() - Ask > trailingStop*Point)
{
if(OrderStopLoss() == 0 || OrderStopLoss() > Ask + trailingStop*Point)
OrderModify(OrderTicket(), OrderOpenPrice(),
Ask + trailingStop*Point, OrderTakeProfit(), 0, Red);
}
}
}
-
ตั้งค่า TrailingStop น้อยไปครับ
เพราะมันพอดีกับค่า minimum ของเค้าพอดีเลย
กว่าอีเอจะส่งคำสั่งไป ถ้าราคามันเปลี่ยน คำสั่งปรับ OrderStoploss ก็โดนยกเลิก
ตั้ง TrailingStop ซัก 20 จุดขึ้นไป น่าแก้ปัญหาได้ ;D
-
ผม ตั้ง trailingstop = 10 ทำไมบางครั้งก็เปลี่ยน บางครั้งก็ไม่เปลียนครับ
ผมใช้ fxopen GBP/USD, EUR/USD, และอื่น ๆ อีกหลายคู่
โค๊ดที่เขียนครับ
if(OrderType() == OP_BUY)
{
if(trailingStop > 0)
{
if(Bid - OrderOpenPrice() > trailingStop*Point)
{
if(OrderStopLoss() < (Bid - trailingStop*Point))
OrderModify(OrderTicket(), OrderOpenPrice(),
Bid - trailingStop*Point, OrderTakeProfit(), 0, Blue);
}
}
}
else
{
if(trailingStop > 0)
{
if(OrderOpenPrice() - Ask > trailingStop*Point)
{
if(OrderStopLoss() == 0 || OrderStopLoss() > Ask + trailingStop*Point)
OrderModify(OrderTicket(), OrderOpenPrice(),
Ask + trailingStop*Point, OrderTakeProfit(), 0, Red);
}
}
}
ตอนแรกดูผิด ตัว code ok แล้วครับ แต่ถ้าอยากตั้งน้อยๆ จะมีวิธีแก้คือใช้เก็บค่าในโปรแกรมเลยครับ เวลาถึงค่าค่อยสั่ง close คือจะไม่มีการ modify order ครับ แต่วิธีนี้จะมีความเสี่ยงนิดนึงกรณีเครื่องเราหรือ net มีปัญหา ซึ่งที่ผมเคยใช้วิธีนี้จะใช้การ stop loss ปกติกันไว้ด้วยครับ
-
int counted_bars=IndicatorCounted();
int i,limit15;
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit15=Bars-counted_bars;
ผมทดลองใช้คำสั่ง IndicatorCounted() แต่ อีเอไม่ทำงานครับ พอผมใช้คำสั่ง
int counted_bars= Bars-1; ก็ได้ค่าอื่น ๆ ในโปรแกรมไม่เหมือนกันอีก เป็นเพราะอะไรครับ หรือว่า คำสั่ง
IndicatorCounted() ใช้ได้เฉพาะอินดิเคเตอร์เท่านั้น
ถ้าเป็นอย่างนั้นจริง ๆ จะแก้โค๊ดตรงนี้ได้อย่างไรครับ
-
int counted_bars=IndicatorCounted();
int i,limit15;
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit15=Bars-counted_bars;
ผมทดลองใช้คำสั่ง IndicatorCounted() แต่ อีเอไม่ทำงานครับ พอผมใช้คำสั่ง
int counted_bars= Bars-1; ก็ได้ค่าอื่น ๆ ในโปรแกรมไม่เหมือนกันอีก เป็นเพราะอะไรครับ หรือว่า คำสั่ง
IndicatorCounted() ใช้ได้เฉพาะอินดิเคเตอร์เท่านั้น
ถ้าเป็นอย่างนั้นจริง ๆ จะแก้โค๊ดตรงนี้ได้อย่างไรครับ
IndicatorCounted( ) ใช้ได้กับ custom indicator เท่านั่นครับ เอามาใช้ใน ea ไม่ได้ครับ ว่าแต่คุณต้องการให้ ea มันทำอะไรหรอครับ
-
int counted_bars=IndicatorCounted();
int i,limit15;
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit15=Bars-counted_bars;
if (15 != Period())
{
limit15 = MathMax(limit15,15/Period());
for(i=limit15; i>=0; i--)
{
int y15 = iBarShift(NULL,15,Time);
buffer515 = iCustom(NULL,15,IndicatorFileName,"",34,34,14,25,PRICE_CLOSE,4,y30);
buffer630 = iCustom(NULL,15,IndicatorFileName,"",34,34,14,25,PRICE_CLOSE,5,y30);
buffer830 = iCustom(NULL,15,IndicatorFileName,"",34,34,14,25,PRICE_CLOSE,7,y30);
}
return(0);
}
for (i=limit15;i>=0;i--)
{
if (14>1) buffer815 = iCCI(NULL,0,14,PRICE_TYPICAL,i);
}
return(0);
}
ตรง IndicatorCounted() แทนค่าอื่น ได้ไหมครับมัน error ตรงนี้ครับ (ผมเคยแทนด้วย Bars - 1 แล้วแต่ไม่ผ่านครับ)
-
ได้คำตอบแล้วครับ
คำสั่ง IndicatorCounted() ใช้สำหรับอินดิเคเตอร์เท่านั้นค่านี้สำหรับนับจำนวนบาร์
ซึ่งจริง ๆ แล้ว ผมก็นำอินดิเคเตอร์เพื่อมาแปลงให้เป็นอีเอ
แต่มีวิธีที่ง่ายกว่านั้นซึ่งผมไม่รู้โดยที่ Admin ได้บอกผมจนเข้าใจ
และแนะนำว่าให้ใช้คำสั่ง icustom ซึ่งคำสั่งนี้เป็นคำสั่งเรียกอินดิเคเตอร์ มาใช้
ทำให้เราสามารถรู้ค่าที่ต้องการได้ เพียงแต่ระบุว่าต้องการทราบค่า อะไรเท่านั้นเองครับ
เช่น
double val=iCustom(NULL, 0, "SampleInd",13,1,0);
หมายถึง เรียกอินดิเคเตอร์ที่ชื่อ "SampleInd"
line ที่ 1 ค่า ณ ปัจจุบัน เราก็จะทราบค่าได้ทันที ไม่ต้องมาแปลงค่าเป็นอีเอครับ
-
int li_76 = IndicatorCounted();
if (li_76 < 0) return (-1);
if (li_76 > 0) li_76--;
int li_0 = Bars - li_76;
คำถาม คือ เราจะแทนค่า IndicatorCounted() อย่างไร เพื่อที่จะนำไปเขียนเป็นอีเอได้
ผมลองทำเป็นอีเอแต่ไม่ผ่านเพราะมีคำสั่งนี้ครับ
ต้องการเพียงให้มันบอกว่า ตอนนี้ลูกศร buy/sell แนบ indicatorมาด้วยครับ
-
เหมือนใช้ ima เเทนได้เลย 55+ เคยทดลองอยู่ ตอนตัดก็มีลูกศรของsignalอ่า
-
ใครพอจะทราบบ้างครับว่ามีคำสั่งอะไรที่จะทำให้เราทราบค่าในตัวแปร ของอินดิเคเตอร์บ้างครับ
เพื่อจะนำไปเขียนในอีเอ โดยดึงค่าของตัวแปรในอินดิเคเตอร์ เช่น ค่าของตัวแปรชื่อ Signal จากอินดิเคเตอร์ที่แนบมาด้วยครับ (กระทู้ข้างบน)
-
ลองเอาตัวนี้ไปดูผมเอา อินดิเคเตอร์ที่คุณโพสไปไปแปลงเป็น ea แล้วครับเพราะตัวนี้ icustom อ่านค่าออกมาไม่ได้ค่าที่ถูกต้องแต่ในตัว code มีจุดบอกสัญญาชื้อขายผมเลยแปลงจากอินมาเป็น ea เลย แล้วเจ้า IndicatorCounted(); มันคือฟังก์ชั่นที่จะให้นับว่ามีแท่งบาร์เท่าไรมันใช้ไม่ได้ใน ea ผมเลยกำหนดเลยว่ามี แท่งบารื 1000 แท่งหรือจะกำหนดมากกว่านี้ก็ได้นะ มันเป็นส่วนที่ให้เจ้าอินดิเคเตอร์รู้ว่าจะต้องใช่บาร์ทั้งหมดเท่าไรเท่านั่นเอง