Skip to main content

สร้างและบ็อกเทสต์ 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 ที่ไม่มีบัญชีอีกต่อไป