Inventor Quantitative Trading Platform Extension APIを使用してTradingViewアラートシグナル取引を実装する
Inventor Quantitative Trading Platform 拡張 API は最近アップグレードされ、直接アクセス モードをサポートするようになりました。これにより、TradingView アラーム信号を Inventor Quantitative Trading Platform ロボットに簡単に送信して、自動取引を実現できます。拡張 API が何であるかまだわからない場合は、詳しく説明します。
Inventor 定量取引プラットフォーム拡張 API
拡張 API の主な機能は、ロボットを一括で同時に起動したり、スケジュールされた時間にロボットを起動および停止したり、ロボット情報の詳細を読み取りたりするなど、プログラム操作発明者の定量取引プラットフォーム上のさまざまな機能のインターフェイスを提供することです。 TradingView アラート シグナル取引を実装するために、Inventor Quantitative Trading Platform Extension API を使用します。この要件では、API の拡張のみが必要です。CommandRobot(RobotId, Cmd)インターフェースは、指定された ID を持つロボットに対話型の指示を送信できます。ロボットは指示を受け取った後、対応する操作 (売買注文の発行など) を実行できます。
拡張APIを使用するには、まず独自のInventorアカウントを作成する必要があります。API KEY:

API KEY鍵はaccess keyそしてsecret key構成、API KEYこれはプログラムされた操作によって発明された定量取引プラットフォームへの鍵であるため、適切に保管され、決して開示されてはいけません。 FMZ拡張機能の作成API KEY使用時に権限を指定できますAPI KEYアクセスを許可するCommandRobot(RobotId, Cmd)この例では、セキュリティ上の理由から、FMZ 拡張機能にのみ権限を付与します。API KEY与えるCommandRobot(RobotId, Cmd)インターフェースのアクセス権限。
拡張APIの直接アクセスモード
直接アクセスモードとはAPI KEYURL のクエリに直接記述します。たとえば、Inventor Quantitative Trading Platform 拡張 API にアクセスするための URL は次のように記述できます。
https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"ok12345"]
で、https://www.fmz.com/api/v1インターフェースアドレスです。?その後Query、パラメータaccess_keyキーの例はxxx(使用時に自分のFMZアカウントのaccess_keyを入力してください)で表されます。パラメータsecret_key秘密鍵はyyyyで表されます(使用時には自分のアカウントのsecret_keyを入力してください)、パラメータmethodアクセスする拡張 API インターフェイスの特定の名前です。args呼ばれるmethodインターフェースのパラメータ。
私たちは、発明者の定量取引プラットフォーム ロボットに取引コマンドを送信するためのシグナル ソースとして TradingView を使用します。CommandRobotこのインターフェース。
TradingView
まず、TradingView Pro アカウントが必要です。アラームの WebHood 機能は、Basic レベルでは利用できません。 TradingViewのチャートに移動します。
チャートにインジケーターを追加しますが、他のスクリプト アルゴリズムも追加します。ここでは最も一般的に使用されるMACDインジケータ、次に K ライン期間を 1 分に設定します (信号をより速くトリガーし、デモンストレーションを容易にするため)。
チャートを右クリックし、ポップアップ メニューから [アラートの追加] を選択します。
「アラート」ポップアップウィンドウで設定WebHookこのステップでは、急いで設定する必要はありません。まずは、Inventor の定量取引プラットフォームでシグナルを監視するロボットを実行してみましょう。
監視信号発注ロボット
戦略ソースコード:
javascript
// 全局变量
var BUY = "buy" // 注意:现货用的命令
var SELL = "sell" // 现货用的命令
var LONG = "long" // 期货用的命令
var SHORT = "short" // 期货用的命令
var COVER_LONG = "cover_long" // 期货用的命令
var COVER_SHORT = "cover_short" // 期货用的命令
function main() {
// 清空日志,如不需要,可以删除
LogReset(1)
// 设置精度
exchange.SetPrecision(QuotePrecision, BasePrecision)
// 识别期货还是现货
var eType = 0
var eName = exchange.GetName()
var patt = /Futures_/
if (patt.test(eName)) {
Log("添加的交易所为期货交易所:", eName, "#FF0000")
eType = 1
if (Ct == "") {
throw "Ct 合约设置为空"
} else {
Log(exchange.SetContractType(Ct), "设置合约:", Ct, "#FF0000")
}
} else {
Log("添加的交易所为现货交易所:", eName, "#32CD32")
}
var lastMsg = ""
var acc = _C(exchange.GetAccount)
while(true) {
var cmd = GetCommand()
if (cmd) {
// 检测交互命令
lastMsg = "命令:" + cmd + "时间:" + _D()
var arr = cmd.split(":")
if (arr.length != 2) {
Log("cmd信息有误:", cmd, "#FF0000")
continue
}
var action = arr[0]
var amount = parseFloat(arr[1])
if (eType == 0) {
if (action == BUY) {
var buyInfo = IsMarketOrder ? exchange.Buy(-1, amount) : $.Buy(amount)
Log("buyInfo:", buyInfo)
} else if (action == SELL) {
var sellInfo = IsMarketOrder ? exchange.Sell(-1, amount) : $.Sell(amount)
Log("sellInfo:", sellInfo)
} else {
Log("现货交易所不支持!", "#FF0000")
}
} else if (eType == 1) {
var tradeInfo = null
var ticker = _C(exchange.GetTicker)
if (action == LONG) {
exchange.SetDirection("buy")
tradeInfo = IsMarketOrder ? exchange.Buy(-1, amount) : exchange.Buy(ticker.Sell, amount)
} else if (action == SHORT) {
exchange.SetDirection("sell")
tradeInfo = IsMarketOrder ? exchange.Sell(-1, amount) : exchange.Sell(ticker.Buy, amount)
} else if (action == COVER_LONG) {
exchange.SetDirection("closebuy")
tradeInfo = IsMarketOrder ? exchange.Sell(-1, amount) : exchange.Sell(ticker.Buy, amount)
} else if (action == COVER_SHORT) {
exchange.SetDirection("closesell")
tradeInfo = IsMarketOrder ? exchange.Buy(-1, amount) : exchange.Buy(ticker.Sell, amount)
} else {
Log("期货交易所不支持!", "#FF0000")
}
if (tradeInfo) {
Log("tradeInfo:", tradeInfo)
}
} else {
throw "eType error, eType:" + eType
}
acc = _C(exchange.GetAccount)
}
var tbl = {
type : "table",
title : "状态信息",
cols : ["数据"],
rows : []
}
// tbl.rows.push([JSON.stringify(acc)]) // 测试时使用
LogStatus(_D(), eName, "上次接收到的命令:", lastMsg, "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(1000)
}
}
戦略コードは非常にシンプルで、検出GetCommand対話型メッセージがポリシープログラムに送信されたときの関数の戻り値は、GetCommand関数はこのメッセージを返し、戦略プログラムはメッセージの内容に基づいて対応する取引操作を実行します。この戦略にはインタラクティブ ボタンが設定されており、インタラクティブ機能をテストできます。たとえば、この戦略を実行し、Inventor Quantitative Trading Platform のシミュレートされた取引でロボットを構成します。WexApp。
インタラクション ボタンをクリックして、ロボットが購入コマンドを受信できるかどうかをテストします。
ロボットが受信したコマンド文字列は次のようになります。buy:0.01。
TradingView アラートがトリガーされたときに、WebHook リクエスト URL が Inventor Quantitative Trading Platform Extension API にアクセスするようにするだけです。CommandRobotインターフェースを使用する場合、パラメータはbuy:0.01それでおしまい。
TradingViewのWebHookの設定
TradingView に戻り、WebHook の URL を入力します。与えるaccess_key、secret_key独自のパラメータを入力してくださいAPI KEY。method修正しました。アクセスするだけですCommandRobotこの拡張APIインターフェースは、argsパラメータは[机器人ID,命令字符串]の形式では、図に示すように、ロボット ページを通じてロボット ID を直接取得できます。

今回はシグナルをトリガーして 0.02 コインを購入します。コマンド文字列は次のとおりです。"buy:0.02"。これでWebHook URLが完成します。この方法は、URLにシグナルを書き込むことのみをサポートしています。TV戦略自体が発行できるアラートメッセージの内容を取得したい場合は、https://www.fmz.com/api#��を参照してください。 %B4%E6 %8E%A5%E9%AA%8C%E8%AF%81。
https://www.fmz.com/api/v1?access_key=e3809e173e23004821a9bfb6a468e308&secret_key=45a811e0009d91ad21154e79d4074bc6&method=CommandRobot&args=[191755,"buy:0.02"]
TradingViewでの設定:
信号がトリガーされるのを待っています...
信号がトリガーされるのを待っています。
信号がトリガーされるのを待っています。
...
ロボットは次の信号を受信しました:
このように、TradingViewの豊富なチャート機能とインジケーターアルゴリズムをInventor Quantitative Trading Platformの戦略ロボットと組み合わせて使用することで、希望する自動取引を実現できます。TradingViewの戦略をJavaScriptやPython言語に移植する場合と比較して、難易度が大幅に軽減されます。
「モニタリングシグナル発注ロボット」の戦略コードは学習と研究のみを目的としています。実際の使用には自分で最適化して調整する必要があります。先物をサポートしており、成行注文モードに設定することをお勧めします。戦略を参照してください詳細についてはコードパラメータを参照してください。
これは単なる出発点です。ご質問やご提案がありましたら、メッセージを残してください。
// 目前已经不支持:https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"ok12345"]这种方式,需要将参数编码,需要修改如下:
https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515%2C"ok12345"]
以前那个多简单明了啊。。。。[186515,"ok12345"]。。。。。为什么一定要修改成这么复杂的啊%5B186515%2C%22ok12345%22%5D
这个策略方案是一个简单的例子,只能做单个品种,多品种的可以参考另一个例子:
https://www.fmz.com/digest-topic/9794
"Flag":"{{strategy.order.id}}",
"Exchange":1,
"Currency":"1000SATS_USDT",
"ContractType":"swap",
"Price":"{{close}}",
"Action":"long",
"Amount":"33333"
}我的信号写成close了,为什么日志显示无法获取价格呢
这个代码就是策略交互这里,我测试1000sats这个交易对,我想的就是用收盘价开单,市价太贵了,但是会报错,我代码水平太差了,gpt用了找不出来具体的问题
这里测试信号指的是最终发到FMZ上的信息,你在trading view 上设置webhook 的时候写的是{{close}} 它实际发送的时候就是具体价格了。所以你在这里测试的时候只能填写具体价格,FMZ上没有、也不识别这个{{close}}占位符。
测试信号的时候填写具体价格,FMZ上不会识别你这个{{close}} ,这个是trading view上的占位符,文章看下,看明白就懂了。
这是您文章里关于这个的例子,因为这里-1都能识别是市价单,中间关于{close}也能识别,但是我查平台的api文档查不到什么对应市价单
我要怎么实现处理多个警报呢,比如同一时间,同一交易对,或者不同交易对,有多个警报传过来,但是我看我只能每秒处理一个,而且没有办法排序
有啊
我们可以自己用通用协议绑定吧?只是要求要填IP地址,这个IP地址要填哪个地址呢?
API 入口链接:https://coinw.pw/API
这个是coinw的现货API哇,coinw现货FMZ是已经支持的了,他们合约都没有接口的。您最好咨询下coinw。我问了他们客服,说是没有合约API。
你好大佬,我做的合约策略,开仓后有时中途会加仓,那么我最后要平仓的时候,用cover_long怎么平掉全部的仓位(因为不知道中间会加几次),"cover_long:1"里面的1改成什么,跪求代码
这个你可以具体设计的,比如你设计 请求里 cover_long:1, 改成 cover_long:all , 这样你在FMZ的这个 监听策略里把收到交互cover_long时修改一下, 判断如果是all,就全部平仓。要实现这个是要修改这个策略的。
// 全局变量
var BUY = "buy" // 注意:现货用的命令
var SELL = "sell" // 现货用的命令
var LONG = "long" // 期货用的命令
var SHORT = "short" // 期货用的命令
var COVER_LONG = "cover_long" // 期货用的命令
var COVER_SHORT = "cover_short" // 期货用的命令
......
....
..
.
} else if (eType == 1) {
var tradeInfo = null
var ticker = _C(exchange.GetTicker)
if (action == LONG) {
exchange.SetDirection("buy")
tradeInfo = IsMarketOrder ? exchange.Buy(-1, amount) : exchange.Buy(ticker.Sell, amount)
} else if (action == SHORT) {
exchange.SetDirection("sell")
tradeInfo = IsMarketOrder ? exchange.Sell(-1, amount) : exchange.Sell(ticker.Buy, amount)
} else if (action == COVER_LONG) { // COVER_LONG 就是 “cover_long” ,判断到是这个action ,进入这里的if
// 这里你再具体判断 all 之类的参数,去做全部平仓的操作设计,具体编写
exchange.SetDirection("closebuy")
tradeInfo = IsMarketOrder ? exchange.Sell(-1, amount) : exchange.Sell(ticker.Buy, amount)
} else if (action == COVER_SHORT) {
exchange.SetDirection("closesell")
tradeInfo = IsMarketOrder ? exchange.Buy(-1, amount) : exchange.Buy(ticker.Sell, amount)
} else {
Log("期货交易所不支持!", "#FF0000")
}
if (tradeInfo) {
Log("tradeInfo:", tradeInfo)
}
} else {
throw "eType error, eType:" + eType
}
acc = _C(exchange.GetAccount)
}
我的TV策略消息是这样的:订单{{strategy.order.action}}@{{strategy.order.contracts}}成交{{ticker}}。新策略仓位{{strategy.position_size}}
如果我想做合约的话,是不是要添加4个警报呢?做多、平多、做空、开空
webhook能不能引用策略里面的字段呢?还是要我写死才行?webhook里面的4种方式long、cover_long\short、cover_short怎么样才能和警报里面的消息对上吗?
使用FMZ的扩展API接收TV请求,可以获取Body内容,参看:https://www.fmz.com/api#直接验证
现在TV发出请求的url里,body里的数据都可以收到了。
老师您好,我按照您的步骤一步一步照搬下来,就是服务器选用的是发明者自带的服务器,但是TV那边已经发信号了但是发明者这边的机器人还是不执行信号命令,是不是因为服务器的原因?请您答疑!!
期货现货使用是一样的, 只是链接里面 参数替换一下而已。
var BUY = "buy"
var SELL = "sell"
var LONG = "long"
var SHORT = "short"
var COVER_LONG = "cover_long"
var COVER_SHORT = "cover_short"
long就是开多头仓位,short就是开空头仓位, cover_long 就是平多头,cover_short 平空头。
https://www.fmz.com/api/v1?access_key=e3809e173e23004821a9bfb6a468e308&secret_key=45a811e0009d91ad21154e79d4074bc6&method=CommandRobot&args=[191755,"buy:0.02"]
链接里面buy替换一下而已。
- 1
- 2























