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

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

Pythonを使ってデータベースに直接書き込むことができます

function onexit(){
    _G('profit', profit)
}
function main(){
    _G("num", 1); // Set a global variable num, with a value of 1 second 
    _G("num", "ok"); // Change a global variable num, whose value is the string "ok"
    _G("num", null); // Delete the global variable num 
    _G("num"); // Return the value of the global variable num; if it does not exist, return null

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

_ N

価格とボリュームの精度は通常制御する必要があります. FMZは保存すべき小数点を決定するために _N関数を組み込みました._N(4.253,2)4.25 になります

_C

プラットフォーム API を呼び出すことは,アクセスが毎回成功することを保証することはできません. _C は自動再試行機能です.成功するまで常に指定された関数を呼び出す (null または false を返す場合,関数は再試行します);例えば,_C(exchange.GetTicker)復試間隔を制御するために _CDelay関数を呼び出すことができます. 例えば _CDelay(1000),これは _C関数の復試間隔を1秒に変更することを意味します.GetTicker(), exchange.GetDepth, GetTrade, GetRecords, GetAccount, GetOrdersそしてGetOrderアクセス障害によるプログラム中断を防ぐため

CancelOrder_C関数を使用できません. 命令のキャンセルに失敗する理由は様々なものがあります. 命令が実行された場合,命令のキャンセルが失敗を返します. _C関数を使用すると,常に再試しになります. _C関数はパラメータも渡し,カスタム関数でも使用されます.

function main(){
    var ticker = _C(exchange.GetTicker)
    var depth = _C(exchange.GetDepth)
    var records = _C(exchange.GetRecords, PERIOD_D1) // Pass in the parameters
}

_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 インディケーター 機能

一般的に使用されている指標機能の MA\MACD\KDJ\BOLL など,FMZプラットフォームに直接組み込まれている他の一般的な指標については,APIドキュメントで特定のサポートされた指標を見つけることができます.

インディケーター関数を使用する前に,K線の長さを判断するのが最善です.以前のK線の長さが計算に必要な期間を満たすことができない場合,結果は,null例えば,入力K線長が100で,MAを計算する期間が10である場合,最初の9つの値はすべてゼロであり,形式9値の後の計算は通常行われます.

JavaScript は,第三者のライブラリとして,完全な talib をサポートしています.talib.CCI(records)参照してくださいhttp://ta-lib.org/function.html. Pythonでは,タリブライブラリを自分でインストールできます.コンパイルする必要性があるため,単に pip を使用してインストールすることはできません.インストール方法を自分で検索できます.

配列の任意の配列を通過することができます.

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.max(), Math.abs()参照:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;
  • FMZが使っている第三者の数学ライブラリ;参照:https://mathjs.org/ ;
  • FMZ が使用する JavaScript のサードパーティのアンダースクロールライブラリで,知識を持つことが推奨され,退屈な Js 操作をより便利にします.参照:https://underscorejs.org/.

テンプレート

ボット戦略関数を書く際には,多くの状況が考慮する必要がある.例えば,5コインを購入するなどの単純な関数では,現在の残高が十分ですか?オーダー価格はどのくらいですか?精度はどのくらいですか?市場に影響を及ぼさないために注文を分割する必要があるか?未完了注文をどう扱うか? それのようないくつかの詳細があります.異なる戦略では,これらの関数は同じなので,テンプレートにすることができます.公式のテンプレートに従って,ユーザーは独自のテンプレート戦略も書くことができます.ここで,ユーザーが迅速に独自の戦略を書けるように,FMZが公式にリリースした非常によく使用されるテンプレートクラスライブラリをいくつか紹介します.

JavaScriptの暗号通貨取引ライブラリと商品先物取引ライブラリはデフォルトで組み込まれ,コピーする必要はありません.他のテンプレートライブラリは戦略で見つけることができます.https://www.fmz.com/square/20/1) テンプレートライブラリをコピーして保存し,独自の戦略を作成する際に使用するライブラリを確認します.

JavaScript テンプレートの関数はすべて$Python はext.

暗号通貨取引図書館

ソースコードアドレス:https://www.fmz.com/strategy/10989特定の機能の実装は,ソースコードを直接参照することができます.

アカウントを取得:

$.GetAccount(e)

Log($.GetAccount()); // Obtain the account information, with fault tolerance function 
Log($.GetAcccount(exchanges[1]));

注文の提出とキャンセル:

$.Buy/Sell(e, amount)
$.Buy(0.3); // The main platform buys 0.3 coin
$.Sell(0.2); // The main platform sells 0.2 coin
$.Sell(exchanges[1], 0.1); // The secondary platform sells 0.1 coin
$.CancelPendingOrders(e, orderType)

$.CancelPendingOrders(); // Cancel all entrusted orders of the main platform 
$.CancelPendingOrders(ORDER_TYPE_BUY); // Cancel all buy orders of the main platform
$.CancelPendingOrders(exchanges[1]); // Cancel all orders of the secondary platform
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // Cancel all sell orders of the secondary platforom 

十字架を裁く

$.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])
If n = 0, it means that the current prices of exactly 15-period EMA and 30-period EMA are equal. 
If n > 0, such as 5, it means that the 15-period EMA up-crosses the 30-period EMA by 5 periods (Bar)
If n < 0, such as -12, it means that the 15-period EMA down-crosses the 30-period EMA by 12 periods (Bar)
If it is not an array passed to the Cross, the function automatically obtains the K-line for moving average calculation.
If an array is passed to Cross, compare directly.

$.withdraw ((e,通貨,住所,金額,手数料,パスワード) 機能:

$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")

商品先物取引図書館

商品先物取引ライブラリを使用するには,非常に安定しています,それは推奨されています. ソースコードアドレス:https://www.fmz.com/strategy/12961特定の機能の実装は,ソースコードを直接参照することができます.

CTAライブラリ

  • ロボットは自動的にインデックスをメイン連続契約にマッピングします
  • 移動を自動的に処理します
  • rbインデックスのk線をメインストーミングコントラクトにマッピングするバックテストのマッピングを指定できます. rb000/rb888などです.
  • また,他の契約にマッピングすることもできます.例えば,rb000/MA888は,MAメイン連続契約を取引するために,rbインデックスのK線を見てください.
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("Golden cross period", cross, "the moment position", mp);
            return 1
        } else if (mp >= 0 && cross < -2) {
            Log("Death cross period", cross, "the moment position", 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"));
    // Multiple varieties use the trading queue to complete the non-blocking trading task
    var q = $.NewTaskQueue();
    q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
        Log(task.desc, ret)
    })
    while (true) {
        // Call "poll" to execute the unfinished tasks in the spare time
        q.poll()
        Sleep(1000)
    }
}

図書室

素描の機能は非常に複雑で,次のチュートリアルで紹介されるので,初心者が図書室を利用して,非常に単純な線図やk線図を図書に描くことをお勧めします. 簡単な図書室はFMZに組み込まれ,戦略編集ページで見ることができます. 図書室がまだ組み込まれていない場合は,ユーザーが図書室をコピーして保存し,戦略で確認して使用する必要があります.

img

Javascript バージョンの図書ライブラリのコピーアドレス:https://www.fmz.com/strategy/27293Python バージョン図書室のコピーアドレス:https://www.fmz.com/strategy/39066

具体的な例:

function main() {
    while (true) {
        var ticker = exchange.GetTicker()
        if (ticker) {
            $.PlotLine('Last', ticker.Last) // You can draw two lines at the samw time, "Last" is the name of the line
            $.PlotLine('Buy', ticker.Buy)
        }
        Sleep(6000)
    }
}

戦略パラメータ設定

策略を編集するには,戦略のグローバル変数に等しい戦略パラメータ設定があり,コード内の任意の位置でアクセスできます. 戦略パラメータはボットページで変更することができ,再起動後には有効になります. したがって,いくつかの変数をパラメータに設定することができ,パラメータは戦略を変更することなく変更できます.
img

  • 変数名戦略グループで直接使用できます. 戦略グループでは,戦略グループで直接使用できます.
  • 記述: 戦略インターフェース上のパラメータの名前,ユーザがパラメータの意味を理解するのに便利です.
  • コメント: マウスがパラメータを横切ったときに表示されるパラメータの詳細な説明です.
  • タイプ: パラメータの種類は,後で詳細に紹介されます.
  • デフォルト: aパラメータのデフォルトです.

字符串タイプと数字タイプを理解することは非常に簡単です. これらは非常に一般的に使用されるタイプです. コンボボックスではパラメータインターフェイスのボックス内のオプションが表示されます. たとえば,SYMBOLパラメータをBTC|USDT|ETHコムボボックスに USDT を選択すると,戦略のSYMBOL 値は USDT インデックス 1 です. チェックオプションはオプションのチェックボックスを参照します. チェックは true を表示し,チェックなしは false を表示します.

設定のパラメータはもっとあります.https://www.fmz.com/api.

戦略 バックテスト

戦略の量子化が完了すると,ストロークデータによってテストし,ストローク日付で戦略の利益状況を確認できます. もちろん,バックテスト結果は参照のみです. FMZ Quantプラットフォームは,主流の暗号通貨のみがサポートされている仮想通貨スポットと先物,BitMEX永久契約,商品先物,バックテストをサポートします. Javascript バックテストはブラウザで実行され,Python バックテストはドッカーで実行され,当社のプラットフォームはユーザーのために公開ドーカーを提供しています.Mylanguage のバックテストには設定のためのより多くのパラメータがあり,より多くの詳細はMylanguage のドキュメントで参照できます.

バクテストメカニズム

オンバーバックテストメカニズムは,Kラインに基づいている.つまり,各Kラインはバックテストのために1つの時間点を生成する.時間点では,現在のKラインのオープン,閉鎖,最高,最低価格,取引量を含む情報,ポイント前のKラインの履歴情報を取得することができます.この種のメカニズムの欠点は非常に明らかです:1つのKラインで1回の購入のみを生成できます.通常,参照価格はthrKラインの終了価格です.また,1つのKラインは,4つの価格のみ,すなわち閉,オープン,最高,最低価格を取得できます.価格が1つのKラインでどのように変化するか,最高価格か最低価格が最初に変化するかを含む情報は入手できません.例えば1時間のKラインテストを例にしてください.このボット取引メカニズムは,確実に数秒ごとに取得され,Kラインのバックラインでコマンドが完了した後,理解が簡単ではありません.

FMZのバックテストには,シミュレーションレベルバックテストと実際の市場レベルバックテストという2つの種類が含まれています.シミュレーションレベルバックテストは,底層K線周期に応じてシミュレーションされたティックを生成することができ,各底層K線周期は14のバックテストタイムポイントを生成します.実際には数秒ごとにチェックを集めており,現在,実際の深さ (20レベルを含む) と実際の実行トレードを tardeでサポートしています.FMZバックテストメカニズムは,1つのKラインでスタートテージの複数の取引を実現し,取引が閉じる価格によってのみ実行できる状況を防止し,また,バックテスト速度をますますターゲットにして注意を払うことができます.詳細な説明のために:https://www.fmz.com/bbs-topic/9126.

バックテストとボットのフレームワークは同じで,両方とも無限ループである.バックテストは異なるバックテストポイントにスキップするため,バックテストはSleepを使用せずに実行することができ,ループが終わると自動的に次のタイムポイントにスキップする.しかし,Pythonはプログラムメカニズムのために,Sleep(10)閉じ込められないように

バックテストマッチング

バックテストエンジンは,ユーザーによって配置されたオーダー価格とバックテストの時点の市場価格に一致する. 購入価格が販売価格よりも高くなった場合,販売価格が実行されます. 取引が実行できない場合は,待機オーダーが生成されます. 取引を確保するためにスリップが追加する必要があります. バックテスト中にポジションを開くか閉じることができない場合は,完了していないオーダーのためにポジションが凍結しているかどうかを確認します.

バックテストページ設定

img

  • Backtestのページを選択し,その左側には"Edit Strategy"のページがあります.
  • 2.バックテストの開始時間と終了時間.データが不完全である場合,バックテストはデータが存在する時点から直接開始できます.
  • 3.バックテストのデフォルト期間GetRecords()function: コードに period パラメータも指定できます.
  • 4.バックテストメカニズムの選択
  • 5.より多くのバックテスト設定を表示または隠す
  • 6.ログ項目,利益ログ項目,チャートログ項の最大値は,膨大なデータ量によるブラウザの障害を防ぐため,
  • 7.K線による下層のによって生成される期間
  • 8. 滑り点
  • 9. API リクエストが誤った状況をシミュレートし,戦略の故障耐性をテストする.
  • 10.市場チャートを描くかどうか.バックテストでTA指標機能が使用されている場合,この機能は自動的にチャートに表示され,購入と販売もマークされます.
  • 11.サービス料金の設定
  • 取引対と資産の追加プラットフォーム
  • バックテストのパラメータ設定.パラメータが数字で,また1キー最適化もサポートしている場合,パラメータはバックテストで一定の範囲で自動的に横ばわされます.

ボットとバックテストの違い

  • 1.バックテストにおける唯一の有効な市場コートは GetTicker と GetRecords のみで,GetDepth と GetTrades のような他のコートはリアルではありません (データ量は巨大で,実際の市場レベルのバックテストは既にデータをサポートしていますが,最新のデータをのみサポートしています);
  • 2.バックテストに追加されたプラットフォームはすべて分離されたアカウントです.取引ペアを直接切り替えるのはサポートされていません.したがって,1つのアカウントで2つの取引ペアを操作することはできません.
  • 3.netwrok リクエストはバックテストでは使用できません.
  • 4.IOバックテストでは拡張は使用できず,基本的なAPIのみを使用できます.
  • 5.バックテストでは標準データのみが得られ,ボットに関連するInfoのようなデータは存在しない.
  • 6.バックテストでは遅延が実行されない可能性があり,凍結された注文の状況に注意してください.
  • 7.inコモディティ・フューチャーズのバックテストでは,市場秩序はサポートされません.

戦略 誤り 許容 と 共通 の 誤り

ロボットでAPIインターフェースを使用すると,アクセスと返信に失敗する可能性があります.null誤差を報告され,ボットが停止します. したがって,戦略は誤差耐性でうまく行わなければなりません.

欠陥 を 許す 共通 の 方法

常見 な 原因

  • API アクセス ネットワーク エラー; インターフェイス アクセス のタイムアウト が nonll を返し,エラー が報告されます.

  • プラットフォームからの制限エラー,IP制限,オーダー精度,アクセス頻度,パラメータエラー,資産不足,市場取引失敗,実行されたオーダーのキャンセルなど.詳細はAPI文書で間違ったコードに従ってクエリすることができます.

  • プラットフォームのデータ返却エラー; 時には,ゼロ深度,遅延したアカウント情報,遅延した注文状態等を返却するなど,発生します.

  • プログラムロジックエラー

API の返されたデータを使用する前に,データが null であるか否かを判断し,一般的な方法が以下のように導入されます.

//1.judge the data is null and handle 
var ticker = exchange.GetTicker();
while(ticker == null){
     Log('ticker obtain error');
     ticker = exchange.GetTicker();
 }
 Log(ticker.Last);
 // 2. judge the data is not null, and use 
 var ticker = exchange.GetTicker();
 if(!ticker){
     Log(ticker.Last);
 }
 // 3.retry _C() function 
 var ticker = _C(exchange.GetTicker);
 Log(ticker.Last);
 // 4.try cache fault tolerance
 try{
     var ticker = exchange.GetTicker();
     Log(ticker.Last);
 }
 catch(err){
     Log('ticker obtain error');
 } 

エラーに関する情報を入手するには,GetLastError()誤差は差によって処理できます. 誤差は,誤差が,誤差が

よくある質問

フォーラムのトップ投稿の一般的なエラーの概要:https://www.fmz.com/bbs-topic/9158Ctrl+Fを使って検索できます.

ドーカーをどのように展開する?

詳細な紹介は ドーカーを追加する部分にあります

誰かにゴースト・ライティング・戦略を頼んでもいいですか?

についてhttps://www.fmz.com/markets相談グループに問い合わせることもできます. このようなサービスにご自身で連絡を取り,リスクもご自身で負うことに注意してください.

すべてのインターフェースは,アクセス時にタイムアウトを提示します.

タイムアウトが偶発的に起こると問題ありませんが,タイムアウトが常に提示される場合,すべてのネットワークにアクセスできず,海外サーバーが必要になります.

ERR_INVALID_POSITION 選択する

バックテストでエラーが報告された場合,それは一般的に書き込みエラーです. ポジションを閉じるオーダーをしようとすると,ポジションがない場合,またはポジションボリュームが十分でない場合,エラーが報告されます.

記号が設定されていない

コードには契約が設定されていないため,先物プラットフォームのバックテストでは,Exchange.SetContractType関数を参照してください.

BITMEX 429error,{error:{message:Rate limit exceeded 速度は1秒後に再試しに超えられました......}}

プラットフォームインターフェイスのアクセス周波数は高すぎる

{ 状態:6004, タイムスタンプは範囲外}

サーバのタイムスタンプはサーバーの更新の時間範囲を超えており,超えた時間は長すぎることはできません.

GetOrder ((455284455): エラー: オーダー id が有効でないか,オーダーがキャンセルされた.

プラットフォームの注文がキャンセルされた場合,プラットフォームは注文情報を保存しなくなるので,情報を入手することはできません.

GetOrders: 400: {コード:-1121,msg:無効なシンボル.}

取引対が有効でない.取引対の設定が間違っているかどうかを確認する.

秘密鍵の解読失敗

APIKEY パルシングが失敗します. APIKEY が設定された後に FMZ パスワードが変更された場合は, FMZ にプラットフォームページを追加してプラットフォーム APIKEY を再構成してみてください.

署名が有効でない: 提出時間が有効でないか,時間形式が間違っている

この問題が発生する Windows システムに時間同期ソフトウェアをインストールしてください.

グローバルプロキシが設定されているのに なぜドーカーはまだプラットフォームAPIにアクセスできないのか?

グローバルプロキシにはプロキシドーカーのネットワークポートがありません.遅延の問題により,海外サーバーのドーカーを展開することが最善です.

FMZにアップロードしないように

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")

もっと