Python を使って量化取引ロボットのタイミングを起動または停止する小道具

作者: リン・ハーン小さな夢, 作成日:2020-02-14 21:56:58, 更新日:2023-10-10 21:13:38

img

Python を使って量化取引ロボットのタイミングを起動または停止する小道具

強力な,柔軟で簡単に利用可能な,全網的な量化取引プラットフォームとして,発明者による量化取引プラットフォームは,使用制限が非常に低く,ロボットプログラムは資源をほとんど占めていません. しかし,私たちはまだロボットが実行するときに起動し,実行するときに停止する必要はありません. 例えば,商品先物取引のプログラム化や量化取引では,開拓時間以外の時間は1日のほとんどを占めています. そのため,ロボットが開拓時間のみで,毎日開拓時間のみで稼働することを非常に望んでいます. この需要のために,私たちはPython言語を使用して,FMZ量化取引プラットフォームで実行する戦略ロボットを書き,このロボットを通過させることができます. 発明者は取引プラットフォームの拡張APIインターフェースを量化し,ロボットの起動と停止を定時制御する.

需要があれば,やる!

発明者による量化取引プラットフォームの拡張APIの例を直接使用できます.

アドレス:https://www.fmz.com/api#简单的例子

直接例の関数を使用します.def api(method, *args)呼び出すインターフェースも簡単です. 次の2つのインターフェースで (FMZのドキュメントで調べることができます)

  • ロボットを再起動 ロボットインターフェイスを再起動し,パラメータをロボットIDに転送します. 具体的使用idフォローしているユーザー:api('RestartRobot', id)

  • ストップロボット ロボットインターフェースを停止します. 参数もロボットです.ID

    ロボットID動画の画像をご覧下さい.img

発明者定量化取引プラットフォームの拡張APIは,発明者定量化取引プラットフォームを使用する必要があります.API KEY│ │ アカウント管理で自分のアカウントを作成できます.API KEY│ │ 計算したものです.API KEY策略のパラメータとして入力します. 発明者のQTアカウントを取得API KEYスクリーンショット:img

タイムロジックを書いて,非常にシンプルで,タイムパラメータを設定します.

["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)

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

img

戦略が実行される:

スクリーンimg

この戦略によって操作されたロボットは:img

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

終わり

FMZプラットフォームをベースにした独自の量化取引プラットフォームを作るのに,これらの拡張APIは全く問題ありません. このタイマーロボットの設計は比較的シンプルで,単に脳を持たない時間開き,時間停止,起動成功かどうか,検査,異常再試行,などなどのメカニズムが含まれていない. 戦略は学習のためのものです.


関連性

もっと