資源の読み込みに... 荷物...

Pythonの単品戦略から多種戦略に変換します.

作者: リン・ハーン発明者 量化 - 微かな夢, 作成日:2020年01月20日 17:33:36, 更新日:2023年10月17日 21:18:46

img

1つ目は,Pythonの単品戦略を多種戦略に変えるための手引きです

この記事では,Pythonのシンプルな戦略を実装しました."Python版 追いつく 倒れる 戦略"この戦略は,ある取引対で1つのアカウントを操作してプログラム化された取引を行うことができる.原理は簡単である.時には同じ取引論理を使用して異なる取引対を操作したい.複数のロボットを作成し,異なる取引対を設定し,様々な通貨で取引を行うことができます.もし戦略が複雑でない場合は,発明者の量化取引プラットフォームの強力な柔軟性により,簡単です.

改変された戦略のソースコード:

'''backtest
start: 2019-02-20 00:00:00
end: 2020-01-10 00:00:00
period: 1m
exchanges: [{"eid":"OKEX","currency":"BTC_USDT"},{"eid":"OKEX","currency":"ETH_USDT","stocks":30},{"eid":"OKEX","currency":"LTC_USDT","stocks":100}]
'''

import time
import json

params = {
    "arrBasePrice": [-1, -1, -1],     # -1
    "arrRatio": [0.05, 0.05, 0.05],         # 0.05
    "arrAcc": [],           # _C(exchange.GetAccount)
    "arrLastCancelAll": [0, 0, 0], # 0
    "arrMinStocks": [0.01, 0.01, 0.01],     # 0.01
    "arrPricePrecision": [2, 2, 2], # 2
    "arrAmountPrecision": [3, 2, 2], # 2
    "arrTick":[]
}

def CancelAll(e):
    while True : 
        orders = _C(e.GetOrders)
        for i in range(len(orders)) :
            e.CancelOrder(orders[i]["Id"], orders[i])
        if len(orders) == 0 :
            break
        Sleep(1000)

def process(e, index):
    global params
    ticker = _C(e.GetTicker)
    params["arrTick"][index] = ticker
    if params["arrBasePrice"][index] == -1 :
        params["arrBasePrice"][index] = ticker.Last
    if ticker.Last - params["arrBasePrice"][index] > 0 and (ticker.Last - params["arrBasePrice"][index]) / params["arrBasePrice"][index] > params["arrRatio"][index]:
        params["arrAcc"][index] = _C(e.GetAccount)
        if params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last > params["arrMinStocks"][index]:
            e.Buy(ticker.Last, params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last)
            params["arrBasePrice"][index] = ticker.Last
    if ticker.Last - params["arrBasePrice"][index] < 0 and (params["arrBasePrice"][index] - ticker.Last) / params["arrBasePrice"][index] > params["arrRatio"][index]: 
        params["arrAcc"][index] = _C(e.GetAccount)
        if params["arrAcc"][index].Stocks * params["arrRatio"][index] > params["arrMinStocks"][index]:
            e.Sell(ticker.Last, params["arrAcc"][index].Stocks * params["arrRatio"][index])
            params["arrBasePrice"][index] = ticker.Last
    ts = time.time()
    if ts - params["arrLastCancelAll"][index] > 60 * 5 :
        CancelAll(e)
        params["arrLastCancelAll"][index] = ts 

def main():
    global params
    
    for i in range(len(exchanges)) :    
        params["arrAcc"].append(_C(exchanges[i].GetAccount))
        params["arrTick"].append(_C(exchanges[i].GetTicker))
        exchanges[i].SetPrecision(params["arrPricePrecision"][i], params["arrAmountPrecision"][i])

    for key in params :
        if len(params[key]) < len(exchanges):
            raise "params error!"

    while True:
        tblAcc = {
            "type" : "table",
            "title": "account",
            "cols": ["账户信息"], 
            "rows": []
        }        

        tblTick = {
            "type" : "table",
            "title": "ticker",
            "cols": ["行情信息"], 
            "rows": []
        }
        for i in range(len(exchanges)): 
            process(exchanges[i], i)

        for i in range(len(exchanges)):
            tblAcc["rows"].append([json.dumps(params["arrAcc"][i])])
            tblTick["rows"].append([json.dumps(params["arrTick"][i])])

        LogStatus(_D(), "\n`" + json.dumps([tblAcc, tblTick]) + "`")
        Sleep(500)

2 違いを見つけること

この記事の記事では,この2つのコードの組み合わせについて説明します. 実際,取引論理はまったく同じで,変更は一切ない.ただし,戦略を複数種に変更すると,前回のの単一の変数を戦略パラメータののような形で使用することはできません.より合理的な解決策は,パラメータを配列にすることであり,配列の各位置のインデックスは追加された取引対に対応します.

img

取引論理のコードを関数に包み込みます.process中,策略主回路では,追加された取引対に依拠してこの関数を呼び出し,各取引対に一度の取引論理コードを実行させる.

  • 繰り返す (繰り返す) 呼び出し:

    for i in range(len(exchanges)): 
        process(exchanges[i], i)
    
  • 戦略パラメータ:

    params = {
        "arrBasePrice": [-1, -1, -1],           # -1
        "arrRatio": [0.05, 0.05, 0.05],         # 0.05
        "arrAcc": [],                           # _C(exchange.GetAccount)
        "arrLastCancelAll": [0, 0, 0],          # 0
        "arrMinStocks": [0.01, 0.01, 0.01],     # 0.01
        "arrPricePrecision": [2, 2, 2],         # 2
        "arrAmountPrecision": [3, 2, 2],        # 2
        "arrTick":[]
    }
    

    このように設計すれば,各取引対が独自のパラメータを持つことが可能になり,各取引対の潜在的な価格の差が大きくなり,パラメータも異なる可能性があり,時には差別化設定が必要になる.

  • CancelAll関数について

    この関数の変化を比較してみましょう. この関数は単にコードを少しだけ変更し,その変更の意図について考えるだけです.

  • ステータスバーグラフデータ

    状態欄に市場データと口座資産データを表示するグラフを追加し,各取引所の対象となる資産と市場をリアルタイムに表示する.

Pythonの策略を複数形に変えるのは簡単ではありませんか?

3 テストを繰り返す

img

img

img

この戦略は,学習,復習テスト,アップグレードの最適化に関心のある人のための参照のみです.戦略アドレス


関連性

もっと

2009年に結婚したなぜ,このポリシーを設定するだけで,exchange.SetDirection (『buy』) の方向を設定する必要がないのか?

円筒印章の黒馬この戦略の最低資本は?

円筒印章の黒馬半日間の反応なしで取引をしなかった.

円筒印章の黒馬わかった わかった わかった わかった わかった わかった

円筒印章の黒馬/upload/asset/164f3fe6e84331d800583.png 今,大丈夫ですが,私の口座にはお金があります. あなたの戦略は,最低限の資本をどれくらい投資しますか? 私の口座にはお金が足りないのでしょうか.

円筒印章の黒馬/upload/asset/16495fcb1185338f8af27.png はアドメインのIPです

円筒印章の黒馬GetAccount: 400: {"error_message":"Invalid IP","code":30011,"error_code":"30011","message":"Invalid IP"} メール番号: 400: メール番号: IPはAPIに追加しました.

円筒印章の黒馬この問題は,このビデオで解くことができます.

円筒印章の黒馬ロボットのK線周期を設定する

発明者 量化 - 微かな夢この戦略は,教育戦略であり,学習を中心に,自力で修正,拡張,最適化することができます.

発明者 量化 - 微かな夢この戦略のソースコードを具体的に見てみると,戦略は公開されており,戦略論理は簡単です. 注意してください,これはデジタル通貨の現金戦略です.

発明者 量化 - 微かな夢API KEY を要求するときに設定されたIPアドレスは,アクセス許可されたホワイトリストアドレスです. 設定した後,このIPアドレスは,APIインターフェースにアクセスするためにあなたのAPI KEYを使用できる唯一のIPアドレスです. あなたはあなたのホストのIPアドレスを設定していますか?

発明者 量化 - 微かな夢管理者がいるサーバーにpythonをインストールします.

発明者 量化 - 微かな夢このポリシーは,K線を考慮せず,任意の設定で実行されます. ティックの粒度に影響を与えるため,リセットは1分設定されます.