| Crates.io | chop-indicator |
| lib.rs | chop-indicator |
| version | 0.1.0 |
| created_at | 2026-01-01 03:01:21.899354+00 |
| updated_at | 2026-01-01 03:01:21.899354+00 |
| description | Choppiness Index (CHOP) indicator for technical analysis and options trading |
| homepage | |
| repository | https://github.com/yourusername/chop-indicator |
| max_upload_size | |
| id | 2015672 |
| size | 56,274 |
ไลบรารี Rust สำหรับคำนวณ Choppiness Index (CHOP) ซึ่งเป็นตัวชี้วัดทางเทคนิคที่ออกแบบมาเพื่อการเทรด Options โดยเฉพาะใน timeframe 1 นาที
Choppiness Index (CHOP) เป็นตัวชี้วัดทางเทคนิคที่ช่วยบอกว่าตลาดกำลังเคลื่อนไหวแบบมีทิศทาง (trending) หรือเคลื่อนไหวไปมาแบบไม่มีทิศทาง (choppy/sideways) โดยมีประโยชน์ในการ:
| ค่า CHOP | สภาพตลาด | คำอธิบาย |
|---|---|---|
| < 38.2 | Trend แรง | ตลาดมี Trend ที่แข็งแกร่งมาก |
| 38.2 - 45 | Trending | ตลาดกำลัง Trend อยู่ |
| 45 - 55 | ช่วงเปลี่ยนผ่าน | ตลาดอยู่ในช่วงเปลี่ยนสภาพ |
| 55 - 61.8 | Choppy | ตลาดเคลื่อนไหวแบบ sideways |
| > 61.8 | Choppy มาก | ตลาด Choppy มาก ไม่มีทิศทาง |
เพิ่มใน Cargo.toml:
[dependencies]
chop-indicator = "0.1.0"
หรือพร้อม serde support:
[dependencies]
chop-indicator = { version = "0.1.0", features = ["serde"] }
use chop_indicator::{choppiness_index, analyze_chop};
fn main() {
// ข้อมูลราคา (ต้องมีอย่างน้อย 15+ candles สำหรับ period 14)
let high = vec![
100.0, 102.0, 104.0, 103.0, 105.0, 107.0, 106.0, 108.0,
110.0, 109.0, 111.0, 113.0, 112.0, 114.0, 116.0
];
let low = vec![
98.0, 100.0, 102.0, 101.0, 103.0, 105.0, 104.0, 106.0,
108.0, 107.0, 109.0, 111.0, 110.0, 112.0, 114.0
];
let close = vec![
99.0, 101.0, 103.0, 102.0, 104.0, 106.0, 105.0, 107.0,
109.0, 108.0, 110.0, 112.0, 111.0, 113.0, 115.0
];
// คำนวณค่า CHOP
let chop_values = choppiness_index(&high, &low, &close, 14).unwrap();
println!("ค่า CHOP: {:?}", chop_values);
// วิเคราะห์แบบละเอียด
let analysis = analyze_chop(&high, &low, &close, 14).unwrap();
println!("CHOP ปัจจุบัน: {:.2}", analysis.value);
println!("สภาพตลาด: {:?}", analysis.condition);
println!("กำลัง Trend: {}", analysis.is_trending);
println!("กลยุทธ์แนะนำ: {}", analysis.strategy_recommendation);
}
use chop_indicator::{quick_1min_analysis, OptionsSignal};
fn main() {
let high = vec![/* ราคาสูงสุด 1 นาที */];
let low = vec![/* ราคาต่ำสุด 1 นาที */];
let close = vec![/* ราคาปิด 1 นาที */];
// วิเคราะห์แบบเร็วสำหรับตัดสินใจทันที
let (chop, signal, condition) = quick_1min_analysis(&high, &low, &close).unwrap();
println!("CHOP: {:.2}", chop);
println!("สัญญาณ: {:?}", signal);
println!("สภาพตลาด: {:?}", condition);
// ตัดสินใจเทรดตามสัญญาณ
match signal {
OptionsSignal::StrongDirectional => {
println!("🚀 ตรวจพบ Trend แรง!");
println!("กลยุทธ์: เทรดแบบมีทิศทางอย่างจริงจัง");
println!("→ ซื้อ Calls/Puts แบบ ATM ตามทิศทาง trend");
println!("→ โอกาสที่ trend จะดำเนินต่อสูง");
}
OptionsSignal::Directional => {
println!("📈 ตลาดกำลัง Trend");
println!("กลยุทธ์: เทรดแบบมีทิศทางปานกลาง");
println!("→ ใช้ Vertical spreads");
println!("→ Options แบบ OTM ตามทิศทาง trend");
}
OptionsSignal::Neutral => {
println!("⚠️ ช่วงเปลี่ยนผ่าน");
println!("กลยุทธ์: กลยุทธ์แบบกลางๆ");
println!("→ ใช้ Iron condors");
println!("→ ลดขนาด position ลง");
}
OptionsSignal::SellPremium => {
println!("💰 ตลาด Choppy - ขาย Premium");
println!("กลยุทธ์: ขาย Premium");
println!("→ Credit spreads");
println!("→ Iron butterflies");
println!("→ Short strangles");
}
OptionsSignal::NoTrade => {
println!("🛑 Choppy มาก - อย่าเทรด!");
println!("กลยุทธ์: หลีกเลี่ยงการเทรด");
println!("→ รอสภาพตลาดที่ดีกว่า");
println!("→ หรือใช้ Calendar spreads เท่านั้น");
}
}
}
choppiness_index(high, low, close, period) -> Result<Vec<f64>>คำนวณค่า CHOP สำหรับทุก period ที่มี
let chop_values = choppiness_index(&high, &low, &close, 14)?;
choppiness_index_last(high, low, close, period) -> Result<f64>คำนวณเฉพาะค่า CHOP ล่าสุด
let current_chop = choppiness_index_last(&high, &low, &close, 14)?;
analyze_chop(high, low, close, period) -> Result<ChopAnalysis>วิเคราะห์ตลาดแบบละเอียดพร้อมคำแนะนำ
let analysis = analyze_chop(&high, &low, &close, 14)?;
println!("ค่า: {}", analysis.value);
println!("สภาพ: {:?}", analysis.condition);
println!("กลยุทธ์: {}", analysis.strategy_recommendation);
quick_1min_analysis(high, low, close) -> Result<(f64, OptionsSignal, MarketCondition)>วิเคราะห์แบบเร็วสำหรับการเทรด 1 นาที (ใช้ period 14)
let (chop, signal, condition) = quick_1min_analysis(&high, &low, &close)?;
MarketConditionpub enum MarketCondition {
StrongTrend, // CHOP < 38.2
Trend, // 38.2 <= CHOP < 45
Transitional, // 45 <= CHOP < 55
Choppy, // 55 <= CHOP < 61.8
VeryChoppy, // CHOP >= 61.8
}
OptionsSignalpub enum OptionsSignal {
NoTrade, // CHOP >= 65
SellPremium, // 55 <= CHOP < 65
Neutral, // 45 <= CHOP < 55
Directional, // 35 <= CHOP < 45
StrongDirectional, // CHOP < 35
}
ChopAnalysispub struct ChopAnalysis {
pub value: f64, // ค่า CHOP
pub condition: MarketCondition, // สภาพตลาด
pub is_trending: bool, // กำลัง trend หรือไม่
pub is_choppy: bool, // choppy หรือไม่
pub strategy_recommendation: String, // คำแนะนำกลยุทธ์
}
Crate นี้มีระบบจัดการ error ที่ครบถ้วน:
use chop_indicator::{choppiness_index, ChopError};
match choppiness_index(&high, &low, &close, 14) {
Ok(values) => println!("CHOP: {:?}", values),
Err(ChopError::InsufficientData { required, got }) => {
eprintln!("ต้องการ {} จุดข้อมูล แต่ได้ {}", required, got);
}
Err(ChopError::InvalidPeriod) => {
eprintln!("Period ต้องมากกว่า 0");
}
Err(ChopError::MismatchedLengths) => {
eprintln!("Array ของ high, low, close ต้องมีความยาวเท่ากัน");
}
Err(e) => eprintln!("Error: {}", e),
}
อย่าใช้ CHOP เพียงอย่างเดียว ควรใช้ร่วมกับ:
CHOP = 100 * LOG10( SUM(ATR, n) / (MAX(High, n) - MIN(Low, n)) ) / LOG10(n)
โดยที่:
ATR = Average True Rangen = lookback period (ค่าเริ่มต้น: 14)MAX(High, n) = ราคาสูงสุดใน n periodsMIN(Low, n) = ราคาต่ำสุดใน n periodsรัน test suite:
cargo test
รันพร้อมแสดงผลลัพธ์:
cargo test -- --nocapture
ดูตัวอย่างเพิ่มเติมในโฟลเดอร์ examples/:
cargo run --example basic
cargo run --example realtime_1min
cargo run --example backtesting
ยินดีรับ Contribution! กรุณา submit Pull Request ได้เลย
git checkout -b feature/ฟีเจอร์เจ๋งๆ)git commit -m 'เพิ่มฟีเจอร์เจ๋งๆ')git push origin feature/ฟีเจอร์เจ๋งๆ)โปรเจกต์นี้ใช้ใบอนุญาตอย่างใดอย่างหนึ่งจาก:
ตามที่คุณเลือก
ซอฟต์แวร์นี้มีวัตถุประสงค์เพื่อการศึกษาเท่านั้น การเทรด Options มีความเสี่ยงสูงต่อการสูญเสียเงินทุนและไม่เหมาะสำหรับทุกคน ผลการดำเนินงานในอดีตไม่ได้บ่งชี้ถึงผลลัพธ์ในอนาคต ควรศึกษาข้อมูลด้วยตนเองและปรึกษาที่ปรึกษาทางการเงินที่มีใบอนุญาตก่อนตัดสินใจลงทุนเสมอ
สร้างด้วย ❤️ สำหรับชุมชน Rust trading
Q: ควรใช้ period เท่าไหร่สำหรับ 1 นาที?
A: แนะนำ 14 (default) หรือ 10 สำหรับความไวที่สูงขึ้น
Q: CHOP เหมาะกับ timeframe อื่นไหม?
A: ใช่ แต่ crate นี้ optimize สำหรับ 1 นาที สามารถใช้กับ 5, 15, 30 นาทีได้
Q: ต้องใช้กับ indicators อื่นด้วยหรือไม่?
A: ควรใช้ร่วมกับ RSI, MACD, Volume เพื่อยืนยันสัญญาณ
Q: CHOP บอกทิศทางได้ไหม?
A: ไม่ได้ CHOP บอกเพียงว่าตลาด trending หรือ choppy เท่านั้น ต้องใช้ indicators อื่นดูทิศทาง