เพิ่มประสิทธิภาพ cBot¶
คำสั่ง optimize จะค้นหาค่าพารามิเตอร์ต่าง ๆ ของ cBot เพื่อหาชุดค่าที่ให้ผลลัพธ์ดีตามเกณฑ์ที่คุณเลือก คำสั่งนี้ใช้การค้นหาแบบพันธุกรรมหรือแบบกริดเช่นเดียวกับแอป cTrader บนเดสก์ท็อป แต่สั่งงานผ่านเทอร์มินัลและไฟล์ JSON ที่ระบุการตั้งค่าพารามิเตอร์ คำสั่งนี้เป็นคำสั่งสำหรับการเพิ่มประสิทธิภาพ ซึ่งเทียบเคียงได้กับคำสั่งbacktesting ที่ใช้ทดสอบย้อนหลัง
ขอบเขตการทำงาน ¶
คำสั่ง optimize ใช้เพิ่มประสิทธิภาพพารามิเตอร์ของ cBot อินดิเคเตอร์และปลั๊กอินมีคำสั่งสำหรับจัดการโดยเฉพาะ (indicator calculate, indicator history, create, build) จึงไม่รวมอยู่ในการเพิ่มประสิทธิภาพนี้
ข้อกำหนดเบื้องต้น ¶
- ต้องติดตั้ง cTrader CLI แล้ว และสามารถลงชื่อเข้าใช้ได้
- ต้องส่งออก cBot เป็นไฟล์
.algoและบิลด์สำหรับ .NET 8 - มีไฟล์พารามิเตอร์ ที่กำหนดว่าจะค้นหาค่าของพารามิเตอร์ใดบ้าง
หมายเหตุ
คำสั่ง optimize ใช้งานได้เฉพาะ cTrader CLI รุ่นที่ทำงานในเครื่องเท่านั้น คำสั่งนี้ไม่มีในรุ่นภายในหรือรุ่นคลาวด์
คำสั่ง optimize ¶
ctrader-cli optimize <path-to-algo-file> --params=<path-to-params-file> [options]
อาร์กิวเมนต์แรกคือพาธไปยังไฟล์ .algo ต้องระบุตัวเลือก --params ต้องกำหนดกรอบเวลาพื้นฐานผ่าน --timeframe หรือในไฟล์พารามิเตอร์ หากไม่ได้กำหนดไว้ทั้งสองแห่ง คำสั่งจะหยุดทำงานพร้อมแจ้งข้อผิดพลาด
ตัวเลือกการเพิ่มประสิทธิภาพ ¶
มีเพียง --params ที่จำเป็นต้องระบุ ตัวเลือกเสริมที่ใช้บ่อยในตัวอย่างด้านล่าง ได้แก่ --timeframe, --method, --criteria, --optres และ --passes-dir
ก่อนเริ่มใช้งาน ควรทำความเข้าใจตัวเลือกต่อไปนี้
--method–genetic(ค่าเริ่มต้น) หรือgridเลือกgridเมื่อมีชุดค่าพารามิเตอร์ไม่มากและต้องการทดสอบทุกชุด ส่วนgeneticเหมาะเมื่อมีชุดค่าจำนวนมากและการค้นหาแบบมีทิศทางทำได้เร็วกว่า--cores– จำนวนเวิร์กเกอร์ที่ทำงานแบบขนานเพื่อเรียกใช้ขั้นตอน backtesting ของแต่ละรัน เวิร์กเกอร์แต่ละตัวใช้เธรด CPU หนึ่งเธรด ดังนั้นการทำงานจะใช้จำนวนเธรดใกล้เคียงกับค่าที่ระบุ ค่าที่ยอมรับคือจำนวนเต็มตั้งแต่ 1 ขึ้นไป ค่าเริ่มต้นเท่ากับครึ่งหนึ่งของจำนวนโปรเซสเซอร์บวกหนึ่ง ลดค่านี้บน VPS ขนาดเล็กเพื่อเหลือทรัพยากรสำหรับงานอื่น หรือเพิ่มค่าบนเครื่องเฉพาะเพื่อกระจายการค้นหาแบบพันธุกรรมไปยังเธรดมากขึ้น--auto-select-best– เลือกรันที่ให้ผลดีที่สุดโดยอัตโนมัติเมื่อการเพิ่มประสิทธิภาพเสร็จสิ้น เพื่อให้ไฟล์.cbotsetที่มีค่าพารามิเตอร์ดีที่สุดพร้อมใช้งานโดยไม่ต้องทำขั้นตอนเพิ่มเติม
หมายเหตุ
คำสั่ง optimize ใช้ --timeframe ไม่ใช่ --period ส่วนคำสั่ง run และ backtest ยังคงใช้ --period หากส่ง --period ให้ optimize ระบบจะปฏิเสธเพราะเป็นตัวเลือกที่ไม่รู้จัก
ไฟล์พารามิเตอร์ ¶
ไฟล์ที่ระบุด้วย --params เป็นออบเจ็กต์ JSON ที่มีอาร์เรย์ parameters ไฟล์นี้มีโครงสร้างเหมือนกับไฟล์ที่ส่งออกจากหน้าจอเพิ่มประสิทธิภาพของแอป cTrader บนเดสก์ท็อป จึงสามารถนำไฟล์ที่ส่งออกมาใช้ได้โดยตรง
{
"parameters": [
{ "Name": "SlowPeriods", "Optimize": true, "Min": "5", "Max": "50", "Step": "5" },
{ "Name": "StopLossPips", "Optimize": true, "Min": "10", "Max": "60", "Step": "5" },
{ "Name": "MAType", "Optimize": true, "Values": ["0", "1", "2"] },
{ "Name": "MySymbol", "Optimize": true, "Values": ["EURUSD", "GBPUSD"] }
]
}
กฎของฟิลด์ ¶
- ต้องระบุ
Nameและค่าในฟิลด์นี้ต้องตรงกับชื่อพร็อพเพอร์ตีของ cBot เรียกใช้ctrader-cli metadata <path-to-algo>เพื่อดูชื่อพร็อพเพอร์ตีที่ใช้ได้ หากไม่พบชื่อในข้อมูลเมตาของ cBot ระบบจะบันทึกลงล็อกและข้ามพารามิเตอร์นั้น แล้วเพิ่มประสิทธิภาพต่อด้วยพารามิเตอร์ที่เหลือ - กำหนด
Optimizeเป็นtrueเพื่อรวมพารามิเตอร์นั้นในการค้นหา หากกำหนดเป็นfalseค่าพารามิเตอร์จะคงที่ - พารามิเตอร์แบบช่วงค่า เช่น จำนวนเต็มและเลขทศนิยมชนิด double ต้องมี
Min,MaxและStepหากต้องการค้นหาค่าต่าง ๆ - พารามิเตอร์แบบเลือกจากค่าที่กำหนด เช่น ค่าประเภท enum และสัญลักษณ์ ต้องมีอาร์เรย์
Valuesที่ไม่ว่าง หากต้องการค้นหาค่าต่าง ๆ ParameterTypeเป็นฟิลด์ที่ไม่จำเป็นต้องระบุ หากไม่ระบุ ระบบจะกำหนดชนิดของพารามิเตอร์จากข้อมูลเมตาของ cBot โดยจับคู่กับName
กำหนดค่าคงที่ให้พารามิเตอร์ ¶
หากต้องการคงค่าของพารามิเตอร์ ให้เพิ่มพารามิเตอร์นั้นพร้อม Optimize: false และค่า Value ที่ต้องการ:
{ "Name": "MAType", "Value": "1", "Optimize": false },
{ "Name": "FastPeriods", "Value": "5", "Optimize": false }
คำเตือน
ให้ยึดการตั้งค่าในไฟล์พารามิเตอร์เป็นหลัก ก่อนนำไฟล์ไปใช้ cTrader CLI จะรีเซ็ตพารามิเตอร์ทั้งหมด ดังนั้นจะค้นหาเฉพาะพารามิเตอร์ที่คุณระบุเป็น Optimize: true เท่านั้น พารามิเตอร์ที่ไม่ได้ระบุไว้ในไฟล์เลยจะใช้ค่าเริ่มต้น แม้ว่า cBot จะตั้งค่าเริ่มต้นให้พารามิเตอร์นั้นเข้าร่วมการเพิ่มประสิทธิภาพก็ตาม หากต้องการรวมพารามิเตอร์ในการเพิ่มประสิทธิภาพ ให้เพิ่มพารามิเตอร์นั้นพร้อม Optimize: true
เพิ่มประสิทธิภาพกรอบเวลาหลัก ¶
คำสั่ง optimize สามารถค้นหาค่ากรอบเวลาหลักหลายค่าได้ นอกเหนือจากพารามิเตอร์ของ cBot กรอบเวลาหลักกำหนดได้จากสองแหล่ง โดย --timeframe มีลำดับความสำคัญสูงกว่า
--timeframe <tf>– ค่าเดียวจะกำหนดกรอบเวลาหลักให้คงที่ ส่วนหลายค่าที่คั่นด้วยจุลภาคจะให้ค้นหากรอบเวลาหลายค่า- ไฟล์พารามิเตอร์ – ไฟล์ที่ส่งออกจากแอปเดสก์ท็อปมีพารามิเตอร์กรอบเวลาแบบสังเคราะห์สำหรับวัตถุประสงค์นี้อยู่แล้ว
กรอบเวลาพื้นฐานของข้อมูลจะใช้ค่าเดียวที่ระบุ ค่าที่กำหนดให้คงที่ หรือกรอบเวลาที่เล็กที่สุดจากค่าที่ค้นหา
ความเข้ากันได้ของกรอบเวลาและโหมดข้อมูล ¶
กรอบเวลาหลักที่ใช้ค้นหาหรือกำหนดให้คงที่ต้องโหลดได้ใน --data-mode ที่เลือก
| โหมดข้อมูล | ค่ากรอบเวลาหลักที่ใช้ได้ |
|---|---|
open | กรอบเวลาชนิดเดียวกันที่มีระยะเวลาเป็นจำนวนเท่าเต็มของกรอบเวลาที่เล็กที่สุดที่เลือก |
m1 หรือ m1-csv | กรอบเวลาทั้งหมดที่อิงเวลา โดยไม่รองรับกรอบที่ไม่ได้อิงเวลา เช่น Renko และกราฟแท่งแบบช่วงราคา |
ticks | กรอบเวลาทั้งหมดยกเว้นกรอบเวลาแบบกำหนดเอง |
หมายเหตุ
หากชุดค่าไม่ถูกต้อง คำสั่งจะหยุดก่อนโหลดข้อมูลและแสดงค่าที่ทำให้เกิดข้อผิดพลาด
เกณฑ์ ¶
แต่ละรายการใน --criteria จับคู่ดัชนีผลการดำเนินงานกับทิศทาง max หรือ min เช่น NetProfit:max ตารางด้านล่างแสดงชื่อดัชนีที่รองรับทั้งหมดพร้อมคำอธิบายว่าวัดค่าอะไร
| ดัชนี | ค่าที่วัด |
|---|---|
NetProfit | กำไรหรือขาดทุนสุดท้ายในสกุลเงินของบัญชี |
ProfitFactor | กำไรรวมหารด้วยขาดทุนรวม |
MaxEquityDrawdownPercentages | เปอร์เซ็นต์การลดลงสูงสุดของอิควิตี้จากจุดสูงสุดถึงจุดต่ำสุด |
MaxBalanceDrawdownPercentages | เปอร์เซ็นต์การลดลงสูงสุดของยอดคงเหลือจากจุดสูงสุดถึงจุดต่ำสุด |
MaxEquityDrawdown | มูลค่าการลดลงสูงสุดของอิควิตี้ในสกุลเงินของบัญชี |
MaxBalanceDrawdown | มูลค่าการลดลงสูงสุดของยอดคงเหลือในสกุลเงินของบัญชี |
WinningTrades | จำนวนรายการเทรดที่ปิดโดยมีกำไร |
LosingTrades | จำนวนรายการเทรดที่ปิดโดยขาดทุน |
TotalTrades | จำนวนรายการเทรดที่ปิดทั้งหมด |
AverageTrade | กำไรสุทธิหารด้วยจำนวนรายการเทรดที่ปิด |
หากต้องการเพิ่มกำไรสุทธิให้สูงสุดและลดการลดลงสูงสุดของอิควิตี้ให้น้อยที่สุด:
--criteria="NetProfit:max,MaxEquityDrawdownPercentages:min"
หากต้องการกำหนดการจัดอันดับด้วยตนเอง ให้ใช้ --fitness แทน เมธอด GetFitness ของ cBot จะส่งคืนคะแนน และระบบเพิ่มประสิทธิภาพจะเก็บรันที่มีค่าคะแนนสูงที่สุดไว้ --fitness และ --criteria ใช้ร่วมกันไม่ได้ ต้องเลือกใช้เพียงตัวเลือกเดียว
ตัวเลือกสภาพแวดล้อมการทดสอบ ¶
optimize ใช้ตัวเลือกสภาพแวดล้อมการทดสอบเดียวกับ backtest ตารางด้านล่างแสดงตัวเลือกที่ CLI เวอร์ชันปัจจุบันรองรับ สิ่งที่แต่ละตัวเลือกกำหนด และความแตกต่างระหว่างสองคำสั่งในกรณีที่เกี่ยวข้อง
| ตัวเลือก | วัตถุประสงค์ | ใช้ได้กับ |
|---|---|---|
--account | หมายเลขบัญชีเทรด | ทั้งสองคำสั่ง |
--symbol | สัญลักษณ์ที่ใช้ทดสอบ | ทั้งสองคำสั่ง |
--start | วันที่และเวลาเริ่มต้นของช่วงทดสอบ | ทั้งสองคำสั่ง |
--end | วันที่และเวลาสิ้นสุดของช่วงทดสอบ | ทั้งสองคำสั่ง |
--balance | ยอดคงเหลือเริ่มต้นสำหรับการจำลอง | ทั้งสองคำสั่ง |
--data-mode | open, m1, m1-csv, tick-csv หรือ ticks | ทั้งสองคำสั่ง |
--data-file | พาธไปยังไฟล์ CSV สำหรับ m1-csv หรือ tick-csv | ทั้งสองคำสั่ง |
--commission | จำนวนค่าคอมมิชชันต่อรายการเทรด | ทั้งสองคำสั่ง |
--spread | สเปรดในหน่วย pip | ทั้งสองคำสั่ง |
--precise-conversion | ใช้การแปลงสกุลเงินที่แม่นยำสำหรับคู่สกุลเงินที่ต้องแปลงข้ามสกุลเงิน | ทั้งสองคำสั่ง |
--timeframe | กรอบเวลาพื้นฐานสำหรับการค้นหาพารามิเตอร์ | เฉพาะ optimize |
--period | กรอบเวลาพื้นฐานสำหรับการทดสอบ | เฉพาะ backtest |
--report | พาธสำหรับบันทึกรายงาน HTML | เฉพาะ backtest |
--report-json | พาธสำหรับบันทึกรายงาน JSON | เฉพาะ backtest |
หมายเหตุ
ตัวเลือกการออกรายงานใช้กับ optimize ไม่ได้ ให้ใช้ --optres และ --passes-dir เพื่อบันทึกผลลัพธ์แทน
ตัวอย่าง ¶
ctrader-cli optimize "C:/test/Sample Trend cBot.algo" \
--params=C:/test/optimize-params.json \
--account=1234567 --symbol=EURUSD --timeframe=h1,h2 \
--start="01/01/2025" --end="01/02/2025" \
--balance=100000 --data-mode=open --commission=30 --spread=2 \
--method=grid \
--criteria="NetProfit:max,MaxEquityDrawdownPercentages:min" \
--auto-select-best \
--optres=C:/test/result.optres \
--passes-dir=C:/test/result-passes \
--ctid=letstrade --pwd-file=C:/test/password.pwd
ผลลัพธ์ ¶
ระหว่างทำงาน optimize จะแสดงความคืบหน้าอย่างต่อเนื่องในเทอร์มินัล:
Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
- สรุปผล – เมื่อเสร็จสิ้น cTrader CLI จะแสดงสรุปในเทอร์มินัล ซึ่งรวมจำนวนรันทั้งหมด เวลาที่ใช้ และรันที่ให้ผลดีที่สุดพร้อมสถิติ
- ไฟล์ผลลัพธ์ – เมื่อระบุ
--optrescTrader CLI จะเขียนผลลัพธ์ทั้งหมดลงในไฟล์ JSON นามสกุล.optresซึ่งแสดงข้อมูลของทุกรัน ไฟล์นี้ใช้รูปแบบเดียวกับผลการเพิ่มประสิทธิภาพในแอปเดสก์ท็อป จึงสามารถเปิดหรือนำเข้าในหน้าจอเพิ่มประสิทธิภาพของแอปได้ - รายงานแยกตามรัน – เมื่อระบุ
--passes-dircTrader CLI จะบันทึกไฟล์รายงานของแต่ละรันในไดเรกทอรีนั้น โดยมีโฟลเดอร์ย่อยหนึ่งโฟลเดอร์ต่อรัน และแต่ละโฟลเดอร์มีไฟล์.html,.txt,.jsonและ.cbotsetไฟล์.cbotsetแสดงค่าพารามิเตอร์ที่ใช้จริงในการรันนั้น
หากไม่ได้ระบุทั้ง --optres และ --passes-dir การเพิ่มประสิทธิภาพจะเสร็จสิ้นและแสดงเฉพาะสรุปผล
หมายเหตุ
คำสั่ง optimize ไม่สร้างรายงาน HTML แบบรวมทั้งหมด อย่างไรก็ตาม หากระบุ --passes-dir ไฟล์ HTML ของแต่ละรันจะยังคงถูกบันทึกไว้ในไดเรกทอรีนั้น
ตรวจสอบว่าการเพิ่มประสิทธิภาพทำงานถูกต้อง ¶
หลังการทำงาน ให้ยืนยันว่าระบบได้ค้นหาค่าพารามิเตอร์ตามที่คุณต้องการ
- เปิดไฟล์
.cbotsetของรันใดรันหนึ่งภายใต้--passes-dirและตรวจสอบว่าพารามิเตอร์ที่เพิ่มประสิทธิภาพมีค่าเปลี่ยนไประหว่างรัน ขณะที่พารามิเตอร์ที่กำหนดให้คงที่หรือไม่ได้ระบุไว้ยังมีค่าเดิม - หากค้นหากรอบเวลาหลายค่า ให้ตรวจสอบค่า
Chart.Periodในไฟล์.cbotsetของแต่ละรัน ค่านั้นควรตรงกับกรอบเวลาที่คุณเลือก - เปิดไฟล์
.optresหรือนำเข้าไฟล์นี้ในหน้าจอเพิ่มประสิทธิภาพของแอปเดสก์ท็อปเพื่อตรวจสอบการกำหนดค่าและผลของทุกรันพร้อมกัน
การตรวจสอบความถูกต้องและข้อผิดพลาดที่พบบ่อย ¶
แต่ละแถวในตารางด้านล่างแสดงอาการ สาเหตุที่เป็นไปได้ รหัสสิ้นสุดการทำงานที่ cTrader CLI ส่งคืนเมื่อเกิดข้อผิดพลาด และขั้นตอนถัดไปที่ควรทำ เมื่อการตรวจสอบความถูกต้องล้มเหลว cTrader CLI จะส่งคืนรหัสสิ้นสุดการทำงานที่ไม่ใช่ศูนย์ ทำให้สคริปต์หยุดเมื่อพบข้อผิดพลาดแรกได้โดยไม่ต้องวิเคราะห์ข้อความ
รหัสสิ้นสุดการทำงานในตารางหมายถึงค่าที่ cTrader CLI ส่งกลับให้เชลล์ ไม่มีการเผยแพร่ตัวเลขรหัสที่แน่นอน ดังนั้น non-zero หมายถึงคำสั่งล้มเหลวโดยไม่มีรหัสเฉพาะ ส่วน unknown หมายถึงข้อผิดพลาดภายในที่ต้องเปลี่ยนบิลด์หรือติดต่อฝ่ายสนับสนุน
| อาการ | สาเหตุที่เป็นไปได้ | รหัสสิ้นสุดการทำงาน | ขั้นตอนถัดไป |
|---|---|---|---|
ข้อผิดพลาดในการตรวจสอบความถูกต้อง: ไม่มี --params | ไม่ได้ระบุไฟล์พารามิเตอร์ JSON | ไม่เป็นศูนย์ | ระบุ --params=<path> |
| ข้อผิดพลาดในการตรวจสอบความถูกต้อง: ไม่รู้จักกรอบเวลา | ค่า --timeframe ไม่ตรงกับตัวระบุที่ระบบรู้จัก | ไม่เป็นศูนย์ | เรียกใช้ ctrader-cli periods แล้วใช้ตัวระบุหนึ่งรายการจากผลลัพธ์ |
| ข้อผิดพลาดในการตรวจสอบความถูกต้อง: กรอบเวลาหลักไม่ถูกต้อง | กรอบเวลาไม่สามารถโหลดด้วย --data-mode ที่เลือกได้ | ไม่เป็นศูนย์ | เลือกกรอบเวลาอื่นหรือเปลี่ยน --data-mode |
| ข้อผิดพลาดในการตรวจสอบความถูกต้อง: รูปแบบคู่เกณฑ์ไม่ถูกต้อง | ชื่อดัชนีไม่ถูกต้อง หรือทิศทางไม่ใช่ max หรือ min | ไม่เป็นศูนย์ | ใช้ชื่อดัชนีที่รองรับร่วมกับ max หรือ min |
| ข้อผิดพลาดในการตรวจสอบความถูกต้อง: ดัชนีเกณฑ์ที่ไม่รู้จัก | ชื่อที่ระบุใน --criteria ไม่อยู่ในรายการดัชนีที่รองรับ | ไม่เป็นศูนย์ | ใช้ชื่อดัชนีที่แสดงในส่วน Criteria |
ข้อผิดพลาดในการตรวจสอบความถูกต้อง: ค่า --method ที่ไม่รู้จัก | ค่า --method ไม่ใช่ genetic หรือ grid | ไม่เป็นศูนย์ | ใช้ --method=genetic (ค่าเริ่มต้น) หรือ --method=grid |
ระบุ --fitness และ --criteria พร้อมกัน | ตัวเลือกทั้งสองใช้ร่วมกันไม่ได้ | ไม่เป็นศูนย์ | ระบุ --fitness หรือ --criteria เพียงตัวเดียว |
ไม่สามารถใช้ optimize ได้ | กำลังใช้ CLI รุ่นภายในหรือรุ่นคลาวด์ | ไม่ทราบ | เปลี่ยนไปใช้รุ่นที่ทำงานในเครื่องสำหรับผู้ใช้ทั่วไป |