
前回の記事では、プログラムによる取引スクリプトについて説明しました。実際、トレーディング戦略はトレーディングスクリプトプログラムです。この記事では主に、トレーディングスクリプトプログラム用のハードウェアキャリア(プログラムが実行される場所)の必要性、このスクリプトトレーディングプログラムを書くために使用できるコンピュータプログラミング言語(リスト)について説明しています。 Inventor Quantitative Trading Platform の使用には 3 つのプログラミング言語があります。もちろん、任意のプログラミング言語を使用して、プログラムによる取引の戦略を実装できます。この記事では、暗号通貨界の定量分析について引き続き議論し、暗号通貨界の定量分析の知識を理解します。
取引戦略の種類 プログラム取引や定量取引に不慣れな初心者は、トレンド戦略、裁定取引戦略、高頻度戦略、グリッド戦略などのさまざまな用語に混乱するかもしれません。実際、プログラム取引と定量取引の一般的な戦略タイプは、次のように説明されています: いくつかの方向。
上記は取引戦略の観点から分類したものですが、Inventor Quantitative Trading Platform の戦略設計の観点からは、戦略は次のように分類することもできます。
単一製品戦略 つまり、この戦略では、BTC 取引や ETH 取引など、1 つの商品のみを操作します。
マルチプロダクト戦略 簡単に言えば、戦略ロジックに従って複数の品種を運用することです。
マルチアカウント戦略 簡単に言うと、実ディスク上に複数の交換オブジェクトを構成することです(交換の概念は前回の記事で紹介しており、API KEY が設定された交換オブジェクトは交換アカウントを表します)。例えば、コピートレード戦略の中には、複数の口座(同じ取引所の場合もあれば、異なる取引所の場合もあります)で操作を実行するものがあります。つまり、複数の取引所オブジェクト(口座)を 1 つの実口座で管理することになります。
複数のロジック戦略 例えば、実際の市場では、MACD戦略、移動平均戦略、グリッド戦略などが同時に設計されています(もちろん、それらは異なる取引所オブジェクトで動作します。同じ取引所オブジェクトを操作する場合は、特定の戦略には論理的な矛盾がある)
Exchange APIインターフェース プログラムされた取引スクリプトはどのようにして取引口座を操作するのでしょうか?答えは、取引所が公開した API インターフェースを通じて得られます。 では、取引所にどのような種類のインターフェースが開かれているのでしょうか?前回の記事では、「Exchange」セクションについて説明しました。このセクションでは、Exchange には一般に REST および Websocket インターフェースがあることを説明しました。ここでは、戦略プログラム レベルからいくつかの概念を追加します。 Exchange インターフェースは、検証されているかどうかによって、検証済みと非検証済みの 2 種類に分けられます (REST と Websocket の両方)。
認証を必要としないインターフェース
一般的に「パブリックインターフェース」と呼ばれるこのタイプのインターフェースは検証を必要としませんAPI KEY(API KEYが何であるかを忘れた場合は、前の記事を参照してください)。このタイプのインターフェースは、通常、ディープマーケット情報のクエリ、K ライン データのクエリ、資金調達率のクエリ、トランザクション製品関連情報のクエリ、取引所サーバーのタイムスタンプのクエリなどの市場インターフェースです。
簡単に言えば、アカウントとは何の関係もないインターフェースは、大まかにパブリックインターフェース(検証不要)であると判断できます。
Inventor Quantitative Trading Platform では、未検証の API 関数 (取引所の未検証インターフェース、パブリックインターフェースをカプセル化したもの) を呼び出すときに、API KEY が正しく設定されていない場合でも、インターフェースによって返されるデータを正常に取得できます。 (検証されていないため)
検証が必要なインターフェース 簡単に言えば、検証(API KEY による検証)が必要なインターフェースです。このタイプのインターフェースはプライベートインターフェースと呼ばれます。このタイプのインターフェースは通常、アカウント資産の照会、アカウントポジションの照会、保留中の注文の照会、転送の照会、コインの転送、レバレッジの調整、ポジションモードの設定など、アカウントの一部の操作または情報に関連しています。 これらの操作は検証する必要があります。 Inventor Quantitative Trading Platformでは、検証が必要なAPI関数(カプセル化された取引所が検証する必要があるインターフェース、プライベートインターフェース)を呼び出すときに、API KEYの設定が正しくない場合、インターフェースの呼び出し時にエラーが報告され、 null値が返されます。
では、これらのインターフェースは Inventor Quantitative Trading Platform でどのように使用されるのでしょうか?
Inventor Quantitative Trading Platform は、取引所の振る舞いをカプセル化し、一貫したインターフェース(K ラインインターフェース、ディープマーケットインターフェース、現在の資産照会インターフェース、注文インターフェース、注文引き出しインターフェースなど)を定義します。これらのインターフェースは、API 関数と呼ばれます。 Inventor Quantitative Trading Platform は、API ドキュメント (https://www.fmz.com/api) をクエリすることで表示できます。
では、Inventor Quantitative Trading Platform で、動作や定義に一貫性のない一部の交換インターフェースをどのように使用すればよいのでしょうか?
これらの取引所インターフェースには、資産の移転、条件付き委託、一括注文の配置、一括注文のキャンセル、注文の変更などが含まれます。一部の取引所にはこれらのインターフェースがありますが、他の取引所には存在しません。機能と使用方法の詳細は大きく異なる場合があります。したがって、これらのインターフェースは Inventor Quantitative Trading Platform で利用できます。exchange.IOこの関数はアクセスするために使用されます (詳細については、Inventor Quantitative Trading Platform API ドキュメント (https://www.fmz.com/api#exchange.io…) を参照してください)。 Inventor Quantitative Trading Platform Strategy Square には、実用的な IO サンプル戦略もいくつかあります。
Inventor Quantitative Trading Platform API ドキュメント内のすべての API 関数はネットワーク要求を生成しますか?
まず、取引所のAPIインターフェースにはアクセス頻度の制限(たとえば、1秒あたり5回)があるとします。アクセス頻度が高すぎると、http 429エラーが報告され、アクセスが拒否されます(ほとんどの取引所は429を報告します)。 。同じ制限は、Inventor Quantitative Trading Platform 上のパッケージ化された交換インターフェースの呼び出しにも適用されます。ネットワーク要求を生成しない Inventor Quantitative Trading Platform 上の API 関数には、このような制限はありません。 Inventor Quantitative Trading Platform のすべての API 関数がネットワーク要求を生成するわけではありません。Inventor の API 関数の一部は、現在の取引ペアの設定、契約コードの設定、指標計算関数、取引所オブジェクト名の取得など、一部のローカル設定のみを変更します。等 基本的に、関数の目的からネットワークリクエストが発生するかどうかを判断できます。取引所データの取得、取引所アカウントの操作などであれば、ネットワークリクエストが発生します。呼び出しに注意する必要があります。これらのインターフェースの頻度。
Inventor Quantitative Trading Platform で API 関数を使用するときによくある問題と経験について説明します。

戦略を書くときは、インターフェースから返されるデータを判断して検証する必要があります。たとえば、このコード行は、Inventor Quantitative Trading Platformで市場情報を取得するために使用されます(取引所に直接アクセスするプログラムを書く場合も同様です)。インタフェース):var ticker = exchange.GetTicker()これを使う必要がある場合はticker変数(GetTicker関数によって返される構造を参照)Last(最新価格)データを使用するにはvar newPrice = ticker.Last次のようにデータを取得します(newPriceとは何か?new:最新、Price:価格、そう!これらをまとめます!)このとき、GetTicker()関数が正常なデータを返す場合は問題ありませんが、リクエストがタイムアウトしたり、ネットワークエラーが発生したり、取引所がネットワークケーブルを抜いたり、ケーブルが切断されたり、いたずらな子供が電源スイッチを引っ張ったりした場合は、GetTicker()関数の戻り値null。現時点ではtickerの値はnullまた訪れてみます。Lastプログラム例外が発生し、ポリシー プログラムが停止します。
インターフェース呼び出しの失敗(GetTicker呼び出しが失敗し、nullが返された)は、戦略の実際の取引停止の直接的な原因ではないようです(直接の原因は、null変数プロパティ、インターフェース呼び出しの失敗、エラーによって実際の取引が停止することはありません (強調追加)。
では、実取引の異常な停止を回避するために何ができるでしょうか?
答えは、インターフェースから返されるデータに対してフォールトトレランス処理を行うことです。返されたデータがnull(JavaScriptを例に挙げていますが、他の言語も基本的には同じです)
説明のために小さなコード スニペットを記述します (これは単なる説明であり、直接実行しても機能しません)。
var ticker = exchange.GetTicker()
if (ticker) {
var newPrice = ticker.Last
Log("打印最新价格:", newPrice)
} else {
// 数据为null,不做操作就不会出问题
}
だけでなくGetTickerインターフェースはフォールトトレラントである必要があります。ネットワーク要求を持つすべてのインターフェースは、戻り値に対してフォールトトレラントである必要があります(関数の戻り値を使用する場合)
障害を許容する方法は数多くあります。_C()関数 (FMZ API ドキュメントを参照)、独自のフォールト トレラント関数を記述し、独自のフォールト トレラント メカニズムとロジックを設計します。
について_C()関数を使用する場合、多くの新入生は関数を誤って使用する可能性があります。_C()関数パラメータは関数呼び出しではなく、関数参照です。簡単に言えば:
_C(funcName, param1, param2)呼び出しは正しく、funcName には括弧がなく、param1 と param2 は funcName 関数に渡されるパラメーターです。
_C(funcName(param1, param2))、呼び出しエラー、通常、FMZ API ドキュメントを注意深く読まない初心者は、これを次のように記述します。
LTC_USDT function main() {
exchange.IO("simulate", true) // 切换为OKEX交易所的模拟盘
exchange.Buy(-1, 1) // 价格是-1,表示下的订单为市价单,数量为1表示下单量是1USDT
}
取引所には通常、注文金額の制限があるため、制限を下回る注文は送信されません (たとえば、Binance スポットでは、各注文が 5 USDT を超えると正常に送信されます)。したがって、次のような注文を行うとエラーが発生します。
错误 Buy(-1, 1): map[code:1 data:[map[clOrdId: ordId: sCode:51020 sMsg:Order amount should be greater than the min available amount. tag:]] msg:]

順序関数にはBuy,Sell。しかし、先物(もちろんスポットには問題はありません。スポットには買いと売りしかありません)には、ロングのオープン、ロングのクローズ、ショートのオープン、ショートのクローズなどの方向があります。明らかに、買い/売りはそれほど多くの方向の操作を表すことはできません。このとき、先物取引の方向の設定を導入する必要があります。この機能はexchange.SetDirection()。
FMZについて
exchange.SetDirection("buy")(まず方向を決める)そしてexchange.Buy一緒に使用すると、発注された注文がロングポジションを開く注文であることを意味します。
等々:
exchange.SetDirection("sell")そしてexchange.Sellこれらを一緒に使用すると、発注された注文がショートポジションを開く注文であることを意味します。
exchange.SetDirection("closebuy")そしてexchange.Sellこれらを一緒に使用すると、発注された注文がロングポジションをクローズする注文であることを意味します。
exchange.SetDirection("closesell")そしてexchange.Buyこれらを一緒に使用すると、発注された注文がショートポジションをクローズする注文であることを意味します。
通常、初心者はexchange.SetDirection("sell")そしてexchange.Buy他のものと組み合わせて使用したり、その他の誤った組み合わせで使用したりします。その後、エラーが報告されました (バックテストではエラーが報告されない場合もありますが、これは明らかに論理エラーであり、強迫性障害の人はそれを容認できません…)。
初心者が犯すもう一つのよくある間違い
function main() {
exchange.SetContractType("quarter") // 设置当前合约为季度合约
exchange.SetDirection("sell")
var id = exchange.Sell(-1, 1)
Log("看我市价单下单了,成交了,就有持仓了", exchange.GetPosition())
exchange.SetDirection("closebuy") // closebuy 和Sell 搭配使用,嗯没错~
exchange.Sell(-1, 1)
}

これを見ると、「ポジションを持っていて、closebuy と sell を一緒に使用しているのに、エラーが発生してポジションをクローズできないのはなぜですか?」と疑問に思うかもしれません。私はこう答えます。「間違った方向に決済してしまいました。ロングポジションを決済してしまいました。」
上記のエラーが発生する可能性のある別の状況としては、決済方向が正しく設定され、注文関数が正しく使用され、ポジションがこの方向に保持されているにもかかわらず、このエラーが報告される場合が挙げられます。
理由は、プログラムが複数の注文を出したが、最初の注文は実行されず、決済注文は市場で実行を待っていたためです。この時点で、プログラムはポジションをクローズし続け、プロンプトが表示されます。終値を超えるエラー。
print。
JavaScriptconsole.log。
Go言語fmt.Println()。
C++coutFMZ プラットフォームに表示される情報についてお話しましょう。Inventor Quantitative Trading Platform には、情報が表示される主な場所が 2 つあります。
- ステータスバー
実ディスクが稼働すると、実ディスクページは図のようになります。

表示部分はステータスバー情報です。ステータスバーは主にリアルタイムで変化するデータを表示するために使用されます(リアルタイムの変化はリアルタイムで観察する必要があり、毎回ログに印刷することはできないため、この種類のステータス バーにデータを表示できます。 1 つずつ印刷すると、ログに多くの重複した意味のないデータが含まれることになり、クエリに影響します。
ステータスバーにデータ使用量を表示する`LogStatus`機能の詳細については、FMZ の API ドキュメントを参照してください。
- ログ列
実際のマーケットページでも、図に示すように次のようになります。

表示部分はログバーであり、主に特定の瞬間の特定のデータを永続的に記録したり、特定の時間における戦略の特定の操作を記録したりするために使用されます。
ログにはいくつかの種類があります。
1. 通常のログ: FMZ 戦略は、ログ機能を使用して戦略ログに出力および印刷します。

2. FMZ戦略で使用される注文ログ`exchange.Sell`/`exchange.Buy`ログ出力に自動的に記録されます。

3. FMZ戦略で使用される注文キャンセルログ`exchange.CancelOrder`、注文キャンセルログがログに自動的に出力されます。

4. エラー ログ。FMZ 戦略の実行中に、ネットワーク要求のインターフェイスで呼び出しエラーが発生したり、例外がスローされたりした場合 (throw などのステートメントなど)、ログにエラー ログが自動的に出力されます。

Log(…)、exchange.Buy(Price, Amount)、exchange.CancelOrder(Id)などのログ出力を生成できるFMZ API関数には、必須パラメータの後にいくつかの追加の出力パラメータを続けることができます。例えば、exchange.CancelOrder(注文[j].Id, orders[j]) これは注文をキャンセルするためのものです[j] この注文をすると、注文情報が出力されます。
function main() {
Log("数据1", "数据2", "数据3", "...")
var data2 = 200
var id = exchange.Sell(100000, 0.1, "附带数据1", data2, "...")
exchange.CancelOrder(id, "附带数据1", data2, "...")
LogProfit(100, "附带数据1", data2, "...")
}
JavaScript計算された指標データを印刷するときに言語戦略が表示されます。null。Strategy Square に指導例があります: https://www.fmz.com/strategy/125770 このチュートリアルの例の戦略をバックテストすると、バックテスト システムによって生成されたチャートと 10 期間の移動平均が表示されます。

戦略カスタム描画、描画された K ラインと移動平均チャート:

Q: 10 時間移動平均が必要な場合はどうすればいいですか? 回答: K ライン データは、1 時間ごとの K ライン データを使用できます。
平たく言えば、私たちが目にするKラインは、デジタル化された後の配列です(配列の概念がわからない場合は、Baiduで検索してください)。各要素はKラインの列であり、順番に。配列の最初の要素は現在時刻から最も遠く、配列の最後の要素は現在時刻に最も近いものになります。 通常、K ライン データの最後のバーは現在の期間のバーであり、リアルタイムで変化し、未完了です (取引所のページにログインして K ラインを観察することで、変化を観察できます)。計算されたインジケーターも K ライン バーに 1 対 1 で対応します。上記の例では、1 つのインジケーター値が 1 つの K ライン バーに対応していることがわかります。最後の K ライン列はリアルタイムで変化し、計算されたインジケーターも K ライン列の変化に応じて変化することに注意してください。
Inventor Quantitative Trading Platformでは、TAライブラリ(FMZプラットフォームによって実装され、カストディアンに統合され、さまざまな言語で直接使用できるライブラリ)またはtalibライブラリ(talibは定評のある指標ライブラリであり、 JS と C++ が統合されており、Python は自分で記述する必要があります) をインストールします。 たとえば、上記の例では、移動平均は次のように計算されます。 TA ライブラリの使用:
function main() {
var records = exchange.GetRecords()
var ma = TA.MA(records, 10)
Log(ma) // 打印均线
}
talib ライブラリの使用:
function main() {
var records = exchange.GetRecords()
var ma = talib.MA(records, 10)
Log(ma) // 打印均线
}
計算された指標データmaは配列であり、その各要素はKライン配列(レコード)に対応しています。ma[ma.length -1]対応するrecords[records.length - 1]、 等々。
他の複雑な指標でも同様で、MACDなどの指標にも注意を払う必要があります。
var macd = TA.MACD(records) // 这样只传入K线数据,不传入指标参数,指标参数采用的就是默认值,其它指标函数也是同理
このとき、変数macdは2次元配列です(概念がわからない場合は、Baiduで検索してください)。簡単に言えば、2次元配列は配列であり、その各要素も配列です。 。 質問: macd インジケーターのデータが 2 次元配列であるのはなぜですか? 回答:MACDインジケーターは2本の線(DIF線とDEA線)と一連のボリュームバー(MACDボリュームバー、実際にはこのボリュームバーデータも線と見なすことができます)で構成されているためです。したがって、macd 変数は次のように分割できます。
var dif = macd[0]
var dea = macd[1]
var macdColumn = macd[2]
こちらには既成の指導例もありますので、ご興味があればご覧ください: https://www.fmz.com/strategy/151972
