A Step-By-Step Guide To Building Trading Bot in Any Programming Language

ここから、私たちのアーキテクチャがどのように見えるかを決定し始めます。

最初に、ボットが現在置かれている状態を示す変数が必要です。 これは、買いまたは売りのいずれかです。 ブール値または列挙型がこの目的によく合うはずです。

それから、買いと売りのしきい値を設定する必要があります。

例えば、私が100ドルで資産を購入し、その価格が現在102ドルである場合、2%の増加を示しています。 売り閾値が1%の上昇に設定されている場合、ボットは、閾値を上回る利益を得たので、売ります。

BUY Thresholds (If the Bot is in SELL State)

  • DIP_THRESHOLD : 資産価格が閾値より下がると買われます。 7591>
  • UPWARD_TREND_THRESHOLD :価格がしきい値より上昇した場合、その資産を購入します。 これは、「安く買って高く売る」という哲学に反しますが、価格が上昇しているときを識別し、さらに高くなる前に買う機会を逃さないようにすることを目的としています。

ここで、参考になりそうな図を挙げてみましょう。

Image By Author

上の図で「SELL」と書いてあるところで売り操作を行った場合、今は買い操作のための基準値を設定した状態となっています。

もし価格が下の緑色の線を下回ったり、上の緑色の線を上回ったりすることがあれば、買いオペレーションを実行することになります。 この場合、まず上のしきい値を超えたので、BUY_DIP_THRESHOLDに基づいて買いました。

Sell Thresholds (If the Bot is in BUY State)

  • PROFIT_THRESHOLD : 買ってから価格がしきい値を超えて上昇した場合、資産を売却することになります。 これが利益の出し方です。
  • STOP_LOSS_THRESHOLD : 理想的には、ボットが利益を得たときだけ売却するようにしたいものです。 しかし、もしかしたら相場が大きく下がっていて、手遅れになる前に脱出し、より低い価格で買いたいかもしれません。

Here’s an illustration:

Image By Author

Here, we bought at the point marked with “BUY “ibuy. そして、下のしきい値より先に上のしきい値を満たした、つまり、資産を売却して利益を得ました。 1021>

API ヘルパー関数

このボットにまず必要なのは、取引所の API からデータを取得するためのいくつかのヘルパー関数です。 必要なのは、

上記は自明なはずですが、買いまたは売り操作を行うときに API POST 要求がどの通貨について尋ねるかを認識していることを確認する必要があります。

たとえば、米ドルとゴールドを取引する場合、ゴールドをいくら買うか、または米ドルをいくら売るかを指定できることがよくあります。

Bot Loop Cycle

さて、ヘルパー関数ができたので、ボットのワークフローを定義し始めましょう。 まず必要なのは、スリープ時間を持つ無限ループです。 例えば、ボットが30秒ごとに操作を行うようにしたいとします。

そして、変数と定数を設定し、意思決定のフローも設定しましょう。 APIヘルパー関数はさておき、私たちのコードは以下のようになります:

注:ここでの閾値の値は、単なる任意値である。

もし上記がヘルパー関数とループ関数(mainでも可)と組み合わされるなら、私たちは今、動くボットの基本的な柱を自分たちで作っているはずです。

反復ごとに、ボットは現在の状態(買いまたは売り)をチェックし、ハードコードされている閾値をもとに取引をしようと試みます。 そして、BUY/SELLの状態と操作のための最後の価格を更新します。

それから、それを繰り返します。

ステップ 5: ボットを磨く

Photo by Matthew Dockery

ボットの基本構造はできていますが、おそらくまだ追加したいことが少しあるはずです。

Logs

私が最初にこのボットのバリエーションを構築したとき、私にとって不可欠だったことは、ボットのアクションをターミナルと別のログ ファイルの両方に常にログ記録することでした。

各ステップで、次のようなログを作成しました。

 USD Balance = 22.15$
Bought 0.002 BTC for 22.15 USD
Last Operation Price updated to 11,171.40 (BTC/USD)
Could not perform SELL operation - Insufficient balance

ファイルに出力されるログにはタイムスタンプも追加されるので、たとえば丸一日後にサーバーにアクセスしてエラーを見つけた場合、それがどこで起こったかを正確に追跡でき、その過程でボットが行った他のすべてのことも知ることができました。 次のようなものです:

Identifying Trends

ボットの主要目標は安い価格で買い、利益が出るように販売することであるはずです。 UPWARD_TREND_THRESHOLDSTOP_LOSS_THRESHOLD です。

これらのしきい値は、損切りで売るべきか、価格上昇で買うべきかを教えてくれるものと思われます。 一般的な戦略から外れるが、自分にとって有害または有益である可能性があるため、行動すべき傾向を識別しようとするものです。

しかし、私が上で構成した方法はかなり限定的です。

幸いなことに、それほど手間をかけずに、これをもう少し信頼性の高いものにすることができます。 たとえば、10 か 20 回前の価格を記録しておき、lastOpPrice の代わりに現在の価格と比較することができます。 これは、長い期間にわたって発生したシフトではなく、価格の急激なシフトをチェックするため、おそらくトレンドを特定するのに適しています。

データベース?

実行中、このシンプルなボットは、非常に少ないデータを処理し、すべての情報をメモリ内に保持できるため、実際にはデータベースは必要ありません。

あなた側での手作業を防ぐために、lastOpPrice のようないくつかのことを記録するための軽量なデータベースのようなものを保持しておくとよいかもしれません。

この方法では、ボットが起動したときに、デフォルト値を使用するのではなく、実際に保存されている値をチェックし、そこから続行します。

これをどれだけ単純化するかにもよりますが、いずれにせよいくつかの値を保存するだけなので、.txt または json ファイルによる「データベース」も検討することができます。

Dashboard

Photo by Luke Chesser

ボットの操作を視覚化したい場合は、次のようなものを使います。 また、手動でコードをいじらなくても管理できるように、ボットをダッシュボードに接続することを検討するとよいでしょう。

この場合、ボットを Web サーバー/API に接続し、その機能を制御できるようにすることが必要になります。 1021>

Testing Strategies on Past Data

多くの取引所では、過去の価格データへのアクセスを提供しており、また、必要であれば、通常そのデータを他の場所で簡単に入手できます。 過去のデータと「偽のお金」でボットのシミュレーションを実行し、定義したしきい値がどの程度機能したかを確認し、実際の取引のために調整することができます。

しきい値と注文に関する追加のポイント

注文を出すときに気をつけなければならないことがいくつかあります。

成行注文は、現在の市場価格で執行される注文で、ほとんどの場合、事実上すぐに執行されます。

一方、指値注文は、市場価格より低い価格(買い注文の場合)または高い価格(売り注文の場合)で注文するときに発生します。

指値注文の利点は、市場の動きを予測し、その動きが起こる前に市場がどこに行くかを予想して注文を出すことができることです。

この名称とそれぞれの手数料の理由は、成行注文が現在の市場価格をそのまま受け入れる(「テイク」)のに対し、市場価格の外にある指値注文は流動性を追加して「マーケットを作る」ため、低い手数料で「報いる」ことになるからだそうです。

この記事のボットは成行注文に最も適していることに注意してください。

最後に、手数料の話題ですが、PROFIT_THRESHOLDを設定するときは、手数料を考慮するのを忘れないでください。

利益を出すためには、買い、売りの操作を行う必要があり、2つの手数料がかかります。

そのため、少なくとも手数料をカバーできるようになってから利益を出すために売るようにしなければ、実際には損失を出すことになります。

考えてみてください、手数料が一律だとすると、ある資産を100.00$で買って0.50$の手数料がかかり、それを100.75$で売ると、0.75$の粗利益が出るはずですが、実際には0.25%の純損失となるのです。

Final Remarks

以上、ボットについてでした。 このチュートリアルが役に立ったことを願っています。

このアイデアは、プログラミングの方法を教えるのではなく、トレードをしたことがなくても、トレーディングボットを作るために知っておくべきすべての概念に焦点を当てるというものでした。

読者の皆さんは、自分の好きな言語でHTTPリクエストができるという前提なので、他の側面に焦点を当てるのがベストでしょう。

このように(疑似コードベースで)書いた最初のチュートリアルなので、コンセプトについてどう思ったか教えてください。 そして、この記事が役に立ったと思ったら、拍手で応援してください👏👏

コメントを残す

メールアドレスが公開されることはありません。