初心者が暗号通貨の定量取引戦略を設計するとき,しばしばさまざまな機能要件があります. プログラミング言語やプラットフォームに関係なく,それらはすべてさまざまな設計要件に直面します. たとえば,時には複数の取引品種の回転が必要であり,時にはマルチプラットフォームヘッジが必要であり,時には異なる取引品種が同時に必要になります. 戦略の巻き込み要件を実装する際に設計経験の一部を共有しましょう.
学習プラットフォームは 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)
}
}
}
ロボットを構成します
ロボットに交換オブジェクトが設定され,取引ペアが切り替わられ,異なる取引ペアの市場が得られ,マルチトレード・バラエティ市場が実行され,戦略論理の下で実行されることがわかります.
ループ内の3つの取引ペアである BTC_USDT, LTC_USDT, ETH_USDTは 繰り返し市場価格を入手し 情報を入手した後 市場を特定して 戦略によって設計された取引論理を 起動することが見られます
取引ペアを切り替えるのは好きではないし,ちょっと面倒で,戦略の論理は明確ではない.
デザインの他の選択肢は,実際にあります.
異なる取引対の市場データは複数の交換オブジェクトを通じて得られ,繰り返しの戦略論理で実行されます.
例えば,ロボットのために3つの交換オブジェクトを設定してロボットを設定します.取引ペアはそれぞれBTC_USDT,LTC_USDT,およびETH_USDTに設定されています.
名前とは
終わった
このコードを少し変更しました このとき 複数の交換オブジェクトを ロボットに追加しました 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)
}
}
}
ロボットを動かして
設定アカウントの複数の異なる取引ペアのための取引オブジェクトを追加する. これらはすべて単に交換アカウントの構成を使用しています (設定された交換を使用します).
複数の取引口座を 1つの戦略で使うには?
複数の取引所のクロスマーケット・ヘージングや 単一の取引所の複数の口座戦略など
2つのエクスチェンジを設定しました.
この2つの取引所で設定された口座の資産情報にアクセスできます
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のアカウント交換設定を追加することができます.
例えば,フウビ・フューチャーズの口座を追加します.
戦略が作成されると,Robot
例えば,この方法は2つのアカウントが最初に販売し,次に典型的なグリッド戦略 (アップ) で購入したり,まず購入し,次に販売 (ダウン) したりすることを可能にします.
上記の2つの例を通して
ロボットに複数の交換オブジェクトを設定し,ロボットに同じ交換アカウントに複数の交換オブジェクトを設定するとの違いは以下です.
違いは上記の例が交換構成であるということです.
ロボットが交換オブジェクトを構成するときは 常に以下のようなことを使用します
この配置です
交換オブジェクトを追加すると 取引ペアの設定が異なります
GetAccount 関数が呼び出された場合,同じアカウントの資産情報には常にアクセスできます.
ただし:
この2つのフュービー・フューチャー・取引対象は,フュービー・フューチャーであるにもかかわらず,異なる取引口座を表しています.
時には,暗号通貨契約ヘッジの戦略では,瞬間の取引機会を掴むために,多くのシナリオを同時に配置する必要があります.しかし,契約が異なるため,市場 kotaを取得して注文するときに対応する契約に切り替える必要があります.exchange.Go
配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列の配列
複数の交換オブジェクトを同じ交換アカウントに設定します. 交換オブジェクトの設定をします.
この交換構成を使用して別の交換オブジェクトを追加します
提示ボックスが表示されます!
交換口座の設定では,同じ通貨または取引ペアの交換オブジェクトを追加することはできません.
戦略ロボットは2つの交換オブジェクトを使用できないようで,交換オブジェクトは交換口座番号に結びついているようです.
まだ方法がある!
OKEXのフューチャー取引の設定を追加します. この場合は,OKEXのフューチャー取引の設定をクリックします.
設定されたときに保存をクリックします.
同じAPIKEYの設定情報を使用します. この方法では,
この こと の 益 は 何 です か
戦略を書くとき デザインはとても簡単です
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)
}
このデザイン戦略は もっとシンプルで 明確でしょうか?
実際の市場操作:
2つの契約の価格を得るのに 約50ミリ秒かかります