avatar of 发明者量化-小小梦 发明者量化-小小梦
フォロー ダイレクトメッセージ
4
フォロー
1271
フォロワー

Python を使用して、ガジェットを開始または停止する定量取引ロボットを実装します。

作成日:: 2020-02-14 21:56:58, 更新日:: 2023-10-10 21:13:38
comments   4
hits   3047

Python を使用して、ガジェットを開始または停止する定量取引ロボットを実装します。

Python を使用して、ガジェットを開始または停止する定量取引ロボットを実装します。

Inventor Quantitative Trading Platform は、ネットワーク全体にわたる強力で柔軟性があり、使いやすい定量取引プラットフォームであるため、使用のハードルが非常に低く、ロボット プログラムはごくわずかなリソースしか消費しません。しかし、私たちは、ロボットが動作する必要があるときに起動し、動作する必要がないときに停止できることを依然として望んでいます。 たとえば、商品先物のプログラム取引や定量取引を行う場合、市場が開いていない時間が一日の大半を占めます。このように、私たちはロボットを市場の営業時間中だけ稼働させたいと思っています。毎日市場の営業時間中だけ稼働させることで、どれだけコストを節約できるかを考えるのはワクワクします。この要件を満たすには、Python を使用して、FMZ 定量取引プラットフォームで実行される戦略ロボットを作成します。 発明者の定量取引プラットフォームの拡張 API インターフェースは、ロボットの起動と停止を一定の時間に制御します。

需要があれば、やるだけです!

実際、コード全体は非常に単純です。発明者の定量取引プラットフォームの拡張APIインターフェースを呼び出す例は、直接使用できます。

アドレス: https://www.fmz.com/api#%E7%AE%80%E5%8D%95%E7%9A%84%E4%BE%8B%E5%AD%90

例の関数を直接使用します。def api(method, *args) 呼び出す必要のあるインターフェースも非常にシンプルで、次の 2 つのインターフェースを使用します (FMZ ドキュメントに記載されています)。

  • RestartRobot ロボット インターフェイスを再起動し、ロボット ID をパラメータとして渡します。 特定のid次のように呼び出すことができます。api('RestartRobot', id)

  • StopRobot ロボットインターフェースを停止します。パラメータもロボットですID

ロボットID表示、取得、スクリーンショット: Python を使用して、ガジェットを開始または停止する定量取引ロボットを実装します。

Inventor Quantitative Trading Platform拡張APIを呼び出すには、Inventor Quantitative Trading Platformを使用する必要があります。API KEY。 アカウント管理で独自のアカウントを生成することができますAPI KEY。 私たちはAPI KEY戦略へのパラメータとして渡されます。 Inventor Quantitative Trading Platform アカウントを取得するAPI KEYスクリーンショット: Python を使用して、ガジェットを開始または停止する定量取引ロボットを実装します。

残っているのはタイミング ロジックを記述することだけですが、これも非常に簡単です。タイミング パラメータを設定します。

["175708,14:55:33-15:10:33", ...]

省略記号は、より類似した"175708,14:55:33-15:10:33"設定。 タイミング パラメータは JSON 文字列であり、ポリシー コード内のリストに解析されます。リスト内の各要素は、ロボットの開始/停止設定のセットです。 今すぐ:

"175708,14:55:33-15:10:33"

区切りにはコンマを使用します。カンマの前の部分175708はロボットID、カンマの後の部分は開始時刻/停止時刻です。 上記の例では、ID 175708 のロボットは 14:55:33 に起動され、15:10:33 に停止しました。

その後、戦略は検索を続け、そのたびにまず現在の時刻を取得し、次に現在の時刻とスケジュールされた時刻を比較して、ロボットの起動または停止をトリガーする必要があるかどうかを判断します。 トリガーされた場合、api(‘RestartRobot’, id) または api(‘StopRobot’, id) を呼び出してロボットを起動または停止します。

完全な戦略コード:

# -*- coding: utf-8 -*-
import time
import json

try:
    import md5
    import urllib2
    from urllib import urlencode
except:
    import hashlib as md5
    import urllib.request as urllib2
    from urllib.parse import urlencode

def api(method, *args):
    d = {
        'version': '1.0',
        'access_key': accessKey,
        'method': method,
        'args': json.dumps(list(args)),
        'nonce': int(time.time() * 1000),
        }

    d['sign'] = md5.md5(('%s|%s|%s|%d|%s' % (d['version'], d['method'], d['args'], d['nonce'], secretKey)).encode('utf-8')).hexdigest()
    return json.loads(urllib2.urlopen('https://www.fmz.com/api/v1', urlencode(d).encode('utf-8')).read().decode('utf-8'))

RobotParams = json.loads(strRobotParams)

def main():
    global RobotParams 
    arrParams = []
    nowDay = 0
    strPush = ""
    if isPushMsg:
        strPush = "@"

    for i in range(len(RobotParams)):
        param = {}
        arr = RobotParams[i].split(",")
        if len(arr) != 2:
            raise Exception("字符串配置错误:分隔符号,")
        param["id"] = arr[0]
        param["isProcessOpenThisDay"] = False
        param["isProcessCloseThisDay"] = False

        arr = arr[1].split("-")
        if len(arr) != 2:
            raise Exception("字符串配置错误:分隔符号-")

        begin = arr[0]
        arrBegin = begin.split(":")
        if len(arrBegin) != 3:
            raise Exception("字符串配置错误:起始时间分隔符号:")
        
        param["begin"] = {}
        param["begin"]["hour"] = float(arrBegin[0])
        param["begin"]["min"] = float(arrBegin[1])
        param["begin"]["sec"] = float(arrBegin[2])

        end = arr[1]
        arrEnd = end.split(":")
        if len(arrEnd) != 3:
            raise Exception("字符串配置错误:结束时间分隔符号:")            
        
        param["end"] = {}
        param["end"]["hour"] = float(arrEnd[0])
        param["end"]["min"] = float(arrEnd[1])
        param["end"]["sec"] = float(arrEnd[2])
        arrParams.append(param)

    # 测试
    Log("输出参数", arrParams, "#FF0000")  

    while True:
        nowTime = time.localtime(time.time())
        nowHour = nowTime.tm_hour 
        nowMin = nowTime.tm_min
        nowSec = nowTime.tm_sec
        
        tbl = {
            "type" : "table", 
            "title" : "msg", 
            "cols" : ["id", "begin", "end", "今天是否执行过启动", "今天是否执行过停止"],
            "rows" : []
        }

        for i in range(len(arrParams)):
            tbl["rows"].append([arrParams[i]["id"], json.dumps(arrParams[i]["begin"]), json.dumps(arrParams[i]["end"]), arrParams[i]["isProcessOpenThisDay"], arrParams[i]["isProcessCloseThisDay"]])
            if nowDay != nowTime.tm_mday:
                arrParams[i]["isProcessOpenThisDay"] = False
                arrParams[i]["isProcessCloseThisDay"] = False

            if arrParams[i]["isProcessOpenThisDay"] == False:
                if nowTime.tm_hour == arrParams[i]["begin"]["hour"] and nowTime.tm_min >= arrParams[i]["begin"]["min"] and nowTime.tm_sec >= arrParams[i]["begin"]["sec"]:
                    ret = api('RestartRobot', int(arrParams[i]["id"]))                    
                    arrParams[i]["isProcessOpenThisDay"] = True
                    Log("机器人ID:", arrParams[i]["id"], "执行启动,请登录平台检查是否启动成功", "扩展API返回值:", ret, strPush)

            if arrParams[i]["isProcessCloseThisDay"] == False:
                if nowTime.tm_hour == arrParams[i]["end"]["hour"] and nowTime.tm_min >= arrParams[i]["end"]["min"] and nowTime.tm_sec >= arrParams[i]["end"]["sec"]:
                    ret = api('StopRobot', int(arrParams[i]["id"]))
                    arrParams[i]["isProcessCloseThisDay"] = True
                    Log("机器人ID:", arrParams[i]["id"], "执行停止,请登录平台检查是否停止成功", "扩展API返回值:", ret, strPush)
        
        if nowDay != nowTime.tm_mday:
            nowDay = nowTime.tm_mday

        LogStatus(_D(), nowTime, "\n`" + json.dumps(tbl) + "`")
        Sleep(500)

ロボットパラメータ設定:

Python を使用して、ガジェットを開始または停止する定量取引ロボットを実装します。

戦略運用:

スクリーンショット Python を使用して、ガジェットを開始または停止する定量取引ロボットを実装します。

この戦略で操作されるロボット: Python を使用して、ガジェットを開始または停止する定量取引ロボットを実装します。

戦略アドレス: https://www.fmz.com/strategy/184600

結論

出発点として、Inventor 定量取引プラットフォームの拡張 API は非常に強力です。これらの拡張 API を使用して、FMZ プラットフォームに基づく独自の定量取引プラットフォームを構築することは完全に可能です。 このタイミングロボットの設計は比較的単純です。時間になったら起動して停止するだけです。起動が成功したかどうか、検証、異常な再試行などのメカニズムは含まれていません。興味のある人は機能を追加して拡張することができます。それ。 この戦略は学習の参考としてのみ利用されます