[TOC]
このチュートリアルは,APIの導入,バックテスト,チャートなど,戦略書きの基本的な知識を含んでいます. この基本的なチュートリアルを学んだ後,ユーザーは基本的なAPIを熟練して安定したボット戦略を書くことができます. チュートリアルを学ぶ前に,どのように使用するかを学ぶ必要があります.FMZ量子プラットフォームを起動する.
古いバージョンのチュートリアル:FMZ Quant (FMZ.COM) 戦略執筆マニュアル 2.0 (チュートリアル)チュートリアルには多くのポスト・インデックスがあり,読んでもらえるようにお勧めします.
プログラム・トレーディングとは,プログラムがAPIを通じてプラットフォームと接続して,設計意図に応じて自動売買または他の機能を達成することを意味します.APIはアプリケーション・プログラミング・インターフェースを表します.
現在,仮想通貨プラットフォームには,REST と Websocket の2つの主要なインターフェースプロトコルがあります.REST プロトコルがデータを取得するたびに,一度アクセスする必要があります.例として,シミュレーションプラットフォームの API
{"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の最新の市場コートをフォローする取引は,リフレッシュするたびに変更される.
FMZ Quant取引プラットフォームは,すべてのプラットフォームの REST インターフェースをカプセル化し,呼び出す統一方法と統一データフォーマットを使用し,戦略書き方をよりシンプルで一般的なものにします. Websocket は FMZ プラットフォームで簡単にサポートできます.次のチュートリアルで詳細に紹介されます.
FMZプラットフォームAPI文書のほとんどの部分はJavaScriptを例として使用しているが,エンカプスレーションにより,異なる言語の間の差はほとんどなく,文法の問題にのみ注意を払う必要がある.
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 Quant プラットフォームは
戦略プログラムは,コード命令で実行される通常のプログラムと同じです.特異な部分は,メイン機能が必要であることです. 戦略が中断なく実行される必要があるため,通常はループプラス睡眠時間が必要です. プラットフォームAPIのアクセス頻度は限られているため,睡眠時間がそれに応じて調整する必要があります. このフレームワークは固定間隔で典型的な実行であり,イベント駆動戦略を書くためにWebソケットも使用できます. たとえば,深さが変化する限り即時実行,これは高度なチュートリアルで紹介されます.
特殊アクションを伴う他の機能は以下のとおりです.
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
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 を呼び出すとき,プラットフォームと取引ペアを指定する必要があります. ボットを作成するときに1つのexchange
このオブジェクトを表現します.例えば,exchange.GetTicker()
この"取引対"の市場値です.
FMZ Quantプラットフォームは,複数の exchanges
代表する配列,すなわちexchanges[0]
そしてexchanges[1]
取引ペアの形式で,例えば,この2つの対を組み合わせると,BTC_USDT
この状況では, 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を使用すると,アクセスが失敗して戻る可能性があります.null
Python が返します.None
. この時点で,使用中のデータはエラーを報告し,ボットが停止する原因になります.故障耐性は非常に重要です. このチュートリアルでは故障耐性を特別に紹介します.
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は,待機中の注文の詳細情報を入手する.GetTickerには1購入と1販売価格が含まれているが,より深い待機注文をクエリしたい場合は,このインターフェースを使用して,一般的に200件の待機注文をチェックしたりダウンしたりすることができます.このインターフェースを使用してショック価格を計算できます.下記は実際の返金結果です.そのうちの
{
"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は,最も一般的に使用されるインターフェースの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_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
返済結果は指定された取引ペアの結果であり,取引口座の他の通貨の情報は"情報"フィールドにありますので,複数の取引ペアを実行するときに複数回呼び出す必要はありません.
このボットは,現在の取引ペアの総値を常に印刷します.
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
注文が失敗した場合に返されます. 注文の状態をクエリするために使用されます.
市場価格で購入注文をしたい場合, 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')
}
売り注文.パラメータはexchange.Sell(-1, 0.2)
0.2ETHを市場価格で販売する
この共通インターフェースがメソッドを呼び出すとき,このメソッドは,このメソッドを呼び出すときに,このメソッドは,このメソッドを呼び出すとき,このメソッドは,このメソッドを呼び出すとき,このメソッドは,このメソッドを呼び出すとき,このメソッドは,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドが,このメソッドを呼び出すとき,このメソッドは,このメソッドを呼び出す.exchange.GetOrder(OrderId)
命令の文字列は,命令の文字列が表示されているように表示されます.Type
注文の実際の価値Status
FMZ は,これらの値を表現するためにグローバル定数を使用します.例えば,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)
}
}
}
}
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)
. キャンセルが成功した場合,返信する
仮想通貨の先物取引はスポット取引とは異なります.先物取引の上記の機能は先物取引にも適用され,単一の先物取引には独自の機能があります.仮想通貨先物取引のプログラム取引を行う前に,ウェブサイト上の手動操作に精通し,オープン,閉鎖,クロス,孤立,レバレッジ,接近利益と損失,浮動収入,マーージンなどの基本概念,それに対応する計算式を理解する必要があります.対応するチュートリアルはさまざまな先物プラットフォームで見つけることができます.そして,それらを自分で学ぶ必要があります.
永続契約は先物契約に似ているが,違いは,長期と短期を同時に保有するという概念がないことだ.
プラットフォームがOKEXやHuobiのフューチャーやスポットの両方をサポートしている場合,これらのフューチャープラットフォームはFMZのスポットプラットフォームとは異なるプラットフォームとみなされるため,プラットフォームインターフェースで別々に
フューチャー取引の第一歩は,取引される契約を設定することです.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 はポジションを閉じるのに |
文字列 | 契約型 | コモディティ・フューチャーズは契約コードで,ストックは |
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)
exchange.SetDirection(Direction)
オープン・クローズ・ポジションに対応する.長期契約とは異なり,永久契約は,同時に長と短の概念を持っていない場合,つまり,単一のポジションは許されない.あなたが長いポジションで短いオープン操作するとき,長いポジションは自動的に閉鎖されるので,あなたはただ設定する必要がありますbuy
そしてsell
2つの方向の位置をサポートする場合は,設定する必要がありますclosebuy
, closesell
.特定の関係
オペレーション | SetDirection パラメーター | 秩序 を 設定 する 機能 |
---|---|---|
オープン・ロング・ポジション | 交換.セットディレクション (( |
交換する.買える. |
ロングポジションを閉じる | 交換.セットディレクション (( |
交換する.売る. |
オープンショートポジション | 交換.セットディレクション (( |
交換する.売る. |
ショートポジションを閉じる | 交換.セットディレクション (( |
交換する.買える. |
最後に,オープン・クローズ・ポジションの特定のコードがあります.配置されたオーダーの量はプラットフォームによって異なります.例えば,フウビ・フューチャーズは契約量の数に基づいており,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") は通常のアカウントモードに戻る.
サポートされているプラットフォーム:
商品先物取引と仮想通貨先物取引はかなり異なります.まず,商品先物取引の取引時間は非常に短く,しかし仮想通貨は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が申請したリストを見るために
FMZ Quantプラットフォームの構造の利点により,ユーザーは複数の先物取引業者アカウントを追加し,他の商品先物取引プログラムソフトウェアが完了できないいくつかの機能を実装することができます.https://www.fmz.com/bbs-topic/1184
まず,24時間取引ではなくログイン操作が必要なので,取引前にリンクの状態を判断する必要があります.exchange.IO("status")
はtrue
, プラットフォームへの接続が成功することを示します. ログインが成功しないときにAPIが呼び出された場合, _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プロトコルを使用し,すべての市場報價とオーダー執行は変更後にのみ通知されるが,注文,アカウント,ポジションに関するクエリはアクティブクエリである.したがって,イベント主導の高周波戦略を書くのに適している.GetTicker
, GetDepth
そしてGetRecords
,すべてのデータは最新のデータを入手するためにキャッシュされている必要があります.データがない場合は,データが戻るまで待つため,戦略は
古いデータであっても,あなたは市場のコートの即時更新モードに切り替えることができます.exchange.IO("mode", 0)
. この時点で,戦略はイベント駆動で記述することはできません. 急速な無限ループを避けるために,SLeepイベントを追加する必要があります. いくつかの不頻繁な戦略はこのモードを使用することができ,戦略デザインは簡単です.exchange.IO("mode", 1)
デフォルトキャッシュモードに戻る
単一のコントラクトを実行するときは,デフォルトモードを使用します. ただし,複数のコントラクトがある場合,コントラクトの1つがマーケットのコートを更新しない可能性があり,その結果,マーケットのコートを入手するためのインターフェースブロックになり,他のコントラクトのコートを更新することもできません.この問題を解決するために,即時更新モードを使用できますが,高周波戦略を書くのは不便です.この時点で,オーダーとコートをプッシュするためにイベントプッシュモードを使用できます.設定方法は,exchange.IO("wait")
商品先物では稀です. 商品先物では,exchange.IO("wait_any")
返された
市場の変化を推し進める:{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'): プラットフォーム上のサブスクリプトされた市場コートを辞書形式で返却し,ボットのみをサポートします.
についてContractType
CTPの先物とは,大小・小小字に敏感な契約のIDを指します.exchange.SetContractType("au1506")
. 契約が成功して設定された後,最低購入金額,サービス料金,配達時間など,契約の詳細な情報を返します.複数の契約に購読する場合,購読要求が実際に送信されるのは初めてであり,その後,取引ペアはコードレベルで切り替わります.時間がかかりません.主な連続契約は,MA888のようなコード888です.連続レート契約は,MA000のような000です.888と000は,バックテストのみをサポートする仮想契約取引であり,実際のボットは,市場報じのみをサポートします.しかし,Mylanguageはメイン契約を操作することができ,プログラムは自動的にポジションを変更します. つまり,非メインポジションを閉鎖し,メインポジションの新しいポジションを開きます.
失敗したログインは契約を設定することはできませんが,すぐに戻りますので,CTPログインが完了したことを知るために,再び
SetDirection
4つのパラメータを得ることができます.buy, closebuy, sell, closesell
商品先物取引はclosebuy_today
そしてclosesell_today
, 現在のポジションの閉鎖を表示します.デフォルトはclosebuy/ closesell
,昨日のポジションの終了を表示する.上海先物取引所の種類は今日と昨日の終了に分かれ,サービス料に影響を与える可能性があるため,昨日のポジションの終了に優先順位を与える必要があります. CTPの伝統的な先物については,第2パラメータをそれぞれ
オペレーション | SetDirection パラメーター | 秩序 を 設定 する 機能 |
---|---|---|
オープン・ロング・ポジション | 交換.セットディレクション (( |
交換する.買える. |
ロングポジションを閉じる | 交換.セットディレクション (( |
交換する.売る. |
オープンショートポジション | 交換.セットディレクション (( |
交換する.売る. |
ショートポジションを閉じる | 交換.セットディレクション (( |
交換する.買える. |
次の例は,特定の閉店ポジション関数です.この例があまりにも単純であることを注意してください.また,取引時間内に,完全に満たされていない場合,待機中のオーダーを再試す方法,最大オーダーボリューム,頻度があまりにも高く,スライディング価格か市場価格,などであるかどうかを考慮する必要があります.参照のためにのみ,これは,実際のボットでポジションを開設・閉じるための提案されたプラットフォームのライブラリパッケージです.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")
特殊後
デフォルトでは,コモディティ・フューチャーズ・ブローカーで開くインターフェースはすべてCTPインターフェイスである.必要に応じて,Esunnyインターフェイスで置き換えることができます. FMZのエンカプスル化により,呼び出し方法は同じです.違いは,アカウント,オーダー,ポジションはすべてプッシュモードにあるため,ドーカーはこれらのデータをローカルに保持し,実際に要求を行わずに対応するインターフェイスが呼び出されるとすぐに返します.
エスニープロトコル カスタムオーダータイプは:
ボットインターフェースでログをログインし,文字列の後ろに文字Log('Push to WeChat@')
.
ログの色もカスタマイズできます.Log('this is a log in red font #ff0000')
.
#ff0000
は RGB 色の十六進数で,すべてのログファイルがドッカーが位置するディレクトリ内のボットの SqLit データベースに格納されていることを示し,データベースソフトウェアでダウンロードして開くか,バックアップをコピーして復元するために使用できます (データベース名とボットIDは同じです).
利益を記録し,ボットのインターフェースに利益曲線を描き,ボットを再起動した後も保持できます.呼び出し方法:LogProfit(1000)
. パラメータがLogProfit
必ずしも利益ではないし,任意の数字で 自分で記入する必要があります.
ログが保存され,継続的に更新されるので,ボット状態が表示のためにのみ情報を必要とする場合,保存のためにではなく,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