簡単なロジックの自動売買プログラムの作り方【FXの自動売買プログラムをPythonで自作しよう⑥】

この記事には広告を含む場合があります。

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

今回はいよいよ自動売買プログラムを作ります。

まずは、わかりやすいように簡単な自動売買のプログラムから始めていきます。

この記事で、プログラミングの流れを理解していただければ思います。

プログラムをフローチャートで書く

作成するプログラムは、設定した価格になったら成行き注文を出して買うというような、指値注文のようなプログラムにします。

まずはプログラムのフローチャートを作ります。

フローチャートとは、プログラムの処理の流れをイメージ化したもので、プログラマーを始めとしたプログラムの設計者にとっては必要不可欠なツールです。

フローチャートの流れ
  • プログラム開始
  • 現在のドル/円の価格を取得する
  • 取得した価格が設定した価格を下回らなければ、5秒待って再度価格を取得する
  • 取得した価格が設定した価格を下回れば、成行き注文を出して買う
  • プログラム終了

それでは実際に作成します。

プログラムの解説

フローチャートの内容でプログラムを作成すると次のようになります。

Python
import requests
import json
import hmac
import hashlib
import time
from datetime import datetime


# -----設定項目
apiKey = 'YOUR_API_KEY'
secretKey = 'YOUR_SECRET_KEY'
buy_price = 157


# ドル/円の最新レートを取得する関数
def get_price():
    while True:
        try:
            endPoint = 'https://forex-api.coin.z.com/public'
            path = '/v1/ticker'

            response = requests.get(endPoint + path)
            data = eval(json.dumps(response.json(), indent=2))
            timestamp = data["data"][0]["timestamp"]
            bid = float(data["data"][0]['bid'])
            ask = float(data["data"][0]['ask'])
            ltp = round((bid + ask) / 2, 3)
            print("TIME: " + timestamp + " LTP: " + str(ltp))

            return ltp

        except Exception as e:
            print(f'action=get_ticker error={e}')
            print("10秒後にリトライします")
            time.sleep(10)


# 成行注文を出す関数
def order():
    while True:
        try:
            timestamp = '{0}000'.format(int(time.mktime(datetime.now().timetuple())))
            method = 'POST'
            endPoint = 'https://forex-api.coin.z.com/private'
            path = '/v1/order'
            reqBody = {
                "symbol": "USD_JPY",
                "side": "BUY",
                "size": "10000",
                "clientOrderId": "abc123",
                "executionType": "MARKET"
            }

            text = timestamp + method + path + json.dumps(reqBody)
            sign = hmac.new(bytes(secretKey.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest()

            headers = {
                "API-KEY": apiKey,
                "API-TIMESTAMP": timestamp,
                "API-SIGN": sign
            }

            res = requests.post(endPoint + path, headers=headers, data=json.dumps(reqBody))
            print(json.dumps(res.json(), indent=2))

            return

        except Exception as e:
            print(f'action=market_order error={e}')
            print("10秒後にリトライします")
            time.sleep(10)


# メイン処理
while True:
    price = get_price()

    if price < buy_price:
        order()
        break

    else:
        time.sleep(5)
        

少し長いですが、順番に解説します。

ライブラリのインポート

Python
import requests
import json
import hmac
import hashlib
import time
from datetime import datetime

まずは必要なライブラリをインポートします。

設定項目

Python
# -----設定項目
apiKey = 'YOUR_API_KEY'
secretKey = 'YOUR_SECRET_KEY'
buy_price = 157

ご自身のAPIキーとAPIシークレットを入力します。

buy_priceは、購入したい価格を入力します。

ドル/円の最新レートを取得する関数

Python
# ドル/円の最新レートを取得する関数
def get_price():
    while True:
        try:
            endPoint = 'https://forex-api.coin.z.com/public'
            path = '/v1/ticker'

            response = requests.get(endPoint + path)
            data = eval(json.dumps(response.json(), indent=2))
            timestamp = data["data"][0]["timestamp"]
            bid = float(data["data"][0]['bid'])
            ask = float(data["data"][0]['ask'])
            ltp = round((bid + ask) / 2, 3)
            print("TIME: " + timestamp + " LTP: " + str(ltp))

            return ltp

        except Exception as e:
            print(f'action=get_ticker error={e}')
            print("10秒後にリトライします")
            time.sleep(10)

def 文を用いて関数(function)を定義することができます。

関数とは、与えられた値をもとに一定の処理をしてその結果を返す命令のことです。関数に定義しておくことで、同じようなプログラムを何度も書く必要がなくなります。

この関数は、Public APIでドル/円の最新レートを取得して、bidとaskの中間の価格のltp(Last Traded Price)を計算してreturnで計算結果を返しています。

tryexceptはひとまとまりで例外処理と言います。

価格を取得する時に何かしらの理由でエラーが返ってくるとプログラムが止まってしまいます。それを防ぐために、エラーが帰ってきた場合は10秒待ってリトライするようにしています。

成行注文を出す関数

Python
# 成行注文を出す関数
def order():
    while True:
        try:
            timestamp = '{0}000'.format(int(time.mktime(datetime.now().timetuple())))
            method = 'POST'
            endPoint = 'https://forex-api.coin.z.com/private'
            path = '/v1/order'
            reqBody = {
                "symbol": "USD_JPY",
                "side": "BUY",
                "size": "10000",
                "clientOrderId": "abc123",
                "executionType": "MARKET"
            }

            text = timestamp + method + path + json.dumps(reqBody)
            sign = hmac.new(bytes(secretKey.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest()

            headers = {
                "API-KEY": apiKey,
                "API-TIMESTAMP": timestamp,
                "API-SIGN": sign
            }

            res = requests.post(endPoint + path, headers=headers, data=json.dumps(reqBody))
            print(json.dumps(res.json(), indent=2))

            return

        except Exception as e:
            print(f'action=market_order error={e}')
            print("10秒後にリトライします")
            time.sleep(10)

これは前回の記事のプログラムを成行注文に変えたものになります。

reqBodyexecutionTypeMARKETに変更することで成行き注文になります。

こちらも例外処理を入れています。

メイン処理

Python
# メイン処理
while True:
    price = get_price()

    if price < buy_price:
        order()
        break

    else:
        time.sleep(5)

while文は、条件が満たされている間は処理を繰り返します。

このプログラムの場合は、get_price()の関数で価格を取得して、if文で取得した価格と設定価格を比較します。

取得した価格が設定価格より高ければ5秒待って再度価格を取得します。

設定価格を下回ると、order()の関数で成行注文を出して、breakでプログラムは終了します。

注文が成立した場合は、ポジションが残っているので手動で決済してください。

おわりに

お疲れさまでした。

価格の条件を満たせば注文を出すプログラムの流れは理解できたでしょうか。

この注文を出す条件がFXの肝要であり、難しいところです。

次回は、FXの戦略を考えてプログラムに落とし込んでいきます。