Forex Algorithmic Trading: เรื่องราวเชิงปฏิบัติสำหรับวิศวกร

เผยแพร่แล้ว: 2022-03-11

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

ไม่กี่ปีที่ผ่านมา ขับเคลื่อนด้วยความอยากรู้ของฉัน ฉันได้ก้าวเข้าสู่โลกของการซื้อขายอัลกอริธึม Forex โดยการสร้างบัญชีทดลองและเล่นการจำลอง (ด้วยเงินปลอม) บนแพลตฟอร์มการซื้อขาย Meta Trader 4

ภาพประกอบปกฟอเร็กซ์

หลังจากสัปดาห์ของ 'การซื้อขาย' ฉันเกือบจะเพิ่มเงินเป็นสองเท่า จากการซื้อขายอัลกอริธึมที่ประสบความสำเร็จของฉันเอง ฉันได้เจาะลึกลงไปอีกและในที่สุดก็ลงชื่อสมัครใช้ฟอรัม FX จำนวนหนึ่ง ไม่นาน ฉันก็ใช้เวลาหลายชั่วโมงอ่านเกี่ยวกับระบบการซื้อขายแบบอัลกอริทึม (ชุดกฎที่กำหนดว่าคุณควรซื้อหรือขาย) ตัวบ่งชี้ที่กำหนดเอง อารมณ์ของตลาด และอื่นๆ

ลูกค้ารายแรกของฉัน

ในช่วงเวลานี้ บังเอิญ ฉันได้ยินมาว่ามีคนพยายามหานักพัฒนาซอฟต์แวร์เพื่อทำให้ระบบการซื้อขายแบบง่ายๆ เป็นไปโดยอัตโนมัติ ย้อนกลับไปในสมัยเรียนมหาวิทยาลัยของฉัน ตอนที่ฉันเรียนรู้เกี่ยวกับการเขียนโปรแกรมพร้อมกันใน Java (เธรด เซมาฟอร์ และขยะทั้งหมด) ฉันคิดว่าระบบอัตโนมัตินี้ไม่ซับซ้อนมากไปกว่างานในหลักสูตรวิทยาศาสตร์ข้อมูลขั้นสูงของฉัน ดังนั้นฉันจึงสอบถามเกี่ยวกับงานนี้และเข้ามาร่วมงาน

ลูกค้าต้องการซอฟต์แวร์ซื้อขายอัลกอริธึมที่สร้างด้วย MQL4 ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้จริงซึ่งใช้โดยแพลตฟอร์ม Meta Trader 4 สำหรับการดำเนินการเกี่ยวกับหุ้น

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

บทบาทของแพลตฟอร์มการซื้อขาย (ในกรณีนี้คือ Meta Trader 4) คือการเชื่อมต่อกับโบรกเกอร์ Forex จากนั้นโบรกเกอร์จะจัดเตรียมแพลตฟอร์มที่มีข้อมูลตามเวลาจริงเกี่ยวกับตลาดและดำเนินการตามคำสั่งซื้อ/ขายของคุณ สำหรับผู้อ่านที่ไม่คุ้นเคยกับการซื้อขาย Forex นี่คือข้อมูลที่ได้รับจากฟีดข้อมูล:

แผนภาพนี้แสดงข้อมูลที่เกี่ยวข้องกับการซื้อขายอัลกอริทึมของ Forex

ผ่าน Meta Trader 4 คุณสามารถเข้าถึงข้อมูลทั้งหมดนี้ได้ด้วยฟังก์ชันภายใน ซึ่งสามารถเข้าถึงได้ในกรอบเวลาต่างๆ: ทุกนาที (M1) ทุก ๆ ห้านาที (M5), M15, M30 ทุกชั่วโมง (H1), H4, D1, W1, MN .

การเคลื่อนไหวของราคาปัจจุบันเรียกว่า ขีด กล่าวอีกนัยหนึ่ง ขีดคือการเปลี่ยนแปลงในราคา Bid หรือ Ask สำหรับคู่สกุลเงิน ในช่วงตลาดที่มีการเคลื่อนไหว อาจมีการติ๊กหลายครั้งต่อวินาที ในช่วงตลาดที่ช้า อาจมีนาทีโดยไม่ต้องติ๊ก เห็บคือหัวใจของหุ่นยนต์ตลาดสกุลเงิน

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

หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับพื้นฐานของการซื้อขาย (เช่น pips ประเภทคำสั่ง สเปรด การคลาดเคลื่อน คำสั่งซื้อในตลาด และอื่นๆ) ดูที่นี่

ข้อกำหนดการซื้อขายอัลกอริทึมของลูกค้านั้นเรียบง่าย: พวกเขาต้องการหุ่นยนต์ Forex โดยอิงตามตัวบ่งชี้สองตัว สำหรับเบื้องหลัง อินดิเคเตอร์มีประโยชน์ มาก เมื่อพยายามกำหนดสถานะตลาดและทำการตัดสินใจซื้อขาย เนื่องจากอิงจากข้อมูลในอดีต (เช่น มูลค่าราคาสูงสุดใน n วันที่ผ่านมา) Meta Trader 4 มีมาให้ในตัวอยู่แล้ว อย่างไรก็ตาม ตัวชี้วัดที่ลูกค้าของฉันสนใจนั้นมาจากระบบการซื้อขายแบบกำหนดเอง

พวกเขาต้องการแลกเปลี่ยนทุกครั้งที่สองตัวบ่งชี้ที่กำหนดเองเหล่านี้ตัดกัน และเฉพาะในบางมุมเท่านั้น

ตัวอย่างอัลกอริทึมการซื้อขายนี้แสดงให้เห็นถึงความต้องการของลูกค้าของฉัน

ลงมือ

ขณะที่ฉันทำมือสกปรก ฉันได้เรียนรู้ว่าโปรแกรม MQL4 มีโครงสร้างดังต่อไปนี้:

  • [คำสั่งพรีโปรเซสเซอร์]
  • [พารามิเตอร์ภายนอก]
  • [ตัวแปรทั่วโลก]
  • [ฟังก์ชั่นเริ่มต้น]
  • [ฟังก์ชันดีนิต]
  • [ฟังก์ชั่นเริ่ม]
  • [ฟังก์ชั่นที่กำหนดเอง]

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

วิธีแก้ปัญหานี้ ฉันบังคับให้ฟังก์ชันดำเนินการหนึ่งครั้งต่อหน่วยของช่วงเวลา:

 int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...

รับค่าของตัวบ่งชี้:

 // Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }

ตรรกะในการตัดสินใจ รวมถึงจุดตัดของอินดิเคเตอร์และมุมของพวกมัน:

 int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }

ส่งคำสั่งซื้อ:

 void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }

หากคุณสนใจ คุณสามารถค้นหาโค้ดที่รันได้ทั้งหมดบน GitHub

Backtesting

เมื่อฉันสร้างระบบการซื้อขายอัลกอริธึมแล้ว ฉันอยากรู้ว่า 1) ถ้ามันทำงานอย่างเหมาะสมและ 2) กลยุทธ์การซื้อขาย Forex ที่ใช้นั้นดีหรือไม่

Backtesting (บางครั้งเขียนว่า “back-testing”) เป็นกระบวนการของการทดสอบระบบเฉพาะ (อัตโนมัติหรือไม่) ภายใต้เหตุการณ์ในอดีต กล่าวอีกนัยหนึ่ง คุณทดสอบระบบของคุณโดยใช้อดีตเป็นตัวแทนในปัจจุบัน

MT4 มาพร้อมกับเครื่องมือที่ยอมรับได้สำหรับการทดสอบย้อนหลังของกลยุทธ์การซื้อขาย Forex (ปัจจุบันมีเครื่องมือระดับมืออาชีพมากกว่าที่มีฟังก์ชันการทำงานที่มากกว่า) ในการเริ่มต้น คุณต้องตั้งค่ากรอบเวลาและเรียกใช้โปรแกรมของคุณภายใต้การจำลอง เครื่องมือจะจำลองแต่ละ Tick โดยรู้ว่าแต่ละหน่วยควรเปิดที่ราคาหนึ่ง ปิดที่ราคาหนึ่ง และไปถึงจุดสูงสุดและจุดต่ำสุดที่กำหนด

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

ตัวชี้วัดที่เขาเลือกพร้อมกับตรรกะในการตัดสินใจนั้นไม่ก่อให้เกิดผลกำไร

จากการทดสอบย้อนหลัง ฉันได้ตรวจสอบอัตราส่วนผลตอบแทนของหุ่นยนต์ FX สำหรับช่วงเวลาสุ่มบางช่วง ไม่จำเป็นต้องพูด ฉันรู้ว่าลูกค้าของฉันจะไม่ร่ำรวยด้วยมัน— ตัวบ่งชี้ที่เขาเลือกพร้อมกับตรรกะในการตัดสินใจนั้นไม่สร้างกำไร ตัวอย่าง ต่อไปนี้คือผลลัพธ์ของการรันโปรแกรมบนหน้าต่าง M15 สำหรับการดำเนินการ 164 รายการ:

นี่คือผลลัพธ์ของการรันโปรแกรมซอฟต์แวร์อัลกอริธึมการซื้อขายที่ฉันพัฒนาขึ้น

โปรดทราบว่ายอดคงเหลือของเรา (เส้นสีน้ำเงิน) อยู่ต่ำกว่าจุดเริ่มต้น

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

แนวโน้มบางประการในตัวอย่างการซื้อขายอัลกอริทึมของเรา

การเพิ่มประสิทธิภาพพารามิเตอร์และการโกหก

แม้ว่าการทดสอบย้อนหลังจะทำให้ฉันระวังประโยชน์ของหุ่นยนต์ FX ตัวนี้ แต่ ฉันก็รู้สึกทึ่งเมื่อเริ่มลองใช้พารามิเตอร์ภายนอกและสังเกตเห็นความแตกต่างอย่างมากในอัตราส่วนผลตอบแทนโดยรวม วิทยาศาสตร์เฉพาะนี้เรียกว่า Parameter Optimization

ฉันทำการทดสอบคร่าวๆ เพื่อลองและอนุมานความสำคัญของพารามิเตอร์ภายนอกในอัตราส่วนผลตอบแทน และได้ผลลัพธ์ดังนี้:

แง่มุมหนึ่งของอัลกอริทึม Forex คืออัตราส่วนผลตอบแทน

หรือทำความสะอาด:

อัตราผลตอบแทนจากการซื้อขายอัลกอริทึมอาจมีลักษณะเช่นนี้เมื่อล้างข้อมูล

คุณอาจคิดว่า (เหมือนที่ฉันคิด) ว่าคุณควรใช้พารามิเตอร์ A แต่การตัดสินใจไม่ได้ตรงไปตรงมาอย่างที่เห็น โดยเฉพาะอย่างยิ่ง ให้สังเกตความ ไม่แน่นอน ของพารามิเตอร์ A: สำหรับค่าความผิดพลาดเล็กน้อย ผลตอบแทนจะเปลี่ยนแปลงไปอย่างมาก กล่าวอีกนัยหนึ่ง พารามิเตอร์ A มีแนวโน้มที่จะคาดการณ์ผลลัพธ์ในอนาคตมากเกินไป เนื่องจากความไม่แน่นอนใดๆ การเปลี่ยนแปลงใดๆ เลยจะส่งผลให้ประสิทธิภาพแย่ลง

แต่อนาคตเป็นสิ่งที่ไม่แน่นอน! ดังนั้นการกลับมาของพารามิเตอร์ A ก็ไม่แน่นอนเช่นกัน ในความเป็นจริง ทางเลือกที่ดีที่สุดคือการพึ่งพาความคาดเดาไม่ได้ บ่อยครั้ง พารามิเตอร์ที่มีผลตอบแทนสูงสุดแต่สามารถคาดการณ์ได้ดีกว่า (ผันผวนน้อยกว่า) จะดีกว่าพารามิเตอร์ที่ให้ผลตอบแทนสูงแต่คาดการณ์ได้ไม่ดี

สิ่งเดียวที่คุณแน่ใจได้คือคุณไม่รู้อนาคตของตลาด และ การคิดว่าคุณรู้ว่าตลาดจะดำเนินไปอย่างไรโดยอิงจากข้อมูลในอดีตถือเป็นความผิดพลาด ในทางกลับกัน คุณต้องยอมรับความไม่แน่นอนนี้ในการทำนาย Forex ของคุณ

การคิดว่าคุณรู้ว่าตลาดจะดำเนินไปอย่างไรโดยพิจารณาจากข้อมูลในอดีตเป็นความผิดพลาด

นี่ไม่ได้หมายความว่าเราควรใช้พารามิเตอร์ B เสมอไป เพราะแม้แต่ผลตอบแทนที่ต่ำกว่าของพารามิเตอร์ A ก็ยังทำงานได้ดีกว่าพารามิเตอร์ B นี่เป็นเพียงเพื่อแสดงให้คุณเห็นว่า Optimizing Parameters อาจส่งผลให้มีการทดสอบที่พูดเกินจริงถึงผลลัพธ์ที่น่าจะเป็นไปได้ในอนาคต และการคิดดังกล่าวไม่ชัดเจน

ข้อควรพิจารณาในการซื้อขาย Forex Algorithmic โดยรวม

ตั้งแต่ประสบการณ์การซื้อขาย Forex แบบอัลกอริธึมครั้งแรกนั้น ฉันได้สร้างระบบการซื้อขายอัตโนมัติหลายระบบสำหรับลูกค้า และฉันสามารถบอกคุณได้ว่ายังมีที่ว่างให้สำรวจและวิเคราะห์ Forex เพิ่มเติมที่ต้องทำอยู่เสมอ ตัวอย่างเช่น ฉันเพิ่งสร้างระบบโดยอาศัยการค้นหาการเคลื่อนไหวที่เรียกว่า “ปลาใหญ่” นั่นคือการเปลี่ยนแปลง pip ขนาดใหญ่ในหน่วยเวลาเล็ก ๆ เรื่องนี้เป็นเรื่องที่ทำให้ฉันหลงใหล

การสร้างระบบจำลอง FX ของคุณเองเป็นตัวเลือกที่ยอดเยี่ยมในการเรียนรู้เพิ่มเติมเกี่ยวกับการซื้อขายในตลาด Forex และความเป็นไปได้ไม่มีที่สิ้นสุด ตัวอย่างเช่น คุณอาจลองถอดรหัสการแจกแจงความน่าจะเป็นของการแปรผันของราคาเป็นฟังก์ชันของความผันผวนในตลาดหนึ่ง (เช่น EUR/USD) และอาจสร้างแบบจำลองมอนติคาร์โลโดยใช้การแจกแจงต่อสถานะความผันผวน โดยใช้ระดับใดก็ตาม ความแม่นยำที่คุณต้องการ ฉันจะทิ้งสิ่งนี้ไว้เป็นแบบฝึกหัดสำหรับผู้อ่าน ที่กระตือรือร้น

โลก Forex อาจมีบางครั้งที่ล้นหลาม แต่ฉันหวังว่าบทความนี้จะให้ข้อมูลบางส่วนแก่คุณเกี่ยวกับวิธีเริ่มต้นกลยุทธ์การซื้อขาย Forex ของคุณเอง

อ่านเพิ่มเติม

ทุกวันนี้ มีเครื่องมือมากมายในการสร้าง ทดสอบ และปรับปรุงระบบอัตโนมัติของการซื้อขาย: Trading Blox สำหรับการทดสอบ NinjaTrader สำหรับการซื้อขาย OCaml สำหรับการเขียนโปรแกรม เป็นต้น

ฉันได้อ่านเกี่ยวกับโลกลึกลับที่เป็นตลาดสกุลเงินอย่างกว้างขวาง ต่อไปนี้คือบทความสองสามข้อที่ฉันแนะนำสำหรับโปรแกรมเมอร์และผู้อ่านที่กระตือรือร้น:

  • BabyPips: นี่คือจุดเริ่มต้นหากคุณไม่รู้จักหมอบเกี่ยวกับการซื้อขาย Forex
  • The Way of the Turtle โดย Curtis Faith: ในความคิดของฉันนี่คือ Forex Bible อ่านเมื่อคุณมีประสบการณ์ในการซื้อขายและรู้กลยุทธ์ Forex บางอย่างแล้ว
  • การวิเคราะห์ทางเทคนิคสำหรับมืออาชีพด้านการซื้อขาย — กลยุทธ์และเทคนิคสำหรับตลาดการเงินโลกที่ปั่นป่วนในปัจจุบัน โดย Constance M. Brown
  • การเขียนโปรแกรมที่ปรึกษาผู้เชี่ยวชาญ – การสร้างระบบการซื้อขายอัตโนมัติใน MQL สำหรับ Meta Trader 4 โดย Andrew R. Young
  • ระบบการซื้อขาย – แนวทางใหม่ในการพัฒนาระบบและการปรับพอร์ตการลงทุนให้เหมาะสม โดย Urban Jeckle และ Emilio Tomasini: มีเทคนิคมาก เน้นที่การทดสอบ FX เป็นอย่างมาก
  • การใช้งานระบบการซื้อขายสกุลเงินแบบหลายตัวแทนทีละขั้นตอนโดย Rui Pedro Barbosa และ Orlando Belo: ระบบนี้มีความเป็นมืออาชีพมาก โดยอธิบายว่าคุณจะสร้างระบบการซื้อขายและแพลตฟอร์มทดสอบได้อย่างไร