損切り-5%のはずが-23.7%に。TAC急落で学んだ「指値損切り」の落とし穴と対応
本日、監視銘柄を17から160へ一気に拡大した直後に、さっそく手痛い授業料を払いました(dry-runなので実害はありませんが)。損切りラインを-5%に設定していたTAC/USDTのポジションが、-23.7%で決済されたのです。何が起きたのか、ボットのログと実際のローソク足で徹底的に検証しました。
何が起きたか(すべて実ログ・実データ)
| 時刻(JST) | 出来事 |
|---|---|
| 10:00 | TAC/USDTを0.00504で買い(結果的にほぼ天井) |
| 10:05頃 | フラッシュクラッシュ発生。5分足1本で-12.6%、出来高は通常の5〜8倍 |
| 10:05:36 | ボットが-5%ライン割れを検知し、損切り注文を発注。検知自体は割れからわずか数十秒で正常動作 |
| 10:05〜10:10 | しかし売り注文が指値(limit)だったため、垂直に落ち続ける相場で約定せず放置 |
| 10:10:42 | 未約定を検知し指値を置き直し |
| 10:11:03 | ようやく約定。-23.7% |
| 10:15 | 皮肉なことに+7.9%反発 |
10分間で最大-28%落ちて即反発する、小型銘柄に典型的なフラッシュクラッシュを、一番悪い場所で受けた形です。
根本原因は「検知」ではなく「執行」
調査前は「損切りの検知が遅れたのでは」と疑っていましたが、ログを見ると検知は数十秒で発動しており完全に正常でした。問題はその後の注文の出し方です。
注文種別の設定が未設定だったため、freqtradeのデフォルト挙動として損切りも指値注文で執行されていました。指値は「この価格で売りたい」という注文なので、買い手が消えて価格が滝のように落ちている最中は、置いた場所に誰も来ないまま約定しません。今回は約5分間宙に浮き、その間に-5%の予定が-23.7%まで拡大しました。
「損切りは検知できるかではなく、約定できるか」。頭では知っていたつもりの相場の教訓を、ボットのログという形で突きつけられました。
対応: 損切りだけ成行注文に変更
注文種別の設定を次のように変更し、本番反映済みです。
entry: limit (エントリーは指値のまま)
exit: limit (通常の利確も指値のまま)
stoploss: market (損切りだけ成行に変更)
通常の利確は今まで通り指値のまま、損切りだけは検知した瞬間に成行で即座に逃げる設定です。成行なので多少のスリッページは受け入れることになりますが、「-5%のつもりが-24%」に比べれば誤差です。今回のケースなら、検知時点(10:05:36)の約-6〜7%で止血できていた計算になります。
教訓
- 小型銘柄を大量に監視対象へ入れるなら、フラッシュクラッシュは「起きるかも」ではなく「必ず起きる」前提で設計する。 監視銘柄を160に拡大したまさにその日に発生した
- 損切りの品質は検知速度ではなく執行方式で決まる。 指値の損切りは、一番損切りが必要な相場(暴落)で一番機能しない
- デフォルト設定を「設定した」と思い込まない。 注文種別が未設定=指値損切りというデフォルトを、事故が起きるまで意識できていなかった
こうした失敗と対応をすべて記録・公開しながら、AIボットの運用ノウハウを積み上げていきます。
注記: このbotは現在dry-run(ペーパートレード)で稼働しており、実際の資金は一切動いていません。本記事の損益・取引はすべてシミュレーション上の数値です。取引ダッシュボードはこちら