chop-indicator 0.1.0

Choppiness Index (CHOP) indicator for technical analysis and options trading
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
# CHOP Indicator (ภาษาไทย)

[![Crates.io](https://img.shields.io/crates/v/chop-indicator.svg)](https://crates.io/crates/chop-indicator)
[![Documentation](https://docs.rs/chop-indicator/badge.svg)](https://docs.rs/chop-indicator)
[![License](https://img.shields.io/crates/l/chop-indicator.svg)](https://github.com/yourusername/chop-indicator#license)

ไลบรารี Rust สำหรับคำนวณ Choppiness Index (CHOP) ซึ่งเป็นตัวชี้วัดทางเทคนิคที่ออกแบบมาเพื่อการเทรด Options โดยเฉพาะใน timeframe 1 นาที

## 🎯 Choppiness Index คืออะไร?

Choppiness Index (CHOP) เป็นตัวชี้วัดทางเทคนิคที่ช่วยบอกว่าตลาดกำลังเคลื่อนไหวแบบมีทิศทาง (trending) หรือเคลื่อนไหวไปมาแบบไม่มีทิศทาง (choppy/sideways) โดยมีประโยชน์ในการ:

- ระบุสภาพตลาดก่อนเข้าเทรด
- เลือกกลยุทธ์ Options ที่เหมาะสม
- หลีกเลี่ยงตลาดที่เคลื่อนไหวแบบ sideways ซึ่งกลยุทธ์แบบมีทิศทางมักจะล้มเหลว
- จับจังหวะเข้าเทรดแบบขาย Premium

### การตีความค่า CHOP

| ค่า CHOP | สภาพตลาด | คำอธิบาย |
|----------|-----------|----------|
| < 38.2 | Trend แรง | ตลาดมี Trend ที่แข็งแกร่งมาก |
| 38.2 - 45 | Trending | ตลาดกำลัง Trend อยู่ |
| 45 - 55 | ช่วงเปลี่ยนผ่าน | ตลาดอยู่ในช่วงเปลี่ยนสภาพ |
| 55 - 61.8 | Choppy | ตลาดเคลื่อนไหวแบบ sideways |
| > 61.8 | Choppy มาก | ตลาด Choppy มาก ไม่มีทิศทาง |

## ✨ คุณสมบัติ

- **เร็วและแม่นยำ**: เขียนด้วย Rust ที่ optimize แล้ว
- **เน้น Options Trading**: ออกแบบพิเศษสำหรับการเทรด Options ใน 1 นาที
- **วิเคราะห์ตลาด**: ตรวจจับสภาพตลาดอัตโนมัติ
- **แนะนำกลยุทธ์**: มีคำแนะนำกลยุทธ์ Options ในตัว
- **จัดการ Error**: มี error types และ validation ครบถ้วน
- **รองรับ Serde**: สามารถเลือกใช้ serialization ได้
- **ทดสอบครบถ้วน**: มี test suite ที่ครอบคลุม

## 📦 การติดตั้ง

เพิ่มใน `Cargo.toml`:

```toml
[dependencies]
chop-indicator = "0.1.0"
```

หรือพร้อม serde support:

```toml
[dependencies]
chop-indicator = { version = "0.1.0", features = ["serde"] }
```

## 🚀 เริ่มต้นใช้งาน

### การใช้งานพื้นฐาน

```rust
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);
}
```

### การเทรด Options ใน 1 นาที

```rust
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 เท่านั้น");
        }
    }
}
```

## 📊 กลยุทธ์ Options ตามค่า CHOP

### Trend แรง (CHOP < 35)
- **กลยุทธ์หลัก**: เทรดแบบมีทิศทางอย่างจริงจัง
- **Options**: Calls/Puts แบบ ATM ตามทิศทาง trend
- **ความเสี่ยง**: ต่ำ (โอกาส trend ดำเนินต่อสูง)
- **เป้าหมายกำไร**: Scalp เร็ว (1-5 นาที)

### กำลัง Trending (CHOP 35-45)
- **กลยุทธ์หลัก**: เทรดแบบมีทิศทางปานกลาง
- **Options**: Vertical spreads, Options แบบ OTM
- **ความเสี่ยง**: กลาง (trend อาจอ่อนลง)
- **เป้าหมายกำไร**: 3-10 นาที

### ช่วงเปลี่ยนผ่าน (CHOP 45-55)
- **กลยุทธ์หลัก**: กลยุทธ์แบบกลางๆ
- **Options**: Iron condors, position ขนาดเล็ก
- **ความเสี่ยง**: สูง (ทิศทางไม่แน่นอน)
- **เป้าหมายกำไร**: กำไรจากการเคลื่อนไหวใน range

### Choppy (CHOP 55-65)
- **กลยุทธ์หลัก**: ขาย Premium
- **Options**: Credit spreads, Iron butterflies
- **ความเสี่ยง**: กลาง (คาดว่าจะเคลื่อนไหวใน range)
- **เป้าหมายกำไร**: Time decay + Mean reversion

### Choppy มาก (CHOP > 65)
- **กลยุทธ์หลัก**: หลีกเลี่ยงหรือใช้ Calendar spreads เท่านั้น
- **Options**: อย่าเทรดหรือใช้ Calendar ระยะยาว
- **ความเสี่ยง**: สูงมาก (การเคลื่อนไหวคาดเดาไม่ได้)
- **เป้าหมายกำไร**: รอสภาพที่ดีขึ้น

## 🔧 คู่มือ API

### ฟังก์ชันหลัก

#### `choppiness_index(high, low, close, period) -> Result<Vec<f64>>`
คำนวณค่า CHOP สำหรับทุก period ที่มี

```rust
let chop_values = choppiness_index(&high, &low, &close, 14)?;
```

#### `choppiness_index_last(high, low, close, period) -> Result<f64>`
คำนวณเฉพาะค่า CHOP ล่าสุด

```rust
let current_chop = choppiness_index_last(&high, &low, &close, 14)?;
```

#### `analyze_chop(high, low, close, period) -> Result<ChopAnalysis>`
วิเคราะห์ตลาดแบบละเอียดพร้อมคำแนะนำ

```rust
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)

```rust
let (chop, signal, condition) = quick_1min_analysis(&high, &low, &close)?;
```

### Types (ชนิดข้อมูล)

#### `MarketCondition`
```rust
pub enum MarketCondition {
    StrongTrend,    // CHOP < 38.2
    Trend,          // 38.2 <= CHOP < 45
    Transitional,   // 45 <= CHOP < 55
    Choppy,         // 55 <= CHOP < 61.8
    VeryChoppy,     // CHOP >= 61.8
}
```

#### `OptionsSignal`
```rust
pub enum OptionsSignal {
    NoTrade,           // CHOP >= 65
    SellPremium,       // 55 <= CHOP < 65
    Neutral,           // 45 <= CHOP < 55
    Directional,       // 35 <= CHOP < 45
    StrongDirectional, // CHOP < 35
}
```

#### `ChopAnalysis`
```rust
pub struct ChopAnalysis {
    pub value: f64,                      // ค่า CHOP
    pub condition: MarketCondition,      // สภาพตลาด
    pub is_trending: bool,               // กำลัง trend หรือไม่
    pub is_choppy: bool,                 // choppy หรือไม่
    pub strategy_recommendation: String, // คำแนะนำกลยุทธ์
}
```

## ⚠️ การจัดการ Error

Crate นี้มีระบบจัดการ error ที่ครบถ้วน:

```rust
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),
}
```

## 💡 เคล็ดลับสำหรับการเทรด Options ใน 1 นาที

### 1. ใช้ร่วมกับ Indicators อื่น
อย่าใช้ CHOP เพียงอย่างเดียว ควรใช้ร่วมกับ:
- **RSI**: ยืนยัน overbought/oversold
- **MACD**: ยืนยันทิศทาง trend
- **Volume**: ยืนยันความแรงของ breakout
- **Moving Averages**: หา support/resistance

### 2. การบริหารความเสี่ยง
- **Stop Loss**: ต้องใส่ stop loss ที่แน่น (ไม่เกิน 2-3%)
- **ขนาด Position**: อย่าเสี่ยงเกิน 1-2% ต่อเทรด
- **จำนวน Position สูงสุด**: จำกัดไว้ 2-3 position พร้อมกัน
- **จำกัดเวลา**: ออกจาก position หลัง 5-10 นาทีไม่ว่าอย่างไร

### 3. ช่วงเวลาที่ดีที่สุดในการเทรด
- **หลีกเลี่ยง**: 15 นาทีแรกหลังตลาดเปิด
- **ดีที่สุด**: 9:45 AM - 11:00 AM, 2:00 PM - 3:30 PM EST
- **หลีกเลี่ยง**: 10 นาทีสุดท้าย (คาดเดาไม่ได้)

### 4. กฎเกี่ยวกับ CHOP
- **CHOP > 65**: อย่าเทรดเด็ดขาด
- **CHOP 55-65**: ขาย premium เท่านั้น และใช้ strike ที่กว้าง
- **CHOP 45-55**: ลดขนาด position ลง 50%
- **CHOP < 45**: ใช้ position เต็มขนาดได้
- **CHOP < 35**: พิจารณา scaling in

### 5. การเลือก Options
- **0DTE หรือ 1DTE เท่านั้น** สำหรับการเทรด 1 นาที
- **ATM ถึง OTM 1 strike** สำหรับเทรดแบบมีทิศทาง
- **Wings กว้าง** สำหรับ iron condors ในตลาด choppy
- **Strike ที่มี volume สูง** เท่านั้น

## 🔬 รายละเอียดทางเทคนิค

### สูตรการคำนวณ

```
CHOP = 100 * LOG10( SUM(ATR, n) / (MAX(High, n) - MIN(Low, n)) ) / LOG10(n)
```

โดยที่:
- `ATR` = Average True Range
- `n` = lookback period (ค่าเริ่มต้น: 14)
- `MAX(High, n)` = ราคาสูงสุดใน n periods
- `MIN(Low, n)` = ราคาต่ำสุดใน n periods

### ประสิทธิภาพ
- **Time Complexity**: O(n * period) โดยที่ n คือจำนวนข้อมูล
- **Space Complexity**: O(n)
- **ประสิทธิภาพทั่วไป**: < 1ms สำหรับ 100 candles บน CPU สมัยใหม่

## 🧪 การทดสอบ

รัน test suite:

```bash
cargo test
```

รันพร้อมแสดงผลลัพธ์:

```bash
cargo test -- --nocapture
```

## 📝 ตัวอย่าง

ดูตัวอย่างเพิ่มเติมในโฟลเดอร์ `examples/`:

```bash
cargo run --example basic
cargo run --example realtime_1min
cargo run --example backtesting
```

## 🤝 การมีส่วนร่วม

ยินดีรับ Contribution! กรุณา submit Pull Request ได้เลย

1. Fork repository
2. สร้าง feature branch (`git checkout -b feature/ฟีเจอร์เจ๋งๆ`)
3. Commit การเปลี่ยนแปลง (`git commit -m 'เพิ่มฟีเจอร์เจ๋งๆ'`)
4. Push ไปยัง branch (`git push origin feature/ฟีเจอร์เจ๋งๆ`)
5. เปิด Pull Request

## 📄 ใบอนุญาต

โปรเจกต์นี้ใช้ใบอนุญาตอย่างใดอย่างหนึ่งจาก:

- MIT License ([LICENSE-MIT](LICENSE-MIT) หรือ http://opensource.org/licenses/MIT)
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) หรือ http://www.apache.org/licenses/LICENSE-2.0)

ตามที่คุณเลือก

## 🙏 กิตติกรรมประกาศ

- แรงบันดาลใจจาก Choppiness Index ดั้งเดิมโดย E.W. Dreiss
- สร้างขึ้นสำหรับชุมชน Rust trading
- ขอบคุณผู้มีส่วนร่วมทุกท่าน

## 📧 ติดต่อ

- Issues: [GitHub Issues](https://github.com/yourusername/chop-indicator/issues)
- Email: your.email@example.com
- Twitter: [@yourhandle](https://twitter.com/yourhandle)

## ⚖️ ข้อจำกัดความรับผิดชอบ

**ซอฟต์แวร์นี้มีวัตถุประสงค์เพื่อการศึกษาเท่านั้น การเทรด Options มีความเสี่ยงสูงต่อการสูญเสียเงินทุนและไม่เหมาะสำหรับทุกคน ผลการดำเนินงานในอดีตไม่ได้บ่งชี้ถึงผลลัพธ์ในอนาคต ควรศึกษาข้อมูลด้วยตนเองและปรึกษาที่ปรึกษาทางการเงินที่มีใบอนุญาตก่อนตัดสินใจลงทุนเสมอ**

---

สร้างด้วย ❤️ สำหรับชุมชน Rust trading

---

## 🇹🇭 เอกสารเพิ่มเติมภาษาไทย

### คำศัพท์ที่ควรรู้

- **Choppy**: การเคลื่อนไหวของราคาแบบไปมา ไม่มีทิศทางชัดเจน
- **Trending**: ราคามีทิศทางชัดเจน (ขึ้นหรือลง)
- **ATM (At The Money)**: Options ที่ราคา strike ใกล้เคียงราคาตลาด
- **OTM (Out of The Money)**: Options ที่ราคา strike ห่างจากราคาตลาด
- **Premium**: ค่า Options ที่ต้องจ่าย
- **Time Decay**: การลดลงของมูลค่า Options เมื่อเวลาผ่านไป

### คำถามที่พบบ่อย

**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 อื่นดูทิศทาง