oas_jpyで高値つかみが発生(1時間足の高値を超える価格で購入)

Resolved 💬 3 comments Opened Jan 5, 2026 by mizuka123 Closed Feb 12, 2026

事象

2026-01-05 12:28にoas_jpyで高値つかみが発生しました。1つ前の1時間足(11時台)の高値を超える価格で購入しています。

詳細

時系列

| 時刻 | イベント | 価格 |
|------|---------|------|
| 11:02〜12:00 | 11時台の買い注文価格帯 | 0.293〜0.304 |
| 12:25:21 | 買い注文発注 | 0.304 |
| 12:26:35 | 買い注文を更新 | 0.315 |
| 12:28:45 | 約定 | 0.315 |
| 12:29〜 | 価格下落、買い注文価格帯 | 0.293〜0.306 |

約定詳細(DBより)

1443506300 | buy | 0.3150 | 25665.7958 | 2026-01-05 12:28:45
1443506290 | buy | 0.3150 | 6400.0000 | 2026-01-05 12:28:38
1443506288 | buy | 0.3150 | 30000.0000 | 2026-01-05 12:28:38
1443506286 | buy | 0.3150 | 20000.0000 | 2026-01-05 12:28:34
合計: 82,065.7958 OAS @ 0.315

原因分析

1. 現在の買い価格決定ロジック

src/logic/strategy.pydetermine_buy_zone() では:

# 現在価格をベースにbuy zoneを計算
current_price = ohlcv_list[-1].close
zone_max = current_price * (1 - zone_max_rate)
zone_min = current_price * (1 - zone_min_rate)

問題: 価格が急上昇すると、current_priceが高くなり、zone_max(買いゾーン上限)も高くなる。結果として高い価格でも買いに行ってしまう。

2. 1時間足の高値を考慮していない

11時台の高値は約0.304だったが、12:26に0.315で買い注文を入れてしまった。1時間足の高値を上限として設定する機能がないため、価格急騰時に高値を追いかけてしまう。

修正提案

案1: 1時間足高値を買い上限として設定

# 直近1時間足の高値を取得
prev_hour_high = ohlcv_list[-2].high  # 1つ前の1時間足

# zone_maxが前1時間足の高値を超えないように制限
zone_max = min(zone_max, prev_hour_high)

案2: 価格急騰検出時の買い抑制

既存の calculate_price_surge_rate()PRICE_SURGE_ZONE_DEEPENING_FACTOR の仕組みを拡張し、急騰時には買いを完全に見送るオプションを追加。

案3: 価格変動幅の制限

直前の買い注文価格からの上昇幅に制限を設ける(例: +3%以上の上昇では更新しない)。

関連ファイル

  • src/logic/strategy.py:200 - determine_buy_zone()
  • src/logic/strategy.py:372 - find_optimal_entry_price()
  • src/core/bot_controller.py:520-543 - buy zone計算と価格決定

ログ

{"timestamp": "2026-01-05T12:25:21.766701", "message": "Placing buy order for oas_jpy: 85035.28192394094 @ 0.304 (allocation: ¥25,851)"}
{"timestamp": "2026-01-05T12:26:35.420150", "message": "Placing buy order for oas_jpy: 82065.79588120127 @ 0.315 (allocation: ¥25,851)"}
{"timestamp": "2026-01-05T12:28:59.803793", "message": "New execution recorded for oas_jpy: 1443506300 (buy 25665.7958 @ 0.315)"}

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗