シストレどうですか

  Algorithmic Trading for Dummies

FXボット とりあえず作ってみた編 その1 ー 概要設計を考える

しばらくブログの更新をさぼっておりました。
在宅勤務が多く家にいる時間が長かったので裏庭で家庭菜園を初めたのですが、これにはまってしまいブログを書く時間がなくなってしまいました。 プログラムのバグを取るより、野菜についている虫を取る方に夢中になってしまった次第です。(つぶした青虫さん、アブラムシさんたちごめんなさい。)
秋になり夏野菜ももう終わりになってきましたのでようやく時間がとれるようになりました。

f:id:jantzen:20210831032134j:plain:w80:left おかげさまで初年度にもかかわらずそれなりに収穫できました。大きな失敗は普通のトマトを栽培するはずが、育ってきたらミニトマトだった事くらいでしょうか。(種を一度取り出してジップロックにいれた際に種の形が同じだったので袋を取り違えてようです。)

なんて言っておりますが、ボットの作成を始めてみたのですが細かい所を考えていくうちに結構奥が深いことに気が付き煮詰まってしまったという面も大きかったです。

そんなこともありますので、またネタが切れるまでなんとか頑張っていきたいと思います。
というわけで、今回からはAPIの解説を少し離れて、OANDA APIを使ってFXトレーディングボットを作成する方法について考えていきたいと思います。


基本方針


Python/Rest APIやFXトレードの専門家でも熟練者でもありませんので、いわゆるちょっとこの辺の事をかじった人がいちから考えて作ってみましたという感じになります。
という訳ですので、そもそも設計段階で考え方が間違えている部分がある可能性もありますし、サーバー側の障害や通信状況によって発生する問題についても詳しくありませんので、予期せぬエラーに対応できず暴走する可能性もあるという前提になっております。

あくまでも個人の備忘録的な感じで記録をつけていくという体裁ですので、今後完成するであろうプログラムをコピーして使っても一切責任は負いかねます。本番環境で運用される場合はよく留意して自己責任でお願いいたします。(完成するところまでブログが続けばの話ですが・・・)


稼働環境


ボット自体にはOSに依存するような仕組みは使いませんのでLinuxでもWindows/Macでも動くと思われます。(たぶん)
ですがボットを24時間動かし続けられるような環境が必要になりますので、最終形としてはVPSのようなサーバーで稼働させる事を考えています。 ただ初心者で利益がでるかどうかもわかりませんので開発(実験?)環境としてなるべくお金のかからない方法をとりたいと思い、まずは無料枠があるAWS EC2 t2.microインスタンスようなクラウドサービス上での運用を目指します。
私自身Linux系のOSはあまり慣れていませんしAWSの無料枠もアカウント取得から1年間と限りがあります。

という前提で以下の手順で稼働環境をアップグレードしていこうと思います。

  1. 古いPCにUbuntuをインストールし、そこでプロトタイプボットを作成しテストする。またSSHを使って運用できるようになるための知識も習得していく。
  2. AWSの無料枠を開設し、そこに使えそうなボットを登録運用し、安定かつ利益がでるように改善していく。
  3. 無事目標を達成できた暁にはOANDAのサーバーと同じ場所に設置しているような低遅延なVPSに移行する。

3.の実現性はともかくAWSの無料枠ではどこまで動くかわかりませんので極力負担かからない環境を設定する予定です。
OSはUbuntu Serverでデスクトップ環境もインストールせずに作成したプログラムをSSHのコマンドベースでサーバーにデプロイしたり起動/停止/監視などきるようにする予定。
よって、pythonの仮想環境も今はAnacondaを使用していますがvenvやpipenvのようなもので構築、githubソースコードを管理するという想定で、最終的にはこれらも使いこなせるように目指します。


プロトタイプボットの作成


概要設計

最初に作成するボットについては、利益がでることよりも安定して動くという事のほうが重要になりますので、あれこれ詰め込んで処理が複雑になってしまわないようなるべくシンプルに全体の流れをつかめるようなものにしたいと考えています。

  • OANDAサーバーとの通信はラッパー(oandapyV20)で処理。
  • 一定時間でループさせ最新のレートを取得する。(ストリーミングは使わない。)
  • 注文は成行のみ
  • ポジションサイズの調整などの資金管理などはしない。注文時のポジションサイズは原則固定値。
  • ポジション保有中は新たな注文は行わない。また保有しているポジションは相場の流れで増加させたり減少させたりしない。
  • クローズは自動で行う。(注文時に同時に付与したテイクプロフィットとストップロスオーダーでクローズさせる。)

簡単に言えば、「定期的にレートを確認し、ポジションを保有していない時にシグナルが発生したら成行注文をする。」ところまでがボットの機能になります。

フローチャート

プロトタイプボットの仕様をもとにまずはフローチャートを作成してみました。
あくまでもイメージをつかむためなので実際に動きとは違ってくるとは思います。
(ちなみにこのフローチャートは、VS CodeでDraw.io integrationという拡張機能があることを最近知ったので、Draw.ioを使って書いてみました。)

f:id:jantzen:20211010032734p:plain:w300
フローチャート

解説

  1. 初期処理
  2. 最新レートの取得処理
    • 最新のレートを取得し、取引可能の状態かどうか判定する。
  3. 保有ポジションの確認処理
    • 取引可能状態であれば、現在保有中のポジションがあるかどうか確認する。
    • ポジションがなければ次のシグナル判定処理に進む。保有中であれば待機処理へ進む。
  4. シグナル判定処理
    • レート情報などをもとに計算を行い売買シグナルが発生しているかどうか判定する。
    • 具体的な手法は今後決めるとしてろうそく足から算出できるようなものを想定。
  5. 注文処理
    • シグナル発生かつポジションを保有していない場合、売買シグナルによって成行注文を行う。
    • 手仕舞いはボットで行わないので、注文時に損切及び利確オーダーを付加する。
  6. 待機処理
    • 指定された時間(固定値)待機し、「2. 初期処理」へ戻る。

テスト

テストの方法についても、本来であればバックテストを行ってそこでの成績から最適化などの調整や修正などを行ったほうがよいみたいですが、MT4/5などと違いバックテスト用のツールを用意するのも大変ですので、スキャルピング的な取引頻度の短いものを作っては動かしてみるようなフォワードテストのみで進めていきたいと思います。


まとめ


うまく完成してある程度使えるようになってきたらこれを基本系にしていろいろな機能を追加していければと考えています。
あまり他のサイトなどは参考にせずに一から作っていく形になりますので、多少出戻ったりしてしまうかもしれませんがお付き合いください。
ブログのタイトルも”開発編”とかですとなんか仰々しいので”とりあえず作ってみた”になっていますので内容的にも”作成日記”的な感じになってしまうと思います。

今回はとりあえず概要のみとなりましたが、次回からは具体的にプログラミングしていきたいと思います。