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



        จากตัวอย่างฟังก์ชั่น closeOrder นี้ เป็นการปิด Order แรก Order เดียว


    bool closeOrder(int cmd) {
        int count_close = 0;
double sp,price;
bool result;
int error;
string XSymbol;
int order_totals;
int i,count;


        /* วนลูปเพื่อตรวจสอบ Order */
        for(i=0;i<OrdersTotal();i++) {

            /* เลือกตรวจสอบเฉพาะ Order ที่กำลังเปิดอยู่ */
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {

                /* เลือกตรวจสอบเฉพาะคู่เงินที่ตรงกับคู่ที่ EA รันอยู่ */
                if(OrderSymbol()==Symbol()) {

                    /* ตรวจอบว่า Order เปิดแบบตรงกับที่ต้องการปิดรึปล่าว */
                    if(cmd==OrderType()) {

                        count = 0;
                        result=false;

                        /* วนลูปจนกว่าจะปิด Order ได้ แต่ไม่เกิน 5 ครั้ง */
                        while ((result == false) && (count < 5)) {

                            /* เก็บค่าของ Order ที่กำลังตรวจสอบ*/
                            XSymbol = OrderSymbol();

                            /* ถ้า Order เปิดแบบ BUY จะอ่านค่าราคา Bid ที่จะปิด */
                            if(cmd==OP_BUY) price=MarketInfo(XSymbol,MODE_BID);

                            /* ถ้า Order เปิดแบบ SELL จะอ่านค่าราคา ASK ที่จะปิด */
                            if(cmd==OP_SELL) price=MarketInfo(XSymbol,MODE_ASK);

                            sp = GetSlippage(XSymbol);

                            /* ส่งคำสั่งเพื่อปิด Order */
                            result=OrderClose(OrderTicket(),OrderLots(),price,sp,CLR_NONE);

                            /* ถ้าไม่สามารถปิด Order ได้ */
                            if(!result) {
                                error=GetLastError();
                                Print("LastError = ",error," price=",price," Slippage=",sp);
                                if(error==129 || error==135 || error==146 || error==138) { RefreshRates(); }

                            /* สามารถปิด Order ได้ */
                            } else {
                                /* ส่งค่า true กลับไป */
                                return (true);
                            }
                            count++;
                        }

                        /* ไม่สามารถปิด Order ได้ ส่งค่า false กลับ */
                        return (false);
                    }
                }
            }
        }
    }



        ฟังก์ชั่น GetSlippage ใช้คำนวนหาค่าความต่างของราคา ask กับ bid ว่าต่างกันกี่จุด


    double GetSlippage(string XSymbol) {

        /* อ่านค่า ราคา Bid */
        double bid = MarketInfo(XSymbol,MODE_BID);

        /* อ่านค่าราคา Ask */
        double ask = MarketInfo(XSymbol,MODE_ASK);

        /* อ่านค่า point */
        double point = MarketInfo(XSymbol,MODE_POINT);

        return((ask-bid)/point);
    }


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