このチュートリアルには,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ドキュメントは,このチュートリアルでは,各インターフェースについて詳しく説明することはできません.具体的には,このドキュメントを参照してください:https://www.fmz.com/api
- FMZで取引をしたい場合は,この記事を参照してください:https://www.fmz.com/digest-topic/5533
- Javascript,Pythonの素早い入門で,簡単な戦略を書き出すには,複雑な文法を必要とせず,いくつかの基本的な概念を習得するだけで,プログラミングを学びながら,このチュートリアルを学ぶことができます. https://www.fmz.com/bbs-topic/382 https://www.fmz.com/bbs-topic/417
- マック言語のドキュメンタリー,トレンド戦略のマック言語は便利です。https://www.fmz.com/bbs-topic/2569
- C++ の呼び出し例は,C++ に興味のある人は見ることができますが,解釈言語ではないため,デビューは難しいので,使用は推奨されません:https://www.fmz.com/strategy/61533
- デジタル通貨の量化取引の講座は,FMZの公式製品で,わずか20元で,内容が詳細で豊富で,浅から深く,初心者向けです.コースのリンク
- fmz.com/square/s:タグ:教学/1
- 策略の詳細については,https://www.fmz.com/bbs/s:tag:源码解析/1
デバッグツール
FMZ定量化プラットフォームは,APIインタフェースをデビューするためのデビューツールを提供しています. http://www.fmz.com/m/debug 。デビューツールはJavaScriptのみをサポートし,しばらく実行でき,リッスルを作成せずに取引所のインタフェースをデビューすることができます。返されたデータは結果として返され,デビューツールのコードは保存されません。この学習チュートリアルでは,デビューツールを同時に使用してテストすることができます。

戦略プログラム構造
策略プログラムは,通常のプログラムと同様に,コード順序で実行されるが,特別な点は,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は計算通貨である.
明らかに,この方法は,多くの取引ペアを操作する場合は面倒になります. 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は,ハンキングリストを売り,数列はそれぞれ<unk>を売り,<unk>を売り,二<unk>を売り...したがって価格も順番に上昇します。Bidsは,ハンキングリストを売り,数列はそれぞれ<unk>を買い,<unk>を買い...価格が順番に低下します。
{
"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},
......
]
<unk>代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の期貨<unk>とHuobiの期貨<unk>を別々に選択し,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のうさぎ商品期貨:持仓<unk>市損益,デジタル通貨:(デジタル通貨単位:BTC/LTC,従来の期貨単位:RMB,注:OKCoin期貨全仓状態で余剰を達成することを指す,持仓<unk>損益ではなく,順位を下げて持仓<unk>損益を指す)
≪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") を使用して,<unk>口座モードに切り替えると,口座資産の注文,取得は,取引所のレバレッジインターフェースにアクセスします.
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定量化プラットフォームは,プログラム化取引プロバイダーとして,各期貨サービス提供者にソフトウェアライセンスを申請しています.ユーザーは直接申請する必要なく使用できます.追加期貨商は,検索<unk>をクリックして,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プロトコルを使用し,すべての取引と注文の取引は変更がある場合にのみ通知され,注文,アカウント,ポジションを検索することは主動的な検索である.GetTicker、GetDepth、GetRecordsすべてのデータは,最新データを取得するためにキャッシュされている.データがない場合は,データが常に待機するので,戦略はSleepを使用することはできません. 状況が変化すると,ticker,depth,recordsは更新されます.このとき,任意のインターフェースを呼び出すことはすぐに返されます.呼び出されたインターフェースの状態は更新モードを待機し,次の呼び出しは同じインターフェースで,新しいデータが返されるまで待機します. いくつかの冷門合約または約<unk>落は,長い時間取引しない状況が発生します.これは,戦略が長い時間卡にされるのも正常です.
古いデータでも,毎回更新モードに切り替える事ができます.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も取引履歴を取得できません (所有権の変更に基づいて模擬化され,実際の取引記録はありません).商品期貨には<unk>値の停止制限があります.<unk>値の停止時,深さ売り札の販売価格は<unk>値であり,注文量は0で,停止時,買い札の購入価格は<unk>値であり,注文量は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パラメータ<unk>1<unk>または<unk>2<unk>または<unk>3<unk>を設定し,それぞれ投機<unk>,<unk>利率<unk>,<unk>保護<unk>を設定し,默認投機を設定しない.具体的には,取引,ポジション取得,注文取得,請求書撤回,口座取得などの操作は,デジタル通貨の期貨取引と同じです.上記の章を参照してください.
| 操作する | 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]);
}
}
}
商品先物サポート カスタム注文タイプ (リッドディスクサポート,反測サポートされていません),後方<unk>方式指定,添付<unk>_<unk>の後ろに
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 日付関数
直接呼び出す_D()文字列を返します.2019-08-15 03:46:14┃ 復測中に呼び出された場合,復測時間を返します。 ┃ D関数を使って時間を判断できます.例えば: _D().slice(11) > '09:00:00':
_D(timestamp,fmt)文字列の時間軸は,msの時間軸に変換されます._D(1565855310002)fmtは時間形式で,デフォルトはyyyy-MM-dd hh:mm:ss
TA指数関数
FMZプラットフォームは,MA\MACD\KDJ\BOLLなどの一般的な指標を直接内蔵しています.特定のサポートされた指標はAPIドキュメントを参照できます.
指数関数を使用する前に,K線長を判断するのが良い. 前方のK線長が計算に必要な周期を満たさない場合,結果はnull◎ 入力K線長が100で,MAの周期が10であれば,前9値はnullで,後は正常に計算する。
JavaScriptは,第三者のライブラリとして,完全なtalibをサポートしています.talib.CCI(records)◎参照 http://ta-lib.org/function.html ◎ Python では talib データベースをインストールできます.pip を使って簡単にインストールできないため,コンパイルする必要があります. ◎ インストール方法については,自分で検索できます.
指数関数は,K行データに加え,任意の配列にも変換できます.
function main(){
var records = exchange.GetRecords(PERIOD_M30)
if (records && records.length > 9) {
var ma = TA.MA(records, 14)
Log(ma)
}
}
JavaScript でよく使われる関数
このページでは,JavaScriptの常用関数について説明します.
Date.now()現在の時間軸に戻るparseFloat()文字列を数字に変換します.parseFloat("123.21")parseInt()文字列を整数に変換するnum.toString()数字を文字列に,numを数値変数に変換します.JSON.parse()Json文字列をフォーマットします.JSON.parse(exchange.GetRawJSON())- JavaScript の自作 Math 函数として,
Math.max(),Math.abs()参考:https://www.w3school.com.cn/jsref/jsref_obj_math.asp (英語) - FMZから引用されたJavaScriptの第三者mathデータベース,参照:https://mathjs.org/
- FMZは,多くのJsの繁忙な操作を容易にするために,JavaScriptの第三者underscoreライブラリを参照することをお勧めします.参照:https://underscorejs.org/
テンプレートライブラリ
リアルタイムの戦略機能を書くには,考えなければならないことがたくさんあります.例えば,5コインの簡単な機能を購入するなどです.我々は,考慮する必要があります:現在の余剰は十分ですか? 注文の価格はどれくらいですか? 精度はどれくらいですか? 注文を分割する必要はありませんか? 市場をショックから避けるために? 未完成の注文をどのように処理するか?
JavaScriptのデジタル通貨取引类庫と商品期貨取引类庫は,デフォルトで内蔵され,複製する必要はありません.他のテンプレート类庫は,戦略広場から https://www.fmz.com/square/20/1 で見つけることができます. テンプレート类庫を複製して保存し,独自の戦略を作成する際に使用したい類庫をタグ付けすることで使用できます.
JavaScript テンプレート関数は$PythonはPythonと定義されています.extスタート
デジタル通貨取引類別データベース
ソースコードはhttps://www.fmz.com/strategy/10989で,既に内蔵されており,コピーする必要はありません.特定の機能の実装方法は,ソースコードに直接参照できます.
アカウントの取得:
$.GetAccount(e)
Log($.GetAccount()); // 获取账户信息, 带容错功能
Log($.GetAcccount(exchanges[1]));
返信はこちらから
$.Buy/Sell(e, amount)
$.Buy(0.3); // 主交易所买入0.3个币
$.Sell(0.2); // 主交易所卖出0.2个币
$.Sell(exchanges[1], 0.1); // 次交易所卖出0.1个币
$.CancelPendingOrders(e, orderType)
$.CancelPendingOrders(); // 取消主交易所所有委托单
$.CancelPendingOrders(ORDER_TYPE_BUY); // 取消主交易所所有的买单
$.CancelPendingOrders(exchanges[1]); // 取消第二个交易所所有订单
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // 取消第二个交易所所有的卖单
横断的な判断:
$.Cross(periodA, periodB) / $.Cross(arr1, arr2);
var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
如果 n 等于 0, 指刚好15周期的EMA与30周期的EMA当前价格相等
如果 n 大于 0, 比如 5, 指15周期的EMA上穿了30周期的EMA 5个周期(Bar)
如果 n 小于 0, 比如 -12, 指15周期的EMA下穿了30周期的EMA 12个周期(Bar)
如果传给Cross不是数组, 则函数自动获取K线进行均线计算
如果传给Cross的是数组, 则直接进行比较
$.withdraw ((e, currency, address, amount, fee, password) の返金関数は,次のようになります.
$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")
商品期貨取引のクラスデータベース
商品期貨取引類庫は使用安定で,使用を推奨する。ソースコードアドレス: https://www.fmz.com/strategy/12961 。既に内蔵されており,コピーする必要はありません。
CTAのデータベース
- 固形ディスクは指数を主力連続に自動的にマップします.
- 移動は自動的に処理されます
- rb000/rb888のようなマッピングを指定できます. rb指数取引を主力連続にマッピングします.
- rb000/MA888は, rb指数のK線を見て, MA主力連続を取引する.
function main() {
$.CTA("rb000,M000", function(r, mp) {
if (r.length < 20) {
return
}
var emaSlow = TA.EMA(r, 20)
var emaFast = TA.EMA(r, 5)
var cross = $.Cross(emaFast, emaSlow);
if (mp <= 0 && cross > 2) {
Log("金叉周期", cross, "当前持仓", mp);
return 1
} else if (mp >= 0 && cross < -2) {
Log("死叉周期", cross, "当前持仓", mp);
return -1
}
});
}
クラスリバリーの呼び出し例
function main() {
var p = $.NewPositionManager();
p.OpenShort("MA609", 1);
p.OpenShort("MA701", 1);
Log(p.GetPosition("MA609", PD_SHORT));
Log(p.GetAccount());
Log(p.Account());
Sleep(60000 * 10);
p.CoverAll("MA609");
LogProfit(p.Profit());
Log($.IsTrading("MA609"));
// 多品种时使用交易队列来完成非阻塞的交易任务
var q = $.NewTaskQueue();
q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
Log(task.desc, ret)
})
while (true) {
// 在空闲时调用poll来完成未完成的任务
q.poll()
Sleep(1000)
}
}
グラフの図庫
原始画図機能はより複雑なので,次のチュートリアルで紹介する.初心者は直接画図クラスライブラリ,非常に単純な画折線図,K線図などを使用することをお勧めする.FMZは,簡単なクラスライブラリを内蔵しており,ポリシー編集ページで確認できます.内蔵されていない場合は,ユーザーが自分でコピーして保存した後,ポリシーで引用を選択する必要があります.
JavaScript 版画図庫のコピー アドレス:https://www.fmz.com/strategy/27293
Python 版画ライン クラスライブラリ 複製アドレス: https://www.fmz.com/strategy/39066
例えば
function main() {
while (true) {
var ticker = exchange.GetTicker()
if (ticker) {
$.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字
$.PlotLine('Buy', ticker.Buy)
}
Sleep(6000)
}
}
ポリシーのパラメータ設定
策略編集の下には,策略パラメータの設定があり,策略の全局変数に相当し,コードの任意の位置でアクセスできます. 策略パラメータは,リールディスク界面で変更され,再起動後に有効になります. そのため,いくつかの変数をパラメータとして設定することができ,策略を変更せずにパラメータを変更することもできます.

- 変数の名前: 上の図の number,string,combox などは,戦略グループで直接使用できます。
- 説明する: パラメータの名前で,パラメータの意味を簡単に理解できます.
- 注記: パラメータの詳細な説明,これはマウスがパラメータに停まったときに表示される.
- タイプ: このパラメータのタイプについては,以下で詳しく説明します.
- デフォルト値このパラメータのデフォルト値は:
文字列型と数字型は分かりやすく,最もよく使われるタイプである. 下の引き出しは,SYMBOLパラメータの値が設定されるように下の引き出しで,パラメータインタフェースで選択可能な引き出しを表示します.BTC|USDT|ETH,パラメータのページを引く時にUSDTを選択すると,SYMBOLの値はUSDTのインデックス1となります. 選択項目は選択可能な枠で, trueに勾配され, falseに勾配されます.
このパラメータは, https://www.fmz.com/bbs-topic/1306 を参照して,多くの設定が可能です.
戦略バックテスト
戦略の定量化作業が完了すると,歴史データを使ってあなたの戦略をテストして,歴史データであなたの戦略がどのように収益を上げているかを確認できます. もちろん,反省結果は参照のみです. FMZ定量化プラットフォームは,デジタル通貨現金,先物,BitMEX永続契約,商品先物,その中,デジタル通貨が主に主流の品種をサポートする反省をサポートします.
Javascriptの反射はブラウザで行われ,Pythonの反射はホストで必要であり,プラットフォームが公共のホストを提供する.Mac言語の反射は,さらに多くのパラメータを設定する必要があります.具体的には,Mac言語のドキュメントを参照してください.
反射メカニズム
onbar反測機構は,K線に基づいている.すなわち,各K線は反測時間点を生成し,この時間点では,現在のK線の高開低収収価格,取引量などの情報,およびこの時間点以前の歴史的K線情報を取得することができる.この機構の欠点は明らかである:K線で,一回のみの買取,通常はK線の収束価格がベースとなる.また,一K線は,高開低収価格の4回のみを取得することができる.それゆえ,一K線内の価格がどのように変化するか,最高価格が最初に起こったか,最低価格が最初に起こったかなどなど,情報を得ることはできません.例えば,1時間K線から,リアルタイムで,数秒ごとに動作情報を確実に取得し,取引指令は,取引の終了を待つのではなく,取引の終了を待つこともできます.Konbarの反測機構は,非常に簡単で,理解しやすい反測速度である.
FMZプラットフォームの反測は,模擬回測と实体回測の2種類である.模擬回測は,基底K線周期に基づいて模擬のtickを生成し,基底K線周期ごとに14の反測時間点を生成し,**リアルディスクレベルは,リアルに集めたtickで,数秒ごとに1回程度で,現在,部分的にリアルな深さ (※20ファイルを含む) をサポートしており,リアルな単筆取引が行われています.**データの量が多いため,追及速度が遅いため,特に長い時間を追及することができない.FMZの追及機構は,戦略を1つのKラインで複数回取引させ,收収価格の取引を回避する状況をより精密に兼ね追及速度を考慮することができる.具体的説明は参照してください:https://www.fmz.com/digest-topic/4009
回帰の策略の枠組みは,リールディスクと同じで,すべて死循環である. 回帰は,異なる回帰点にジャンプするので,このとき,Sleepを使わずに,一回転の終わりに自動的に次の時間点にジャンプする. しかし,Pythonは,プログラムメカニズムのために,強制的にSleep(10)交通事故が起きないように
撮影した写真
回測エンジンは,ユーザの下落価格と回測時間点の口コミ価格を合わせ,買値が売値より高い場合,売値に取引する.取引ができない場合は,掛札が生じます.取引を保証するために滑り点を加える必要があります.取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引ができない場合,取引が停止される場合,取引が停止される場合.
ページの設定を反射する
-
- 回顧ページの選択,左側は戦略編集ページ。
-
- 回測開始終了時間.データが不完全であるため,回測はデータのある時間から直接開始する可能性がある.
-
- 振り返り
GetRecords()函数のデフォルト周期は,周期パラメータをコードで指定することもできます.
- 振り返り
-
- 追跡メカニズムの選択
-
- 多反射設定を表示または隠す.
-
- 最大のログ数,収益データ数,グラフデータ数など,データ量が多すぎるとブラウザが停止するのを防ぐために.
-
- 底層tickはK線周期に基づいて生成される.
-
- 取引の滑り点
-
- 容認性: API 要求のエラーを模倣し,策略容認性をチェックする.
-
- 走行アイコンが描かれていないか,反測でTA指数関数を使用した場合は,アイコンに表示され,買い物もマークされます.
-
- 手数料の設定
-
- エクスチェンジ - 取引ペアと資産を追加する
-
- 回測パラメータ設定,パラメータが数値である場合,一鍵の最適化パラメータもサポートし,一定範囲に従って自動的に参数回測を巡る.
リアルディスクとは異なる
-
- 回測時に有効な行情はGetTickerとGetRecordsのみで,その他の深度や取引履歴は真ではない ((データ量が大きいため,リールディスクレベルの回測は現在これらのデータをサポートしているが,最近のデータのみである))
-
- 追溯 追加された取引所は,独立アカウントであり,現在,交換取引ペアをサポートしていません. したがって,一つのアカウントで2つの取引ペアを操作することはできません.
-
- 回測ではネットリクエストが使えません.
-
- 反測は,IO拡張を使用できず,最も基本的なAPIのみを操作できます.
-
- 回測は標準的なデータしか得られず,Infoのような固定ディスクのデータには存在しません.
-
- 返品では不取引が起こりうるので,注文の凍結に注意してください.
-
- 商品期貨の反測は市場価格表を支持しない.
政策の容認と常識的な誤り
前述したように,リールディスクでAPIインターフェースを使用すると,アクセスが失敗して戻ってくる可能性があります.nullこのデータを使うと,エラーが発生し,ディスクが停止するので, 容認性を持つようにしましょう.
誤差を許容する
原因は,この写真の写真家です.
- API アクセス ネットワーク エラー,インターフェース アクセス オーバータイムが null を返します.この時点で使用するとエラーが返されます.
- 取引所の制限エラー,例えばip制限,注文精度,アクセス頻度,パラメータエラー,資産不足,市場が取引できない,取引済みの注文を撤回するなど. 具体的にはエラーコードに基づいてAPI文書を閲覧できます.
- エクスチェンジがデータエラーを返却し,空の深さ,遅れたアカウント情報,遅れた注文状態など,時折発生する.
- プログラム論理エラー
API を使う前に,null になるかどうかを判断する必要があります.以下は,集中的によく使用される方法について説明します.
//1.判断为null进行处理
var ticker = exchange.GetTicker();
while(ticker == null){
Log('ticker 获取出错');
ticker = exchange.GetTicker();
}
Log(ticker.Last);
// 2.判断不为null再进行引用
var ticker = exchange.GetTicker();
if(!ticker){
Log(ticker.Last);
}
// 3._C()函数重试
var ticker = _C(exchange.GetTicker);
Log(ticker.Last);
// 4. try catch容错
try{
var ticker = exchange.GetTicker();
Log(ticker.Last);
}
catch(err){
Log('ticker 获取出错');
}
誤った情報を得たいなら,GetLastError(),は,エラー処理の差分処理を行うために,最後のエラーメッセージの文字列を返します.
FAQ
フォーラムのトピックには,よくあるエラーがいくつか集約されています. https://www.fmz.com/bbs-topic/1427 ≫ ↓ ↓ ↓ ↓ ↓ ↓
保護者の配置はどのように行われますか?
詳細は"管理者を追加する"のページにあります.
ブログを書き換えるための策略を 探すことができるでしょうか?
https://www.fmz.com/marketsのサイトでは,代写サービスやグループでの相談が提供されています.
すべてのインターフェースへのアクセスにタイムアウトが表示されます
取引所のインターフェースの超時にアクセスする場合は,偶発的に発生しても問題なく,ネットワークがアクセスできないことを常に提示している場合は,海外サーバーを使用する必要があります.
ERR_INVALID_POSITION エラー
回測システムはエラーを報告し,一般的には戦略にエラーを書き込み,保有量がない場合や保有量不足の場合,平定を試みると,このエラーが発生する.
symbol not set
期貨取引所の反省,コードには契約が設定されていません. exchange.SetContractType関数を参照してください.
BITMEX 429 エラー,{"error":{"message":"Rate limit exceeded retry in 1 seconds ......"}}
取引所のインターフェースへのアクセス頻度が高すぎる.
{"status":6004,"msg":"timestamp is out of range"}
サーバのタイム<unk>の範囲を超えた場合は,サーバーの時間を更新する必要があります. 偏差は大きすぎません.
GetOrder(455284455): Error: invalid order id or order cancelled.
取引所が注文をキャンセルした場合,取引所はこの注文の情報を維持していないので,取得できません.
GetOrders: 400: {"code":-1121,"msg":"Invalid symbol."}
不正取引ペア,取引ペアの設定が間違っていないか確認してください.
Secret key decrypt failed
API KEY解析失敗.APIKEYを設定した後にFMZパスワードを変更した場合は,FMZで取引所ページを追加して取引所APIKEYを再設定してみてください.
Signature not valid: Invalid submission time or incorrect time format [送信時刻の誤り,またはタイムフォーマットの誤り
Linux サーバーを使用することをお勧めします. または,この問題が発生した Windows システムでは,同期ソフトウェアをインストールしてください.
なぜグローバル代理店を設定し,管理者は取引所のAPIにアクセスできないのか?
グローバル代理には代理ホストのネットワークポートがありません.遅延の問題のため,海外サーバーを配置したホストが最適です.
FMZでアップされるのではなく,現地で保存する戦略は?
Python を使用すると,現地ファイルをインポートし,FMZ の API に基づいて書かれたポリシーを正常にファイルとして保存し,実行の経路の下に自分のサーバーに保存し,実行を直接読み取ることができます.
#!python2.7
def run(runfile):
with open(runfile,"r") as f:
exec(f.read())
def main():
run('my.py')
エクスチェンジのテストネットを使用するか,APIのアドレスを変更する方法
exchange.SetBase () を使用して,直接対応するAPIベースアドレスに切り替えることができます.例えば:
exchange.SetBase("https://www.okex.me")
我是看1分钟k线图操作的,所以Python死循环的sleep time 可以设置为0.1s,也就是sleep(100)吗,我看你其中写过一个sleep(10),也就是0.1s不会超过huobi HM的API限制吗?
exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
这儿我试了OKex的永续合约,如果设置成 sell,直接开空了,平不是平多
是我错了。。。
exchange.Buy(-1, 0.5),交易对是ETH_BTC,市价单代表买入0.5BTC的ETH
exchange.Buy(price, 0.5),如果是这种限价单,则代表用price的价格买入 0.5ETH
- 1







