MyBanner

โฆษณา

วันอาทิตย์ที่ 8 พฤศจิกายน พ.ศ. 2558

แกะรอย EA ตัวอย่างสำหรับ Forex ชื่อ Moving Average



         หลังจากที่ติดตั้งโปรแกรม MT4 (MetaTrader 4) ใหม่ๆ ไม่ว่าท่านจะดาวน์โหลดตัวติดตั้งโปรแกรม MT4 มาจากโปรกเกอร์ค่ายใด เมื่อทำการเรียกโปรแกรมขึ้นมาทำงานบนเดสก์ท็อปของคอมพิวเตอร์ ถ้าเราเข้าไปดูที่หัวข้อ Expert Adviser ในกรอบ Navigator ของโปรแกรม MT4 ดังกล่าว จะพบว่ามีชื่อของโปรแกรม Expert Adviser หรือ EA แถมมาให้ 2 โปรแกรมคือ Moving Average และ Macd Sample ซึ่งโปรแกรม EA ทั้งสองชุดจะเป็นตัวอย่างสำหรับใช้ศึกษาเรื่องของวิธีการเขียนโปรแกรม Expert Adiviser หรือโปรแกรมสำหรับเปิดคำสั่งซื้อ/ขายในตลาด Forex ส่วน EA ทั้งสองชุดนี้จะใช้งานจริงได้หรือไม่นั้น ต้องติดตามได้จากเรื่องราวที่เรากำลังแกะรอยในครั้งนี้

Moving Average

ขอเริ่มต้นที่ EA ชื่อ Maving Average หรือ Moving Average Sample Expert Adviser ในชื่อเต็ม เป็น EA ตัวอย่าง เนื่องจากมีต้นฉบับโปรแกรม หรือ Source Code ของตัว EA แถมมาด้วย (แฟ้ม Moving Average.mq4) EA ดังกล่าวเป็นลิขสิทธิ์ของ MetaQuortes Software Corp. หรือบริษัทที่พัฒนาโปรแกรม MT4 ขึ้นมานั่นเอง

-ลักษณะทั่วไป


Moving Average ดังกล่าวเป็น EA ที่ทำการเปิดคำสั่งซื้อ/ขาย (Order) โดยใช้อินดิเคเตอร์ (Indicator) ชื่อ Moving Average (MA) โดยใช้การคำนวณแบบ Simple (Mode-SMA) โดยผู้นำไปใช้สามารถกำหนดค่า MA ได้เอง แต่ค่าปริยาย (default) จะเป็น 12 (ค่าของ Moving Periad) ใช้ได้กับทุกๆ คู่เงิน และจะทำงานบนกรอบเวลา (Time frame) ปัจจุบัน หมายถึง เราทำการวาง EA ชุดนี้บน timeframe ไหน ตัว EA จะทำงานบน timefame นั้น
เป็น EA ที่มีการกำหนดขนาดล็อตอัตโนมัติ โดยกำหนดจำนวนล็อตเริ่มต้นสำหรับการหาค่าล็อตเท่ากับ 0.1 วิธีการหาจะใช้วิธีการเปรียบเทียบจากคำสั่งซื้อ/ขายที่เปิดค้างอยู่ตามจำนวนรายการที่ระบุในค่าของ DecreaseFactor โดยค้าปริยายจะกำหนดไว้เท่ากับ 3 ซึ่งหมายถึง EA ชุดนี้จะนับจำนวนรายการของคำสั่งซื้อ/ขายที่ยังติดลบอยู่แล้วใช้ค่า DereaseFactor เป็นตัวหาร เพื่อหาขนาดของล็อตที่เหมาะสมสำหรับคำสั่งซื้อ/ขายคำสั่งถัดไป
ค่า DecreaseFactor สามารถกำหนดค่าเป็น 0 ได้ แต่อย่างไรก็ดี ถ้าผลการคำนวณปรากฏว่าค่าล็อตต่ำกว่า 0.1 โปรแกรม Maving Average กำหนดค่าล็อตให้เท่ากับ 0.1 ดังนั้น ถ้าจะใช้ EA ชุดนี้โดยไม่มีการปรับปรุงแก้ไขใดๆ เราจะต้องมีเงินเริ่มต้นไม่น้อยกว่า 1,000 $ หรือ 1000 cent แล้วแต่ประเภทของบัญชีที่เราเปิดใช้
ตัว EA จะเริ่มทำงานเมื่อมีการเปลี่ยนแปลงขึ้น/ลงของราคา (OnTick) หลังจากที่เราสั่ง EA ให้ทำงาน โดยจะเริ่มเปิดคำสั่งซื้อ/ขายเมื่อแท่งราคาผ่านไปแล้ว 100 แท่ง การตรวจสอบเงื่อนไขสำหรับการเปิดคำสั่งซื้อ/ขาย จะใช้แท่งราคาแท่งที่ผ่านมาในการตรวจสอบ เป็น EA ที่มีไมมีการกำหนดค่า Stop loss และค่า Take Profit (sl / tp) และจะเปิดคำสั่งซื้อหรือขายอย่างละ 1 คำสั่งเท่านั้น

-เงื่อนไขในการเปิดและปิดคำสั่งซื้อ (Long / Buy)

เงื่อนไขในการเปิดคำสั่งซื้อ หรือ Buy ของ EA ชุดนี้จะเปิดคำสั่งซื้อ หรือ Buy เมื่อตรวจพบว่าราคาเปิด (Open) ของแท่งราคาแท่งที่ผ่านมามีค่าน้อยกว่าค่าของ MA และ ราคาปิด (close) ของแท่งราคาแท่งที่ผ่านมามีค่ามากกว่าค่าของ MA
ส่วนเงื่อนไขในการปิดคำสั่งซื้อ หรือ Buy เมื่อ EA ตรวจพบว่า ราคาเปิดของแท่งราคาแท่งที่ผ่านมามีค่า มากกว่าค่า MA และราคาปิดน้อยกว่าค่า MA

-เงื่อนไขในการเปิดและปิดคำสั่งขาย (Short / Sell)

เงื่อนไขในการเปิดคำสั่งขาย หรือ Sell ของ EA ชุดนี้จะทำการเปิดคำสั่งขาย หรือ Sell เมื่อตรวจพบว่าราคาเปิด (Open) ของแท่งราคาแท่งที่ผ่านมามีค่ามากกว่าค่าของ MA และ ราคาปิด (close) ของแท่งราคาแท่งที่ผ่านมามีค่าน้อยกว่าค่าของ MA
ส่วนเงื่อนไขในการปิดคำสั่งขาย หรือ Sell เมื่อ EA ตรวจพบว่า ราคาเปิดของแท่งราคาแท่งที่ผ่านมามีค่า น้อยกว่าค่า MA และราคาปิดมากกว่าค่า MA

สรุปก็คือ EA ชุดนี้จะทำการเปิด/ปิดคำสั่งซื้อขาย เมื่อแท่งราคาแท่งที่ผ่านมาทับกับเส้น MA โดยดูจากเงื่อนไขการเปิด/ปิดคำสั่งตามที่กล่าวมาในข้างต้น (โดยไม่สนใจทิศทางของเทรน) ช่วงที่แท่งราคาอยู่เหนือหรือใต้เส้น MA จะไม่เกิดการเปิดคำสั่งซื้อ/ขาย

การกำหนดค่าเริ่มต้นสำหรับการใช้ EA




EA ชุดนี้อนุญาตให้เรากำหนดค่าต่างๆ ได้ 5 ค่า ดังนี้
    • Lots หมายถึง จำนวนล็อตในการเปิดคำสั่งซื้อ/ขาย ค่าปริยายคือ 0.1
    • MaximumRisk หมายถึง เปอร์เซ็นต์กำไรที่เราต้องการ ค่าปริยายคือ 0.02 หรือประมาณ 2 %
    • DecreaseFactor หมายถึง จำนวนคำสั่งซื้อ/ขายที่เปิดค้างไว้สำหรับการคำนวณหาจำนวนล็อตในการเปิดคำสั่งซื้อ/ขายคำสั่งถัดไป
    • MovingPeriod หมายถึง เส้น MA ที่เราต้องการให้ EA ใช้ตรวจสอบเพื่อเปิดคำสั่งซื้อ/ขาย ค่าปริยายคือ 12 หรือค่า MA ของราคา 12 วันที่ผ่านมา
    • Moving Shift หมายถึง ค่าเบี่ยงเบนของ MA ที่ยอมรับได้ ค่าปริยายเท่ากับ 6

ถ้าจะนำไปใช้งานจริง

ผู้เขียนได้ทดลอง EA ชุดนี้กับบัญชีทดลองของ FBS โดยยังไม่แก้ไขหรือปรังปรุงต้นฉบับโปรแกรมของ EA ชุดนี้ใหม่ พบปัญหาร้ายแรงหลายเรื่อง เช่น EA ตั้งล็อตสูงเกินไป ไม่เหมาะกับคนที่มีทุนน้อยๆ และ EA การปิดคำสั่งซื้อ/ขายโดยไม่สนใจว่าคำสั่งซื้อ/ขายคำสั่งนั้นๆ ขาดทุนหรือกำไร ทำให้บัญชีทดลองดังกล่าวขาดทุนไปกว่า $400 ในเวลาไม่กี่นาที

ปรับปรุงให้เหมาะกับคนไทย

อย่างที่ได้บอกกล่าวไว้ว่า EA ชุดนี้มีปัญหาบางอย่างที่ทำให้ไม่เหมาะกับการนำไปใช้งานจริง แต่ถ้าเราไม่มี EA ตัวอื่นๆ เลย หรือมีแต่ไม่รู้คุณสมบัติของ EA นั้นๆ เลย ผู้เขียนว่า EA ตัวนี้น่าสนใจ เพียงแต่เราต้องทำการปรับแต่งต้นฉบับโปรแกรมของ EA ตัวนี้เล็กน้อย โดยเปิดโปรแกรมเมต้าเอดิเตอร์ขึ้นมา แล้วเปิดแฟ้ม Moving Average.mq4 ซึ่งอยู่ในโฟลเดอร์ Expert Advisor ขึ้นมา สำหรับจุดที่จะทำการแก้ไข จะมี 3 จุด ดังนี้

-ทำให้จำนวนล็อตต่ำสุดเริ่มต้นที่ 0.01


จุดแรกที่จะทำการแก้ไขคือ ทำการเปลี่ยนจำนวนล็อตเริ่มต้นจาก เดิม 0.1 เป็น 0.01 โดยเริ่มต้นด้วยการเปลี่ยนค่าของตัวแปร Lots เป็น 0.01 (บรรทัดคำสั่งที่ 15 ของต้นฉบับโปรแกรม) จุดที่ 2 คือที่ส่วนท้ายของฟังก์ชัน LotsOptimized โดยเปลี่ยนเงื่อนไข และคำสั่ง if จากเดิม if (lot < 0.1) lot = 0.1 เปลี่ยนเป็น if (lot < 0.01) lot = 0.01; (บรรทัดคำสั่งที่ 70)


-ทำให้ EA เลือกปิดคำสั่งซื้อ/ขายเฉพาะที่ได้กำไรเท่านั้น

วิธีการก็คือ เราจะหาค่าผลตอบแทนของคำสั่งซื้อ/ขายที่กำลังจะถูกปิดคำสั่งในขณะนั้น โดยนำค่า OrderProfit(), OrderSwap() และ OrderCommission() ของคำสั่งซื้อ/ขาย มาตรวจสอบว่าเป็น บวก (มีกำไร) หรือ เป็น ลบ (ขาดทุน) ถ้ายังเป็นขาดทุนอยู่จะยังไม่ปิดคำสั่งซื้อ/ขายนั้นๆ โดยกิจกรรมนี้ เราจะใส่เพิ่มลงในฟังก์ชัน CheckForClose() ของ EA โดยรายละเอียดของฟังก์ชันดังกล่าวที่ปรับปรุงแก้ไขใหม่มีดังนี้

//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
       double ma;
       double dOrderProfit; //สำหรับเก็บค่ากำไรขาดทุนของ Order
        //--- go trading only for first tiks of new bar
        if(Volume[0]>1) return;
                //--- get Moving Average
                ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
                //---
                for(int i=0;i<OrdersTotal();i++)
                {
                          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
                          if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
                           //หาค่ากำไร/ขาดทุนของ Order
                          dOrderProfit = OrderProfit() + OrderSwap() + OrderCommission();
                          //ถ้าค่ากำไร/ขาดทุนของ Order ยังติดลบยังไม่ปิด Order
                          if (dOrderProfit > 0)
                         {
                                   //--- check order type
                                   if(OrderType()==OP_BUY)
                                   {
                                             if(Open[1]>ma && Close[1]<ma)
                                            {
                                                       if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
                                                                 Print("OrderClose error ",GetLastError());
                                             }
                                             break;
                                   }
                                   if (OrderType()==OP_SELL)
                                   {
                                             if (Open[1]<ma && Close[1]>ma)
                                             {
                                                          if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
                                                                       Print("OrderClose error ",GetLastError());
                                             }
                                             break;
                                    }
                       } //end if
             } //end for
             //---
}

-ทำให้ EA เริ่มทำงานทันทีไม่ต้องรอแท่งราคาครบ 100 แท่ง

สำหรับการทำให้ EA ทำงานทันทีไม่ต้องรอจนเกิดแท่งราคาครบ 100 แท่ง จะทำที่ฟังก์ชัน OnTick() ในแฟ้มต้นฉบับบทของ EA โดยแก้ไขคำสั่ง if จากเดิม if(Bars<100 || IsTradeAllowed()==false) เป็น if(IsTradeAllowed()==false) return;

ผลการนำไปใช้งาน

หลังจากที่เราทำการแก้ไขต้นฉบับโปรแกรม และสั่งคอมไพล์ EA ชุดนี้แล้ว ก็ต้องลองนำมาใช้งานจริงดู (ขออนุญาตไม่พูดถึงการ back test) โดยเริ่มต้นกับบัญชีทดลองของ FBS ปรากฏว่าสามารถดึงเงินถูกกลืนไปกลับคืนมาได้ และได้ทดลองใช้กับบัญชีจริงทั้งของ RoboForex บัญชี Fix-cent ทุน 1000 cent และบัญชีจริงของโปรกเกอร์ XM บัญชีไมโครทุน $5 และบัญชี cent ของ EXNESS ทุน 236 cent  โดยใช้ Timeframe M1 ซึ่งได้ทำการทดลองก่อนหน้าที่จะทำบทความชุดนี้ประมาณ 1 อาทิตย์ (.. 2558)

ผลการทดลองใช้กับบัญชีทดลองของ FBS

ผลที่ได้ก็คือ พอมีกำไรแต่ไม่มากนัก และยังไม่เห็นปรากฏการล้างพอร์ท อาจจะเป็นเพราะ EA ชุดนี้ทำการเปิดคำสั่งซื้อ/ขายทีละคำสั่ง และรอปิดคำสั่งเมื่อมีกำไร และซื้อในขนาดล็อตต่ำสุด ก็ถือว่าเป็น EA ที่ทำกำไรอย่างช้าๆ และเชื่อถือได้พอสมควร
การขาดทุนจากการวิ่งเข้าหา Stop loss จะไม่มี แต่อาจจะเกิดการล้างพอร์ทได้หากวงเงินหลักประกันเหลือน้อยเกินกว่า 20 เปอร์เซนต์ อาจจะต้องคอยตรวจสอบช่วงที่ผลกำไรยังไม่เป็นบวก อาจจะต้องฝากเงินเพิ่มเข้าไปในบัญชีเพื่อรักษาระดับหลักประกันของบัญชีไว้

แก้ไขเพิ่มเติม

เนื่องจากเดิม EA ชุดนี้จะเปิดคำสั่งซื้อ/ขายได้เพียง 1 คำสั่งต่อครั้ง ผู้เขียนจึงปรับปรุงแก้ไขเพิ่มเติมให้สามารถเปิดได้มากกว่า 1 คำสั่ง โดยใช้ค่าของ DecreaseFactor เป็นตัวกำหนดจำนวนคำสั่งสูงสุดในการเปิดคำสั่งซื้อ/ขาย หมายถึง ถ้าเรากำหนดค่า DecreaseFactor เท่ากับ 1 โปรแกรม EA ชุดนี้จะเปิดคำสั่งซื้อ/ขาย 2 คำสั่ง คือคำสั่งซื้อ (Buy/Long) 1 คำสั่ง และคำสั่งขาย (Sell/Short) 1 แต่ถ้าราคาเดินถูกทาง EA ชุดนี้จะเปิดคำสั่งซื้อหรือขายเพียงคำสั่งเดียว
ถ้าเรากำหนดค่า DecreaeseFactor เท่ากับ 5 EA จะเปิดคำสั่งซื้อ/ขายรวม 10 คำสั่ง สำหรับค่าปริยายจะกำหนดไว้เท่ากับ 3 คือจะเปิดคำสั่งซื้อ/ขายรวม 6 คำสั่งต่อรอบการเปิดคำสั่งซื้อ/ขาย ถ้าค่าของ DecreaseFactor ถูกกำหนดให้เป็น 0 โปรแกรม EA ชุดนี้จะเปิดคำสั่งซื้อ/ขายเพียง 1 คำสั่งเท่านั้น
ขอให้โชคดีในการเทรดฟอเร็กซ์กันทุกๆ ท่านนะครับ

บันทึกประจำวันที่ 15 กรกฎาคม พ.. 2557 (2014)

เวลา
เหตุการณ์
06:00 . ตื่นนอน
06:30 . กวาดพื้นใต้ถุนบ้าน
07:00 .
นำน้ำหมักจุลินทรีย์ราดบ่อปลา, ทำอีเอ็มขยายลูกถังที่ 2 และเริ่มใช้อีเอ็มขยายลูกถังที่ 3
08:00 .
0.กินข้าวเช้า
1.กับข้าว:แกงเขียวหวาน, บะหมี่กึ่งสำเร็จรูปต้ม, สะตอสด, น้ำพริก
08:30 .
งานของกิจกรรมอาชีพ กสิกรรมธรรมชาติ แปลงสวนปาล์ม (8/2557):ฉีดพ่นอาหารเสริมพืช YIC nano ในแปลงสวนปาล์ม
10:00 .
งานของกิจกรรมอาชีพ งานการตลาดและการลงทุน (20/2557):ไปพิมพ์ใบโปรชัวร์ที่วัดเขาแก้ว
13:30 .
0.กินข้าว พักผ่อน 1.กับข้าว:แกงเขียวหวาน, บะหมี่กึ่งสำเร็จรูปต้ม, สะตอสด, น้ำพริก
12:30 . สูบน้ำใช้ด้วยปั้มชักพลังงานโซลาร์เซลล์
13:30 .
งานของกิจกรรมอาชีพ งานการตลาดและการลงทุน (20/2557):กรองน้ำหมักใบยาสูบไปฝากลูกค้า YIC nano ที่ปลูกแตงกวา สำหรับไร่เพลี้ย
16:00 .
งานของกิจกรรมอาชีพ งานการตลาดและการลงทุน (20/2557):นำน้ำหมักใบยาสูบไปฝากลูกค้าย่านไร่ยา, และมาเสนอสินค้า YIC nano ย่านซอยท่าเดื่อ
19:00 .
0.อาบน้ำ กินข้าว พักผ่อน
1.กับข้าว:ข้าวโพดทอด, แกงเปอะหน่อไม้ไผ่ตงลืมแล้ง, ผักรวก, สะตอสด, น้ำพริก
21:00 . เข้านอน

Adz2you.