デジタル通貨の契約がロボットに簡単に追記される

作者: リン・ハーン小さな夢, 作成日:2021-04-07 21:30:05, 更新日:2023-09-24 19:35:33

img

デジタル通貨の契約がロボットに簡単に追記される

過去の記事では,シンプルな現貨決済ロボットを実現しましたが,今日では,契約版のシンプルな決済ロボットを実現しました.

デザインのアイデア

契約版のレジボットと現金版の違いは大きく,現金版は主に口座資産変動を監視することによって実現できる.先物版は口座保有変動を監視する必要がある. フューチャー版では,複数の保有,空き保有,異なる契約があるため,状況が複雑になります. この一連の詳細処理が必要です. 核心的な考えは保有量の変動を監視することです. 持株の変動量に応じて単一の動作を誘発する.当初は複数の頭,空頭を一緒に処理する計画であったが,このような処理が複雑になることが判明した.分析問題の後,持株の複数の頭,空頭を別々に処理する決定がされた.

戦略の実現

戦略パラメータ:

img

復習をサポートし,デフォルトで直接復習観察を設定できます.

戦略のソースコード:

/*backtest
start: 2021-03-18 00:00:00
end: 2021-04-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*/

function test() {
    // 测试函数
    var ts = new Date().getTime()    
    if (ts % (1000 * 60 * 60 * 6) > 1000 * 60 * 60 * 5.5) {
        Sleep(1000 * 60 * 10)
        var nowPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
        var longPosAmount = nowPosAmount.long
        var shortPosAmount = nowPosAmount.short
        var x = Math.random()
        if (x > 0.7) {
            exchange.SetDirection("buy")
            exchange.Buy(-1, _N(Math.max(1, x * 10), 0), "参考账户测试开单#FF0000")
        } else if(x < 0.2) {
            exchange.SetDirection("sell")
            exchange.Sell(-1, _N(Math.max(1, x * 10), 0), "参考账户测试开单#FF0000")
        } else if(x >= 0.2 && x <= 0.5 && longPosAmount > 4) {
            exchange.SetDirection("closebuy")
            exchange.Sell(-1, longPosAmount, "参考账户测试平仓#FF0000")
        } else if(shortPosAmount > 4) {
            exchange.SetDirection("closesell")
            exchange.Buy(-1, _N(shortPosAmount / 2, 0), "参考账户测试平仓#FF0000")
        }
    }
}

function getPosAmount(pos, ct) {
    var longPosAmount = 0
    var shortPosAmount = 0
    _.each(pos, function(ele) {
        if (ele.ContractType == ct && ele.Type == PD_LONG) {
            longPosAmount = ele.Amount
        } else if (ele.ContractType == ct && ele.Type == PD_SHORT) {
            shortPosAmount = ele.Amount
        }
    })
    return {long: longPosAmount, short: shortPosAmount}
}

function trade(e, ct, type, delta) {
    var nowPosAmount = getPosAmount(_C(e.GetPosition), ct)
    var nowAmount = type == PD_LONG ? nowPosAmount.long : nowPosAmount.short
    if (delta > 0) {
        // 开仓
        var tradeFunc = type == PD_LONG ? e.Buy : e.Sell
        e.SetDirection(type == PD_LONG ? "buy" : "sell")
        tradeFunc(-1, delta)
    } else if (delta < 0) {
        // 平仓
        var tradeFunc = type == PD_LONG ? e.Sell : e.Buy
        e.SetDirection(type == PD_LONG ? "closebuy" : "closesell")
        if (nowAmount <= 0) {
            Log("未检测到持仓")
            return 
        }
        tradeFunc(-1, Math.min(nowAmount, Math.abs(delta)))
    } else {
        throw "错误"
    }
}

function main() {
    LogReset(1)
    if (exchanges.length < 2) {
        throw "没有跟单的交易所"
    }
    var exName = exchange.GetName()
    // 检测参考交易所
    if (!exName.includes("Futures_")) {
        throw "仅支持期货跟单"
    }
    Log("开始监控", exName, "交易所", "#FF0000")
    
    // 检测跟单交易所
    for (var i = 1 ; i < exchanges.length ; i++) {
        if (exchanges[i].GetName() != exName) {
            throw "跟单的期货交易所和参考交易所不同!"
        }
    }
    
    // 设置交易对、合约
    _.each(exchanges, function(e) {
        if (!IsVirtual()) {
            e.SetCurrency(refCurrency)
            if (isSimulate) {
                if (e.GetName() == "Futures_OKCoin") {
                    e.IO("simulate", true)
                }
            }
        }
        e.SetContractType(refCt)
    })

    var initRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
    while(true) {
        if (IsVirtual()) {    // 回测时才模拟
            test()            // 测试函数,模拟参考账户主动交易,触发跟单账户跟单        
        }
        Sleep(5000)
        var nowRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
        var tbl = {
            type : "table", 
            title : "持仓",
            cols : ["名称", "标签", "多仓", "空仓", "账户资产(Stocks)", "账户资产(Balance)"],
            rows : []
        }
        _.each(exchanges, function(e) {
            var pos = getPosAmount(_C(e.GetPosition), refCt)
            var acc = _C(e.GetAccount)
            tbl.rows.push([e.GetName(), e.GetLabel(), pos.long, pos.short, acc.Stocks, acc.Balance])
        })
        LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
        
        // 计算仓位变动量
        var longPosDelta = nowRefPosAmount.long - initRefPosAmount.long
        var shortPosDelta = nowRefPosAmount.short - initRefPosAmount.short

        // 检测变动
        if (longPosDelta == 0 && shortPosDelta == 0) {
            continue
        } else {
            // 检测到仓位变动
            for (var i = 1 ; i < exchanges.length ; i++) {
                // 执行多头动作
                if (longPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "执行多头跟单,变动量:", longPosDelta)
                    trade(exchanges[i], refCt, PD_LONG, longPosDelta)
                }
                // 执行空头动作
                if (shortPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "执行空头跟单,变动量:", shortPosDelta)
                    trade(exchanges[i], refCt, PD_SHORT, shortPosDelta)
                }
            }
        }

        // 执行跟单操作后,更新
        initRefPosAmount = nowRefPosAmount
    }
}

テスト

OKEXが V5 インターフェースを更新した後で,OKEX の模擬ディスクを使用できるので,私は2つの OKEX の模擬ディスク API KEY を使って非常に便利なテストを行いました.

最初の追加された取引所オブジェクトは参照取引所であり,取引所はその取引所のアカウントに従って取引を行う. OKEXの模擬盤のページでは,取引所の口座参照で3つのETHの四半期コイン本位契約を手動化します.

img

リアルディスクは,参照取引所の口座保有量の変化を検知し,操作に従います.

img

この2つの契約のポジションを平衡させてみましょう.平衡後のポジションは以下の通りです.

img

リアル盤は操作に従って,2つの契約を平らにした.

img

この戦略は,シンプルで理解しやすい方法で設計されており,最適化が行われず,完善された部分は,決済時の資産検定などの詳細を処理する必要があります. 簡潔な設計のために,決済は市場価格表のみを使用しています. 戦略は,学習アイデアを提供するだけであり,実盤は,ニーズに応じて自己最適化します.

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

投稿を歓迎します.


関連性

もっと

pw10132つの異なる取引所が互いに対応できない.

ミンジ1005発明者はいつコインペアで先物契約に勝てるの? 通貨安とオイティは手数料が少ないし,高周波ロボットは手数料が悪い.

アクルク通貨のUSDTの決済版が欲しいです

ロー99実行者のAPIは????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

ショウソン永続的な契約版のトークンUSDTを希望しています

QQラブ23この記事へのトラックバック一覧です.

小さな夢取引所の契約仕様が異なるため,特定の状況に応じて請求書のコードを調整することがあります.

pw1013取引所は,80%の返済率で,FMZは完全にサポートされています.

pw1013私は現在,biboxのフューチャーを使っています. 他の人の okx取引所と接続したい場合は,どこで変更する必要がありますか.

小さな夢実現可能で,コードを変更すればよい.

小さな夢この取引所の評価については,まだ取引所の関係者が連絡していない.