[TOC]

基本 指示

スタート

FMZの量子取引プラットフォームは何ができるのか?

FMZ Quant Tradingプラットフォームは,定量取引の分野で最もプロの定量コミュニティです.ここで定量戦略を学び,書き,共有,購入,販売することができます.オンラインバックテストを実施し,シミュレーション取引を行うシミュレーションボットを使用できます.また,実行,公開,ライブ取引を見ることができます.私たちはほとんどすべての主流のデジタル通貨取引所をサポートします.

トゥートリアル の 完全 シリーズ

グラフィック・チュートリアル:

Telegram グループ内の管理者に連絡してください (テレグラム基本的には,質問にすぐに答えられます.

開発支援のためのChatGPTの支援

開発支援ツールとしてChatGPTを採用しました. 開発支援ツールとして,ChatGPT 補助ツールページ.

私の戦略を実装するために利用できるプログラミング言語は?

FMZ Quant トレーディング プラットフォームは,使用をサポートしますJavaScript, TypeScript, Python, C++, Pine MylanguageそしてBlockly Visualization戦略を書き,デザインする

サポートしていますTypeScript言語,まだそれを設定しますJavaScript戦略を書き出すとき,// @ts-checkまたはボタンをクリックします.TypeScript戦略編集領域の右上の隅にTypeScriptプラットフォームはコードを認識します.TypeScript自動で作成し,適切なコンパイルとタイプチェックのサポートを提供します.

  • タイプ安全:TypeScriptコードを書くときに潜在的なエラーを見つけ,コードの質を改善するのに役立ちます.
  • 自動コードの記入:TypeScript開発効率を向上させています. ソフトウェアの設計は,
  • より明確なコード構造:TypeScript簡単に読みやすく理解できるようにします 簡単に読みやすく理解できるようにします
  • 強力なオブジェクト指向プログラミング機能:TypeScriptインタフェース,クラス,ジェネリックなど 強力なオブジェクト指向プログラミング機能を提供し より堅牢で再利用可能な戦略コードを書くのに役立ちます

この言語の1つしか習得する必要はありません.コードを書くことで戦略をデザインする方法をサポートすることに加えて,ビジュアルモジュール (Blockly) を使用して戦略を作成することもできます. ビジュアライゼーションモジュールスペイリングと戦略構築は,コーディングなしで,戦略をデザインするより直感的な方法を採用しています. これは,プログラムおよび定量的な取引を迅速に開始するために戦略設計に興味を培うのに非常に適しています.

Blockly視覚化チュートリアル:

設定するPythonインタープリターPython戦略プログラム

戦略はPython,バックテストやライブ取引の際に,ドッカーシステム環境が両方を持っている場合パイソン2そしてパイソン3設定することができます.Python戦略の第"行に実行時に開始されるバージョン,例えば#!python3そして#!python2絶対的な経路も指定できます 例えば:#!/usr/bin/python3.

ドッカーとは?

Docker は,複雑なデータリクエスト,データ受信,ネットワークリンク,ログポストバックなどに対して責任を負う取引戦略の実行者として理解することができます. FMZ Quant Trading プラットフォームのウェブサイトにネットワーク障害がある場合でも,Docker はサーバー上で実行されます.Linux, ウィンドウ, マック OS, アンドロイド, ラスベリーパイ ARM Linux他のシステムですドッカーページ, Linux ドッカー インストールと更新手順. ボットとログは,ドッカーによって管理されているディレクトリに保存されます./logs/storageファイルはSqliteデータベースファイルdb3直接編集することができます.Sqlite拡張子を持つファイルdb3本物のボットデータベースでは ファイル名はボットIDです

サポートされているプロトコル

  • ブロックチェーンの資産: 50以上の主流のブロックチェーン資産 (暗号通貨) の取引所は,現在当社のプラットフォームでサポートされています.
  • 一般プロトコル アクセス:一般議定書

戦略安全保障

FMZ Quant Trading プラットフォームで取引戦略が開発されたとき,戦略の内容は FMZ のアカウント保有者にのみ表示されます.そして FMZ の量的な取引プラットフォームでは,戦略コードの完全なローカリゼーションを達成できます.例えば,戦略論理は,Python戦略コンテンツのローカリゼーションが実現できるようにします.

セキュリティPythonコード: なぜならPython戦略は個人用ではなく,レンタル用である場合, 戦略を自分のデプロイドーカーで実行し,サブアカウントまたは完全なドーカー管理の形でレンタルすることができます.

暗号化されているPython戦略コード: 標準ではPython策略コードは作者が使用するときに暗号化されず 他人に貸し出されると暗号化されます このコードを編集することでPython戦略コードを個人使用またはレンタのために暗号化するかどうかを指定できます.Python戦略コードの暗号化をサポートするバージョンは以下のとおりです.Python 2.7, Python 3.5そしてPython 3.6.

  • 戦略の作成者は自分で実行し,登録コードを通じて他の者が使用できるように戦略コードを暗号化します. 指定する#!pythonPython インタープリタのバージョンとして,それから使用,暗号化コマンドを入力しますencrypt. バージョンを指定しない場合Python追加する#!,encrypt directly.
 #!python,encrypt

それとも

  #!encrypt
  • 戦略の作成者が自分のために実行し,登録コードを通じて他者と共有するときに,戦略コードを暗号化しません:
  #!python, not encrypted

それとも

  #!not encrypted

コードを使用os.getenv('__FMZ_ENV__')文字列の返信"encrypt"本物のボットにのみ有効で,バックテストでは暗号化されません.Python戦略コード

#!encrypt
def main():
    ret = os.getenv('__FMZ_ENV__')
    # If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid. 
    Log(ret, ret == "encrypt")

鍵 の 安全

FMZ Quant トレーディングプラットフォームで設定されたアカウント情報や暗号化された文字列などの機密データは,ウェブブラウザで暗号化されています. FMZ Quant トレーディングプラットフォームに格納されているすべての情報は暗号化されています (平文データではありません),ユーザーの個人デバイスのみが情報を暗号化して使用することができ,機密データのセキュリティが大幅に向上します. 戦略コード,パラメータ設定,戦略説明などに他の機密情報が含まれている場合は,戦略を公開または販売しないでください.

  • 取引口座情報や秘密鍵などの 機密情報のローカル化設定をサポートします プラットフォームが交換情報を設定するページでは,マスクを持つ暗号化されたテキストボックス制御はすべて,dockerのローカルファイルをロードするためのファイル経路の設定方法をサポートします.RSA KEY交換の認証方法を例として,ドッカープログラムが位置するデバイス上で,機密情報をローカルに設定する方法について詳細に説明します.
  1. RSAの公開鍵とプライベートキーを作成します.例えば,PKCS#8作成には多くのツールがあります.openssl.
  2. 作成するRSA KEY公開鍵をアップロードしますステップ 1創造の過程で
  3. 作成したプライベートキーを保存ステップ 1形式で同じディレクトリでドッカーtxtドッカープログラムのディレクトリにある他のパス.
  4. FMZ プラットフォームで交換を構成するときに,RSA KEY設定の編集ボックスで交換によって作成Access Key.
  5. FMZプラットフォームで交換を構成するときに,txtファイルは,同じレベルのディレクトリに配置されていますステップ3設定の編集ボックスでSecret Key例えば,ファイル名として:rsaKey.txtファイルとドーカーは同じレベルのディレクトリに記入されます:file:///rsaKey.txt. ファイルがdockerプログラムのディレクトリの隣にあるディレクトリにある場合rsa_key記入する:file:///rsa_key//rsaKey.txt位置を決めるならrsaKey. txtこのファイルは,ドッカーに関して同じレベルのディレクトリまたはサブディレクトリにのみ配置できるので注意してください.

秘密鍵を保存するより安全になります.ビデオ説明詳細な処理のために

バックテストシステム

バックテストシステムとは何か? 何のために使われますか?

定量的な取引戦略の設計を完了した後,戦略の論理や戦略の収益の方向などの戦略の基本状況をどのように知ることができますか? もちろん,我々は実際の取引市場で戦略を実行するために直接実際のお金を使用することはできませんが,我々はあなたの戦略をテストし,歴史的なデータであなたの戦略の利益を知るために歴史的なデータを使用することができます.

バックテストシステムのデータは正確ですか? バックテストの結果の正確さは?

FMZ Quant Trading プラットフォームはバックテストシステムを実際の市場レベルそしてシミュレーションレベルリアル・マーケット・レベルは,完全な歴史的データに基づいて完全にバックテストする. シミュレーション・レベルはバックテストを生成する.tick両方とも実際の歴史的データに基づいていますが,実際の市場レベルのデータはより正確で,結果はより信頼性があります.FMZ バックテスト メカニズムの説明しかし,バックテストは,歴史的なデータに基づいて戦略のパフォーマンスにすぎない.歴史的なデータは将来の市場を完全に表現することはできません.歴史的な市場は繰り返される可能性があります.またはブラック・スワンにつながることもあります.したがって,バックテスト結果は合理的かつ客観的に扱われるべきです.

異なるプログラミング言語戦略をバックテストする際に注意すべき事項:

バックテストJavaScriptそしてC++実際の市場ボットまたはウェックスアプリリアル市場 (つまり,ウェックスアプリFMZ Quant Tradingプラットフォームのエミュレーション交換) は,他のソフトウェア,ライブラリ,モジュールをインストールすることなく実行されます. バックテストパイソンFMZ Quant Trading プラットフォームによって追加された公共サーバーで実行され,またユーザー自身のdockerで実行することもできます.実際の市場操作とバックテストの両方がパイソンドッカーが位置するシステムにインストールされます.いくつかのライブラリが必要であれば,手動でインストールする必要があります (公共サーバーでは一般的なライブラリのみがサポートされています).

システム内のバックテストデータ

FMZ Quant Trading プラットフォームのバックテストには,シミュレーションレベルバックテストとリアル市場レベルバックテストの2種類があります.シミュレーションレベルバックテストは,シミュレーションされたバックテストを生成します.tick各Kライン期間が12回バックテストの時間点を生成します.しかし,実際の市場レベルはticksFMZのバックテストメカニズムは,取引戦略が単一のKラインで複数回取引できるようにし,取引が閉じる価格でのみ実行できる状況を回避する.バックテストの速度を考慮しながらより正確です.詳細な説明については,参照してくださいリンク.

バックテストシステムにおける戦略DEBUG方法

JavaScript 戦略 バックテスト Chrome DevTools のデバッグ

バックテストシステムでサポートされる交換

  • 暗号通貨 (暗号通貨)

    名前 タイプ 指示
    ビットフィネックス スポット交換対象 限られた取引対のサポート,例えば:BTC_USD, ETH_USDそしてLTC_USD取引対のコート通貨はUSDドル)
    バイナンス スポット交換対象 限られた取引対のサポート,例えば:BTC_USDT, ETH_USDT, ETH_BTCそしてLTC_BTCなど
    OKX スポット交換対象 限られた取引対のサポート,例えば:BTC_USDT, ETH_USDT, ETH_BTCそしてLTC_BTCなど
    ハウビー スポット交換対象 限られた取引対のサポート,例えば:BTC_USDT, ETH_USDT, ETH_BTCそしてLTC_BTCなど
    OKX フューチャー フューチャー取引対象 限られた取引対のサポート,例えば:BTC_USDそしてETH_USD取引対のコート通貨はUSD特定の契約コードの設定後 (関数を参照してください)exchange.SetContractType契約のコードは以下のとおりです.this_week, next_week, quarterそしてswap
    HuobiDMについて フューチャー取引対象 HuobiDMは Huobi Futures (Huobi Contract) で,以下のような限られた取引ペアをサポートしています.BTC_USDそしてETH_USD取引対のコート通貨はUSD特定の契約コードの設定後 (関数を参照してください)exchange.SetContractType契約のコードは以下のとおりです.this_week, next_week, quarterそしてswap.
    ビットメックス フューチャー取引対象 取引相手はXBT_USD特定の契約コードの設定後 (関数を参照してください)exchange.SetContractType契約のコードは次のとおりです.XBTUSD
    ビナンス・フューチャーズ フューチャー取引対象 限られた取引対のサポート,例えば:BTC_USDTそしてETH_USDT取引対のコート通貨はUSD特定の契約コードの設定後 (関数を参照してください)exchange.SetContractType契約は,USDT- マージン契約; サポートされた契約コードはswap
    デリビットオプション フューチャー取引対象 取引対は次のとおりです.BTC_USDそしてETH_USD特定の契約コードの設定後 (関数を参照してください)exchange.SetContractType契約は暗号保証契約である.特定のオプション契約コードを設定する必要があります.

    バックテストシステムにおける先物取引の場合は,戦略コードでは一時的に取引ペアを変更することがサポートされません.

シミュレーションレベル

バックテストは,バックテストシステムの基となるK線データに基づいて,特定のアルゴリズムに従って,与えられた基となるK線バーの最高価格,最低価格,開盤価格,閉盤価格の枠組み内でティックデータをシミュレートします.データはリアルタイムで返します.tickインターフェースが要求されたときのデータです.詳細については,以下を参照してください:FMZ量子シミュレーションレベル バックテスト メカニズム説明.

リアル市場レベル

実際の市場レベルバックテストは,実際のtickバール時間列のレベルデータtick実際の市場レベルバックテストでは,tickデータとは,シミュレートされたデータではなく,実際の記録データです. 深度データ,市場取引の記録データ再生,カスタム深度,および各個別取引データをサポートします. リアルマーケットレベルのデータバックテストの最大サイズは最大50MBまでであり,データセットの上限内のバックテスト時間範囲に制限はありません. バックテストの時間範囲をできるだけ拡大する必要がある場合は,深度設定ギアの値を減らすことができ,バックテストの時間範囲を増やすために各個別取引データを使用しないでください.GetDepth,GetTradesタイムラインの市場データで,電話GetTicker,GetTrades, GetDepthそしてGetRecordsバックテストのタイムラインで時間が移動するときに,時間を複数回プッシュしない (次の市場データ瞬間へのジャンプを誘発しない).上記の機能の1つへの繰り返し呼び出しは,バックテストのタイムラインに移動するためにバックテスト時間をプッシュする (次の市場データ瞬間へのジャンプ).バックテストのために実際の市場レベルを使用する場合,以前の時間を選択することが推奨されません.早期の時間帯には実際の市場レベルのデータがない可能性があります.

市場レベルバックテストは,現在:

  • バイナンス
  • OKX (OKXスポット)
  • HuobiDM (フウビ・フューチャーズ)

バックテストシステムパラメータ最適化

FMZ Quant Tradingプラットフォームのバックテストシステムのパラメータ最適化機能は,バックテスト中に各パラメータ最適化オプションに従って最適化を設定することであり,オプションは以下のように示されています.

  • 最低値:パラメータの初期値を制限する.
  • 最大値: 漸進的な変更の後,パラメータの最大値を制限する.
  • ステップサイズ:パラメータのインクリメンタル変数量.

パラメータの組み合わせを生成し,すべての組み合わせをバックテスト (すなわち,各パラメータの組み合わせを1回バックテスト) に渡る.番号バックテストシステムで最適化できます.

例えば,バックテストページのパラメータ最適化オプションを設定します:

img

パラメータ最適化モードのバックテスト:

img

バックテスト設定を保存

戦略編集ページでは,Backtest (すなわちバックテストシステム) のページ付けで,戦略をバックテストするために,バックテスト設定や戦略パラメータなどのオプションを設定できます.バックテスト設定は,バックテスト時間範囲,交換プラットフォーム,スリップポイント,サービス料金などを指します.戦略パラメータは,戦略のパラメータオプションを設定するために使用されます. 戦略設定がすべて設定されると,設定に従って戦略をバックテストすることができます. では,これらの設定した設定を次のバックテストで使用するためにどのように保存しますか (ページをリフレッシュする際に設定されたオプションはリセットされます). 戦略ページ上のSave Settingsボタンをクリックすると,すべてのバックテスト設定 (バックテスト戦略設定やパラメータ設定を含む) は,テスト戦略のソースコード形式で記録されます. 戦略ページを開いてバックセットに切り替えたら,テスト戦略のコードに記録された設定情報は自動的にバックセットになります.

img

持ってJavaScriptソースファイルに設定を保存します.

img

ソースファイルにBacktest設定を保存するJavaScript, Python, cppそしてMylanguage:

/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

ミランゲージ:

(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)

カスタムデータソース

システムでは,GETバックテストのための外部データソースを取得するためにカスタム URL (公開アクセス可能な URL) を要求する方法.追加の要求パラメータは以下のとおりです.

パラメーター 意味 解説
シンボル シンボルの名前 BTC_USD_OKCoin_EN など
イード 交換 OKCoin_EN など
丸い 価格の正確性 返したデータに表示される価格を 1000 で掛け,丸める必要があります.
周りに 量 の 正確性 返されたデータに含まれる金額は100で掛け,丸める必要があります.
期間 バールピリオド (ミリ秒) "分を要求するバーを表示します
深さ 深度レベル 1-20
ビジネス データを分割する必要性 true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false
について 開始時間 UNIX タイムスタンプ
ありがとうございました 終わり の 時 UNIX タイムスタンプ

注記:

Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.

縫ったデータの一例:

http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200

返された形式は次の2つの形式の1つでなければならない (システムによって自動的に認識される):

普通のバーレベルバックテスト

{
    "schema":["time","open","high","low","close","vol"],
    "data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}

Tickレベルバックテストデータ (市場深度情報を含む,深度フォーマット [価格,ボリューム] の配列.複数の深度レベルがある可能性があります. Asksは価格上昇順序,そして Bidsは価格逆順序を指します.)

{
    "schema":["time","asks", "bids","trades","close","vol"],
    "data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}

記述

フィールド 記述
スキーマ データ配列の列の属性を指定し,文字が小さいため,time,open,high,low,close,vol,asksおよびbidsに限定されます.
データ スキーマによるデータを格納する配列

データ形式

フィールド 記述
要求/申し出 [価格,量...]
取引 [時間,方向性 (0:買い,1:売る),価格,数量...]

資金提供率のデータ提供:

例えば,Binance Futuresのバックテストを行うとき,カスタムデータソースによって提供される資金提供率の追加のデータが必要です.例えば,Binance Futuresのバックテスト中に要求された資金提供率のデータ構造は以下のとおりです.

{
  "detail": {},
  "symbol": "futures_binance.eth_usdt.funding",
  "schema": ["time", "open", "high", "low", "close", "vol"],
  "data": [
    [1582876800000, 25289, 25289, 25289, 25289, 0],
    [1582905600000, 30522, 30522, 30522, 30522, 0],
    [1582934400000, 40998, 40998, 40998, 40998, 0],
        ...
    [1626652800000, 198, 198, 198, 198, 0],
    [1626681600000, 691, 691, 691, 691, 0],                  // The adjacent periodic interval is 8 hours
    [1626710400000, 310, 310, 310, 310, 0],                  // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
    [1626739200000, 310, 310, 310, 310, 0],                  // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310 
    [1626768000000, -41610, -41610, -41610, -41610, 0],      // The funding rate might be a negative value
    [1626796800000, -5125, -5125, -5125, -5125, 0],
        ...   
    [1627977600000, 10000, 10000, 10000, 10000, 0]
  ]
}

バックテストシステムからのデータ要求の例:

http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400

カスタムデータソースの例:

データ源,URLを指定するhttp://xxx.xx.x.xx:9090/dataデータベースをカスタマイズします.

package main 
import (
    "fmt"
    "net/http"
    "encoding/json"
)

func Handle (w http.ResponseWriter, r *http.Request) {
    // e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
    // r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "schema":["time","open","high","low","close","vol"],
            "data":[
                [1564315200000,9531300,9531300,9497060,9497060,787],
                [1564316100000,9495160,9495160,9474260,9489460,338]
            ]
        }
        */
        ret := map[string]interface{}{
            "schema" : []string{"time","open","high","low","close","vol"},
            "data" : []interface{}{
                []int64{1564315200000,9531300,9531300,9497060,9497060,787},
                []int64{1564316100000,9495160,9495160,9474260,9489460,338},
            },
        }
        b, _ := json.Marshal(ret)
        w.Write(b)
    }()
}

func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

テスト戦略JavaScript例:

/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/

function main() {
    var ticker = exchange.GetTicker()
    var records = exchange.GetRecords()
    Log(ticker)
    Log(records)
}

バックテストシステム内のカスタムデータによって描かれたチャート:

戦略 印刷情報:

ローカルバックテストエンジン

FMZ Quant トレーディングプラットフォームは,JavaScript翻訳とPythonローカルバックテストエンジンのバージョン,サポート設定基となるK線期バックテスト中に

バックテストページショートカットキー

  • 戦略 編集 ページと バックテスト ページを切り替えるショートカットキー

    鍵を使うCtrl +,キーを押して ページに戻るCtrlキーを押して,.

  • 節約戦略のショートカットキー

    鍵を使うCtrl + s戦略を救うために

  • 戦略バックテストを開始するためのショートカット

    鍵を使うCtrl + bBacktestを開始するを有効にする

コード説明

入力機能

機能名 記述
main() これは入力関数です.
onexit() 通常終了時,最大実行時間は5分であり,未申告のまま残すことができます.タイムアウトが発生した場合,中断するエラーが報告されます.
onerror() 実行時間は5分で,宣言されないまま残すことができます.Pythonそしてcppこの機能をサポートしません.
init() 実行開始時に自動的に呼び出されます. 宣言されないまま残すこともできます.
  • 記述:
    1. バックテストシステムでは機能がサポートされていませんonerror().
    1. この関数はonerror()ボットで起動します.onexit()触発されることはありません

一出 (onexit))

onexit()処理作業は,最大5分で,使用者が実現します.

function main(){
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)
}

// onexit function implementation
function onexit(){
    var beginTime = new Date().getTime()
    while(true){
        var nowTime = new Date().getTime()
        Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
        Sleep(1000)
    }
}
import time 
def main():
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)

def onexit():
    beginTime = time.time() * 1000
    while True:
        ts = time.time() * 1000
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
        Sleep(1000)
void main() {
    Log("Start running, stop after 5 seconds, and execute onexit function!");
    Sleep(1000 * 5);
}

void onexit() {
    auto beginTime = Unix() * 1000;
    while(true) {
        auto ts = Unix() * 1000;
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
        Sleep(1000);
    }
}

開始する

ユーザが初期化関数を実装するinit()自動で実行します.init()初期化タスクを完了する戦略の開始時に

function main(){
    Log("The first line of the code executed in the program!", "#FF0000")
    Log("Exit!")
}

// Initialization Function
function init(){     
    Log("Initialization!")
}
def main():
    Log("The first line of the code is executed!", "#FF0000")
    Log("Exit!")

def init():
    Log("Initialization!")
void main() {
    Log("The first line of the code is executed!", "#FF0000");
    Log("Exit!");
}

void init() {
    Log("Initialization!");
}

間違えました.

機能の実行onerror()この機能は,Exception が発生すると起動します.Pythonそしてcpp.

function main() {
    var arr = []
    Log(arr[6].Close)
}

function onerror() {
    Log("error")
}
# not supported by python 
// not supported by C++ 

クラシック戦略の枠組み

戦略はJavaScript, PythonそしてcppについてSleep()この機能は,これらの戦略のメインループで呼び出す必要があります. バックトラッキング速度を制御するために使用されます. ボットでは,戦略投票間隔を制御するために使用されます. また,交換のAPIインターフェースにアクセスする要求頻度を制御します.

  • 仮想通貨戦略の基本枠組み例:

    function onTick(){
        //Write strategy logic here, and it will be called constantly, such as printing market information
        Log(exchange.GetTicker())
    }
    
    function main(){
        while(true){
            onTick()
            //The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently 
            Sleep(60000)
        }
    }
    
    def onTick():
        Log(exchange.GetTicker())
    
    def main():
        while True:
            onTick()
            Sleep(60000)
    
    void onTick() {
        Log(exchange.GetTicker());
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(60000);
        }
    }
    

    100の価格と 1の量で毎秒取引所で購入オーダーをします. これを次のように書きます.

    function onTick(){
        // It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
        exchange. Buy(100, 1)
    }
    
    function main(){
        while(true){
            onTick()
            // The pause period can be customized in millisecond (1 second = 1000 milliseconds)
            Sleep(1000)
        }
    }
    
    def onTick():
        exchange.Buy(100, 1)
    
    def main():
        while True:
            onTick()
            Sleep(1000)
    
    void onTick() {
        exchange.Buy(100, 1);
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(1000);
        }
    }
    

テンプレートライブラリ

についてテンプレートライブラリFMZ Quant Trading プラットフォームの再利用可能なコードモジュールで,取引戦略コードのカテゴリとして動作します.テンプレートライブラリ,当面 FMZ Quant Trading プラットフォームにログインしているアカウントの"戦略"ページにテンプレートが追加されます.作成後,カテゴリーを通常の戦略に変更することはもはやできません.

テンプレートライブラリJavaScript:

img

テンプレートライブラリPython:

img

テンプレートライブラリcpp:

img

  • テンプレートライブラリの輸出機能 エクスポート関数は,テンプレートライブラリのインターフェース関数であり,テンプレートライブラリを参照する戦略で呼び出すことができます.テンプレートライブラリにおける輸出関数の宣言と実装の例コードは以下のとおりです:

    /*
    -- This method is called directly with $.Test() after the strategy refers to the template
    -- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
    */
    $.Test = function() {
        Log('Test')
    }
    
    function main() {
        $.Test()
    }
    
    def Test():
        Log("template call")
    
    # Export "Test" function; the main strategy can be called by ext.Test()
    ext.Test = Test 
    
    // The strategy refers to the template and calls this method directly with ext::Test()
    void Test() {
        Log("template call");
    }
    
  • テンプレートライブラリパラメータ テンプレートライブラリは,独自のインターフェースパラメータを設定することもできます.

    テンプレートライブラリパラメータ設定:

    img

    テンプレートライブラリコード:

    $.SetParam1 = function(p1) {
        param1 = p1
    }
    
    $.GetParam1 = function() {
        Log("param1:", param1)
        return param1
    }
    
    def SetParam1(p1):
        global param1
        param1 = p1
    
    def GetParam1():
        Log("param1:", param1)
        return param1
    
    ext.SetParam1 = SetParam1
    ext.GetParam1 = GetParam1
    
    void SetParam1(float p1) {
        param1 = p1;
    }
    
    float GetParam1() {
        Log("param1:", param1);
        return param1;
    }
    

    戦略コードを参照してください.テンプレートライブラリ上記の例:

    function main () {
        Log("call $.GetParam1:", $.GetParam1())
        Log("call $.SetParam1:", "#FF0000")
        $.SetParam1(20)
        Log("call $.GetParam1:", $.GetParam1())
    }
    
    def main():
        Log("call ext.GetParam1:", ext.GetParam1())
        Log("call ext.SetParam1:", "#FF0000")
        ext.SetParam1(20)
        Log("call ext.GetParam1:", ext.GetParam1())
    
    void main() {
        Log("call ext::GetParam1:", ext::GetParam1());
        Log("call ext::SetParam1:", "#FF0000");
        ext::SetParam1(20);
        Log("call ext::GetParam1:", ext::GetParam1());
    }
    

    img

  • 引用 テンプレートライブラリ

    戦略編集ページのテンプレート列の参照を確認した後,戦略を保存します.

    img

組み込み構造

グローバル変数

交換

Exchange交換オブジェクトとして考えることができる.デフォルトでは,戦略パラメータに追加された最初の交換オブジェクトとして考えられる. 交換とのすべてのデータ相互作用は,このオブジェクトの機能を通じて実現される.

  • Backtest に交換オブジェクトを追加する

  • Botページに交換オブジェクトを追加する

追加された交換対象は,exchangeコード内のオブジェクト:

function main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
交換

すべての交換オブジェクトを格納する配列として理解できますexchange交換オブジェクト,複数の交換オブジェクトを含むことができる.exchanges[0]exchange.

追加された交換対象は,exchanges[0], exchanges[1], exchanges[2]...戦略コードなどです

function main() {
    for(var i = 0; i < exchanges.length; i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
    }
}
def main():
    for i in range(len(exchanges)):
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
    for(int i = 0; i < exchanges.size(); i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
    }
}
注文の状況

属性StatusについてOrder structure.

常数名 定義 価値
ORDER_STATE_PENDING について 未完成 0
ORDER_STATE_CLOSED について 終わった 1
ORDER_STATE_CANCELED 削除しました キャンセル 2
ORDER_STATE_UNKNOWN オーダー_ステート_未知 未知の状態 (他の状態) 3

ORDER_STATE_UNKNOWN オーダー_ステート_未知ステータスは呼び出すことができますexchange.GetRawJSON()オリジナルの注文状態情報を取得し,交換ファイルをクエリし,特定の説明を表示します. 形式の定数名は,戦略コードで直接使用され,属性と比較できます.StatusについてOrder定数名を印刷すると,定数値が表示されます.常数名そしてそれに対応する同じように動作するので,これ以上詳細な説明はありません.

オーダー・トランザクションタイプ

属性TypeについてOrder structure.

常数名 定義 価値
ORDER_TYPE_BUY について 購入命令 0
ORDER_TYPE_SELL について 販売命令 1
ポジションタイプ

属性TypeについてPosition structure.

常数名 定義 記述 適用可能 価値
PD_LONG ロングポジション 暗号通貨の先物使用exchange.SetDirection("closebuy")閉じるポジションの方向を設定し,このタイプのポジションを閉じる 仮想通貨先物 0
PD_SHORT ショートポジション 暗号通貨の先物使用exchange.SetDirection("closesell")閉じるポジションの方向を設定し,このタイプのポジションを閉じる 仮想通貨先物 1
フューチャーズ ポジションの開設・閉じる方向性

属性OffsetについてOrder structure.

常数名 定義 価値
ORDER_OFFSET_OPEN について オープン・ポジション・オーダー 0
ORDER_OFFSET_CLOSE について クローズ・ポジション・オーダー 1
戦略パラメータ

取引戦略コードでは,戦略インターフェースに設定された戦略パラメータがグローバル変数として反映されます.JavaScript戦略インターフェースで設定または修正されたパラメータ値に直接アクセスできます.Python戦略はキーワードですglobal戦略の全体的な変数を修正するために必要である.

パラメータタイプ:

img

変数 記述 コメント タイプ デフォルト値 記述
番号 数字型 コメント 番号 (番号) 1 C++の戦略は浮動点字タイプです
文字列 文字列 コメント 文字列 (文字列) こんにちは FMZ デフォルト値は引用する必要はありません.入力は文字列として扱われます.
コムボックス コンボボックス コメント コムボックス (選択) 1|2|3 コムボックス変数自体は数値値で,コムボックスコントロールが選択した列のインデックスを表します.最初のコムボックスは1で,他のコムボックスは0で,
ボール チェックオプション コメント ブール式 (真/偽) 本当 チェックされている場合,変数 bool は true; チェックされていない場合,変数 bool は false
秘密文字列 暗号化された文字列 コメント 暗号化された文字列 (文字列) パスワード 文字列と同じ使い方で,暗号化された文字列は暗号化によって送信され,文字列で送信されません.
  • インターフェースパラメータは,戦略編集ページのコード編集セクションの下の戦略パラメータセクションで設定されています.
  • インターフェースパラメータは戦略コードでグローバル変数として存在し,つまりインターフェースパラメータはコードで修正できる.
  • 戦略コードのインターフェースパラメータの変数名 (上記の形式で表示):number, string, combox, bool, secretString.
  • 記述オプション: 戦略インターフェース上のインターフェースパラメータの名前.
  • 注記オプション: インターフェースパラメータの詳細な記述. マウスがインターフェースパラメータの上に移動しているときに説明が表示されます.
  • タイプオプション:インターフェースパラメータのタイプ.
  • デフォルト値オプション: インターフェースパラメータのデフォルト値.

パラメータ依存性設定: パラメータの選択に基づいて,別のパラメータが表示され,隠されるように設定することができます. たとえば,パラメータを設定します.numberAこの式は,数式で,numberAパラメータが表示されるか隠されるかisShowA変数を true と false にします.numberAインターフェースパラメータについて:numberA@isShowA.

img

このパラメータは,isShowAパラメータがチェックされていない場合numberAパラメータの値がコンボボックスの制御タイプに等しいかどうかを判断する,パラメータの依存部分です.インデックス値同じように,パラメータを取ります.isShowAパラメータに変数を設定すると,numberA@combox==2パラメータnumberAパラメータが表示されるか隠されるかcombox第3のオプションとしてチェックされます (インデックス0は第1のオプション,インデックス1は第2のオプション,インデックス2は第3のオプションです)

戦略インターフェースパラメータ,インタラクティブなコントロール,パラメータグループ機能のテンプレート: 追加するだけです(?First group)グループ化を開始するパラメータの説明の初め,次の図のように:

img

戦略を使用する場合は,パラメータはグループで表示されます:

img

パラメータのデフォルト値を保存: バックテスト中に,戦略パラメータのデフォルト値を保存したい場合は,Save settings戦略パラメータを変更した後にボタンを押します.

img

img

戦略パラメータ設定をコードで保存できます:

/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/

データ構造

いくつかの機能には,オリジナルのJSON呼び出し中に要求されたデータです.JSONデータが属性に格納されているInfoバックテストはプラットフォームインターフェースにアクセスしないため,バックテスト中に返されたデータは属性がないInfo以下は各データ構造の主要な属性の説明です.

貿易

すべての取引履歴を取得 (自分自身ではなく),関数によって返されるexchange.GetTrades().

{
    Id      : 9585306,          // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in 
    Time    : 1567736576000,    // Time (Unix timestamp milliseconds)
    Price   : 1000,             // Price
    Amount  : 1,                // Volume
    Type    : 0                 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}
ティッカー

市場コートは,関数で返される.exchange.GetTicker().

{
    Info    : {...},             // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    High    : 1000,              // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in 
    Low     : 500,               // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in 
    Sell    : 900,               // Sell price 1
    Buy     : 899,               // Buy price 1 
    Last    : 900,               // Last executed price
    Volume  : 10000000,          // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency  
    Time    : 1567736576000      // Millisecond-level timestamp
}
記録

標準OHLC構造は,K線とプロセス指標の計算と分析を描くために使用されます.exchange.GetRecords()構造の配列を返します.Record構造は1つのk線バーを表します.BAR.....TimeについてRecordK線バーピオードの開始時間です.

{
    Time    : 1567736576000,     // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
    Open    : 1000,              // Open price
    High    : 1500,              // Highest price
    Low     : 900,               // Lowest price
    Close   : 1200,              // Close price 
    Volume  : 1000000            // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
順序

命令構造は,関数によって返される.exchange.GetOrder()そしてexchange.GetOrders()機能についてexchange.GetOrders()構造の配列または空の配列を返します (配列がない場合)現在の未完成の注文返信する[](つまり,空の配列)

{
    Info        : {...},         // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    Id          : 123456,        // Unique ide