BTCFXのエントリーと手仕舞い(決済)をpythonで自動化しようさて、前回の記事で作った「赤三兵のローソク足パターンで買いシグナルを出すpythonコード」を改良して、エントリーと手仕舞いまでを自動化するコードを書いてみましょう。手仕舞いの条件を決める今回は以下のようなシンプルなルールにしましょう。1.現在の終値が、前回の終値を下回ったら手仕舞う手仕舞いのロジック今回は、赤三兵のローソク足パターンを、上昇トレンドの序盤を捉える買いシグナルとして使います。そのため、買いエントリーした後、そのまま素直に上がり続ければポジションを持ち続け、1度でも終値が下げて引けたら、そこで成行で手仕舞うようにします。手仕舞いのロジックとしては、「利確」と「損切」にわけて、それぞれの値幅で決める方法もあります。今回ははじめてのBOT作成の練習なので、損切りと利確とで条件を分けることはせず、共通の条件で一律に手仕舞うことにします。今回の記事の構成としては、まずポイントとなるpythonコードを部分的に解説していき、最後に全体のコードを示す、という流れにします。いう変数を作り、そこに「買いシグナルの状況」「サーバーに出した注文の状況」「ポジション保有の有無」などの情報を保有させます。「何本連続で陽線が続いているか?」を示すフラッグで、これが「3」になれば買い注文を出すことにします。いう要素を新しくフラッグに追加します。「現在サーバーに未約定の注文があるかどうか?」を管理するためのフラッグです。「現在ポジション(建玉)を保有しているかどうか?」を管理するためのフラッグです。買い注文の関数まずは「価格データからシグナルをチェックして、買いシグナルが点灯していれば買い注文を出す」という部分の自作の関数を作ります。以下のようになります。flag「赤三兵」というローソク足パターン(3本連続の陽線)を判定するために、buy_signal()という関数を使います。これは今まで解説していた「While文」の中身のロジックを外に出して、関数にまとめただけです。して、Bitflyerのサーバーに指値で買い注文を出します。今回は、先に過去データで検証をしたいので、まだ実際に注文を出すコードは書きません。ここに注文を出すコードを入れれば、注文を出せます。注文を出すためのコードは以下の記事で説明しています。flag今回の自動売買ロジックでは、買いシグナルが点灯したら、その時点での終値付近でBitflyerのサーバーに指値注文を出します。注文が通ったかどうかを確認します。これで初めて手仕舞いのための関数が動作する仕組みです。一定時間で注文が通っていなければ、注文をキャンセルするようにします。関数に書き足しますが、テスト検証の時点では、買い指値はすべて「刺さったもの」として進めたいので、上記のように書いておきます。関数が呼ばれるようにしておきます。関数の中では、以下のif文を使い、前回の終値と今回の終値を比較します。last_data["close_price"]:もし終値が下がっていれば、決済のために売り注文をサーバーに出します。これによって、また先頭の「買いシグナルを探して買い注文を出す関数」が動くようになります。全体のループ文さて、このように「買い注文(エントリー)の関数」「注文の約定をチェックする関数」「決済をする関数」の3つが準備できたところで、全体の流れを管理するためのループ処理を作ります。関数を使って、Bitflyerのサーバーに注文状況を問い合わせます。必要があれば、ここで注文のキャンセルもします。)次に10秒おきにCryptowatchのAPIを使用して最新の価格データを取得します。1分足の価格データ(例)に更新があったかどうかを確認し、もし更新があった場合は、日時や価格をprint()で表示します。確認し、その結果に応じて条件分岐します。ポジションを保有中かどうかを確認します。関数を呼んで、手仕舞いのための条件を満たしているかどうかを確認します。手仕舞いの条件を満たしていれば、売りの決済注文を出します。満たしていなければ、また10秒待機して次のループ処理に戻ります。関数を実行し、買いシグナルが点灯するかどうかを確認します。買いシグナル(3本連続の陽線)が点灯すれば、サーバーに買い注文を出します。以上が、全体のロジックです。テスト検証のためのコード以下は、過去データのテスト検証のための、pythonコードの全文です。ここでいう過去データの検証とは、リアルタイムの足ではなく、直近の500件の確定足を使って「売買シグナルが点灯するかどうか?」などの挙動を確認するための検証のことです。勝率等の検証(いわゆるバックテスト)のことではありません。詳しくは以下を読んでください。サンプルコードでは1分足のデータを使っていますが、60の部分を300に変更すれば5分足、1800に変更すれば30分足、3600に変更すれば1時間足に修正できます。実際に売買BOTを動かすときは、最新価格の取得の遅延、約定までの時間などを考慮するので、(この売買ロジックの場合)1分足は適していないと思います。1time.sleep(0)実行結果このpythonコードを実行すると以下のようになります。今回の例では、直近の1分足のデータを500件分チェックしたところ、以下の2カ所でシグナルが点灯していました。実際のチャートを見てみると、以下の部分でシグナルが点灯していたことがわかります。1つ目の矢印が「赤三兵」での買いシグナルが出たローソク足、2つ目の矢印が「前回の終値を下回った」ことで決済シグナルの出たローソク足です。このテストでは、前述のように「買い指値はすぐに刺さったもの」として検証しています。繰り返しますが、今回の自動売買BOTは「はじめて作る方」のための練習用であり、統計的に勝率を検証したものではありません。今回の例ではたまたま利益が出ていますが、もっと広範にテストすれば、このままのロジックでは全く勝てないことがわかると思います。勝率を検証する方法などは今後、解説していく予定ですが、今回は単に「自分の設計したとおりの場面でエントリー・決済をしているか?」を確認するためにテストをしている、と考えてください。PM非常に勉強になります。続きを楽しみにしています。AM先日Pythonの基礎を終えてからこちらのチュートリアルを参考にしてBOTを制作に取り掛かっています。わかりやすくて助かります。AMコメントありがとうございます。今後もよろしくお願いします。zero」が発生するため、その場合、このコードではエラーになります。Falseとかで「高値-安値」の結果が0の場合はFalseを返す様にしてあげればとりあえずは機能するかと。※本来はもっと違う処理を考えないといけないと思いますが、とりあえずスクリプトを動かすためだけの非実用的な対処になります。コメントをキャンセルメールアドレスが公開されることはありません。