FMZ 量子プラットフォームの基本チュートリアル 戦略執筆

作者: リン・ハーンニナバダス, 作成日: 2022-03-18 09:00:46, 更新日: 2022-04-02 11:48:15

[TOC] このチュートリアルは,APIの導入,バックテスト,チャートなど,戦略作成の基本的な知識を含んでいます. この基本的なチュートリアルを学んだ後,ユーザーは基本的なAPIを熟練して安定したボット戦略を書くことができます. チュートリアルを学ぶ前に,どのように使用するかを学ぶ必要があります.FMZ量子プラットフォームを起動する.

古いバージョンのチュートリアル:FMZ Quant (FMZ.COM) 戦略執筆マニュアル 2.0 (チュートリアル)チュートリアルには多くのポスト・インデックスがあり,読んでもらえるようにお勧めします.

戦略 書写 に 関する 予備 指導

API 紹介

プログラム・トレーディングとは,プログラムがAPIを通じてプラットフォームと接続して,設計意図に応じて自動売買または他の機能を達成することを意味します.APIはアプリケーション・プログラミング・インターフェースを表します.

現在,仮想通貨プラットフォームには,REST と Websocket の2つの主要なインターフェースプロトコルがあります.REST プロトコルがデータを取得するたびに,一度アクセスする必要があります.例として,シミュレーションプラットフォームの API Wex.app を取りましょう.ブラウザで直接 [リンク] (https://api.wex.app/api/v1/public/ticker?market=BTC_USDT) を開いて,以下の結果を得ることができます:

{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}

この方法により,取引対BTC_USDTの最新の市場コートをフォローする取引は,リフレッシュするたびに変更される. market="は,他の取引対データを入手するために変更できる特定の取引対パラメータが続く. 市場コートなどの公開インターフェースでは,誰もがそれらを入手できるため,検証は必要ありません. しかし,一部のインターフェイスは,注文をしたりアカウントを取得するときにユーザーの身元を特定する必要があります. この場合,署名するにはAPI-KEYが必要です. Websocketは購読モードです. 購読する必要があるコンテンツを送信した後,プラットフォームは更新されたデータをプログラムに送信し,毎回再確認する必要はありません. そのため,より効率的です.

FMZ Quant取引プラットフォームは,すべてのプラットフォームの REST インターフェースをカプセル化し,呼び出す統一方法と統一データフォーマットを使用し,戦略書き方をよりシンプルで一般的なものにします. Websocket は FMZ プラットフォームで簡単にサポートできます.次のチュートリアルで詳細に紹介されます.

異なるプログラミング言語

FMZプラットフォームAPI文書のほとんどの部分はJavaScriptを例として使用しているが,エンカプスレーションにより,異なる言語の間の差はほとんどなく,文法の問題にのみ注意を払う必要がある. C++"は少し特別で,将来のチュートリアルには専門的な紹介が用意されている. Jsは比較的シンプルで互換性に関する問題がないため,初心者の使用が推奨されている. FMZ Quantプラットフォームは完全な Pythonをサポートし,さまざまなパッケージを自由にインストールできる. プログラミング基礎を持っているユーザーに推奨されている. プログラミング言語を学びたいのではなく,戦略を書きたいと思っているユーザーには,FMZ Platformは Webstock 言語と基本的には互換性のあるMylanguage もサポートしており,関連する経験を持つ方には推奨されている. Webstock のデメリットとしては,強力なプログラミング言語と類似した柔軟なプログラミング言語がない. FMZ プログラミング言語と類似したプログラミング言語の構築も推奨されている. 視覚的なプログラミング言語や戦略を学ぶには,ほとんど努力する必要はないが,実行する戦略も推奨されている.

Pythonには異なるバージョンがあるため,プログラム開始時に指定することができます.#!Python2そして#!Python3. JavaScript が最近 ES6 の構文をアップグレードしたことに注意してください.興味のある人は,そのことを学ぶことができます. 同じ機能を持つ Python と Javascript のコードは下記に示されています. 構文の違いだけがあることが見られますので,API 文書は Javascript の例のみを示しており,このチュートリアルでは Python の特殊な用例も考慮されます.

#python code
def main():
    while True:
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
#the corresponding Js code
function main(){
    while(true){
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
    }
}

資源に関する勧告

  • このチュートリアルでは,FMZプラットフォームのAPIドキュメントの各インターフェイスについて詳細な紹介はしません.この記事より詳細に.
  • FMZで注文をしたい場合は,この記事.
  • 簡単な戦略を書くには,複雑な文法が必要ではなく,いくつかの基本的な概念が必要です. プログラミングを学ぶ間,チュートリアルを勉強することができます (https://www.fmz.com/bbs-topic/9123, https://www.fmz.com/bbs-topic/9124).
  • ミル言語文書傾向戦略にはまだ非常に便利です.
  • C++ の呼び出し例です. C++ に興味がある人は見てみてください. C++ は解釈言語ではないので,デバッグは非常に難しいので,例として推奨されません.
  • 公式にFMZが制作したNetEase Cloud Classroomの 仮想通貨量的な取引コースは わずか20元で シンプルから深いまで 詳細な内容が豊富で 初心者向けに適しています!コースリンク
  • これは教え方基礎を勉強している間に 戦略を書くこともできます
  • 戦略のソースコードの詳細な説明:リンク.

デバッグツール

FMZ Quant プラットフォームはデバッグツールAPIインターフェースのデバッグのために. デバッグツールはJavaScriptのみをサポートし,一定の期間のみ実行できます. プラットフォームインターフェースはボットを作成せずにデバッグできます. 結果として返信データが返されます. デバッグツールのコードは保存されません. このチュートリアルを通して作業するにつれて,同時にデバッグツールを実験することができます.img

戦略プログラム枠

戦略プログラムは,コード命令で実行される通常のプログラムと同じです.特異な部分は,メイン機能が必要であることです. 戦略が中断なく実行される必要があるため,通常はループプラス睡眠時間が必要です. プラットフォームAPIのアクセス頻度は限られているため,睡眠時間がそれに応じて調整する必要があります. このフレームワークは固定間隔で典型的な実行であり,イベント駆動戦略を書くためにWebソケットも使用できます. たとえば,深さが変化する限り即時実行,これは高度なチュートリアルで紹介されます.

特殊アクションを伴う他の機能は以下のとおりです.

  • onexit() は正常の終了時の関数で,最大実行時間は5分であり,指定できない場合もあります.時間が切れた場合,中断エラーが報告されます.
  • onerror() は異常な出力関数で,最大実行時間は5分であり,指定されない場合もあります.
  • initは初期化関数であり,実行開始時に戦略プログラムが自動的に呼び出されます.指定できないこともあります.
function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
    while(true){
        onTick()
        Sleep(6000)
    }
}

前例では,ネットワークアクセスにエラーが発生した場合,戦略は直接停止する可能性があります.自動再起動に類似した戦略を希望し,停止しない場合は,ボット戦略で"try catch fault-tolerant main loop"を使用できます (バックテストのために"try"を使用しないでください).もちろん,これは戦略が安定している場合にのみ推奨されます.そうでなければ,すべてのエラーが報告されませんので,戦略の欠陥を見つけることが困難になります.

function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
    try{
        while(true){
           onTick()
           Sleep(6000)
       }
    }catch(err){
        Log(err)
    }
}

プラットフォーム API 紹介

セットプラットフォームと取引ペア

プラットフォームに関連した API を呼び出すとき,プラットフォームと取引ペアを指定する必要があります. ボットを作成するときに1つのプラットフォーム取引ペアが追加された場合,exchangeこのオブジェクトを表現します.例えば,exchange.GetTicker()この"取引対"の市場値です.

FMZ Quantプラットフォームは,複数の 交換取引ペアオブジェクトを同時に追加することをサポートします.例えば,同じプラットフォームアカウントの BTC と ETH を同時に操作できます.または,同じプラットフォームの BTC と ETH を同時に操作できます.同じプラットフォーム上の異なるアカウントも同時に追加でき,FMZ ウェブサイトに追加されたラベルに従って区別されます.複数の 交換取引ペアオブジェクトがある場合,exchanges代表する配列,すなわちexchanges[0]そしてexchanges[1]取引ペアの形式で,例えば,この2つの対を組み合わせると,BTC_USDTBTCは取引通貨で,USDTは報名通貨です.

img

この状況では, SetCurrency を使って取引ペアを切り替えることができます.exchange.SetCurrency("BTC_USDT")取引相手は,exchangeとなるBTC_USDT取引相手を変更する次のコールまで有効です.バックテストは最近取引ペアを切り替えるのをサポートしていることに注意してください.具体例は以下です.

var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
  for(var i=0;i<symbols.length;i++){
      exchange.SetCurrency(symbols[i])
      var ticker = exchange.GetTicker()
      var amount = _N(buyValue/ticker.Sell, 3)
      exchange.Buy(ticker.Sell, amount)
      Sleep(1000)
  }
}

パブリックインターフェースを取得

前例で述べたように,市場インターフェースは一般に公開されたインターフェースであり,誰でもアクセスできます.一般的な市場インターフェイスは:GetTicker,GetDepth,GetRecords,GetTradesです.市場コートは,取引判断を行う戦略の基礎です.後で,それらを一つずつ紹介します. 詳細な説明が必要な場合は,API文書で確認できます.

インターフェースは,通常,Infoプラットフォームが返した元のデータ文字列を表すフィールドで,追加の情報を補完するために使用できます.使用前に解析する必要があります. JavaScript はJSON.parse()Python は json ライブラリを使っています.Time遅延を判断するために使用できる要求のタイムスタンプを表示します.

ボット内のAPIを使用すると,アクセスが失敗して戻る可能性があります.nullPython が返します.None. この時点で,使用中のデータはエラーを報告し,ボットが停止する原因になります.故障耐性は非常に重要です. このチュートリアルでは故障耐性を特別に紹介します.

GetTicker をインストールする

GetTickerは,おそらく最も一般的に使用されるインターフェースである.最後に実行された価格,buy1価格,sell1価格,および最新の取引量を見つけることができます.注文を出す前に,実行された価格は,ティカー情報に基づいて決定できます.ボット返信の例:{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}.

function main() {
    var ticker = exchange.GetTicker()
    Log(ticker) //return ticker in the debugging tool, and you can see the specific result
    Log('Last time executed price:',ticker.Last, 'Buy1 price:', ticker.Buy)
}

GetDepth を取得する

GetDepthは,待機中の注文の詳細情報を入手する.GetTickerには1購入と1販売価格が含まれているが,より深い待機注文をクエリしたい場合は,このインターフェースを使用して,一般的に200件の待機注文をチェックしたりダウンしたりすることができます.このインターフェースを使用してショック価格を計算できます.下記は実際の返金結果です.そのうちのAsksは待機中の販売注文を表し,配列はSell1,Sell2...したがって価格も順番に上昇します.Bidsは待機中の購入注文を表し,配列はbuy1,buy2です...価格が順番に下がります.

{
    "Info":null,
    "Asks":[
        {"Price":5866.38,"Amount":0.068644},
        {"Price":5866.39,"Amount":0.263985},
        ......
        ]
    "Bids":[
        {"Price":5865.13,"Amount":0.001898},
        {"Price":5865,"Amount":0.085575},
        ......
        ],
    "Time":1530241857399
}

Ask & Bids に GetDepth を使う例:

function main() {
    var depth = exchange.GetDepth()
    Log('Buy 1 price:', depth.Bids[0].Price, 'Sell 1 price:', depth.Asks[0].Price)
}

GetRecords を取得する

GetRecordsは,最も一般的に使用されるインターフェースの1つであり,さまざまな指標の計算の基礎となる長期間で価格情報を返すことができます.Kライン期間が指定されていない場合は,ボットを追加するときにデフォルト期間を使用することを意味します.Kラインの長さは指定できません.最大数は2000であり,最初のコールでは約200です (異なるプラットフォームは異なる番号を返します).最後のKラインは最新のKラインです.したがって,市場価格が変化するにつれてデータが変化します.最初のKラインは最も古いデータです.

exchange.SetMaxBarLen(Len)初めてのKライン数 (一部のプラットフォームでサポートされる) を設定し,最大Kライン数を設定できます.例えば:exchange.SetMaxBarLen(500).

GetRecords は PERIOD_M1: 1分, PERIOD_M5: 5分, PERIOD_M15: 15分, PERIOD_M30: 30分, PERIOD_H1: 1時間, PERIOD_D1: 1日などの期間を指定することができます. 特定の使用はexchange.GetRecords(PERIOD_M1). 最新のドッカーをアップグレードした後,周期のカスタマイズをサポートし,パラメータとして周期の第2桁を通過します. 1分間のK線,1分未満のK線をGetTradesで合成し,コモディティ・フューチャーズをTickで合成します.記入されているのは,PERIOD_M1FMZのデフォルトのグローバル変数です.興味がある場合は,その特定の値を自分でログインして,通常の方法で直接使用できます..

返却データ例:

[
    {"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
    {"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
    {"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
    ......
]

繰り返されたK線の例:

function main(){
    var close = []
    var records = exchange.GetRecords(PERIOD_H1)
    Log('total bars: ', records.length)
    for(var i=0;i<records.length;i++){
        close.push(records[i].Close)
    }
    return close
}

GetTrades は

GetTrades は,特定の時間帯 (あなた自身の取引データではなく) 内で取引データを取得します.これは一部のプラットフォームではサポートされていません.一般的に使用されていません. API ドキュメントの詳細な紹介を確認できます.

取引するアカウントを取得

これらのインターフェースはアカウントに関連しているため,直接取得することはできません.それらを取得するには,API-KEYを使用してサインする必要があります.FMZプラットフォームの統一された自動バックグラウンド処理の後,直接使用できます.

アカウントを取得

GetAccount は,アカウント情報を取得する.最も一般的に使用されるインターフェースの1つであるため,注文を出す前に呼び出す必要があります.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}Stocksは取引対の取引通貨の利用可能な残高,FrozenStocksは実行されていない注文の凍結された残高,Balanceは引換通貨の利用可能な金額,そしてFrozenBalanceは凍結した残高である.BTC_USDTStocksはBTC,BalanceはUSDTを指します.

返済結果は指定された取引ペアの結果であり,取引口座の他の通貨の情報は"情報"フィールドにありますので,複数の取引ペアを実行するときに複数回呼び出す必要はありません.

このボットは,現在の取引ペアの総値を常に印刷します.

function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var account = exchange.GetAccount()
        var price = ticker.Buy
        var stocks = account.Stocks + account.FrozenStocks
        var balance = account.Balance + account.FrozenBalance
        var value = stocks*price + balance
        Log('Account value is: ', value)
        LogProfit(value)
        Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
        //when run in debug tool, add a break here
    }
}

購入命令

呼び出す方法には,exchange.Buy(Price, Amount)そしてexchange.Buy(Price, Amount, Msg),この方法では,価格を表示し,金額を表示し,Msg はボットログに表示できる追加文字列で,必要ではありません.これらの方法は待機中の注文です.注文が直ちに完全に実行できない場合は,未完了の注文が生成されます.注文が成功した場合,注文IDが返されます.null注文が失敗した場合に返されます. 注文の状態をクエリするために使用されます.

市場価格で購入注文をしたい場合, 価格は-1で, 金額は注文の値です. 例えば,exchange.Buy(-1, 0.5)取引相手がETH_BTC市場価格で0.5BTCのETHを購入することを意味します.一部のプラットフォームは市場オーダーもバックテストもサポートしません.

価格と金額の精度要求があり,精度機能で制御できます._N()フューチャー取引では,には別の意味があり,これは特別に紹介されます.

価格に達すると購入する例:

function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var price = ticker.Sell
        if(price >= 7000){
            exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
            break
        }
        Sleep(3000)//Sleep 3000ms
    }
    Log('done')
}

販売命令

売り注文.パラメータはBuyと同じです.市場注文のパラメータには異なる意味があります.exchange.Sell(-1, 0.2)0.2ETHを市場価格で販売する

GetOrder を取得する

この共通インターフェースがメソッドを呼び出すとき,このメソッドは,このメソッドを呼び出すときに,このメソッドは,このメソッドを呼び出すとき,このメソッドは,このメソッドを呼び出すとき,このメソッドは,このメソッドを呼び出すとき,このメソッドは,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドは,このメソッドを呼び出す.exchange.GetOrder(OrderId)命令の文字列は,命令の文字列が表示されているように表示されます.Type注文の実際の価値StatusFMZ は,これらの値を表現するためにグローバル定数を使用します.例えば,Status完了していない注文の値は0で,ORDER_STATE_PENDING. このドキュメントで確認できます.... 返した結果:

{
    "Id":125723661, //Order id
    "Amount":0.01, //Order ammount 
    "Price":7000, //Order price 
    "DealAmount":0, //Executed amount 
    "AvgPrice":0, //executed average price
    "Status":0, //0: not completely executed; 1: executed; 2: canceled 
    "Type":1,//Order type; 0: buy order; 1: sell order 
    "ContractType":"",//contract type, used in futures trading
    "Info":{} //the platform returns the raw information
    }
}

特定の金額の通貨を購入する戦略:

function main(){
    while(true){
        var amount = exchange.GetAccount().Stocks
        var ticker = exchange.GetTicker()
        var id = null
        if(5-amount>0.01){
            id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
        }else{
            Log('Job completed')
            return //return the main function, bot will stop
        }
        Sleep(3000) //Sleep 3000ms
        if(id){
            var status = exchange.GetOrder(id).Status
            if(status == 0){ //Here you can aslo use "status == ORDER_STATE_PENDING" to judge 
                exchange.CancelOrder(id)
            }
        }
    }
}

GetOrders を取得する

GetOrderは,現在の取引ペアの未完了注文のリストを取得します.未完了注文がない場合は,空の配列を返します. GetOrderなどの注文リストの特定の結果.

現在の取引ペアのすべてのオーダーをキャンセルする例:

function CancelAll(){
    var orders = exchange.GetOrders()
    for(var i=0;i<orders.length;i++){
        exchange.CancelOrder(orders[i].Id) // cancel order by orderID
    }
}
function main(){
    CancelAll()
    while(true){
        //do something
        Sleep(10000)
    }
}

キャンセル

注文番号によると,注文をキャンセルします.exchange.CancelOrder(OrderId). キャンセルが成功した場合,返信する true; そうでなければ返信する false.

フューチャーと永続契約

仮想通貨の先物取引はスポット取引とは異なります.先物取引の上記の機能は先物取引にも適用され,単一の先物取引には独自の機能があります.仮想通貨先物取引のプログラム取引を行う前に,ウェブサイト上の手動操作に精通し,オープン,閉鎖,クロス,孤立,レバレッジ,接近利益と損失,浮動収入,マーージンなどの基本概念,それに対応する計算式を理解する必要があります.対応するチュートリアルはさまざまな先物プラットフォームで見つけることができます.そして,それらを自分で学ぶ必要があります.

永続契約は先物契約に似ているが,違いは,長期と短期を同時に保有するという概念がないことだ.

プラットフォームがOKEXやHuobiのフューチャーやスポットの両方をサポートしている場合,これらのフューチャープラットフォームはFMZのスポットプラットフォームとは異なるプラットフォームとみなされるため,プラットフォームインターフェースで別々にOKEXフューチャーHuobiフューチャーを選択する必要があります.

SetContractType について

フューチャー取引の第一歩は,取引される契約を設定することです.OKEXフューチャーを例に挙げると,ボットまたはバックテストを作成するときにBTC取引ペアを選択し,また,コードに週,来週または四半期契約を設定する必要があります.設定されていない場合は,プロンプトになります.invalid contract type. スポット取引ペアとは異なり,先物契約はしばしばBTCなどの取引通貨をマージンとして使用する.取引ペアにBTCを追加することは,通常,BTCをマージンとして使用するBTC_USD取引ペアを表す.USDTをマージンとして使用する先物契約がある場合,BTC_USDTの取引ペアを追加するためにボットを作成する必要があります.例えば,Binance OKEX Futuresのような永久契約は,暗号とUSDTの両方のマージン合約を有する.取引ペアを設定した後,永久,週,来週,など,特定の契約タイプを設定する必要があります. 契約を設定した後,市場 cotization,購入,販売などの操作を実行することができます.

Binance,OKEX,HuobiDMなどには,暗号保証契約とUSDT保証契約の両方があり,ボットを追加し契約を設定する際に区別する必要があります.具体的な設定は以下のとおりです:

//OKEX Futures
exchange.SetContractType("swap")        // set to perpetual contract
exchange.SetContractType("this_week")   // set to weekly contract 
exchange.SetContractType("next_week")   // set to next week contract 
exchange.SetContractType("quarter")     // set to quarterly contract

//HuobiDM
exchange.SetContractType("this_week")   // set to weekly contract 
exchange.SetContractType("next_week")   // set to next week contract
exchange.SetContractType("quarter")     // set to quarterly contract 
exchange.SetContractType("swap")        // set to perpetual contract

//Binance Futures
exchange.SetContractType("swap")   // set to perpetual contract, and notice that crypto-margined and USDT-margined contracts are all in the perpetual contract
exchange.SetContractType("quarter")   // set to quarterly contract
exchange.SetContractType("next_quarter")  // set to next quarter contract

//BitMEX
exchange.SetContractType("XBTUSD")    // set to perpetual contract
exchange.SetContractType("XBTM19")  // the contract settled at a specific time; for more details, please log in BitMEX to check each contract code

//GateIO
exchange.SetContractType("swap")      // set to perpetual contract, and do not set the default as swap perpetual contract 
//Deribit
exchange.SetContractType("BTC-27APR18")  // the contract settled at a specific time; for more details, please log in Deribit to check out 

位置を取得

現在のポジション情報リストを取得するには,OKEX (OKCOIN) フューチャーズは,取得する契約の種類を指定するパラメータを通過することができます. 空のリストを返します[]ポジションが存在しない場合.ポジション情報は次のように返されます.多くの特定の情報があり,取引ペアと組み合わせて分析する必要があります.

データタイプ 変数名 記述
オブジェクト インフォ プラットフォームが返した原始構造
番号 マージンレベル OKCoinは10か20で,OK先物との交差は10 (固定) を返します.
番号 総額 ポジション額 OKCoin は契約金額を表示する (整数1より大きい)
番号 凍結した量 凍結されたポジション額
番号 価格 ポジション平均価格
番号 マージン 凍結された限界
番号 利益 コモディティ・フューチャーズ: ポジションの利益と損失を市場にマークする; 仮想通貨: 仮想通貨単位: BTC/LTC,伝統的なフューチャーズ単位: RMB (注:OKCoinフューチャーズのクロスポジションの場合,ポジションの利益と損失ではなく,実現した利益と損失を指します. 孤立したポジションでは,ポジションの利益と損失を指します.)
コスト タイプ PD_LONG はロングポジション (CTP はポジションを閉じるのに closebuy_todayを使用する); PD_SHORT はショートポジション (CTP はポジションを閉じるのに closesell_todayを使用する); CTP フューチャーでは PD_LONG_YD は昨日のロングポジション (ポジションを閉じるのに closebuyを使用する); PD_SHORT_YD は昨日のショートポジション (ポジションを閉じるのに closesellを使用する)
文字列 契約型 コモディティ・フューチャーズは契約コードで,ストックは プラットフォームコード_ストックコードです. SetContractTypeの特定のパラメータのパスされたタイプ
function main(){
    exchange.SetContractType("this_week");
    var position = exchange.GetPosition();
    if(position.length>0){ //especially pay attention to judging the length of position before call, or an error will occur
        Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
            position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
    }
}

フューチャー オープン&クローズ ポジション

まず,レバレッジのサイズを設定する必要があります.呼び出す方法:exchange.SetMarginLevel(10)10はレバレッジの10倍を意味し,特定のサポートされたレバレッジサイズは対応するプラットフォームで確認できます.リーバージーはプラットフォームで設定され,コードはプラットフォームで設定された設定と一致している必要があります.そうでなければエラーが発生します.デフォルトのレバレッジを使用できます. 次に,取引方向を設定します.呼び出し方法:exchange.SetDirection(Direction)オープン・クローズ・ポジションに対応する.長期契約とは異なり,永久契約は,同時に長と短の概念を持っていない場合,つまり,単一のポジションは許されない.あなたが長いポジションで短いオープン操作するとき,長いポジションは自動的に閉鎖されるので,あなたはただ設定する必要がありますbuyそしてsell2つの方向の位置をサポートする場合は,設定する必要がありますclosebuy, closesell.特定の関係

オペレーション SetDirection パラメーター 秩序 を 設定 する 機能
オープン・ロング・ポジション 交換.セットディレクション ((買い) 交換する.買える.
ロングポジションを閉じる 交換.セットディレクション ((closebuy) 交換する.売る.
オープンショートポジション 交換.セットディレクション ((売る) 交換する.売る.
ショートポジションを閉じる 交換.セットディレクション ((closesell) 交換する.買える.

最後に,オープン・クローズ・ポジションの特定のコードがあります.配置されたオーダーの量はプラットフォームによって異なります.例えば,フウビ・フューチャーズは契約量の数に基づいており,1つの契約は100米ドルです.先物バックテストは市場オーダーをサポートしていないことに注意してください.

function main(){
    exchange.SetContractType("this_week")    // for example, set OKEX futures to weekly contract 
    price = exchange.GetTicker().Last
    exchange.SetMarginLevel(10) // set to 10 times of leverage  
    exchange.SetDirection("buy") // set the order type as buy long 
    exchange.Buy(price+10, 20) // set contract quantity as 20 orders
    pos = exchange.GetPosition()
    Log(pos)
    Log(exchange.GetOrders()) // check out if there is any unfinished order 
    exchange.SetDirection("closebuy"); // if it is a perpetual contract, directly set exchange.SetDirection("sell")
    exchange.Sell(price-10, 20)
}

完全閉店の具体的な戦略例を以下のように示してください.

function main(){
    while(true){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){
            Log('not able to obtain ticker')
            return
        }
        if(!pos || pos.length == 0 ){
            Log('no position')
            return
        }
        for(var i=0;i<pos.length;i++){
            if(pos[i].Type == PD_LONG){
                exchange.SetContractType(pos[i].ContractType)
                exchange.SetDirection('closebuy')
                exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
            }
            if(pos[i].Type == PD_SHORT){
                exchange.SetContractType(pos[i].ContractType)
                exchange.SetDirection('closesell')
                exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
            }
        }
        var orders = exchange.Getorders()
        Sleep(500)
        for(var j=0;j<orders.length;j++){
            if(orders[i].Status == ORDER_STATE_PENDING){
                exchange.CancelOrder(orders[i].Id)
            }
        }
    }
}

暗号通貨のレバレッジ取引

暗号通貨のレバレッジ取引は コード内のレバレッジアカウントに切り替わなければなりません 他の部分はスポット取引と同じです

使用exchange.IO("trade_margin") はレバレッジアカウントモードに切り替える.オーダーとアカウント資産の取得は,レバレッジプラットフォームのインターフェイスにアクセスします. 使用exchange.IO("trade_normal") は通常のアカウントモードに戻る.

サポートされているプラットフォーム:

  • OKEX V3:レバレッジアカウントモードの取引ペアは通常の取引ペアとは異なります.一部の取引ペアは存在しない場合があります.
  • Huobi:レバレッジアカウントモードの取引ペアは通常のペアとは異なります.一部の取引ペアは存在しない可能性があります.
  • ZB:資産はQCでのみ転送できます.レバレッジ取引部門では,異なる取引ペアの間の資産は独立しています.つまり,ETH_QC取引ペアの下のQCコインの数はBTC_QCでは表示されません.
  • FCoin
  • バイナンス

商品先物取引

商品先物取引と仮想通貨先物取引はかなり異なります.まず,商品先物取引の取引時間は非常に短く,しかし仮想通貨は24時間取引されます.商品先物取引のプロトコルは一般的に使用されるREST APIではありません.商品先物取引の取引頻度と待機注文額は制限されていますが,仮想通貨先物取引は非常に緩いです.したがって,商品先物取引の際には特に注意を払う必要があるポイントがたくさんあり,手動操作の豊富な経験を持つ方にお勧めです.FMZは現在商品先物シミュレーションボットをサポートしており,以下を参照することができます:https://www.fmz.com/bbs-topic/325商品先物企業を追加するには:https://www.fmz.com/bbs-topic/371

商品先物取引は2019年6月に透明性監視を実施した.個々のプログラムでは,個々のユーザーは先物取引業者向け認証コードを申請するためにアカウントを開設する必要があります (特定のアプリケーション情報テンプレートはWeChatグループまたはQQグループに送ることができます),通常4〜5日かかります.手順はかなり複雑です.プログラム取引プロバイダーとして,FMZプラットフォームは,さまざまな先物取引サービスプロバイダからソフトウェア認証コードを申請しています.ユーザーは申請せずに直接使用できます.先物取引業者を追加するときに,FMZが申請したリストを見るためにquantを検索してください.特定の参照ポスト:https://www.fmz.com/bbs-topic/3860. あなたの先物ブローカーがリストに載っていない場合は,自分で申請するか,サポートされているブローカーの新しいアカウントを開設するだけで,通常2日かかります. FMZは一部のサービスプロバイダーと深い協力関係を築いています.例えば,Guotai Junan Hongyuan Futuresは,FMZプラットフォームの機関版を購入し,ユーザーが使用できます.アカウントを開設すると自動的にVIPになります.サービス料金は最小化されます.アカウント開設参照:https://www.fmz.com/bbs-topic/506.

FMZ Quantプラットフォームの構造の利点により,ユーザーは複数の先物取引業者アカウントを追加し,他の商品先物取引プログラムソフトウェアが完了できないいくつかの機能を実装することができます.https://www.fmz.com/bbs-topic/1184

戦略の枠組み

まず,24時間取引ではなくログイン操作が必要なので,取引前にリンクの状態を判断する必要があります.exchange.IO("status")true, プラットフォームへの接続が成功することを示します. ログインが成功しないときにAPIが呼び出された場合, ログインしないは提示されません. 戦略が開始された後, Sleep (2000) を追加して, ログインする一定の時間を与えることができます. また, 登録を再試すこともできます._C(exchange.SetContractType,"MA888")成功したログインを保証します.

商品先物取引の市場配当取得と取引コードは,仮想通貨先物取引と同じである.ここで,注意を払う必要がある違いとポイントを紹介する.

function main(){
    _C(exchange.SetContractType,"MA888") //If you do not log in successfully, you cannot subscribe to the contract, so better to try again
    while(true){
        if(exchange.IO("status")){
            var ticker = exchange.GetTicker()
            Log("MA888 ticker:", ticker)
            LogStatus(_D(), "Already connected with CTP !")//_D obtain event
        } else {
            LogStatus(_D(), "Not connected with CTP !")
            Sleep(1000)
        }
    }
}

商品先物ライブラリ (後で説明される) を利用することが推奨されます.この時点でコードは非常にシンプルで,退屈な詳細に対処する必要はありません. ソースコードコピーアドレス:https://www.fmz.com/strategy/57029

function main() {
    // Use the CTA strategy framework of commodity futures library 
    $.CTA(Symbols, function(st) {
        var r = st.records
        var mp = st.position.amount
        var symbol = st.symbol
        /*
        "r" represents K-line, "mp" indicates the position amount of the current variety; positive number means long position, negative number means short position, and 0 means no position; "symbol" is the variety name
        if the return value is n: 
            n = 0 : full close positions (no matter now they are long or short)
            n > 0 : if right now long positions are held, add n long positions; if now they are short positions, close n short posiitons; if n is over the position amount right now, reverse to open long positions 
            n < 0 : if right now short positions are held, add n short positions; if now they are long positions, close n long posiitons; if -n is over the position amount right now, reverse to open short positions 
        */
        if (r.length < SlowPeriod) {
            return
        }
        var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
        if (mp <= 0 && cross > ConfirmPeriod) {
            Log(symbol, "Golden Cross Period", cross, "the moment position", mp);
            return Lots * (mp < 0 ? 2 : 1)
        } else if (mp >= 0 && cross < -ConfirmPeriod) {
            Log(symbol, "Death Cross Period", cross, "the moment position", mp);
            return -Lots * (mp > 0 ? 2 : 1)
        }
    });
}

CTP データを取得する方法

商品先物取引はCTPプロトコルを使用し,すべての市場報價とオーダー執行は変更後にのみ通知されるが,注文,アカウント,ポジションに関するクエリはアクティブクエリである.したがって,イベント主導の高周波戦略を書くのに適している.GetTicker, GetDepthそしてGetRecords,すべてのデータは最新のデータを入手するためにキャッシュされている必要があります.データがない場合は,データが戻るまで待つため,戦略はSleepを使用する必要はありません.市場価格の変更があるとき,ティッカー,深さ,レコードが更新されます.この時点で,これらのインターフェースのいずれかを呼び出すことはすぐに戻り,呼び出されたインターフェースの状態はupdateモードに設定されます.次回同じインターフェースが呼び出されるときは,新しいデータが戻るまで待つでしょう.一部の不人気の契約または価格制限は長い間取引がなくなり,戦略が長い間滞留していることを意味します.

古いデータであっても,あなたは市場のコートの即時更新モードに切り替えることができます.exchange.IO("mode", 0). この時点で,戦略はイベント駆動で記述することはできません. 急速な無限ループを避けるために,SLeepイベントを追加する必要があります. いくつかの不頻繁な戦略はこのモードを使用することができ,戦略デザインは簡単です.exchange.IO("mode", 1)デフォルトキャッシュモードに戻る

単一のコントラクトを実行するときは,デフォルトモードを使用します. ただし,複数のコントラクトがある場合,コントラクトの1つがマーケットのコートを更新しない可能性があり,その結果,マーケットのコートを入手するためのインターフェースブロックになり,他のコントラクトのコートを更新することもできません.この問題を解決するために,即時更新モードを使用できますが,高周波戦略を書くのは不便です.この時点で,オーダーとコートをプッシュするためにイベントプッシュモードを使用できます.設定方法は,exchange.IO("wait")商品先物では稀です. 商品先物では,exchange.IO("wait_any")返された Index は返されたプラットフォームインデックスを示します.

市場の変化を推し進める:{Event:"tick", Index: platform index (in the order of the platforms added in the bot), Nano: event of nanosecond-level time, Symbol: contract name}オーダープッシュ:{Event:"order", Index:Exchange index, Nano:Event of nanosecond-level time, Order:Order information (same as GetOrder)}

この時点で戦略構造は次のように書ける.

function on_tick(symbol){
    Log("symbol update")
    exchange.SetContractType(symbol)
    Log(exchange.GetTicker())
}

function on_order(order){
    Log("order update", order)
}

function main(){
    while(true){
        if(exchange.IO("status")){ //Judge the link status 
            exchange.IO("mode", 0)
            _C(exchange.SetContractType, "MA888")//Subscribe to MA; only the subscription request for the first time is ture, and the later ones are program switches, which do not consume time
            _C(exchange.SetContractType, "rb888")//Subscribe to rb
            while(true){
                var e = exchange.IO("wait")
                if(e){
                    if(e.event == "tick"){
                        on_tick(e.Symbol)
                    }else if(e.event == "order"){
                        on_order(e.Order)
                    }
                }
           }
        }else{
            Sleep(10*1000)
        }
    }
}

商品先物と仮想通貨の違い

また,商品先物と仮想通貨プラットフォームの違いにも注意してください.例えば,GetDepthは実際には1つの深度レベルしか持っていません (深度レベルは高価です),GetTradesは取引履歴を取得することはできません (すべてはポジション変化に基づいてシミュレートされ,実際の取引記録はありません).商品先物には価格制限メカニズムがあります.制限値が上がると,販売する深度販売オーダーの価格が制限価格であり,注文量は0です.制限値が下がると,購入する購入オーダーの価格が制限価格であり,注文量は0です.また,口座,注文,ポジションを取得などの商品先物クエリインターフェースの頻度は,一般的に2秒ごとに厳格に制限されています.商品先物には,注文の額やキャンセルにも制限があります.

セット契約

exchange.IO("instruments"): プラットフォーム上のすべての契約のリストを辞書形式で返し,ボットのみをサポートします.exchange.IO("products"): プラットフォーム上のすべての項目のリストを辞書形式で返します.ボットのみをサポートします.exchange.IO('subscribed'): プラットフォーム上のサブスクリプトされた市場コートを辞書形式で返却し,ボットのみをサポートします.

についてContractTypeCTPの先物とは,大小・小小字に敏感な契約のIDを指します.exchange.SetContractType("au1506"). 契約が成功して設定された後,最低購入金額,サービス料金,配達時間など,契約の詳細な情報を返します.複数の契約に購読する場合,購読要求が実際に送信されるのは初めてであり,その後,取引ペアはコードレベルで切り替わります.時間がかかりません.主な連続契約は,MA888のようなコード888です.連続レート契約は,MA000のような000です.888と000は,バックテストのみをサポートする仮想契約取引であり,実際のボットは,市場報じのみをサポートします.しかし,Mylanguageはメイン契約を操作することができ,プログラムは自動的にポジションを変更します. つまり,非メインポジションを閉鎖し,メインポジションの新しいポジションを開きます.

失敗したログインは契約を設定することはできませんが,すぐに戻りますので,CTPログインが完了したことを知るために,再び_cで試してみることができます. 成功したログイン後,契約を設定するのに時間がかかりません.

オープン・ポジション・クローズ・ポジション

方向性SetDirection4つのパラメータを得ることができます.buy, closebuy, sell, closesell商品先物取引はclosebuy_todayそしてclosesell_today, 現在のポジションの閉鎖を表示します.デフォルトはclosebuy/ closesell,昨日のポジションの終了を表示する.上海先物取引所の種類は今日と昨日の終了に分かれ,サービス料に影響を与える可能性があるため,昨日のポジションの終了に優先順位を与える必要があります. CTPの伝統的な先物については,第2パラメータをそれぞれ投機,仲裁,ヘッジを意味する1または2または3として設定できます.設定されていない場合は,デフォルトは投機です.購入・販売,ポジション取得,オーダー取得,オーダーキャンセル,口座取得などの具体的な操作は,仮想通貨先物取引と同じであるため,前項を参照してください.

オペレーション SetDirection パラメーター 秩序 を 設定 する 機能
オープン・ロング・ポジション 交換.セットディレクション ((買い) 交換する.買える.
ロングポジションを閉じる 交換.セットディレクション ((closebuy) 交換する.売る.
オープンショートポジション 交換.セットディレクション ((売る) 交換する.売る.
ショートポジションを閉じる 交換.セットディレクション ((closesell) 交換する.買える.

次の例は,特定の閉店ポジション関数です.この例があまりにも単純であることを注意してください.また,取引時間内に,完全に満たされていない場合,待機中のオーダーを再試す方法,最大オーダーボリューム,頻度があまりにも高く,スライディング価格か市場価格,などであるかどうかを考慮する必要があります.参照のためにのみ,これは,実際のボットでポジションを開設・閉じるための提案されたプラットフォームのライブラリパッケージです.https://www.fmz.com/strategy/12961図書館のソースコードを勉強することも推奨されます.

function Cover(contractType, amount, slide) {
    for (var i = 0; i < positions.length; i++) {
        if (positions[i].ContractType != contractType) {
            continue;
        }
        var depth = _C(e.GetDepth);
        if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
            exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
            exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "Close today" : "Close yesterday", 'Bid', depth.Bids[0]);
        } else {
            exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
            exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "Close today" : "Close yesterday", 'Ask', depth.Asks[0]);
        }
    }
}

コモディティ・フューチャーズは,_に付加された後尾で指定されるカスタムオーダータイプ (ボットへのサポート,バックテストではない) をサポートします.例えば:

exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")

特殊後:

  • iocを即座に完了するか THOST_FTDC_TC_IOCをキャンセルするか
  • gfs はノード THOST_FTDC_TC_GFS で有効です
  • 日間に有効 gfd THOST_FTDC_TC_GFD
  • gtd は,指定された日前に有効です THOST_FTDC_TC_GTD
  • gtc はキャンセルされる前に有効です THOST_FTDC_TC_GTC
  • gfaはオークションのオファーで有効です THOST_FTDC_TC_GFA

エスニーインターフェース

デフォルトでは,コモディティ・フューチャーズ・ブローカーで開くインターフェースはすべてCTPインターフェイスである.必要に応じて,Esunnyインターフェイスで置き換えることができます. FMZのエンカプスル化により,呼び出し方法は同じです.違いは,アカウント,オーダー,ポジションはすべてプッシュモードにあるため,ドーカーはこれらのデータをローカルに保持し,実際に要求を行わずに対応するインターフェイスが呼び出されるとすぐに返します.

エスニープロトコル カスタムオーダータイプは:

  • gfd は日間に有効です TAPI_ORDER_TIMEINFORCE_GFD
  • gtc はキャンセルされる前に有効です TAPI_ORDER_TIMEINFORCE_GTC
  • gtd は指定された日前に有効です TAPI_ORDER_TIMEINFORCE_GTD
  • fak 部分的に実行され,残りのTAPI_ORDER_TIMEINFORCE_FAKをキャンセル
  • ioc は即座に実行するか,TAPI_ORDER_TIMEINFORCE_FAK をキャンセルするか
  • 完全に実行されていない場合は,すべてのTAPI_ORDER_TIMEINFORCE_FOKをキャンセルします.

一般的に使用されるグローバル関数

ログ - ログ & 微信プッシュ

ボットインターフェースでログをログインし,文字列の後ろに文字@を追加すると,メッセージはプッシュキューに入ります.Log('Push to WeChat@').

ログの色もカスタマイズできます.Log('this is a log in red font #ff0000'). #ff0000は RGB 色の十六進数で,すべてのログファイルがドッカーが位置するディレクトリ内のボットの SqLit データベースに格納されていることを示し,データベースソフトウェアでダウンロードして開くか,バックアップをコピーして復元するために使用できます (データベース名とボットIDは同じです).

ログプロフィット - 印刷利益

利益を記録し,ボットのインターフェースに利益曲線を描き,ボットを再起動した後も保持できます.呼び出し方法:LogProfit(1000). パラメータがLogProfit必ずしも利益ではないし,任意の数字で 自分で記入する必要があります.

LogStatus - 状態表示 (表を含む)

ログが保存され,継続的に更新されるので,ボット状態が表示のためにのみ情報を必要とする場合,保存のためにではなく,LogStatusパラメータはLogStatus文字列で表の情報を表現することもできます

本物のボット位置表示表の例:

var table = {type: 'table', title: 'position information', cols: ['Column1', 'Column2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}; 
LogStatus('`' + JSON.stringify(table) + '`'); // After serialization, JSON will be added the character "'" on both sides, which is regarded as a comlpex messag format (now supporting tables)
LogStatus('The first line information\n`' + JSON.stringify(table) + '`\nthe third line information'); // the table information can be displayed in multiple lines
LogStatus('`' + JSON.stringify([table, table]) + '`'); // Multiple tables are supported to be displayed at the same time, which will be displayed in one group by TAB  
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // Multiple tables are displayed up and down by arrangement 

眠れ

そのパラメータはミリ秒数ですSleep(1000)すべてのプラットフォームのアクセス頻度が限られているため,一般戦略では睡眠時間を無限ループに追加する必要があります.

_G

ロボットが再起動したら プログラムも再起動します_GJSON のシリアル化されたコンテンツを保存できます._Gこの関数はonexit()戦略を停止するたびに,必要な情報は自動的に保存されます. 格式化されたデータを保存したい場合は, _G 関数は適していませんが,


もっと