วันศุกร์ที่ 14 กันยายน พ.ศ. 2555

การเขียน EA เพื่อแสดงข้อความบน Chart

        ในการเขียน EA บางครั้งเราจำเป็นต้องแสดงผลของค่าบางค่าที่เราต้องการบน Chart เพื่อให้ง่ายต่อการตรวจสอบผลการทำงานของ EA ว่าทำงานได้ถูกต้องตามเงื่อนไขที่เราตั้งไว้หรือไม่
        จากตัวอย่างด้านล่างเป็นการแสดงผลขอกำไร/ขาดทุนของ Order ที่เราเปิดอยู่ ซึ่งจะแสดงหมายเลข Ticket และ Profit ที่เกิดขึ้น



ตัวอย่างการเขียนโค๊ด

วันพุธที่ 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 ว่าสำเร็จหรือไม่

วันอาทิตย์ที่ 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); }

    พยายามคิดการทำงานออกมาให้เป็นส่วนๆ แต่ละส่วนทำงานแยกขาดออกจากกัน จะทำให้เราได้ฟังก์ชั่นที่สามารถนำเอาไปใช้ทำงานร่วมกับ EA ตัวอื่นได้ ขอให้สนุกับการเขียน EA ครับ