3
フォロー
1444
フォロワー

FMZ 定量プラットフォーム戦略作成の基本チュートリアル (必読)

作成日:: 2019-08-13 17:47:27, 更新日:: 2021-08-06 10:29:46
comments   33
hits   69033

[TOC] このチュートリアルには,APIの紹介,反省,グラフなどの策略編入に関する初等知識が含まれています.この基礎チュートリアルを学んだ後,ユーザーは基礎APIを使用し,安定したリールディスク戦略を書き出すことができるでしょう.このチュートリアルを学ぶ前に,まず学習する必要があります.FMZの発明者による量化プラットフォームの導入 。

古いチュートリアル:発明者 量化 (FMZ.COM) 策略 完全使用マニュアル 2.0 (チュートリアル)投稿のインデックスもたくさんありますので,ぜひ見てください.

戦略の準備書

APIについて

プログラム化された取引は,APIと取引所を介してプログラムで接続し,設計された意図に従って自動的に売買または他の機能を実現する.APIは,アプリケーションプログラミングインターフェースである.

現在,デジタル通貨取引所は主に2種類のインターフェースプロトコルを持っています:RESTとWebsocket。RESTプロトコルでは,データを取得するたびに,アクセスする必要があります。模擬取引所wex.appのAPIを例として,ブラウザで直接 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定量取引プラットフォームは,各取引所のRESTインタフェースをパッケージ化し,統一された呼び出し方法とデータフォーマットを使用し,策略の書き込みをより簡素で一般的にします.FMZプラットフォームではWebsocketを便利にサポートできます.次のチュートリアルで詳細に説明します.

プログラミング言語

FMZプラットフォームのAPI文書は,JavaScriptを例として使用しているが,パッケージ化により,異なる言語の差はほとんどないため,文法上の問題のみを注意する必要がある. C++は少し特殊で,後回のチュートリアルでは,専門的な紹介がある. Jsは比較的簡単で,互換性の問題がないため,初心者向けに推奨されている. FMZ定量化プラットフォームは,完全なPythonをサポートし,各種パッケージを自由にインストールでき,ある程度のプログラミング基礎を使用することを推奨している.

Pythonは,異なるバージョンがあるため,プログラム開始時に指定できます.#!Python2,#!Python3〔注意〕JavaScriptは最近ES6の文法にアップグレードされたので,興味のある方は参考にしてください.以下は,同じ機能を持つPythonとJavascriptのコードが示されているが,文法上の違いしか見られないので,APIドキュメントはJavascriptの例のみを示している.このチュートリアルでは,Pythonの特殊な用例も兼ねて行います.

#python代码
def main():
    while True:
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
#相应的Js代码
function main(){
    while(true){
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
    }
}

参考資料

デバッグツール

FMZ定量化プラットフォームは,APIインタフェースをデビューするためのデビューツールを提供しています. http://www.fmz.com/m/debug 。デビューツールはJavaScriptのみをサポートし,しばらく実行でき,リッスルを作成せずに取引所のインタフェースをデビューすることができます。返されたデータは結果として返され,デビューツールのコードは保存されません。この学習チュートリアルでは,デビューツールを同時に使用してテストすることができます。 FMZ 定量プラットフォーム戦略作成の基本チュートリアル (必読)

戦略プログラム構造

策略プログラムは,通常のプログラムと同様に,コード順序で実行されるが,特別な点は,main関数が必須であることである.策略は,不間断に実行される必要があるため,通常の場合,ループと休憩時間が必要である.取引のすべてのAPIへのアクセス頻度が制限されているため,それに対応した休憩時間が必要である.このアーキテクチャは,典型的な固定間隔の実行である.また,websocktを使用してイベント駆動型策略を記述することも可能である.例えば,深度が変化すれば即座に実行され,進捗チュートリアルで紹介される.

他の特殊な機能は以下のとおりである.

  • onexit ((() 正常に退出するクエスト処理の実行時間は最大5分で,その時間を超えるとinterruptエラーが表示されることが宣言されない.退出時に使用できる.
  • onerror ((() は例外として退出関数で,最長実行時間は5分であり,宣言しないことができます。
  • init (() は,初期化関数として,策略プログラムが実行開始時に自動的に呼び出されるが,宣言されない.
function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //在这里写策略逻辑,将会每6s调用一次
}
function main(){
    while(true){
        onTick()
        Sleep(6000)
    }
}

前述の例では,ネットワークアクセスエラーが策略の直接停止を引き起こす可能性がある場合,自動再起動が停止しないような策略を望む場合は,リールディスク策略をtry catch容認主ループで再使用できます (tryは使用しないでください). もちろん,策略が安定している場合にのみこのような操作を推奨します.そうでなければ,すべてのエラーが報告されず,策略の問題を排出しに困難になります.

function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //在这里写策略逻辑,将会每6s调用一次
}
function main(){
    try{
        while(true){
           onTick()
           Sleep(6000)
       }
    }catch(err){
        Log(err)
    }
}

エクスチェンジAPIについて

取引所と取引ペア設定

取引所と取引ペアを明確に指定する必要があります. 实体ディスクの作成時に取引所-取引ペアが1つだけ追加された場合,exchangeこのオブジェクトの代表として,exchange.GetTicker()この取引所から,取引先の取引状況のチーカーが取得されます.

FMZプラットフォームは,複数の取引所を同時に追加することをサポートしています.例えば,同じ取引所の口座で同時に操作できるBTCとETHは,同じ取引所のBTCと別の取引所のETHを同時に操作することもできます.同じ取引所の異なるアカウントも同時に追加でき,それらはFMZウェブサイトに追加されたラベルの区分に基づいて使用されます.exchanges列は,リールディスクの作成順序に従って,それぞれexchanges[0]exchanges[1]取引対の形式は以下の通りです.BTC_USDTBTCは取引通貨であり,USDTは計算通貨である.

FMZ 定量プラットフォーム戦略作成の基本チュートリアル (必読)

明らかに,この方法は,多くの取引ペアを操作する場合は面倒になります. 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)
  }
}

公開されたインターフェース

前述の例のように,行情インターフェースは一般的には公開インターフェースであり,誰もがアクセスできる.通常行情インターフェースには:行情tickerを取得,深度depthを取得,K線recordsを取得,取引記録tradesを取得する.行情は,戦略を判断するための基礎であり,以下で一挙に紹介する.デビューツールで自分で試してみることが最善である.詳細な説明はAPIドキュメントを参照してください.

インターフェースはInfoフィールドは,取引所が返した原始データ文字列を表し, JavaScript を使用して,以前に解析された必要のある追加の情報を補うことができます.JSON.parse()翻訳は,Pythonでjsonライブラリを使用しています.Timeこのフィールドは,遅延を判断するために,要求の時間軸を示します.

リアルディスクでAPIインターフェースを使用すると,アクセスが失敗して返却される可能性があります.null再びPythonに戻りました.None誤差を許容することは非常に重要です. このチュートリアルでは,誤差を別々に説明します.

GetTicker

市場の現在の動向を入手する,おそらく最もよく使用されるインターフェースで,最後の取引価格,買って売って価格,最近の取引量などの情報を調べることができる.再注文する前に,ticker情報に基づいて取引価格を決定することができる.{"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 。可以看到具体的结果。
    Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy)
}

GetDepth

ハンキングリストの深度情報を取得する。GetTickerには買って売って売るが含まれているが,より深いハンキングリストを検索する場合は,このインターフェースを使用して,一般的には次の200のハンキングリストを見ることができます。このインターフェースを使用して衝撃価格を計算することができます。以下は,実際の返却結果です。この中でAsksは,ハンキングリストを売り,数列はそれぞれを売り,を売り,二を売り…したがって価格も順番に上昇します。Bidsは,ハンキングリストを売り,数列はそれぞれを買い,を買い…価格が順番に低下します。

{
    "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
}

ディープ アクセス バイアースの例:

function main() {
    var depth = exchange.GetDepth()
    Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}

GetRecords

最もよく使用されるインターフェースの1つであるK線を取得し,一度により長い時間の価格情報を返し,様々な指標の基礎を計算できます.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)≫ 最新のホストをアップグレードすると,カスタムサイクルがサポートされ,周期秒数がパラメータとして直接伝送され,分級のカスタムが1分間のK線で合成され,1分以下のK線がGetTradesで合成され,商品の期貨はtickで合成され,≫このビデオでは,このような例を紹介しています.PERIOD_M1この全大文字変数は,FMZのデフォルトの全局変数であり,興味のある方は,その具体的な値を自分でログすることができます.通常は直接使用できます.

返されるデータ例:

[
    {"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

特定の時間帯の取引データを取得する (自分の取引データではなく),一部の取引所ではサポートされません.比較してまれに使用され,APIドキュメントで詳しく説明できます.

アカウントの取得

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

GetAccountでアカウントを取得する

アカウント情報を取得する.最もよく使用されるインターフェースの1つで,残高不足を避けるために注文する前に呼び出す必要があります.返却結果は次のとおりです.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃BTC_USDTストックスはBTC,バランスはUSDT.

返される結果は指定された取引ペアの結果であり,取引口座の他の通貨の情報はInfoフィールドに記載されており,複数の取引ペアを操作するには,複数回呼び出す必要はありません.

オンライン取引の総額を表示するディスプレイ:

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
    }
}

Buyで購入する

下の料金 呼び出し方法は以下の通りです.exchange.Buy(Price, Amount)またはexchange.Buy(Price, Amount, Msg)Price は価格,Amount は量,Msg は追加文字列で,リールディスクのログに表示できますが,必須ではありません.この方法は,注文を掛けるため,即座に完全に取引ができない場合,未取引の注文が生じます.null注文の状況について調べる

Priceは-1,Amountは,下落価格で購入する場合は下落価格で購入する.exchange.Buy(-1, 0.5)取引は正しかったETH_BTC,は,市場価格で0.5BTCのETHを購入することを意味する.一部の取引所は,市場価格のリストをサポートしないし,先物回報もサポートしない.

すべての価格と量の精度要求は,利用可能_N()精度関数を制御する. 期貨取引のBuyとSellには別の意味があり,別々に説明する.

価格が上がると購入する例:

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で注文を入手する

注文IDで注文情報を取得する. 常用インターフェース,呼び出し方法exchange.GetOrder(OrderId)注文IDは,注文時に返されるものです.注文の種類に注意してくださいTypeフィールドと注文状態Status実際の値は数値で,異なる意味を表しますが,記憶に不利であるため,FMZは未完成の注文のように,全局的な常数でこれらの値を表します.Status値が 0 になったとき,ORDER_STATE_PENDINGこの全局常数は,ドキュメントで確認できます.┃ 返される結果:

{
    "Id":125723661, //订单id
    "Amount":0.01, //订单数量
    "Price":7000, //订单价格
    "DealAmount":0, //已成交数量
    "AvgPrice":0, //成交均价
    "Status":0, // 0:未完全成交, 1:已成交, 2:已撤单
    "Type":1,// 订单类型,0:买单, 1:卖单
    "ContractType":"",//合约类型,用于期货交易
    "Info":{} //交易所返回原始信息
    }
}

コインの購入戦略:

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){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。
                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)
    }
}

キャンセルオーダー

注文のidに基づいて注文を取り消す.exchange.CancelOrder(OrderId)撤回成功で true が返され,そうでない場合は false が返されます.

期貨と永続契約

デジタル通貨の期貨取引と現金取引は少し異なります.上記の現金取引の機能は,期貨,単期貨取引にも適用されます.デジタル通貨の期貨の手続き化取引を行う前に,ウェブサイトで手作業に慣れ,基本的な概念を理解し,開仓,平仓,全仓,減仓,レバレッジ,平仓の損失,浮動収益,担保金などの概念および相応の計算公式.各期貨取引所で関連するチュートリアルを見つけることができます.自分で学習する必要があります.

永続契約は期貨契約に類似しているが,同時に多空を保有する概念はない.

取引所がOKEXやHuobiのような現金期貨を同時にサポートしている場合,取引所のインターフェイスでOKEXの期貨とHuobiの期貨を別々に選択し,FMZでは現金と異なる取引所と見なす必要があります.

SetContractType 契約を設定する

期貨取引の第一歩は,取引する契約を設定することです.OKEX期貨の例では,實盤または反測を作成するときにBTC取引ペアを選択し,コードで当週,来週または四半期契約を設定する必要があります.設定されていない場合は提示されます.invalid contract type現金取引ペアとは異なり,期貨契約は往々にして取引取引通貨であるBTCを担保とする.取引ペアにBTCを加えたBTCは通常,BTCを担保とするBTC_USD取引ペアを表す.USDTを担保とする期貨が存在する場合,BTC_USDT取引ペアを加えた実体を作成する必要がある.通貨安OKEXなどの期貨は,通貨本位とUSDT本位の両方の永続契約が存在する.取引ペアを設定した後は,永続,当週,次週などの特定の契約タイプを設定する必要があります. 契約を設定した後は,取引状況,売買などの操作を行うことができます.

ビンヤン,OKEX,HuobiDMなどにコイン本位とUSDT本位の契約が存在するが,实体設定の契約を追加する際に区分する必要がある.具体的設定は以下のとおりである.

//OKEX期货
exchange.SetContractType("swap")        // 设置为永续合约
exchange.SetContractType("this_week")   // 设置为当周合约
exchange.SetContractType("next_week")   // 设置为次周合约
exchange.SetContractType("quarter")     // 设置为季度合约

//HuobiDM
exchange.SetContractType("this_week")   // 设置为当周合约 
exchange.SetContractType("next_week")   // 设置为次周合约
exchange.SetContractType("quarter")     // 设置为季度合约
exchange.SetContractType("swap")        // 设置为永续合约

//币安期货
exchange.SetContractType("swap")   // 设置为永续合约,注意币本位和USDT本位都存在永续
exchange.SetContractType("quarter")   // 设置为当季合约
exchange.SetContractType("next_quarter")  // 设置为次季合约

//BitMEX
exchange.SetContractType("XBTUSD")    // 设置为永续合约
exchange.SetContractType("XBTM19")  // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码

//GateIO
exchange.SetContractType("swap")      // 设置为永续合约,不设置默认为swap永续合约。 

//Deribit
exchange.SetContractType("BTC-27APR18")  // 具体某个时间结算的合约,详情参看Deribit官网。

GetPosition ポジションを保持する

現在の保有情報の一覧を取得し,OKEX(OKCOIN) 期貨は,取得する契約の種類を指定するパラメータを入力できます. 保有していない場合は空リストを返します.[]┃ 保有情報返却は以下のように,具体的な情報はたくさんあり,取引の具体的な分析と組み合わせる必要がある。

データの種類 変数の名前 例示する

“Object HDID Info HDID Exchange”が返した原始構造 OKCoinは10か20で,OK Futuresの全仓モードは固定的10を返します. 原生APIがサポートしていないからです. OKCoinは,契約の総額を表示します. 凍結した数値 持株総額は 持株総額は 銀行口座の口座番号 銀行口座の口座番号 銀行口座の口座番号 ≪numberのうさぎProfitのうさぎ商品期貨:持仓市損益,デジタル通貨:(デジタル通貨単位:BTC/LTC,従来の期貨単位:RMB,注:OKCoin期貨全仓状態で余剰を達成することを指す,持仓損益ではなく,順位を下げて持仓損益を指す) ≪constの使い方≫ PD_LONGは多頭ポジション (CTPでは closebuy_todayで平仓),PD_SHORTは空頭ポジション (CTPでは closesell_todayで平仓), (CTPの期貨では) PD_LONG_YDは昨日多頭ポジション (closebuyで平仓),PD_SHORT_YDは昨日空頭ポジション (closesellで平仓) ストリングのContractType ストリングのContractType ストリングのContractType ストリングのContractType

function main(){
    exchange.SetContractType("this_week");
    var position = exchange.GetPosition();
    if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错
        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そしてsell設定は,双方向のポジションをサポートする場合は必要closebuy,closebuy具体的には

操作する SetDirectionのパラメータについて 下位関数
ポジションを開設する exchange.SetDirection(“buy”) exchange.Buy()
平多仓 exchange.SetDirection(“closebuy”) exchange.Sell()
空き地 exchange.SetDirection(“sell”) exchange.Sell()
空き仓 exchange.SetDirection(“closesell”) exchange.Buy()

最後に,特定の開場平仓コード,下位注文量は異なる取引所によって異なります.例えば,huobi期貨は枚数で,一枚100ドルです. 期貨の反測は市場価格をサポートしません.

function main(){
    exchange.SetContractType("this_week")    // 举例设置 为OKEX期货 当周合约
    price = exchange.GetTicker().Last
    exchange.SetMarginLevel(10) //设置杠杆为10倍 
    exchange.SetDirection("buy") //设置下单类型为做多 
    exchange.Buy(price+10, 20) // 合约数量为20下单 
    pos = exchange.GetPosition()
    Log(pos)
    Log(exchange.GetOrders()) //查看是否有未成交订单
    exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
    exchange.Sell(price-10, 20)
}

具体的には,以下のような戦略があります.

function main(){
    while(true){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){
            Log('无法获取ticker')
            return
        }
        if(!pos || pos.length == 0 ){
            Log('已无持仓')
            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:レバレッジアカウントの取引対は,通常の取引対とは異なるものがあり,一部の取引対は存在しない可能性があります.
  • コイン:レバレッジアカウントのモデルは,通常とは異なる取引ペアで,いくつかの取引ペアは,そうではないかもしれません.
  • ZB: 資金はQCとしてのみ移動可能,レバレッジ取引板,異なる取引ペアの間の資金独立,すなわち,ETH_QC取引ペアのQCコイン数,BTC_QCでは見られない
  • FCoin
  • ビンアンス

商品期貨取引

商品期貨取引とデジタル通貨期貨取引には大きな違いがある。 まず商品期貨の取引時間は短く,デジタル通貨は24時間取引する.商品期貨の協定も一般的なREST APIではない.商品期貨の取引頻度と掛單数制限は,デジタル通貨は柔軟である,など。 したがって,取引商品期貨には特別な注意が必要な多くの場所があり,豊富な操作の手動操作経験を持つことをお勧めします。FMZはsimnow商品期貨の模擬ディスクをサポートしています.参照: https://www.fmz.com/bbs-topic/325 。 商品期貨会社追加: https://www.fmz.com/bbs-topic/371

商品期貨は2019年6月,個人プログラム化個人ユーザーが必要とする開設期貨商の申請許可コード ((具体的申請に必要な資料のテンプレートは微信群またはQQ群で送信できます),通常4-5日かかります.手順はより複雑です。FMZ定量化プラットフォームは,プログラム化取引プロバイダーとして,各期貨サービス提供者にソフトウェアライセンスを申請しています.ユーザーは直接申請する必要なく使用できます.追加期貨商は,検索をクリックして,FMZが既に申請したリストを見ることができます. 具体的参照ポスト: https://www.fmz.com/bbs-topic/3860 。あなたの期貨商がリストに含まれなくなれば,自分で申請するか,取引開設者を再サポートする場合は,通常2日かかります。FMZは,国安宏君源,期貨機関などと深い協力関係を築いており,FMZのプラットフォームの版を購入し,ユーザーに自動で開設し,最低手数料で開設することができます. 参照:www.fmz.com/506 /bbs-topic/3860 。

FMZプラットフォームのアーキテクチャの優位性により,ユーザーはまた複数の期貨商アカウントを追加することができ,他の商品期貨のプログラム化された取引ソフトウェアができない機能を実現できます.例えば,高周波ティックの合成,参照: https://www.fmz.com/bbs-topic/1184

政策枠組み

まず,24時間取引ではないので,ログイン操作が必要なので,取引する前にリンクの状態を判断する必要があります.exchange.IO("status")のためにtrue接続した取引所を表示する。ログインが成功しなかった場合APIを呼び, ‘not login’を提示しない。戦略が始まってからSleep ((2000)) したり,ログインに一定の時間を与えます。また,サブスクリプションを再試すこともできます._C(exchange.SetContractType,"MA888")飛行機の着陸を確実にするため,

商品期貨の取得方法と取引コードは,仮想通貨期貨と同じで,異なる点と注意すべき点について説明します.

function main(){
    _C(exchange.SetContractType,"MA888") //没登陆成功是无法订阅合约的,最好重试一下
    while(true){
        if(exchange.IO("status")){
            var ticker = exchange.GetTicker()
            Log("MA888 ticker:", ticker)
            LogStatus(_D(), "已经连接CTP !")//_D获取事件
        } else {
            LogStatus(_D(), "未连接CTP !")
            Sleep(1000)
        }
    }
}

商品期貨類倉庫取引 (後述) を使用することをお勧めします.この場合,コードは非常に単純で,面倒な詳細を処理する必要はありません. ソースコードの複製アドレス:https://www.fmz.com/strategy/57029

function main() {
    // 使用了商品期货类库的CTA策略框架
    $.CTA(Symbols, function(st) {
        var r = st.records
        var mp = st.position.amount
        var symbol = st.symbol
        /*
        r为K线, mp为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则不持仓, symbol指品种名称
        返回值如为n: 
            n = 0 : 指全部平仓(不管当前持多持空)
            n > 0 : 如果当前持多仓,则加n个多仓, 如果当前为空仓则平n个空仓,如果n大于当前持仓, 则反手开多仓
            n < 0 : 如果当前持空仓,则加n个空仓, 如果当前为多仓则平n个多仓,如果-n大于当前持仓, 则反手开空仓
            无返回值表示什么也不做
        */
        if (r.length < SlowPeriod) {
            return
        }
        var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
        if (mp <= 0 && cross > ConfirmPeriod) {
            Log(symbol, "金叉周期", cross, "当前持仓", mp);
            return Lots * (mp < 0 ? 2 : 1)
        } else if (mp >= 0 && cross < -ConfirmPeriod) {
            Log(symbol, "死叉周期", cross, "当前持仓", mp);
            return -Lots * (mp > 0 ? 2 : 1)
        }
    });
}

CTPデータ取得モード

商品期貨はCTPプロトコルを使用し,すべての取引と注文の取引は変更がある場合にのみ通知され,注文,アカウント,ポジションを検索することは主動的な検索である.GetTickerGetDepthGetRecordsすべてのデータは,最新データを取得するためにキャッシュされている.データがない場合は,データが常に待機するので,戦略はSleepを使用することはできません. 状況が変化すると,ticker,depth,recordsは更新されます.このとき,任意のインターフェースを呼び出すことはすぐに返されます.呼び出されたインターフェースの状態は更新モードを待機し,次の呼び出しは同じインターフェースで,新しいデータが返されるまで待機します. いくつかの冷門合約または約落は,長い時間取引しない状況が発生します.これは,戦略が長い時間卡にされるのも正常です.

古いデータでも,毎回更新モードに切り替える事ができます.exchange.IO("mode", 0)┃ この時,戦略はイベント駆動として記述できないので,SLeep イベントを追加して,急速な死循環を避ける必要がある。 ┃ いくつかの低頻度の戦略は,このモードを使用することができ,戦略の設計はシンプル。 使用exchange.IO("mode", 1)標準のキャッシュモードを切り替えることができます.

単一の契約を操作する際には,デフォルトモードを使用できます。しかし,複数の契約の場合,契約が更新されていない可能性があり,取得状況インターフェースがブロックされ,他の契約の状況更新も取得できません。この問題を解決するには,即時更新モードを使用できますが,高頻度戦略を書くことはできません。このとき,イベントプッシュモードを使用して,注文と状況のプッシュを取得できます。設定方法はexchange.IO("wait")商品期貨では珍しいが,複数の取引所オブジェクトが追加された場合,exchange.IO("wait_any")返されたインデックスは返された取引所のインデックスを示します.

ツイート:{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称} オーダーフォロー:{Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与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")){ //判断链接状态
            exchange.IO("mode", 0)
            _C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。
            _C(exchange.SetContractType, "rb888")//订阅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つの深さしかありません (深さ5層は高価です),GetTradesも取引履歴を取得できません (所有権の変更に基づいて模擬化され,実際の取引記録はありません).商品期貨には値の停止制限があります.値の停止時,深さ売り札の販売価格は値であり,注文量は0で,停止時,買い札の購入価格は値であり,注文量は0です.

契約を設定する

exchange.IO ((“instruments”): 取引所のすべての契約のリストを辞書形式で返します. exchange.IO ((“products”): Exchangeの全ての製品リストを{製品名:詳細}辞書形式で返し,实体ディスクのみをサポートする. exchange.IO ((“subscribed”): 契約を返却した状態で,形式は同じで,実体のみをサポートする.

CTPの将来性についてContractType契約IDは,大文字と小文字の区別で,例えばexchange.SetContractType("au1506")◎契約設定が成功した後,契約の詳細を返却します.例えば,最低1回の購入額,手数料,配送時間などです.複数契約を購読する場合は,最初に購読のリクエストを送信するだけで,その後はコードレベルで取引ペアを切り替えるだけで,時間がかかりません.主力連続契約は,MA888のような888のコードで,連続指数契約は,MA000のような000で,仮想契約取引は回測のみがサポートされ,実体ディスクは,取得条件のみがサポートされます.しかし,Mac言語は主力契約を操作することができ,プログラムは自動的にポジションを入れ替える,つまり非主力ポジションを平らにして主力ポジションに新しいポジションを開く.

ログインが成功しない場合,契約は設定できませんが,すぐに戻ります.CTP ログインが完了したことを知って,Cで再試してください. ログインが成功すると,契約を設定することは時間がかかりません.

ポジションを平らにする

SetDirection“Direction”を表示するbuy, closebuy, sell, closesell4つのパラメータ 商品期貨の多出closebuy_todayそしてclosesell_today“私は今,この状況に満足している.closebuy/closesell平昨ポジションでは,先期品種のみを平今と平昨に分け,手数料に影響を与える可能性があるため,優先的に平昨ポジションが必要である.CTPの従来の期貨については,第2パラメータ1または2または3を設定し,それぞれ投機,利率,保護を設定し,默認投機を設定しない.具体的には,取引,ポジション取得,注文取得,請求書撤回,口座取得などの操作は,デジタル通貨の期貨取引と同じです.上記の章を参照してください.

操作する SetDirectionのパラメータについて 下位関数
ポジションを開設する exchange.SetDirection(“buy”) exchange.Buy()
平多仓 exchange.SetDirection(“closebuy”) exchange.Sell()
空き地 exchange.SetDirection(“sell”) exchange.Sell()
空き仓 exchange.SetDirection(“closesell”) exchange.Buy()

以下の例は,具体的な平仓関数である.この例があまりにも単純であることに注意してください.また,取引時間にあるかどうか,未完全取引の順番を重試し,最大下落の量は何であるか,頻度があまりにも高いかどうか,具体的には滑走価格か,または開口などなど,一連の問題を考慮してください.参照のみです.fmz.com/strategy/12961 (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 ? "平今" : "平昨", '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 ? "平今" : "平昨", '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 指定された日までに有効である
  • gtc 撤回前に有効だった
  • gfa 集合の入札は有効である

インターフェース

商品期貨トレーダーでは,CTPインターフェースがデフォルトで開いているが,要求があれば,EasyPayインターフェースに変更できる.FMZのパッケージは,呼び出し方法が同じである.違いは,アカウント,注文,保管庫は,推送モードであるため,托管者は,これらのデータをローカルで維持し,対応インターフェースを呼び出すと,すぐに返却され,実際に要求は出さない.

イーシェン協定のカスタム注文タイプは以下の通りです.

  • gfd 当日有効である TAPI_ORDER_TIMEINFORCE_GFD
  • gtc キャンセル前に有効だった TAPI_ORDER_TIMEINFORCE_GTC
  • gtd 指定された日までに有効である
  • fak 部分交付,残りの部分を取り消す TAPI_ORDER_TIMEINFORCE_FAK
  • ioc すぐに完了する,または TAPI_ORDER_TIMEINFORCE_FAK を取り消す
  • フォークは完全に取引できず,すべて撤回 TAPI_ORDER_TIMEINFORCE_FOK

一般的なグローバル関数

ログ日記と微信配信

固形ディスクのインターフェイスでは,Logのログ,文字列の後で@文字を追加すると,メッセージは,推送キューに入ります.微信またはtelegramをバインドすると,直接推送されます.Log('推送到微信@')

ログのカラーもカスタマイズできます.Log('这是一个红色字体的日志 #ff0000')#ff0000RGB の 16 進数表示

すべてのログファイルは,ホストのディレクトリにあるディスク上のsqlitデータベース内に存在し,ダウンロードしてデータベースソフトウェアで開くことができる.また,バックアップの復元を複製するために使用することもできる (データベース名とディスクIDは同じ).

LogProfit 収益を印刷する

収益を記録し,実機界面に収益曲線を描画し,実機が再起動された後も保存できます.LogProfit(1000)注意してくださいLogProfit参数とは必ずしも収益ではなく,任意の数字で,自分で記入する必要があります.

LogStatus ステータス欄の表示 (表を含む)

ログが保存され,常に更新されるので,保存されていない情報だけを表示する場合は,LogStatus関数。LogStatus文字列のパラメータは,表の情報を表示するためにも使用できます.

具体的には,リールディスクの位置を示す表の例です.

var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}; 
LogStatus('`' + JSON.stringify(table) + '`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格) 
LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息'); // 表格信息也可以在多行中出现 
LogStatus('`' + JSON.stringify([table, table]) + '`'); // 支持多个表格同时显示, 将以TAB显示到一组里 
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // 上下排列显示多个表

眠っている

パラメータはミリ秒数です.Sleep(1000)休憩に1秒.取引のすべてのアクセス頻度が制限されているため,一般的な戦略では,死循環に休憩時間を加える必要があります.

_G データ保存

固体ディスクが再起動すると,プログラムが再起動します._GJSONの配列化されたコンテンツを保存できる._G書き換えると,onexit()戦略を停止するたびに,必要な情報は自動的に保存されます. 格式化されたデータをもっと保存したいなら,_G関数はあまり適用されないので,Pythonを使って直接データベースに書き込むことができます.

function onexit(){
    _G('profit', profit)
}
function main(){
    _G("num", 1); // 设置一个全局变量num, 值为1 s
    _G("num", "ok"); // 更改一个全局变量num, 值为字符串ok 
    _G("num", null); // 删除全局变量 num 
    _G("num"); // 返回全局变量num的值,如果不存在返回null

    var profit = 0
    if(_G('profit')){
        profit = _G('profit')
    }
}

_N精度関数

注文時に価格と数量の精度をコントロールする傾向があり,FMZは,小数点位を保存する,例えば_N(4.253,2)答えは4.25でした.

_C 自動再試行

インターフェースの API は,アクセスするたびに成功する保証はありません._Cは自動再試行関数である。指定された関数を成功まで呼び続ける (返される関数はnullまたはfalseで再試行される),例えば_C(exchange.GetTicker), 元の再試行間隔は3秒で,再試行間隔を制御するために_CDelay関数 (例えば_CDelay(1000) を呼び出すことができます.GetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderプログラムが停止されるのを防ぐために,Cは_error_tolerant を使っています.

CancelOrder_C関数を使用できません. 撤回失敗には様々な理由があります. 一つの単数が交付されていれば,撤回が失敗に戻ります. _C関数を使用すると,常に再試しに導きます.

_C関数は,参数に伝送され,カスタム関数にも使用されます.

function main(){
    var ticker = _C(exchange.GetTicker)
    var depth = _C(exchange.GetDepth)
    var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数
}

_D 日付関�