EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: Jummum on กันยายน 01, 2010, 11:34:56 pm
-
พอดีผมอ่านจากกระทู้เก่าๆมาเรื่องการเอาค่าจากอินดิเคเตอร์มาใช้ตามนี้เลย
double a,b,c;
if( เส้นแรก == เส้นสอง หรือ คอนดิชั่นที่คิดว่ามันตัดกันหรืออะไรก็ได้ที่เป็น event ของคุณ)
{
c=b;
b=a;
a=ค่าที่อยากบันทึก อะไรก็ว่ากันไป ;
}
ใช้ได้กับอะไรก็ได้ที่ส่งค่าออกมา ไม่ได้ส่งค่า null ออกมา
แต่พอเขียนตามแล้วเหมือนมัไม่สามารถอ่านค่าได้ ช่วยอธิบายหน่อยครับ
ขอตัวอย่างด้วยจะขอบคุณมาก
-
ถ้าคุณต้องการ EA ที่เปิดจากการตัดกันของ อินดิเคเตอร์ ลองเอา code เก่าตัวนี้ไปดูครับเป็น EA ที่จะเปิดเมื่อค่าของเส้น MA ตัดกับราคาปัจจุบันครับ
int check (double bidprice ,double sma) // ฟังก์ชั่นตรวจสอบการตัดกัน
{ static int lastway =0;
static int way =0;
if(bidprice > sma)
{
way=1;
}
if(bidprice < sma)
{
way=2;
}
if(way!= lastway)
{
lastway = way;
return (lastway);
}
return (0);
}
int start()
{
double ma =iMA(NULL,0,13,0,MODE_SMMA,PRICE_MEDIAN,0);
int kway = check(Bid,ma); // เรียกใช้งานฟังก์ชั่นตรวจสอบ
int total =OrdersTotal();
int ticket;
double Lots=0.1;
if(total==0)
{
if(kway==1)
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Point*20,Ask+Point*10,"smaaa",0,0,Green);
}
if(kway==2)
{
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Point*20,Bid-Point*10,"smaaa",555,0,Red);
}
}
return(0);
}
-
ขอบคุนครับ พอดีเพิ่งศึกษา
ไม่เข้าใจอันนี้
if(way!= lastway)
{
lastway = way;
return (lastway);
}
return (0);
หมายความว่าอะไรครับ
-
if(way!= lastway)
{
lastway = way;
return (lastway);
}
return (0);
เป็นการตรวจสอบการตัดครับ way เป็นตัวแปรที่เราให้บันทึกการตัดครั้งสุดท้ายเอาไว หากเราตรวจสอบได้ว่าปัจจุบัน ราคากับ ma เกิดการเปลี่ยนแปลงจาก way ก็คือมีการตัดกันเกิดขึ้นครับ
-
เข้าใจยากจังครับ!!
ขอรบกวนอีกหน่อยแล้วถ้าจะบันทึกค่าไว้
คือเจตนาอยากได้สามค่าที่ตัดขึ้นล่าสุดน่ะครับ
-
จะบันทึกค่าใช่ไหมครับ มี 2 วิธีคือ
1.คือใช้ตัวแปร แบบ static โดยประกาศก่อนฟังก์ชั่น start()
static int way;
int start()
{
}
แบบนี้ตัวแปร way จะจำค่าเอาไวจนกว่าเราจะปิด EA หรือมีการเปลี่ยนแปลงค่าครับ
2.วิธีที่ 2 คือการเขียนลงไฟล์วิธีการนี้ยุ่งยากครับเพราะต้องมีการอ่านไฟล์ และ เขียนไฟล์ควบคู่กันครับแต่วิธีนี้ค่าที่ได้จะอยู่ถึงแม้เราจะปิด EA ก็ตามก้เหมือนการ save ไฟล์ทั่วไปครับ
-
คือช่วยแก้ให้ผมหน่อย คือพยายามแล้วแต่ไม่ได้
ยังไงมันก็ไม่จำค่าน่ะครับ
จุดประสงค์คือ Stochistic ตัดขึ้นสามครั้ง ค่าน้อยลงเรื่อยๆ
ให้เปิดสัญญาซื้อ ต่อมาถ้าตัดลงให้เปิดสัญญา
-
จุดประสงค์คือ Stochistic ตัดขึ้นสามครั้ง ค่าน้อยลงเรื่อยๆ งง ตรงนี้หละครับช่วยอธิบายให้ละเอียดหน่อยครับ
-
ก็คือสมุติ ตัดขึ้นครั้งที่ 1 = 30; 2=25; 3=20
ก็จะเปิดสัญญา เลยอยากหาวิธีจำค่าที่ตัดกันไว้เพื่อเอามาเทียบน่ะครับ
แต่stoตอนที่ตัดกันมันไม่มีค่า(ใช้โปรแกรมของแอดมินดู)เลยใช้ก่อนหลังบวกกันหารสองแทน
ขอบคุนที่ตอบ แล้วก็ขอบคุนล่วงหน้าที่ช่วยแก้ให้ครับ
-
งั้นถามต่อ การตัดนี้เราเริ่มนับ 1 จากตอนที่เปิด EA ใช่ไหมครับ ตัดครั้งแรกก็เก็บค่าไวที่ตัวแปรตัวแรก ตัวครั้งที่ 2 ก็เก็บค่าไวตัวแปรตัวที่ 2 ตัดครั้งที่ 3 ก็เก็บค่าไวตัวแปรตัวที่ 3 ใช่ไหม
-
ใช่ครับ ช่วยหน่อยนะครับ
พอดีผมอ่านมาจากเวบนอกเรื่องเอาไปใช้
มีทั้งดูไดเวิด ดูค่าอย่างที่บอกหาจุดกลับตัว
แต่ยังไงก็ต้องหาวิธีอ่านค่าที่ตัดกันออกมาก่อน
ก็อยากเอามาพัฒนาต่อ รบกวนด้วยนะครับ
-
ลองเอาไปดูครับ
extern double Lots=0.1;
extern int SL=20;
extern int TP=10;
static double one;
static double two;
static double three;
int check (double stosignal ,double stomain)
{ static int lastway =0;
static int way =0;
if(stosignal > stomain)
{
way=1;
}
if(stosignal < stomain)
{
way=2;
}
if(way!= lastway)
{
lastway = way;
if( ( one == 0) && (two == 0) && (three== 0) )
{
one=Bid;
return(0);
}
if( ( one != 0) && (two == 0) && (three== 0) )
{
two=Bid;
return(0);
}
if( ( one != 0) && (two != 0) && (three== 0) )
{
three=Bid;
return(0);
}
if( ( one != 0) && (two != 0) && (three!= 0) )
{ one=Bid;
two=0;
three=0;
return(0);
}
}
return (0);
}
int start()
{
double stomain=iStochastic(Symbol(),30,5,5,5,MODE_SMA,1,MODE_MAIN,0);
double stosignal=iStochastic(Symbol(),30,5,5,5,MODE_SMA,1,MODE_SIGNAL,0);
int kway = check(stosignal,stomain);
int total =OrdersTotal();
if(total==0)
{
if(one > (two > three) )
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Point*SL,Ask+Point*TP,"smaaa",0,0,Green);
}
if(one < (two < three) )
{
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Point*SL,Bid-Point*TP,"smaaa",555,0,Red);
}
}
return(0);
}
-
สงสัยครับว่า one=Bid Bid คืออะไร ราคาในตอนนั้นหรือป่่าว
เอาไปรันแล้วมันไม่เห็นจำค่าเลย
ก็ยังเข้าทุกครั้งที่ตัดกันเหมือนเดิมอ่ะ
-
one = Bid คือให้มันจำค่าตอนตัด ที่มันยังเปิดอยู่เพราะเงื่อไขการเปิดนี้ครับ
if(total==0)
{
if(one > (two > three) )
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Point*SL,Ask+Point*TP,"smaaa",0,0,Green);
}
if(one < (two < three) )
{
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Point*SL,Bid-Point*TP,"smaaa",555,0,Red);
}
}
คุณต้องเอาไปเขียนต่อเองครับว่าจะให้มันทำงานยังไง ค่าจะถูกจำอยู่ใน ตัวแปร one two three ครับ ลอง print ออกมาดูครับ
-
ผมคงอธิบายงง..
คือเอาแบบในรูปอ่ะครับ คงเข้าใจง่ายผมอธิบาย
ตัดขึ้นแต่ละครั้งค่าจุดตัดของStoมากขึ้นเรื่อยๆ
ดูเหมือนง่ายแต่พยายามเท่าไหร่ก็เขียนไม่ได้
เอาค่าจุดตัดออกมาไม่ได้ ช่วยทีนะครับ
ขอบคุณอีกครั้ง แล้วก็ขอโทดที่ทำให้เสียเวลาหลายรอบ ;D
-
ลอง copy ไปแล้ว backtest ดู ค่าผมสั่งให้ print ออกมาดูแล้วครับ แต่ถ้าจะให้ sure รวันจันทร์ตลาดเปิดแล้วค่อยดูอีกทีเพราะ backtest ไม่แน่นอน
extern double Lots=0.1;
extern int SL=20;
extern int TP=10;
static double one =0;
static double two = 0;
static double three = 0;
static int lastway =0;
int check (double stosignal ,double stomain)
{
static int way =0;
if(stosignal > stomain)
{
way=1;
}
if(stosignal < stomain)
{
way=2;
}
if(way==2)
{
lastway=2;
}
if(way == 1 && lastway!= way)
{
lastway = 1;
if( ( one == 0) && (two == 0) && (three== 0) )
{
one=Bid;
return(0);
}
if( ( one != 0) && (two == 0) && (three== 0) )
{
two=Bid;
return(0);
}
if( ( one != 0) && (two != 0) && (three== 0) )
{
three=Bid;
return(0);
}
}
return (0);
}
int start()
{
double stomain=iStochastic(Symbol(),30,5,5,5,MODE_SMA,1,MODE_MAIN,0);
double stosignal=iStochastic(Symbol(),30,5,5,5,MODE_SMA,1,MODE_SIGNAL,0);
check(stosignal,stomain);
Print("A :",one);
Print("B :",two);
Print("C :",three);
Print(".....");
// ถ้าจะเอาไปใช้งานจริงๆๆให้เอา /* */ ออกไม่งั้นค่าจะไม่ถูกล้าง
/* if( ( one != 0) && (two != 0) && (three!= 0) )
{ one=0;
two=0;
three=0;
}
*/
return(0);
}
-
เอาไปรันแล้วครับ แต่...
คือค่าที่ได้เป็นค่า ราคา ไม่ใช่ค่าของ Stochastic อ่ะครับ
ตอนแรกพยายามทำเองอ่ะก็เอามาได้แต่ราคานี่ล่ะครับ แต่ค่าStoนี่จนปัญญาจริงๆ
-
สรูปคือ ต้องการค่าของ Sto ที่มันตัดกันใช่ไหมไม่ใช่ราคา ผมเห็นรูปที่คุณโพส มีลูกศรชี้ไปที่กราฟราคาอ่ะ ถ้าอยากได้ค่า ณ จุดตัดเลยคงเป็นไปไม่เพราะ sto มันคำนวณจากหน้ากลับไปหลังมันเกิดการตัดกันแล้ว อินมันถึงแสดงจุดตัดให้เราเห็น แต่หาค่าได้ใกล้เคียงที่จุดคือ การเอาค่าที่มันตัดกันแล้ว ณ จุดแรกมาเฉลี่ย ครับ
int check (double stosignal ,double stomain)
{
static int way =0;
if(stosignal > stomain)
{
way=1;
}
if(stosignal < stomain)
{
way=2;
}
if(way==2)
{
lastway=2;
}
if(way == 1 && lastway!= way)
{
lastway = 1;
if( ( one == 0) && (two == 0) && (three== 0) )
{
one=(stosignal+stomain)/2;
return(0);
}
if( ( one != 0) && (two == 0) && (three== 0) )
{
two=(stosignal+stomain)/2;
return(0);
}
if( ( one != 0) && (two != 0) && (three== 0) )
{
three=(stosignal+stomain)/2;
return(0);
}
}
return (0);
}
-
ขอบคุณครับ ได้แล้วๆแต่ไม่ค่อยดีเลยครับ
จะลองเอาค่าตัดลงมาคิดด้วยดู
ผมเขียนแบบนี้ดูปรากดว่าจำแต่ค่าตัดขึ้น
คิดเองนะครับไม่รู้ถูกรึป่าวครับ(คิดว่าผิดเพราะไม่อ่านค่า)
int check (double stosignal ,double stomain)
{
static int way =0;
if(stosignal < stomain)
{
way=1;
}
if(way==1)
{
lastway2=1;
}
if(stosignal > stomain)
{
way=2;
}
//-----------------four five six-----------------------------------
if(way == 2 && lastway2!= way)
{
lastway2 = 1;
if( ( four == 0) && (five == 0) && (six== 0) )
{
four=stosignal;
return(0);
}
if( ( four != 0) && (five == 0) && (six== 0) )
{
five=stosignal;
return(0);
}
if( ( four != 0) && (five != 0) && (six== 0) )
{
six=stosignal;
return(0);
}
}
//-----------------one two three-----------------------------------
if(way==2)
{
lastway=2;
}
if(way == 1 && lastway!= way)
{
lastway = 1;
if( ( one == 0) && (two == 0) && (three== 0) )
{
one=stosignal;
return(0);
}
if( ( one != 0) && (two == 0) && (three== 0) )
{
two=stosignal;
return(0);
}
if( ( one != 0) && (two != 0) && (three== 0) )
{
three=stosignal;
return(0);
}
}
return (0);
}
ขอรบกวนอีกครั้ง นะครับพยายาาทำเองตั้งแต่เมื่อคืนไม่เป็นผลเลย
-
จำแต่ตัดขึ้นทุกต้องครับ เพราะตัวนี้ผมเขียนตามรูปที่คุณโพสไว ขึ้น 3 ครั้งเปิด buy ผมว่าต้องรอการทำงานในตลาดจริงค่อยพัฒนาต่อครับ จากที่ดู code มันน่าจะผิดตรงเงื่อนไขการแยกตัดขึ้นหรือตัดลงครับ
-
คือที่คุณAdmin เขียนให้ก็ได้ค่าตัดขึ้นแล้ว
แต่อยากจำค่าตัดลงด้วยพอทำได้มั๊ยครับ
พยายามเขียนเพิ่มเองให้จำค่าตัดลง
แต่มันไม่ยอมจำเลยเอามาโพสขอคำแนะนำว่าเขียนผิดยังไง
หรือต้องแก้ยังไงให้รบกวนด้วยครับ
-
แบบนี้น่าจะได้แล้วนะลองเอาทดสอบดูครับ
static double one =0;
static double two = 0;
static double three = 0;
static int lastway =0;
static double four =0;
static double five = 0;
static double six = 0;
static int lastway2 =0;
int check (double stosignal ,double stomain)
{
static int way =0;
if(stosignal > stomain)
{
way=1;
}
if(stosignal < stomain)
{
way=2;
}
if(way==2)
{
lastway=2;
}
if(way==1)
{
lastway2=1;
}
if(way == 1 && lastway!= way)
{
lastway = 1;
if( ( one == 0) && (two == 0) && (three== 0) )
{
one=(stosignal+stomain)/2;
return(0);
}
if( ( one != 0) && (two == 0) && (three== 0) )
{
two=(stosignal+stomain)/2;
return(0);
}
if( ( one != 0) && (two != 0) && (three== 0) )
{
three=(stosignal+stomain)/2;
return(0);
}
}
if(way == 2 && lastway2!= way)
{
lastway2 = 2;
if( ( four == 0) && (five == 0) && (six== 0) )
{
four=(stosignal+stomain)/2;
return(0);
}
if( ( four != 0) && (five == 0) && (six== 0) )
{
five=(stosignal+stomain)/2;
return(0);
}
if( ( four != 0) && (five != 0) && (six== 0) )
{
six=(stosignal+stomain)/2;
return(0);
}
}
return (0);
}
-
ขอบคุณมากเลยครับ