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

シンプルなデジタル通貨スポット取引ロボットを実装する

作成日:: 2021-02-18 16:09:43, 更新日:: 2023-09-26 20:57:30
comments   6
hits   3831

シンプルなデジタル通貨スポット取引ロボットを実装する

シンプルなデジタル通貨スポット取引ロボットを実装する

暗号通貨業界には、コピーキャットロボットを必要とする手動トレーダーが多くいますが、基礎知識がないとプログラム設計を始めるのに時間がかかることに困っています。このような需要に基づいて、この記事では、アルゴリズム取引の基礎知識を持たない暗号通貨業界の友人を支援するために、シンプルなスポットコピー取引ロボットを設計します。

まず、ニーズを分析しましょう。このロボットの機能は、1 つのアカウントで購入または販売操作が行われると、他のコピー アカウントもそれに追随してこの操作を実行するようにすることです。 したがって、まず 2 つの主題を明確にします。

  • 参照アカウント: このアカウントのすべての動きを監視する監視対象アカウント。
  • コピー アカウント: 注文に従うアカウント。参照アカウントでアクションが発生すると、コピー アカウントは同じアクションを実行します。

このニーズを予備的に特定したので、次のステップについて引き続き検討する必要があります。参照アカウントのアクションをどのように識別しますか?

スポット口座の場合、参照口座の監視は非常に簡単で、最新の口座情報データ内のコイン数と、現在取得している最新の口座情報データ内のコイン数を比較するだけです。 現在取得している最新のアカウント情報データのコイン数が前回の記録よりも多い場合、参照アカウントが購入操作を実行し、購入が成功したことが証明されます。逆にコインが少ない場合は、参照アカウントに対して売却操作が実行されます。このアクションを発見したら、他の取引所アカウントでも同じ操作を実行できるようになります。

参照アカウントでトランザクションが実行されたことが判明した場合、最新のアカウントデータレコードを更新し、次回取得されたアカウント情報と比較して、新しいトランザクションアクションがあるかどうかを判断する必要があります。

上記のロジックは、戦略コードによって記述されます。

        // 检测跟单
        var amount = (nowAcc.Stocks + nowAcc.FrozenStocks) - (initAcc.Stocks + initAcc.FrozenStocks)  // 检测币数发生的变化
        var func = null 
        if (amount > 0) {   // 币变多了
            func = $.Buy    // 买入
        } else if (amount < 0) {  // 币变少了
            func = $.Sell         // 卖出
        } else {
            continue
        }
        
        // 执行跟单
        Log("跟单!数量:", Math.abs(amount), "#FF0000")
        for (var i = 1 ; i < exchanges.length ; i++) {    // i 等于 0 时,是参考交易所,不处理,处理其它的跟单交易所        
            func(exchanges[i], Math.abs(amount))          // 执行具体的交易函数,可能是$.Buy 或者是 $.Sell ,具体看amount 是大于0,还是小于0
        }
        
        // 执行跟单之后更新参考交易所账户信息记录
        initAcc = nowAcc                                  // 更新参考交易所最近一次的账户信息,用于下次对比

この戦略の主な検出ロジックは上記のコードです。設計を簡素化するために、この戦略では FMZ 公式 [デジタル通貨取引ライブラリ] テンプレートを使用します。$.Buy , $.Sellこれらはすべてこのテンプレートの機能であり、注文操作を実行することがその機能です。

各アカウントのデータの監視を容易にするために、戦略にいくつかのステータス バー表示を追加します。完全な戦略は次のとおりです。

function test() { 
    // 测试函数
    var ts = new Date().getTime()    
    if (ts % (1000 * 60 * 60 * 6) > 1000 * 60 * 60 * 5.5) {
        Sleep(1000 * 60 * 10)
        var x = Math.random()
        if (x > 0.5) {
            $.Buy(exchange, x / 10)    
        } else {
            $.Sell(exchange, x / 10)    
        }        
    }
}

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().includes("Futures_")) {
            throw "不支持期货交易所跟单"
        }
    }
    
    var initAcc = _C(exchange.GetAccount)
    while(1) {
        if(IsVirtual()) {
           // 测试函数
           test()  
        }  
        Sleep(5000)
        
        // 更新参考账户当前的账户信息
        var nowAcc = _C(exchange.GetAccount)
        
        // 参考交易所账户信息
        var refTbl = {
            type : "table", 
            title : "参考交易所",
            cols : ["名称", "币", "冻结币", "钱", "冻结钱"],
            rows : []
        }
        refTbl.rows.push([exName, nowAcc.Stocks, nowAcc.FrozenStocks, nowAcc.Balance, nowAcc.FrozenBalance])
        
        // 跟单交易所账户信息
        var followTbl = {
            type : "table", 
            title : "跟单交易所",
            cols : ["名称", "币", "冻结币", "钱", "冻结钱"],
            rows : []        
        }
        for (var i = 1 ; i < exchanges.length ; i++) {
            var acc = _C(exchanges[i].GetAccount)
            var name = exchanges[i].GetName()
            followTbl.rows.push([name, acc.Stocks, acc.FrozenStocks, acc.Balance, acc.FrozenBalance])
        }
        
        // 状态栏显示
        LogStatus(_D(), "\n`" + JSON.stringify(refTbl) + "`", "\n`" + JSON.stringify(followTbl) + "`")
        
        // 检测跟单
        var amount = (nowAcc.Stocks + nowAcc.FrozenStocks) - (initAcc.Stocks + initAcc.FrozenStocks)
        var func = null 
        if (amount > 0) {
            func = $.Buy
        } else if (amount < 0) {
            func = $.Sell
        } else {
            continue
        }
        
        // 执行跟单
        Log("跟单!数量:", Math.abs(amount), "#FF0000")
        for (var i = 1 ; i < exchanges.length ; i++) {            
            func(exchanges[i], Math.abs(amount))
        }
        
        // 执行跟单之后更新参考交易所账户信息记录
        initAcc = nowAcc
    }
}

FMZ の wexApp 模擬交換テストを使用してリアルタイム テストを実行してみましょう。ここで、互いに独立した 3 つの wexApp アカウントを追加しました。そのうちの 1 つは参照交換として機能し、他の 2 つはコピー交換として機能します。

シンプルなデジタル通貨スポット取引ロボットを実装する

次に、FMZ の取引端末を使用して手動で注文を出し、ロボットが自動的に注文に従うかどうかを確認します。

シンプルなデジタル通貨スポット取引ロボットを実装する

ロボットがトランザクションを検出し、コピー操作を実行したことがわかります。

シンプルなデジタル通貨スポット取引ロボットを実装する

完全な戦略: https://www.fmz.com/strategy/255182

この戦略は学習のみを目的としています。ご質問がある場合は、メッセージを残してください。