สร้างและบ็อกเทสต์ cBot
สร้าง เรียกใช้ บ็อกเทสต์ cBot ของ cTrader (C# และ Python โดยทั้งคู่ใช้ .NET) จากตัวแก้ไข Monaco ในเบราว์เซอร์ เรียกใช้บน ghcr.io/spotware/ctrader-console
สร้าง
- หน้า Builder โฮสต์ตัวแก้ไข Monaco;
CBotBuilderคอมไพล์โปรเจกต์ด้วยdotnet buildในคอนเทนเนอร์ที่ใช้แล้วทิ้ง (AppOptions.BuildImageไดเรกทอรีการทำงานผูกมัดที่/work) เพื่อให้ MSBuild ของผู้ใช้ที่ไม่น่าเชื่อถือไม่สามารถเข้าถึงโฮสต์ได้ NuGet restore ถูกแคช ทั่วการสร้างผ่านโวลิวม์ที่ใช้ร่วมกัน โฮสต์เว็บต้องการการเข้าถึง Docker socket - เทมเพลตเริ่มต้น C# + Python อยู่ใน
src/Nodes/Builder/Templates/
เรียกใช้และบ็อกเทสต์
- Instances = ลำดับชั้นสถานะ TPH (
Run/Backtest×Pending/Scheduled/Starting/Running/Stopping/Stopped/Failed) การเปลี่ยนแปลงแทนที่เอนทิตี (เปลี่ยนรหัส) รหัสคอนเทนเนอร์ถูกนำไปด้วย NodeSchedulerเลือกโหนดที่มีการโหลดน้อยที่สุดที่เหมาะสม;ContainerDispatcherFactoryส่งต่อไปยัง ตัวแทน HTTP ของโหนดระยะไกลหรือตัวส่วนส่ง Docker ในพื้นที่- โปรแกรมขัดขวาง Completion ตรวจสอบความสอดคล้องของคอนเทนเนอร์ที่ออก (คอนเทนเนอร์บ็อกเทสต์ออกด้วยตนเอง
ผ่าน
--exit-on-stop); รายงานที่มีอยู่ → เสร็จสิ้น (เก็บReportJson) ขาดหายไป → ล้มเหลว - บันทึกคอนเทนเนอร์สดทีม่อเบราว์เซอร์ผ่าน SignalR; เส้นโค้งความเสมอภาค backtested ถูกแยกวิเคราะห์จาก รายงานและแสดงกราฟ
ข้อมูลตลาด backtested ถูกแคชต่ออัคเคาต์
cTrader Console ดาวน์โหลดข้อมูล tick/bar ทางประวัติศาสตร์ลงใน --data-dir นั้น ไดเรกทอรีนี้เป็น
แคชที่มั่นคงและคงอยู่ตามคีย์ของบัญชีการซื้อขายหลักทรัพย์ (หมายเลขบัญชีของมัน) — ผูกมัดมาจากดิสก์ของโหนดที่
ตำแหน่งคอนเทนเนอร์ของมัน (/mnt/data) การผูกมัดแยกที่ไม่ซ้อนกัน จากไดเรกทอรีการทำงานต่อ-อินสแตนซ์ ดังนั้นทุก
backtested ในบัญชีเดียวกัน นำข้อมูลที่ดาวน์โหลดแล้วกลับมาใช้ใหม่
แทนที่จะดาวน์โหลดใหม่ทีละครั้ง (ก่อนหน้านี้
ไดเรกทอรีข้อมูลอยู่ภายใต้ไดเรกทอรีการทำงานต่อ-อินสแตนซ์ ซึ่งรหัสเปลี่ยนทุกการเรียกใช้ ซึ่งบังคับให้ดาวน์โหลดใหม่
ทั้งหมด backtested) ไดเรกทอรีการทำงานชั่วคราวต่อ-อินสแตนซ์ยังคงเก็บอัลโกริทึม พารามิเตอร์ รหัสผ่าน
และรายงาน; แคชข้อมูลที่ใช้ร่วมกันจะถูกนับในการใช้ข้อมูล backtested ของโหนด และทำความสะอาดโดยการทำความสะอาดโหนด
การตั้งค่า backtested
ไดแล็อก Backtest จะแสดงการตั้งค่า backtested cTrader Console ที่ปรับแต่งได้ของผู้ใช้ เพื่อคุณไม่ต้องแตะบรรทัดคำสั่ง:
- Symbol / Timeframe — timeframe คือ รายการแบบเลื่อนลงของทุกระยะเวลา cTrader (
t1…t1000,m1…m45,h1…h12,D1/D2/D3,W1,Month1และระยะ Renko/Range/Heikin) ในแบบฟอร์มที่ตั้งไว้ของคอนโซล เพื่อให้คุณเลือก--periodที่ถูกต้องเสมอ - From / To — หน้าต่าง backtested (
--start/--end) - Data mode — หนึ่งในสามโหมด cTrader (
--data-mode): Tick data (tickถูกต้อง) m1 bars (m1เร็ว) หรือ Open prices only (openเร็วที่สุด) - Starting balance — ค่าเริ่มต้น
10000(--balance) 0 balance ไม่ทำให้เกิดการซื้อขายและทำให้ cTrader ส่งรายงานว่างซึ่งเสียหายจากมัน ("Message expected") ดังนั้นจึงส่ง non-zero balance เสมอ - Commission —
--commission - Spread —
--spreadฟิลด์ตัวเลขในจุด pips ที่ไม่สามารถลดต่ำกว่า 0 ได้ มันถูก ซ่อนไว้ในโหมด Tick data โดยที่ cTrader อนุมาน spread จากข้อมูล tick โดยตัวเอง (ไม่ส่ง--spread)
ไดเรกทอรีข้อมูล (--data-file / --data-dir) ถูกจัดการโดยแอปพลิเคชันเอง (แคชต่ออัคเคาต์) ไม่ได้เปิดเผยใน
ไดแล็อก
:::note cTrader ขัดข้องใน backtested ว่าง
ถ้า backtested ให้ผลลัพธ์ ไม่มี — ไม่มีการซื้อขายหรือไม่มีข้อมูลตลาดสำหรับวันที่/สัญลักษณ์ที่เลือก —
ตัวเขียนรายงานของ cTrader Console เองจะโยน Message expected และออกโดยไม่มีรายงาน แอปไม่สามารถแก้ไขบัค
ต้นน้ำนั้นได้ แต่จะตรวจจับและทำเครื่องหมายอินสแตนซ์ Failed ด้วยเหตุผลที่เป็นประโยชน์
("ไม่มี backtested ผลลัพธ์สำหรับช่วงที่เลือก...") แทนที่จะเป็น stack trace ดิบ เลือกช่วงวันที่กว้างขึ้นซึ่งมี
ข้อมูลตลาดที่มีอยู่และลองใหม่
:::
หน้ารายละเอียดอินสแตนซ์
การเปิดอินสแตนซ์ (/instance/{id}) จะแสดงสถานะสดของมัน บันทึก และ — สำหรับ backtested — เส้นโค้ง
ความเสมอภาค ชื่อแท็บเบราว์เซอร์ สะท้อนถึงอินสแตนซ์ที่เฉพาะเจาะจง (cBot name · kind · symbol เช่น
TrendBot · Backtest · EURUSD) ดังนั้นแท็บการเรียกใช้สดและแท็บ backtested จะแตกต่างกันได้ในวาบ
การเรียกใช้และ backtested ของ cBot เดียวกันถูกติดตามเป็น lineages ที่แตกต่างกัน (รหัส lineage ที่มั่นคงซึ่ง
ถูกนำไปมาในการเปลี่ยนแปลงสถานะ) เพื่อให้หน้าติดตามอินสแตนซ์เพียงอินสแตนซ์เดียวและไม่เคยผสมข้อมูลของการเรียกใช้
ด้วยข้อมูล backtested
ตัวควบคุม lifecycle ของอินสแตนซ์
แต่ละแถว instance (และหน้ารายละเอียดของมัน) มีตัวควบคุมที่ถูกต้องตามสถานะ อินสแตนซ์ที่ active แสดง Stop; อินสแตนซ์ที่ terminal (Stopped / Completed / Failed) แสดง Start (▶) เพื่อเรียกใช้ใหม่ด้วย cBot, account, symbol, timeframe, ParamSet และ image เดียวกัน (การเรียกใช้เรียกใช้ใหม่เป็นการเรียกใช้ backtested เป็น backtested) การคลิก Stop แสดงประกาศ "Stopping..." และปิดใช้งานไอคอนจนกว่าจะแก้ไข และการเรียกใช้ ที่สร้างขึ้นใหม่จะปรากฏในรายการทันที — ไม่มีการรีโหลดหน้า
Console logs ถูก persisted เมื่ออินสแตนซ์สิ้นสุด — สำหรับการเรียกใช้ (เมื่อ Stop) และสำหรับ backtested (เมื่อเสร็จสิ้น) เท่าเทียมกัน — เพื่อให้บันทึกของการเรียกใช้ครั้งสุดท้ายยังคงดูได้บนหน้ารายละเอียด และ ผ่านแถบเครื่องมือบันทึก คัดลอกไปยังคลิปบอร์ด (ไอคอน Copy logs) หรือ ดาวน์โหลด (ไอคอน Download logs) แม้หลังจากที่คอนเทนเนอร์หายไป ทั้งสองดำเนินการบนบันทึก console เต็มรูปแบบของอินสแตนซ์ ไม่ใช่แค่ส่วนท้ายบนหน้าจอ
backtested ที่เสร็จสิ้น ยังคง persists cTrader report ของมันในรูปแบบทั้งสอง — JSON ดิบ (อันเดียวกันที่เส้นโค้งความเสมอภาคและการวิเคราะห์ AI อ่าน) และรายงาน HTML เต็มรูปแบบ ทั้งสองสามารถ ดาวน์โหลดได้จากแถว backtested และ หน้ารายละเอียดผ่านไอคอนเฉพาะ เฉพาะ บันทึกการเรียกใช้ครั้งสุดท้าย รายงานจะถูกเก็บไว้ และไอคอนจะถูก ปิดใช้งาน สำหรับ backtested ใด ๆ ที่ไม่ได้เริ่มต้น กำลังทำงาน หรือ ล้มเหลว (และไม่เคยแสดงสำหรับอินสแตนซ์การเรียกใช้) — backtested ที่เสร็จสิ้นเท่านั้นที่มีรายงานเพื่อ ดาวน์โหลด
uploaded .algo ไม่เคยสร้างที่นี่ ดังนั้น Last Build คอลัมน์ของมันบนหน้า cBot จึงเว้นว่าง (มันแสดง
เวลาการสร้างเพียงสำหรับ cBot ที่คุณสร้างในเบราว์เซอร์เท่านั้น)
แก้ไขและเรียกใช้อินสแตนซ์ที่หยุดใหม่
อินสแตนซ์ที่ หยุด (เรียกใช้หรือ backtested) มี Edit control — ไอคอนในแถวของมันในรายการ และ ข้างโครงแบบ Start/Stop บนหน้ารายละเอียดของมัน — ที่เปิดไดแล็อก ที่ปรกครองไว้ล่วงหน้า ด้วยการกำหนดค่า ปัจจุบันของมัน คุณสามารถเปลี่ยน บัญชีการซื้อขายหลักทรัพย์ สัญลักษณ์ timeframe ParamSet และแท็ก image (และ สำหรับ backtested หน้าต่าง และการตั้งค่า backtested ทั้งหมดข้างต้น) จากนั้น Save & start เรียกใช้ ใหม่ด้วยการตั้งค่าใหม่ (แทนที่อินสแตนซ์ที่หยุด) ตัวควบคุมถูก ปิดใช้งานขณะที่อินสแตนซ์ไม่ทำงาน — เฉพาะอินสแตนซ์ที่หยุดเท่านั้นที่สามารถแก้ไขได้
เรียกใช้จากตัวแก้ไขรหัส
การคลิก Run ในตัวแก้ไขรหัสเปิดไดแล็อกแทนการยิงการเรียกใช้ที่ตาบอดและฮาร์ดโค้ด:
- Trading account (จำเป็น) — บัญชี cTrader ที่ cBot เชื่อมต่อ
- Parameter set (เพิ่มเติม) — เลือกชุดที่มีอยู่ หรือปล่อยให้ว่างเพื่อเรียกใช้ด้วย ค่าพารามิเตอร์เริ่มต้น ของ cBot ปุ่ม + ถัดจากตัวเลือกสร้าง ParamSet ใหม่เนื้อหา (ดูด้านล่าง) และเลือกมัน
- Symbol / Timeframe ค่าเริ่มต้น
EURUSD/h1และสามารถเปลี่ยนได้; Cancel หรือ Run
เมื่อ Run ตัวแก้ไขบันทึก + สร้างแหล่งที่มาปัจจุบัน เริ่มอินสแตนซ์บนบัญชีที่เลือกด้วยพารามิเตอร์ที่เลือก
จากนั้น tail บันทึกคอนเทนเนอร์สด (สตรีมบันทึกจะส่งต่อคุกกี้การพิสูจน์ตัวตนของผู้ใช้ที่ลงชื่อเข้าไปยัง
/hubs/logs SignalR hub ดังนั้นจึงเชื่อมต่อแทนที่จะล้มเหลวด้วย Invalid negotiation response received)
Parameter sets
ParamSet เป็นชุดการเขียนทับพารามิเตอร์ cBot ที่ตั้งชื่อและนำมาใช้ใหม่ได้ ซึ่งเก็บไว้เป็นอ็อบเจกต์ JSON
แบบเรียบที่จับคู่แต่ละชื่อพารามิเตอร์กับค่าสเกลาร์ เช่น {"Period": 14, "Label": "trend"} ที่เวลา run/backtested
จะเปลี่ยนเป็นไฟล์ cTrader params.cbotset ({ "Parameters": { … } }) คุณสามารถสร้าง/แก้ไขชุดเป็น JSON ดิบจากไดแล็อก Parameter
sets ของ cBot หรือเนื้อหาจากไดแล็อก Run
ParamSet ทั้งหมด จะเป็นของ cBot: ไดแล็อก New Parameter Set แสดง cBot ทั้งหมดของคุณและคุณ
ต้องเลือกหนึ่ง — การสร้างจะถูกบล็อกจนกว่า cBot จะถูกเลือก ชื่อของชุด จะเป็นเอกลักษณ์ต่อ cBot:
การสร้างหรือเปลี่ยนชื่อชุดเป็นชื่อที่ชุดอื่นของ cBot เดียวกันใช้อยู่แล้วจะถูกปฏิเสธ (ข้อผิดพลาดที่ชัดเจนในไดแล็อก
409 Conflict ที่ API) ชื่อเดียวกันอาจถูกนำมาใช้ใหม่บน cBot ที่แตกต่างกัน
JSON ถูก validated เมื่อบันทึก: มันต้องเป็นอ็อบเจกต์เรียบเดียวที่ค่าเป็นสเกลาร์ทั้งหมด (string / number / bool)
ไม่ใช่-object root array nested object null value หรือ JSON ที่ผิดรูปแบบจะถูกปฏิเสธ (ข้อผิดพลาดที่ชัดเจนใน
ไดแล็อก 400 Bad Request ที่ API) อ็อบเจกต์ว่าง {} ได้รับอนุญาตและหมายถึง "ไม่มี
overrides"
cTrader Console CLI หมายเหตุ
Backtested ต้องการ --data-mode (ค่าเริ่มต้น m1) วันที่ด้วย dd/MM/yyyy HH:mm และ
params.cbotset JSON อาร์กิวเมนต์ positional; run ปฏิเสธ --data-dir (backtest-only) ดู
ContainerCommandHelpers
Node และมาตราส่วน
ความจุในการประมวลผลสเกลโดยการเพิ่มตัวแทน Node (ลงทะเบียนตัวเองและ heartbeat) ดู node discovery และ scaling
จำเป็นต้องมีบัญชีการซื้อขายหลักทรัพย์
การเรียกใช้หรือ backtested cBot ต้องการบัญชี cTrader trading account เพื่อเชื่อมต่อ จนกว่าคุณจะเพิ่มอัน
ภายใต้ Trading accounts ปุ่ม Run New cBot / Backtest New cBot จะถูกปิดใช้งาน (ด้วย tooltip)
และหน้าจะแสดงพรอมต์ที่เชื่อมโยงไปยังการตั้งค่าบัญชี — คุณไม่เคยตี raw
stream connect failed ข้อผิดพลาดจาก cBot ที่ไม่มีบัญชีอีกต่อไป