Indicator Math V2 (indicator_math_v2) 🚀
ไลบรารี Rust ประสิทธิภาพสูงสำหรับการวิเคราะห์ทางเทคนิคทางการเงิน (Financial Technical Analysis) ที่ถูกออกแบบมาเพื่อ สืบทอดและเพิ่มประสิทธิภาพ ของลอจิกจาก clsAnalysisGenerator.js โดยเฉพาะ
ด้วยการออกแบบใหม่ทั้งหมด ทำให้ indicator_math_v2 มีจุดเด่นในเรื่องการประมวลผลแบบขนาน (Parallel Processing) และการวิเคราะห์แบบสะสม (Incremental Analysis) ซึ่งเบาและเร็วกว่าตัวเก่าอย่างเทียบไม่ติด
✨ คุณสมบัติเด่น (Features)
1. ⚡ Parallel Asset Processing (คำนวณหลายคู่เงินพร้อมกันแบบไร้คอขวด)
ใช้พลังของ tokio (Asynchronous Runtime) และ rayon (Data-parallelism) ในการกระจายงานคำนวณอินดิเคเตอร์ของหลายคู่เงินไปรันบน CPU หลายๆ Core พร้อมกัน ทำให้เซิร์ฟเวอร์สามารถรับโหลดได้จำนวนมหาศาล
2. 🧠 Incremental State Management (O(1) Update Time)
ลาก่อนการคำนวณซ้ำ O(N): ในเวอร์ชันปกตินั้น เวลาคุณมีข้อมูลตั้งต้น 1,000 แท่ง เมื่อมี Tick ใหม่มา 1 ครั้ง ระบบจะคำนวณใหม่ไล่ตั้งแต่แท่งที่ 1 ยัน 1,001 (เสียเวลามาก)
แต่ V2 ฉลาดกว่า: ระบบมี
GeneratorStateคอยจดจำ "ค่าตัวแปรสุดท้าย" เอาไว้ (เช่น EMA ของแท่งล่าสุด) ทำให้เมื่อมีราคา Tick เข้ามา ระบบจะเอา ราคาใหม่ + ค่าใน State เดิม มาคำนวณได้ทันที (ใช้แค่ 1 Operation (O(1)) ไม่ใช่พันครั้ง!) ทำให้เบากระชากใจ
3. 🌐 Built-in Deriv Integration
มีโค้ดจัดการการดึงข้อมูล OHLC ย้อนหลังจาก Deriv WebSocket/API ในตัว ไม่ต้องเขียนโค้ดยิง API เองให้เมื่อย โหลดข้อมูลตั้งต้นเป็นร้อยเป็นพันกราฟได้สบายๆ รวดเดียว
4. 🧮 Comprehensive Indicators
มีชุดอินดิเคเตอร์ครบครันและได้รับการรีไรต์ให้เข้ากับการทำงานแบบ State (Incremental):
- Moving Averages: EMA, HMA, EHMA, WMA
- Momentum/Trend: RSI, MACD, ADX
- Volatility: ATR, Bollinger Bands, Choppiness Index (CI)
5. 🎯 Status Code Matching
ตัวนี้ทีเด็ด! มันสามารถวิเคราะห์และรวมอินดิเคเตอร์สิบกว่าตัว แล้วสรุปสถานะแท่งเทียนนั้นออกมาให้เป็น SeriesCode ตัวแปรเดียว (เช่น M-UU-G-C) ซึ่งตรงกับรูปแบบ CandleMasterCode ที่เอาไว้ใช้พิจารณาเข้าเทรดได้เลยอัตโนมัติ ไม่ต้องมานั่งเขียน if-else เอง
🛠️ โครงสร้างฟังก์ชันหลัก (Key Functions)
ตัวจัดการหลักของไลบรารีนี้คือ AnalysisManager ซึ่งมีฟังก์ชันที่คุณจะได้ใช้บ่อยๆ ดังนี้:
1. AnalysisManager::new(options, master_codes)
- ใช้ทำอะไร: สร้าง Instance บริหารการคำนวณขึ้นมาใหม่
- พารามิเตอร์ที่รับ: รับ
AnalysisOptions(ตั้งค่าว่าจะเอา Period เท่าไหร่) และmaster_codes(กติกา Status Code ว่าแบบไหนเรียกว่าอะไร)
2. manager.initialize(ws_url, assets).await
- ใช้ทำอะไร: ดึงข้อมูลแท่งเทียนย้อนหลังของรายชื่อเหรียญ (
assets) ผ่าน Web Socket URL ที่ให้ไป จากนั้นมันจะคำนวณอินดิเคเตอร์ย้อนหลังทั้งหมดทีเดียวและเก็บข้อมูลไว้ใน State ให้พร้อมใช้งาน - เหมาะสำหรับ: การบู้ท (Boot Up) ระบบครั้งแรก
3. manager.process_tick(asset, price, epoch)
- ใช้ทำอะไร: เป็นหัวใจหลักของโหมด Live Trading เมื่อมีสัญญาณราคาขยับ (Tick) ส่งราคาล่าสุด (
price) ไปให้ มันก็จะเอาไปเช็คดูว่าปิดแท่งเทียนเดิมรึยัง- ถ้าปิดแล้ว ระบบก็จะ "คืนค่า (Return)" ไฟล์
AnalysisResultกลับมาบอกผลวิเคราะห์ของแท่งล่าสุดทันที - ถ้ายังไม่ปิด มันก็แค่เซฟไว้และคืนค่า
None
- ถ้าปิดแล้ว ระบบก็จะ "คืนค่า (Return)" ไฟล์
- ประสิทธิภาพ: O(1) เร็วและไม่กิน CPU อย่างที่กล่าวไปข้างต้น
4. manager.get_all_status()
- ใช้ทำอะไร: สำหรับเรียกดู "สถานะล่าสุด" ของทุกคู่เงินที่เราได้สั่งให้มันทำงานไว้ มันจะรวบรวมข้อมูลสถานะ (Status Code) แปะมาให้ทันที เอาไปโชว์ใน Web / Mobile ได้ง่ายสุดๆ
📦 วิธีการติดตั้ง
เพิ่มมันลงใน Cargo.toml ระบบคุณ ดังนี้:
[]
= { = "indicator_math", = "RustLib/indicator_math" }
= { = "1.0", = ["full"] }
ปล. ต้องใช้คู่กับแพ็กเกจ tokio เสมอเพราะมันเป็นระบบทำงานขนานแบบ Asynchronous
🔗 วิธีการใช้งาน (Integration Guide)
1. การเชื่อมต่อกับ main.rs (Backend)
การนำไปใช้ใน main.rs นั้น คุณจะต้องสร้าง AnalysisManager เอาไว้เป็น Global State/Shared State ผ่านตระกูล Arc<Mutex<>> หรือ Arc<RwLock<>> เพื่อให้ระบบ WebSocket หรือ Thread ต่างๆ เข้ามาเรียกใช้พร้อมกันได้
ตัวอย่างโค้ดใน main.rs:
use ;
use Arc;
use RwLock;
// สร้างข้อมูล State รวมที่สามารถแชร์ไปใน Axum (หรือ WebSocket) ได้
type SharedManager = ;
async
2. การนำไปใช้กับ Lightweight Charts (Frontend)
เมื่อ Backend รัน process_tick() ได้แท่งเทียนปิดและวิเคราะห์เสร็จ มันจะคืนรูปมาเป็นค่าต่างๆ เช่น open, high, low, close, ema_short_value, rsi_value
สิ่งที่คุณต้องทำบน Frontend (HTML/JS) คือ เอาตัวแปลเหล่านั้นป้อนใส่ TradingView Lightweight Charts คล้ายกับวิธีดั้งเดิม:
ตัวอย่างโค้ดฝั่ง Javascript:
// 1. สร้างชาร์ตแท่งเทียนหลักและเส้น EMA
const chart = ;
const candleSeries = chart.;
const emaSeries = chart.;
// 2. รอรับข้อมูล JSON จาก WebSocket Rust
socket ;