ในการเขียน EA บางครั้งเราจำเป็นต้องแสดงผลของค่าบางค่าที่เราต้องการบน Chart เพื่อให้ง่ายต่อการตรวจสอบผลการทำงานของ EA ว่าทำงานได้ถูกต้องตามเงื่อนไขที่เราตั้งไว้หรือไม่
จากตัวอย่างด้านล่างเป็นการแสดงผลขอกำไร/ขาดทุนของ Order ที่เราเปิดอยู่ ซึ่งจะแสดงหมายเลข Ticket และ Profit ที่เกิดขึ้น
ตัวอย่างการเขียนโค๊ด
วันศุกร์ที่ 14 กันยายน พ.ศ. 2555
วันพุธที่ 5 กันยายน พ.ศ. 2555
สอนวิธีการเขียน EA เพื่อทำการปิด Order
ในการเขียน EA เพื่อช่วยในการเทรด Forex แบบอัตโนมัตินั้น การส่งคำสั่งเพื่อปิด Order นั้นถือเป็นส่วนหนึ่งที่มีความสำคัญอีกส่วนหนึ่ง เราต้องทำความเข้าใจถึงแนวคิดและขั้นตอนในการทำงานของการปิด Order เพื่อลดความผิดพลาดที่จะเกิดขึ้น
ทุกครั้งที่มีการเปลี่ยนแปลงราคา Server จะส่งสัญญาณกลับมายัง Client ฟังก์ชั่น start จะทำงาน
int start () {
/* สมมติว่าเราได้วิเคราะห์สัญญาณแล้วปรากฏว่าถึงจุดที่เราจะต้องทำการปิด Order */
/* ทำการเรียกฟังก์ชั่นเพื่อปิด Order จากตัวอย่างจะทำการปิด Order ซึ่งมีการเปิดแบบ BUY */
if(closeOrder(OP_BUY)) {
/* ปิด Order สำเร็จ Order */
} else {
/* ปิด Order ไม่สำเร็จสำเร็จ Order */
}
return(0);
}
เราเขียนฟังก์ชั่นการปิด Order แยกออกมาจากส่วนของฟังก์ชั่น start เพื่อให้ง่ายต่อการแก้ไขแล้วตรวจสอบหากมีการทำงานผิดพลาดเกิดขึ้น จากฟังก์ชั่น closeOrder จะเห็นว่า Input ที่จะป้อนให้แก่ฟังก์ชั่นนี้คือ ลักษณะของฟังก์ชั่นที่เปิดเป็น BUY หรือ SELL ถ้าต้องการปิด Order ที่เปิดเป็น BUY ก็ส่งค่า OP_BUY และถ้าต้องการปิด Order ที่เปิดแบบ SELL ก็ส่ง OP_SELL มาให้ฟังก์ชั่น closeOrder หลังจากที่ประมวลผลเสร็จแล้ว ฟังก์ชั่น closeOrder จะส่งค่าคืนให้กับฟังก์ชั่นที่มีการเรียก closeOrder ซึ่งก็คือฟังก์ชั่น start โดยข้อมูลที่ส่งกลับเป็นชนิดบูลีน ซึ่งถ้าปิด Order สำเร็จจะส่ง true กลับ แต่หากปิด Order ไม่สำเร็จจะส่งค่า false กับ ดังนั้นที่ฟังก์ชั่น start ต้องทำการตรวจสอบค่าผลการทำงานของการปิด Order ว่าสำเร็จหรือไม่
ทุกครั้งที่มีการเปลี่ยนแปลงราคา Server จะส่งสัญญาณกลับมายัง Client ฟังก์ชั่น start จะทำงาน
int start () {
/* สมมติว่าเราได้วิเคราะห์สัญญาณแล้วปรากฏว่าถึงจุดที่เราจะต้องทำการปิด Order */
/* ทำการเรียกฟังก์ชั่นเพื่อปิด Order จากตัวอย่างจะทำการปิด Order ซึ่งมีการเปิดแบบ BUY */
if(closeOrder(OP_BUY)) {
/* ปิด Order สำเร็จ Order */
} else {
/* ปิด Order ไม่สำเร็จสำเร็จ Order */
}
return(0);
}
เราเขียนฟังก์ชั่นการปิด Order แยกออกมาจากส่วนของฟังก์ชั่น start เพื่อให้ง่ายต่อการแก้ไขแล้วตรวจสอบหากมีการทำงานผิดพลาดเกิดขึ้น จากฟังก์ชั่น closeOrder จะเห็นว่า Input ที่จะป้อนให้แก่ฟังก์ชั่นนี้คือ ลักษณะของฟังก์ชั่นที่เปิดเป็น BUY หรือ SELL ถ้าต้องการปิด Order ที่เปิดเป็น BUY ก็ส่งค่า OP_BUY และถ้าต้องการปิด Order ที่เปิดแบบ SELL ก็ส่ง OP_SELL มาให้ฟังก์ชั่น closeOrder หลังจากที่ประมวลผลเสร็จแล้ว ฟังก์ชั่น closeOrder จะส่งค่าคืนให้กับฟังก์ชั่นที่มีการเรียก closeOrder ซึ่งก็คือฟังก์ชั่น start โดยข้อมูลที่ส่งกลับเป็นชนิดบูลีน ซึ่งถ้าปิด Order สำเร็จจะส่ง true กลับ แต่หากปิด Order ไม่สำเร็จจะส่งค่า false กับ ดังนั้นที่ฟังก์ชั่น start ต้องทำการตรวจสอบค่าผลการทำงานของการปิด Order ว่าสำเร็จหรือไม่
วันอาทิตย์ที่ 2 กันยายน พ.ศ. 2555
ตัวอย่างการเขียน EA เพื่อเปิด Order โดยครอบคลุมทั้ง BUY และ SELL
การเขียนโปรแกรมที่ดีควรเขียนแยกการทำงานออกเป็นส่วนๆหรือที่เรียกว่าฟังก์ชั่น เพื่อให้ง่ายต่อการวิเคราะห์ในการหาข้อผิดพลาดจากการทำงานของโปรแกรม การเขียน EA ก็เหมือนกัน ถ้าเราเขียนโดยแยกออกเป็นฟังก์ชั่นก็จะทำให้ง่ายต่อการแก้ไขปรับปรุง ในกรณีที่เราต้องการปรับเปลี่ยนเทคนิคในการเทรด
มาดูฟังก์ชั่นในการเปิด Order ซึ่งเป็นฟังก์ชั่นหลักฟังก์ชั่นหนี่งของ EA ก็ว่าได้ เพราะถ้าฟังก์ชั่นนี้ทำงานผิดพลาดนั่นหมายถึงหายนะกำลังมาเยือน เพราะฉะนั้นต้องมั่นใจว่าฟังก์ชั่นนี้จะไม่ทำงานผิดพลาด ไม่ว่าสถานการณ์ของตลาดจะผันผวนก็ตาม
/* ฟังก์ชั่นนี้จะทำงานเมื่อมีสัญญาณมาจากฝั่ง Server */
int start(){
/* เมื่อเราตรวจสอบราคาด้วยอินดิเคเตอร์ใดๆแล้ว แล้วถึงจุดที่ต้องการเปิด Order */
/* ยกตัวอย่าง ถ้าต้องการเปิด ORDER BUY และ Lotsize เท่ากับ 1
openOrder(OP_BUY,1);
/* ยกตัวอย่าง ถ้าต้องการเปิด ORDER SELL และ Lotsize เท่ากับ 1
openOrder(OP_SELL,1);
return(0);
}
/* ฟังก์ชั่นสำหรับเปิด Order
bool openOrder(int cmd,double lot,double tp=0.0) {
int ticket,count;
int error;
double price;
count = 0;
ticket = -1;
/* วนลูปเพื่อส่งคำสั่งซื้อจนกว่าจะเปิด Order ได้ แต่ไม่เกิน 5 ครั้ง */
while((ticket<0) && (count < 5)){ /* ถ้าเป็นคำสั่ง BUY ให้ซื้อที่ Ask */ if(cmd==OP_BUY) price=Ask; /* ถ้าเป็นคำสั่ง SELL ให้ซื้อที่ Bid */ else price=Bid; /* ถ้าเป็นคำสั่ง BUY */ if(cmd==OP_BUY){ ticket=OrderSend(Symbol(),OP_BUY,lot,price,3,0.0,tp,NULL,255,0,CLR_NONE); /* ตรวจสอบว่าเปิด Order สำเร็จรึปล่าว */ if(ticket<0){ error = GetLastError(); Print("Error:Send Buy Order LastError = ",error," price=",price); /* ถ้า error code เกี่ยวกับราคาที่เปลี่ยนไปจากราคาที่ต้องการให้อ่านค่าใหม่ */ if(error==129 || error==135 || error==146 || error==138){ RefreshRates(); } }else{ /* ได้รับค่า ticket แสดงว่าเปิด Order สำเร็จ */ return (true); } /* ถ้าเป็นคำสั่ง SELL */ }else { ticket=OrderSend(Symbol(),OP_SELL,lot,price,3,0.0,tp,NULL,255,0,CLR_NONE); if(ticket<0 ){ error = GetLastError(); Print("Error:Send Sell Order LastError = ",error," price=",price); if(error==129 || error==135 || error==146 || error==138){ RefreshRates(); } }else { /* เปิด Order สำเร็จ */ return (true); } } /* เปิด Order ไม่สำเร็จกับไปเปิดใหม่ */ count++; } /* ไม่สามารถเปิด Order ได้ */ return (false); }
มาดูฟังก์ชั่นในการเปิด Order ซึ่งเป็นฟังก์ชั่นหลักฟังก์ชั่นหนี่งของ EA ก็ว่าได้ เพราะถ้าฟังก์ชั่นนี้ทำงานผิดพลาดนั่นหมายถึงหายนะกำลังมาเยือน เพราะฉะนั้นต้องมั่นใจว่าฟังก์ชั่นนี้จะไม่ทำงานผิดพลาด ไม่ว่าสถานการณ์ของตลาดจะผันผวนก็ตาม
/* ฟังก์ชั่นนี้จะทำงานเมื่อมีสัญญาณมาจากฝั่ง Server */
int start(){
/* เมื่อเราตรวจสอบราคาด้วยอินดิเคเตอร์ใดๆแล้ว แล้วถึงจุดที่ต้องการเปิด Order */
/* ยกตัวอย่าง ถ้าต้องการเปิด ORDER BUY และ Lotsize เท่ากับ 1
openOrder(OP_BUY,1);
/* ยกตัวอย่าง ถ้าต้องการเปิด ORDER SELL และ Lotsize เท่ากับ 1
openOrder(OP_SELL,1);
return(0);
}
/* ฟังก์ชั่นสำหรับเปิด Order
bool openOrder(int cmd,double lot,double tp=0.0) {
int ticket,count;
int error;
double price;
count = 0;
ticket = -1;
/* วนลูปเพื่อส่งคำสั่งซื้อจนกว่าจะเปิด Order ได้ แต่ไม่เกิน 5 ครั้ง */
while((ticket<0) && (count < 5)){ /* ถ้าเป็นคำสั่ง BUY ให้ซื้อที่ Ask */ if(cmd==OP_BUY) price=Ask; /* ถ้าเป็นคำสั่ง SELL ให้ซื้อที่ Bid */ else price=Bid; /* ถ้าเป็นคำสั่ง BUY */ if(cmd==OP_BUY){ ticket=OrderSend(Symbol(),OP_BUY,lot,price,3,0.0,tp,NULL,255,0,CLR_NONE); /* ตรวจสอบว่าเปิด Order สำเร็จรึปล่าว */ if(ticket<0){ error = GetLastError(); Print("Error:Send Buy Order LastError = ",error," price=",price); /* ถ้า error code เกี่ยวกับราคาที่เปลี่ยนไปจากราคาที่ต้องการให้อ่านค่าใหม่ */ if(error==129 || error==135 || error==146 || error==138){ RefreshRates(); } }else{ /* ได้รับค่า ticket แสดงว่าเปิด Order สำเร็จ */ return (true); } /* ถ้าเป็นคำสั่ง SELL */ }else { ticket=OrderSend(Symbol(),OP_SELL,lot,price,3,0.0,tp,NULL,255,0,CLR_NONE); if(ticket<0 ){ error = GetLastError(); Print("Error:Send Sell Order LastError = ",error," price=",price); if(error==129 || error==135 || error==146 || error==138){ RefreshRates(); } }else { /* เปิด Order สำเร็จ */ return (true); } } /* เปิด Order ไม่สำเร็จกับไปเปิดใหม่ */ count++; } /* ไม่สามารถเปิด Order ได้ */ return (false); }
พยายามคิดการทำงานออกมาให้เป็นส่วนๆ แต่ละส่วนทำงานแยกขาดออกจากกัน จะทำให้เราได้ฟังก์ชั่นที่สามารถนำเอาไปใช้ทำงานร่วมกับ EA ตัวอื่นได้ ขอให้สนุกับการเขียน EA ครับ
ป้ายกำกับ:
ตัวอย่างการเขียน EA
สมัครสมาชิก:
บทความ (Atom)