この記事では、文系初学者でも自動売買BOTを動かすために、プログラムのソースコードを「何となく読んで理解できる」レベルになることを目指します。そのために、最低限、必要なプログラミングの構文知識を3つだけ説明します。
それが、for文/if文/while文です。
実際のところ、単純なアルゴリズムによる自動売買BOTであれば、この3つの構文をキチンと理解するだけで実装が可能になります。
学習のポイント
当ブログはプログラミング学習サイトではないので、教科書のような詳しい構文の書き方は説明はしません。最低限、これらの3つの構文がどういう雰囲気で動くものなのか、ここでは大雑把に理解することを目指してください。
あとは当ブログに出てくる実際のソースコードを手打ちしたり、カスタマイズしながら実践で覚えていってください。キチンと基本を勉強したい方は、他の学習サイトを参考にしたり、一番簡単そうなPythonのプログラム教本を1冊だけ読むといいでしょう。
for文について
for文というのは、簡単にいうと、「〇個の要素すべてについて、1つずつ同じ処理を実行していきたい。だけど同じソースコードを〇回書くのは面倒くさい」というときに使います。
構文は以下のような感じです。
for 要素 in 配列等 要素について1つずつ実行したい処理
例えば、ある仮想通貨の取引所で、取扱いのある通貨ペアをAPIで取得したところ、以下のような配列が返ってきたとします。
product = [“BTC_JPY”,”ETH_BTC”,”XRP_BTC”,”XEM_BTC”,”BCH_BTC”,”TRX_BTC”,”LTC_BTC”,……..]
これをすべてAndcondaプロンプト(黒い画面)に表示したい場合、以下のように書くことができます。
print(product[0]) print(product[1]) print(product[2]) print(product[3]) print(product[4]) print(product[5]) print(product[6]) print(product[7]) print(product[8]) ....
しかし同じprint()を何度も書くのは面倒くさいですよね。
6~7回程度ならまだいいですが、過去2年分の価格データとか、すべての約定履歴とか、データ数が膨大になってくると、とても1つ1つを書くことはできません。しかも上記のように書く場合には、あらかじめデータ数が何個あるのかを数えて調べなければなりません。
for文を使えば、これを以下のようにシンプルに書けます。
for p in product: print(p)
これだけです!
上記の2行は、productという配列の中にある要素の1つずつを順番に「p」という変数に入れて、それをprint(p)で、黒い画面に出力する、という意味のプログラムです。
実践的な例
もう1つだけ、実践的な例をあげてみましょう。
「10日間の単純移動平均線を当日の終値が上回って引けた場合」をエントリーまたは利確の条件の1つ(フィルター)として使いたいとします。そこで過去のビットコインの終値の価格をAPIで取得したところ、以下のようなデータが得られました。
price = [1012104,1064332,981452,1026681,1040899,1103870,1214016,1346433,1319455,1312633]
知りたいのは、当日の終値が過去10日間の単純移動平均を上回ったかどうかなので、この平均を求めます。もしこれをfor文を使わずに書くとしたら、以下のようになります。
sum = 0 sum = sum + price[0] sum = sum + price[1] sum = sum + price[2] sum = sum + price[3] sum = sum + price[4] sum = sum + price[5] sum = sum + price[6] sum = sum + price[7] sum = sum + price[8] sum = sum + price[9] average = sum/10 print(average)
こちらもなかなか面倒くさいですね。
10期間単純移動平均くらいなら何とかなりますが、100期間移動平均などになると、とても手では書けません。これはfor文を使うと以下のように書けます。
sum = 0 for p in price: sum = sum + p average = sum/10 print(average)
これだけです!
データが何百個あったとしても、上の5行だけで平均を調べることができます。
for文について、とりあえず知っておくべき基本的な説明はこれで終わりです。他にも、数字で指定した回数だけ実行するなど、いろいろと応用的な書き方はありますが、新しく出会うたびにGoogleで調べていけば問題ありません。
if文について
if文というのは、「〇〇の場合には~したい、××の場合には~したい、それ以外の場合には~したい」といった条件分岐を書くための構文です。おそらく自動売買BOTでも一番使うことになります。
構文は以下のかたちになります。
if 〇〇のとき: 実行したい処理
簡単ですね。
もし、「それ以外の場合は~」までセットで書きたければ、以下のように書きます。
if 〇〇のとき: 実行したい処理 else: それ以外で実行したい処理
3つ以上の条件分岐を書きたいときは、以下のように書きます。
if 〇〇のとき: 実行したい処理 elif 〇〇のとき: 実行したい処理 elif 〇〇のとき: 実行したい処理 elif 〇〇のとき: 実行したい処理 else: それ以外で実行したい処理
とりあえず、このイメージだけ理解しておいてください。あとは実際のソースコードを読んだり書き写したりしながら、使い方を確認していけば問題ありません。
実践的な例
せっかくなのでさっきの続きをやりましょう。
過去10日の終値の単純平均は、114万2187円でした。もし当日の終値がこれを上回っていたら買いエントリー、下回っていたら何もしない、というプログラムを、さっきの続きで書いてみましょう。
当日の終値は118万2475円だとします。
today_price = 1182475 sum = 0 for p in price: sum = sum + p average = sum/10 if average <= today_price: print("買いエントリーする") else: print("何もしない")
付け足したのは、最初の「today_price = 1182475」の部分と、最後のif文のところです。
この例では、当日の終値が過去10日の単純移動平均より大きければ、「買いエントリーする」と画面に表示します。そうでなければ「何もしない」と画面に表示します。実際の自動売買BOTでは、この「買いエントリーする」のところに、買い注文の関数を入れることになります。
while文について
最後はwhile文です。
while文というのは、「ある特定の条件を満たしている間は、ずーっと永久に以下の処理をループしてください」という構文です。
構文は以下のようになります。
while 条件: ループしたい処理
自動売買BOTを作る場合だと、例えば、10秒間おきに価格やテクニカル指標をチェックして、シグナルが出たら売る・買う・手仕舞う・損切りする、といった処理を、放置で自動的にループさせたい場合などに使います。
例えば、以下のようなイメージですね。
while true: APIで価格を取得する シグナルを計算する if ポジションを持っていない: if 買いシグナルが出た: 買い注文を出す else: if 利確シグナルが出た: 利確注文を出す elif 損切シグナルが出た: 損切注文を出す sleep(10)//10秒待機
こちらは物凄く大雑把なロジックですが、
(1)価格を取得してシグナルを計算する
(2)まだポジションを取ってなければ、買いシグナルを確認し、シグナルが出ていれば買い注文を出す。出ていなければ何もしない。
(3)もし既にポジションを取っていれば、利確シグナルを確認する。シグナルが出ていれば利確注文を出す。出ていなければ、損切シグナルを確認する。シグナルが出ていれば損切注文を出す。両方出ていなければ何もしない。
(4)10秒間待機して、また(1)に戻る
というアルゴリズムを永久にループさせることができます。
この「シグナルを計算する」と書いた部分に、先ほどのfor文を使った実践例を組み込めば、「終値が短期移動平均を上回ったときに買い、下回ったときに売る」といった、ごくシンプルなアルゴリズムを作ることもできます。
ここでは大体、どのようにwhile文を使うのかのイメージが掴めればOKです。