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')
}
}
価格とボリュームの精度は通常制御する必要があります. FMZは保存すべき小数点を決定するために _N関数を組み込みました._N(4.253,2)
4.25 になります
プラットフォーム 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()
直接は現在の時間文字列を返します.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
.
一般的に使用されている指標機能の 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関数を紹介します
Date.now()
現在のタイムスタンプを返します.parseFloat()
文字列を数字に変換しますparseFloat("123.21")
;parseInt()
文字列を整数に変換するnum.toString()
数字を文字列に変換し,数値変数 num を使いますJSON.parse()
JSON 文字列のフォーマット,例えばJSON.parse(exchange.GetRawJSON())
;Math.max()
, Math.abs()
参照:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;ボット戦略関数を書く際には,多くの状況が考慮する必要がある.例えば,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ライブラリ
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に組み込まれ,戦略編集ページで見ることができます. 図書室がまだ組み込まれていない場合は,ユーザーが図書室をコピーして保存し,戦略で確認して使用する必要があります.
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)
}
}
策略を編集するには,戦略のグローバル変数に等しい戦略パラメータ設定があり,コード内の任意の位置でアクセスできます. 戦略パラメータはボットページで変更することができ,再起動後には有効になります. したがって,いくつかの変数をパラメータに設定することができ,パラメータは戦略を変更することなく変更できます.
字符串タイプと数字タイプを理解することは非常に簡単です. これらは非常に一般的に使用されるタイプです. コンボボックスではパラメータインターフェイスのボックス内のオプションが表示されます. たとえば,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(10)
閉じ込められないように
バックテストエンジンは,ユーザーによって配置されたオーダー価格とバックテストの時点の市場価格に一致する. 購入価格が販売価格よりも高くなった場合,販売価格が実行されます. 取引が実行できない場合は,待機オーダーが生成されます. 取引を確保するためにスリップが追加する必要があります. バックテスト中にポジションを開くか閉じることができない場合は,完了していないオーダーのためにポジションが凍結しているかどうかを確認します.
GetRecords()
function: コードに period パラメータも指定できます.ロボットで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")