FX / EA Python 個人開発

【Pythonコードあり】FXのエントリー条件を判定する方法|最新のローソク足からシグナルを確認

本ページにはプロモーションが含まれています。

この記事では、保存済みのローソク足CSVを使って、最新の確定済み15分足に買いシグナルが出ているかを判定する方法を解説します。

今回使用するentry_signal.pyでは、バックテストで作成したbacktest_config.pyの設定と、backtest_fx.pyの判定処理を利用します。

そのため、スクリプトを実行するには、以下の準備が必要です。

  • 15分足・1時間足・4時間足・日足のローソク足CSV
  • 売買条件やCSVの保存先を設定したbacktest_config.py
  • バックテストの処理をまとめたbacktest_fx.py
  • ローソク足CSVを最新の状態に更新できる環境

まだ準備できていない場合は、以下のまとめ記事を最初から順番に進めてください。

上記の記事では、ローソク足CSVの作成、バックテスト、ローソク足の差分更新、エントリー判定までを順番に解説しています。

手順に沿って進めることで、今回使用するentry_signal.pyの実行に必要なファイルや環境を準備できます。

すでに前の手順まで完了している場合は、ローソク足CSVを最新の状態に更新してから、今回の手順へ進んでください。

なお、この記事では、entry_signal.py単体の処理内容、実行方法、実行結果の見方、使用する際の注意点を中心に解説します。

とりあえずコードのみ欲しい方へ。以下がentry_signal.pyのコードです。

entry_signal.py
from datetime import datetime, timedelta, timezone

import backtest_config as strategy
import backtest_fx

# バックテストと同じ売買ルールを使い、保存済みのローソク足CSVから
# 「現在、買いシグナルが出ているか」を確認するスクリプトです。
#
# このファイル自身には移動平均線やシグナルの計算処理を重複して書かず、
# backtest_fx.py の関数を呼び出します。これにより、バックテスト時と
# シグナル確認時で判定ルールがずれることを防ぎます。

# -----------------------------------------------------------------------------
# 日時の基本設定
# -----------------------------------------------------------------------------

# GMOコインのローソク足を日本時間で扱うため、UTCより9時間進んだ
# 日本標準時(JST)のタイムゾーンを作ります。
JST = timezone(timedelta(hours=9), name="JST")


def find_latest_signal(now):
    """確定済みの最新15分足で、バックテストと同じ買い条件を判定する。"""

    print("最新の確定足でエントリー条件を判定します。")

    # 設定ファイルに書かれた15分足・1時間足・4時間足・日足を読み込みます。
    # close_timeがnow以下の足だけを残すことで、まだ形成途中の足や
    # 未来の情報を誤ってシグナル判定に使わないようにしています。
    candles = {
        interval: [
            candle
            for candle in backtest_fx.load_candles(interval, path)
            if candle["close_time"] <= now
        ]
        for interval, path in strategy.CANDLE_CSV_PATHS.items()
    }

    # エントリーのタイミングは15分足で判断します。
    entry_candles = candles["15min"]

    # fast_smaは短期の単純移動平均線です。
    backtest_fx.add_sma(
        entry_candles, strategy.ENTRY_FAST_SMA_PERIOD, "fast_sma"
    )

    # slow_smaは長期の単純移動平均線です。
    # 短期SMAが長期SMAを下から上へ抜けると、ゴールデンクロスになります。
    backtest_fx.add_sma(
        entry_candles, strategy.ENTRY_SLOW_SMA_PERIOD, "slow_sma"
    )

    # 1時間足・4時間足・日足について、それぞれの終値とSMAを比較し、
    # 上昇トレンドかどうかを時刻から調べられるようにします。
    trend_lookups = {}
    for interval, period in strategy.TREND_SMA_PERIODS.items():
        # 各上位足へ、設定された期間のSMAをtrend_smaという名前で追加します。
        backtest_fx.add_sma(candles[interval], period, "trend_sma")

        # シグナル時刻より前に確定した最新の上位足を検索するためのデータです。
        trend_lookups[interval] = backtest_fx.make_completed_trend_lookup(
            candles[interval], "trend_sma"
        )

    # リストの末尾が最新足なので、「本数 - 1」を添字にします。
    index = len(entry_candles) - 1

    # ゴールデンクロスの判定には現在足と直前足の2本が必要です。
    if index < 1:
        print("判定に必要な15分足が不足しています。")
        return None

    print(f"判定対象: {entry_candles[index]['close_time'].isoformat()}")

    # backtest_fx.pyと同じ条件で判定します。
    # 条件は「15分足でゴールデンクロス」かつ「すべての上位足が上昇トレンド」です。
    if not backtest_fx.has_long_entry_signal(index, entry_candles, trend_lookups):
        return None

    # 条件を満たした場合は、シグナルが出た最新の15分足を返します。
    return entry_candles[index]


def main():
    """現在時刻でシグナルを判定し、結果を画面へ表示する。"""

    # タイムゾーン情報付きの現在の日本時刻を取得します。
    now = datetime.now(JST)

    # 最新の確定足を使って買いシグナルを探します。
    signal = find_latest_signal(now)

    # find_latest_signal()がNoneを返した場合、買い条件は未成立です。
    if signal is None:
        print("買いシグナルはありません。")
        return

    # シグナルがある場合は、確認しやすいよう日時・終値・SMAを表示します。
    print("買いシグナルがあります。")
    print(f"  シグナル確定日時: {signal['close_time'].isoformat()}")
    print(f"  終値: {signal['close']:.3f}")
    print(f"  短期SMA: {signal['fast_sma']:.3f}")
    print(f"  長期SMA: {signal['slow_sma']:.3f}")


# このファイルを直接実行した場合だけmain()を呼び出します。
# 別のPythonファイルからimportされた場合は、自動では判定を始めません。
if __name__ == "__main__":
    main()

エントリー条件を判定するスクリプトを解説

今回作成するentry_signal.pyは、保存済みのローソク足CSVを読み込み、最新の確定済み15分足に買いシグナルが出ているかを判定するスクリプトです

エントリー条件を新しく作るのではなく、バックテストで使用したbacktest_config.pyの設定と、backtest_fx.pyの判定処理を利用します。

これにより、バックテストと実際のエントリー判定で売買ルールがずれることを防げます。

entry_signal.pyの処理の流れ

今回のスクリプトでは、次の流れでエントリー条件を判定します。

  • 現在の日本時間を取得する
  • 15分足・1時間足・4時間足・日足のローソク足CSVを読み込む
  • 形成途中のローソク足を除外する
  • 各時間足に移動平均線を追加する
  • 最新の確定済み15分足で買い条件を判定する
  • 判定結果を画面に表示する

ローソク足を読み込む際は、close_timeが現在時刻以前のデータだけを残します。

これにより、まだ確定していないローソク足をエントリー判定に使用することを防いでいます。

今回使用する買いエントリー条件

今回の買いエントリー条件は、以下の2つです。

  • 15分足で短期SMAが長期SMAを下から上へ抜けている
  • 1時間足・4時間足・日足がすべて上昇トレンドになっている

両方の条件を満たした場合は、シグナルが発生した最新の15分足を返します。

条件を満たしていない場合はNoneを返し、「買いシグナルはありません。」と画面に表示します。

entry_signal.pyを実行する3ステップ

ここからは、ローソク足CSVを最新の状態に更新し、entry_signal.pyを単体で実行する方法を解説します。

実行するステップは以下の3ステップです。

  • ローソク足CSVを最新の状態に更新する
  • エントリー判定スクリプトを実行する
  • 実行結果を確認する

1つずつ詳しく見ていきましょう。

ステップ1|ローソク足CSVを最新の状態に更新する

はじめに、GMO FX APIから最新のローソク足を取得し、保存済みのCSVを更新します。

今回のエントリー判定では、backtest_config.pyに設定した以下のローソク足CSVを使用します。

  • 15分足
  • 1時間足
  • 4時間足
  • 日足

ローソク足CSVの更新方法は、以下の記事で解説しています。

entry_signal.pyには、GMO FX APIからローソク足を取得する処理は含まれていません。

そのため、CSVを更新せずに実行すると、保存されている古いローソク足を使ってエントリー条件が判定されます。

必ずローソク足CSVを最新の状態にしてから、次のステップへ進んでください。

ステップ2|エントリー判定スクリプトを実行する

ローソク足CSVを更新できたら、ターミナルまたはコマンドプロンプトを開き、entry_signal.pyを配置しているフォルダへ移動します。

その後、以下のコマンドを実行してください。

python entry_signal.py

スクリプトを実行すると、日本時間の現在時刻を取得し、各時間足のCSVから確定済みのローソク足だけを読み込みます。

そのうえで、最新の確定済み15分足に買いシグナルが出ているかを判定します

ステップ3|実行結果を確認する

エントリー条件を満たしていない場合は、以下のように表示されます。

最新の確定足でエントリー条件を判定します。
判定対象: 2026-08-06T23:30:00+09:00
買いシグナルはありません。

エントリー条件を満たしている場合は、以下のように買いシグナルの情報が表示されます。

最新の確定足でエントリー条件を判定します。
判定対象: 2026-08-06T23:30:00+09:00
買いシグナルがあります。
  シグナル確定日時: 2026-08-06T23:30:00+09:00
  終値: 147.250
  短期SMA: 147.180
  長期SMA: 147.120

買いシグナルが出た場合は、以下の情報を確認できます。

  • シグナルが確定した日時
  • 最新の15分足の終値
  • 短期SMA
  • 長期SMA

今回のスクリプトは、エントリー条件の判定結果を画面に表示するところまでです。

買いシグナルが出ても、GMO FX APIへの注文は実行されません。

エントリー判定スクリプトを使用する際の注意点

entry_signal.pyを実行する際は、以下の3点に注意してください。

  • 過去のシグナルは検索しない
  • 今回のスクリプトは買い条件のみを判定する
  • バックテスト側の変更が判定結果にも反映される

1つずつ詳しく見ていきましょう。

過去のシグナルは検索しない

今回のスクリプトが判定するのは、CSVに保存されている最新の確定済み15分足のみです。

過去のローソク足をさかのぼり、いつ買いシグナルが発生したかを一覧で確認する機能はありません。

過去のシグナルやエントリー結果を確認したい場合は、entry_signal.pyではなく、バックテストを実行して確認してください。

今回のスクリプトは買い条件のみを判定する

今回のentry_signal.pyでは、has_long_entry_signal()を使用して買い条件のみを判定します。

売りシグナルの判定には対応していません。

売り条件も確認したい場合は、ショート用のエントリー条件を作成し、別途判定処理を追加する必要があります。

バックテスト側の変更が判定結果にも反映される

entry_signal.pyは、backtest_config.pyの設定とbacktest_fx.pyの判定処理を利用しています。

そのため、移動平均線の期間やエントリー条件を変更すると、今回のエントリー判定にも変更内容が反映されます。

バックテストとエントリー判定で同じ売買ルールを使える一方、設定を変更した際は、バックテスト結果を確認してから使用してください。

まとめ

今回は、保存済みのローソク足CSVを使って、最新の確定済み15分足に買いシグナルが出ているかを判定する方法を解説しました。

entry_signal.pyでは、バックテストで使用したbacktest_config.pybacktest_fx.pyを利用し、15分足のゴールデンクロスと、1時間足・4時間足・日足の上昇トレンドからエントリー条件を判定します。

実行前には、15分足・1時間足・4時間足・日足のローソク足CSVを最新の状態に更新してください。

また、今回のスクリプトが行うのは、エントリー条件の判定と結果の表示までです。

買いシグナルが出ても、GMO FX APIへの注文は実行されません。

次は、今回の判定結果を使って、実際に注文する処理を実装していきます。

-FX / EA, Python, 個人開発