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

クリプト通貨の量的な取引戦略の交換構成

作者: リン・ハーン優しさ, 作成日:2019-09-16 14:55:26, 更新日:2023-11-07 20:50:11

img

初心者が暗号通貨の定量取引戦略を設計するとき,しばしばさまざまな機能要件があります. プログラミング言語やプラットフォームに関係なく,それらはすべてさまざまな設計要件に直面します. たとえば,時には複数の取引品種の回転が必要であり,時にはマルチプラットフォームヘッジが必要であり,時には異なる取引品種が同時に必要になります. 戦略の巻き込み要件を実装する際に設計経験の一部を共有しましょう.

学習プラットフォームは FMZ Quant 取引プラットフォームを使用しています (https://www.fmz.com市場が暗号通貨市場として選択されます.

複数の暗号通貨の戦略設計

これらの需要状況のほとんどは,マルチ仮想通貨のトレンドとグリッド戦略のために準備されており,異なる取引繰り返しの方法で市場で実行する必要があります.

通常はこんな感じで設計されています

function Process (symbol) {
     exchange.IO("currency", symbol)
     var ticker = _C(exchange.GetTicker)
     Log("has switched trading pairs, processing trading pairs according to strategy logic:", symbol, "quotes: ", ticker)
     // ...
     // ..
     // .
}

function main(){
     var symbols = ["BTC_USDT", "LTC_USDT", "ETH_USDT"]
     while (true) {
         for (var i = 0 ; i < symbols.length; i++) {
             Process(symbols[i])
             Sleep(500)
         }
     }
}

ロボットを構成します

img

img

ロボットに交換オブジェクトが設定され,取引ペアが切り替わられ,異なる取引ペアの市場が得られ,マルチトレード・バラエティ市場が実行され,戦略論理の下で実行されることがわかります.

ループ内の3つの取引ペアである BTC_USDT, LTC_USDT, ETH_USDTは 繰り返し市場価格を入手し 情報を入手した後 市場を特定して 戦略によって設計された取引論理を 起動することが見られます

取引ペアを切り替えるのは好きではないし,ちょっと面倒で,戦略の論理は明確ではない.

デザインの他の選択肢は,実際にあります.

同じ交換アカウントでロボットのために複数の交換オブジェクトを設定する

異なる取引対の市場データは複数の交換オブジェクトを通じて得られ,繰り返しの戦略論理で実行されます.

例えば,ロボットのために3つの交換オブジェクトを設定してロボットを設定します.取引ペアはそれぞれBTC_USDT,LTC_USDT,およびETH_USDTに設定されています.

img

名前とは OKEX Spot V3 Test 交換オブジェクトで,ダッシュボードのページ,交換設定のページ:

img

終わった

このコードを少し変更しました このとき 複数の交換オブジェクトを ロボットに追加しました BTC_USDT,LTC_USDT,ETH_USDTの交換オブジェクトです

function Process (e) {
    var ticker = _C(e.GetTicker)
    Log("exchange", e.GetName(), "Process trading pairs according to strategy logic:", e.GetCurrency(), "Quotes:", ticker)
    // ...
    // ..
    // .
}  

function main(){
    while (true) {
        for (var i = 0 ; i < exchanges.length; i++) {
            Process(exchanges[i])
            Sleep(500)
        }
    }
}

ロボットを動かして

img

設定アカウントの複数の異なる取引ペアのための取引オブジェクトを追加する. これらはすべて単に交換アカウントの構成を使用しています (設定された交換を使用します).

複数の取引口座を 1つの戦略で使うには?

複数の交換口座の使用戦略

複数の取引所のクロスマーケット・ヘージングや 単一の取引所の複数の口座戦略など

  • 複数の交換装置の構成と異なる交換装置

img

2つのエクスチェンジを設定しました.

この2つの取引所で設定された口座の資産情報にアクセスできます

img

function main(){
     Log(exchanges[0].GetAccount()) // Print the account asset information of the first exchange object.
     Log(exchanges[1].GetAccount()) // ... Print the asset information of the Bit-Z exchange
}

もちろん,私はまた,交換に第2および第3のアカウント交換設定を追加することができます.

  • 複数の交換装置を同じ交換装置で配置する

例えば,フウビ・フューチャーズの口座を追加します.

img

フュービー・フューチャーズ2つの取引所の口座を構成します

img

戦略が作成されると,Robotの Modify Configuration オプションに Huobi Futures Exchange オブジェクトが表示されます.

img

例えば,この方法は2つのアカウントが最初に販売し,次に典型的なグリッド戦略 (アップ) で購入したり,まず購入し,次に販売 (ダウン) したりすることを可能にします.

上記の2つの例を通して

ロボットに複数の交換オブジェクトを設定し,ロボットに同じ交換アカウントに複数の交換オブジェクトを設定するとの違いは以下です.

同じ取引口座にはロボットのための複数の取引オブジェクトがあるという上記の例は,ある程度似ていますが,違いがあります.

違いは上記の例が交換構成であるということです.

img

ロボットが交換オブジェクトを構成するときは 常に以下のようなことを使用します

img

この配置です

交換オブジェクトを追加すると 取引ペアの設定が異なります

GetAccount 関数が呼び出された場合,同じアカウントの資産情報には常にアクセスできます.

ただし:

img

この2つのフュービー・フューチャー・取引対象は,フュービー・フューチャーであるにもかかわらず,異なる取引口座を表しています.

  • 取引先の配置を使用することで,仮想通貨先物戦略の設計が容易になります.

時には,暗号通貨契約ヘッジの戦略では,瞬間の取引機会を掴むために,多くのシナリオを同時に配置する必要があります.しかし,契約が異なるため,市場 kotaを取得して注文するときに対応する契約に切り替える必要があります.exchange.Go配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列

複数の交換オブジェクトを同じ交換アカウントに設定します. 交換オブジェクトの設定をします.

img

この交換構成を使用して別の交換オブジェクトを追加します

提示ボックスが表示されます!

img

交換口座の設定では,同じ通貨または取引ペアの交換オブジェクトを追加することはできません.

戦略ロボットは2つの交換オブジェクトを使用できないようで,交換オブジェクトは交換口座番号に結びついているようです.

まだ方法がある!

OKEXのフューチャー取引の設定を追加します. この場合は,OKEXのフューチャー取引の設定をクリックします.

img

設定されたときに保存をクリックします.

img

同じAPIKEYの設定情報を使用します. この方法では,

img

この こと の 益 は 何 です か

戦略を書くとき デザインはとても簡単です

function main(){
    exchanges[0].SetContractType("quarter") // Set the first added exchange object. The current contract is a quarterly contract.
    exchanges[1].SetContractType("this_week") // Set the second added exchange object, the current contract is the current week contract
    
    while (true) {
        var beginTime = new Date().getTime() // Record the timestamp from which this time the market quote was taken.
        var rA = exchanges[0].Go("GetTicker") // Create a concurrent thread to get the first exchange object, which is the market data for the quarterly contract.
        var rB = exchanges[1].Go("GetTicker") // Create a concurrent thread to get the second exchange object, which is the market data for the weekly contract.
        
        var tickerA = rA.wait() // The two threads executing each other perform their own tasks, waiting to get the data. When A waits, the B task is also executing.
        var tickerB = rB.wait() // So it seems to be sequential execution, actually at the bottom of the concurrency. Only when you get the order is to get A first, and get B.
        var endTime = new Date().getTime() // Record the timestamp at the end of the two contract quotes.
        
        if (tickerA && tickerB) { // If there is no problem with the data obtained, execute the following logic.
            var diff = tickerA.Last - tickerB.Last // calculate the difference
            $.PlotLine("diff", diff) // Use the line drawing library to plot the difference on the chart.
            if (diff > 500) { // If the spread is greater than 500, hedge arbitrage (of course, the difference of 500 is relatively large, rarely seen.)
                // Hedging
                rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // Concurrent threads create a selling order under the quarterly contract
                rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // Concurrent thread create a buying order under the weekly contract
                
                var idA = rA.wait() // Waiting for the return of placing order results, returning the order ID
                var idB = rB.wait() // ...
            }
            
            // ...
        }
        
        LogStatus(_D(), "Concurrently get two contract quotes taking time:", endTime - beginTime, "millisecond.") // Shows the time on the status bar to know that the program is executing.
        Sleep(500)
    }

このデザイン戦略は もっとシンプルで 明確でしょうか?

実際の市場操作:

img

2つの契約の価格を得るのに 約50ミリ秒かかります


関連性

もっと