Type/to search
0
Follow
0
Followers
アドバイスをお願いします。同じ方向にポジションがある場合は、新しい注文は出されません。このシグナル受信プログラムをどのように変更すればよいでしょうか?
Help
Created 2023-01-26 20:31:05  
 4
 1331

/*backtest
start: 2022-01-15 00:00:00
end: 2023-01-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

信号の構造
var Template = {
Flag: "45M103Buy", // 標識は,任意に指定できる
Exchange: 1, // 取引相手を指定する
通貨: "ETH_USDT", // 取引ペア
ContractType: "swap", // 契約タイプ,swap,quarter,next_quarter,現貨の記入スポット
Price: "-1", // ポジション開設または平仓価格,-1は市場価格
アクション: "long", // トランザクションタイプ[buy: 現貨買入, sell: 現貨売却, long: 期貨多出, short: 期貨空出, closesell: 期貨買入空出, closebuy: 期貨多出]
取引額: "0", // 取引額
}

var BaseUrl = "https://www.fmz.com/api/v1" // FMZ拡張APIインターフェースアドレス
var RobotId = _G (() // 現在のリッドディスクID
var Success = "#5cb85c" // 成功の色を表示する
var Danger = "#ff0000" // 危険な色
var Warning = "#f0ad4e" // 警告色
var buffSignal = []

// 信号メッセージの形式を確認する
function DiffObject(object1, object2) {
const keys1 = Object.keys(object1)
const keys2 = Object.keys(object2)
if (keys1.length !== keys2.length) {
return false
}
for (let i = 0; i < keys1.length; i++) {
if (keys1[i] !== keys2[i]) {
return false
}
}
return true
}

function CheckSignal(Signal) {
Signal.Price = parseFloat(Signal.Price)
Signal.Amount = parseFloat(Signal.Amount)
if (Signal.Exchange <= 0 || !Number.isInteger(Signal.Exchange)) {
Log (("取引所の最小番号は1であり,整数である",Danger)
return
}
if (Signal.Amount <= 0 || typeof(Signal.Amount) != "number") {
Log (("取引量は0未満で,数値型である", typeof ((Signal.Amount), Danger)
return
}
if (typeof(Signal.Price) != "number") {
Log (『値段は数値でなければならない』,Danger)
return
}
if (Signal.ContractType == "spot" && Signal.Action != "buy" && Signal.Action != "sell") {
Log (("指令は操作現貨,Action エラー,Action:", Signal.Action,Danger) について
return
}
if (Signal.ContractType != "spot" && Signal.Action != "long" && Signal.Action != "short" && Signal.Action != "closesell" && Signal.Action != "closebuy") {
Log (("指令は,操作期貨,Actionエラー,Action:", Signal.Action,Danger) として設定されています.
return
}
return true
}

function commandRobot(url, accessKey, secretKey, robotId, cmd) {
// https://www.fmz.com/api/v1?access_key=xxx&secret_key=xxx&method=CommandRobot&args=[xxx,+""]
url = url + '?access_key=' + accessKey + '&secret_key=' + secretKey + '&method=CommandRobot&args=[' + robotId + ',+""]'
var postData = {
method:'POST',
data:cmd
}
var headers = "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36\nContent-Type: application/json"
var ret = HttpQuery(url, postData, "", headers)
Log ((("TradingViewのwebhook要求を模倣し,テスト用のPOST要求を送信する:", url, "body:", cmd, "返信:", ret)
}

function createManager() {
var self = {}
self.tasks = []

self.process = function() { var processed = 0 if (self.tasks.length > 0) { _.each(self.tasks, function(task) { if (!task.finished) { processed++ self.pollTask(task) } }) if (processed == 0) { self.tasks = [] } } } self.newTask = function(signal) { // {"Flag":"45M103Buy","Exchange":1,"Currency":"BTC_USDT","ContractType":"swap","Price":"10000","Action":"buy","Amount":"0"} var task = {} task.Flag = signal["Flag"] task.Exchange = signal["Exchange"] task.Currency = signal["Currency"] task.ContractType = signal["ContractType"] task.Price = signal["Price"] task.Action = signal["Action"] task.Amount = signal["Amount"] task.exchangeIdx = signal["Exchange"] - 1 task.pricePrecision = null task.amountPrecision = null task.error = null task.exchangeLabel = exchanges[task.exchangeIdx].GetLabel() task.finished = false Log("创建任务:", task) self.tasks.push(task) } self.getPrecision = function(n) { var precision = null var arr = n.toString().split(".") if (arr.length == 1) { precision = 0 } else if (arr.length == 2) { precision = arr[1].length } return precision } self.pollTask = function(task) { var e = exchanges[task.exchangeIdx] var name = e.GetName() var isFutures = true e.SetCurrency(task.Currency) if (task.ContractType != "spot" && name.indexOf("Futures_") != -1) { // 非现货,则设置合约 e.SetContractType(task.ContractType) } else if (task.ContractType == "spot" && name.indexOf("Futures_") == -1) { isFutures = false } else { task.error = "指令中的ContractType与配置的交易所对象类型不匹配" return } var depth = e.GetDepth() if (!depth || !depth.Bids || !depth.Asks) { task.error = "订单薄数据异常" return } if (depth.Bids.length == 0 && depth.Asks.length == 0) { task.error = "盘口无订单" return } _.each([depth.Bids, depth.Asks], function(arr) { _.each(arr, function(order) { var pricePrecision = self.getPrecision(order.Price) var amountPrecision = self.getPrecision(order.Amount) if (Number.isInteger(pricePrecision) && !Number.isInteger(self.pricePrecision)) { self.pricePrecision = pricePrecision } else if (Number.isInteger(self.pricePrecision) && Number.isInteger(pricePrecision) && pricePrecision > self.pricePrecision) { self.pricePrecision = pricePrecision } if (Number.isInteger(amountPrecision) && !Number.isInteger(self.amountPrecision)) { self.amountPrecision = amountPrecision } else if (Number.isInteger(self.amountPrecision) && Number.isInteger(amountPrecision) && amountPrecision > self.amountPrecision) { self.amountPrecision = amountPrecision } }) }) if (!Number.isInteger(self.pricePrecision) || !Number.isInteger(self.amountPrecision)) { task.err = "获取精度失败" return } e.SetPrecision(self.pricePrecision, self.amountPrecision) // buy:现货买入 , sell:现货卖出 , long:期货做多 , short:期货做空 , closesell:期货买入平空 , closebuy:期货卖出平多 var direction = null var tradeFunc = null if (isFutures) { switch (task.Action) { case "long": direction = "buy" tradeFunc = e.Buy break case "short": direction = "sell" tradeFunc = e.Sell break case "closesell": direction = "closesell" tradeFunc = e.Buy break case "closebuy": direction = "closebuy" tradeFunc = e.Sell break } if (!direction || !tradeFunc) { task.error = "交易方向错误:" + task.Action return } e.SetDirection(direction) } else { if (task.Action == "buy") { tradeFunc = e.Buy } else if (task.Action == "sell") { tradeFunc = e.Sell } else { task.error = "交易方向错误:" + task.Action return } } var id = tradeFunc(task.Price, task.Amount) if (!id) { task.error = "下单失败" } task.finished = true } return self

}

var manager = createManager()
function HandleCommand(signal) {
インタラクティブ指令の受信を検知する
if (signal) {
Log (("交互指令を受信:", signal) //交互指令を受信し,交互指令をプリントする
} else {
return // 受け取れなかったら直接返却し,処理しない
}

// 检测交互指令是否是测试指令,测试指令可以由当前策略交互控件发出来进行测试 if (signal.indexOf("TestSignal") != -1) { signal = signal.replace("TestSignal:", "") // 调用FMZ扩展API接口,模拟Trading View的webhook,交互按钮TestSignal发送的消息:{"Flag":"45M103Buy","Exchange":1,"Currency":"BTC_USDT","ContractType":"swap","Price":"10000","Action":"buy","Amount":"0"} commandRobot(BaseUrl, FMZ_AccessKey, FMZ_SecretKey, RobotId, signal) } else if (signal.indexOf("evalCode") != -1) { var js = signal.split(':', 2)[1] Log("执行调试代码:", js) eval(js) } else { // 处理信号指令 objSignal = JSON.parse(signal) if (DiffObject(Template, objSignal)) { Log("接收到交易信号指令:", objSignal) buffSignal.push(objSignal) // 检查交易量、交易所编号 if (!CheckSignal(objSignal)) { return } // 创建任务 manager.newTask(objSignal) } else { Log("指令无法识别", signal) } }

}

function main() {
ログ (log) "WebHookアドレス:", "https://www.fmz.com/api/v1?access_key=" + FMZ_AccessKey + "&secret_key=" + FMZ_SecretKey + "&method=CommandRobot&args=[" + RobotId + ',+""]', Danger)
取引の種類[buy: 現貨買入, sell: 現貨売却, long: 期貨多出, short: 期貨空出, closesell: 期貨買入空出, closebuy: 期貨売出平出", Danger)
Log (("コマンド テンプレート:", JSON.stringify ((Template), Danger)

while (true) { try { // 处理交互 HandleCommand(GetCommand()) // 处理任务 manager.process() if (buffSignal.length > maxBuffSignalRowDisplay) { buffSignal.shift() } var buffSignalTbl = { "type" : "table", "title" : "信号记录", "cols" : ["Flag", "Exchange", "Currency", "ContractType", "Price", "Action", "Amount"], "rows" : [] } for (var i = buffSignal.length - 1 ; i >= 0 ; i--) { buffSignalTbl.rows.push([buffSignal[i].Flag, buffSignal[i].Exchange, buffSignal[i].Currency, buffSignal[i].ContractType, buffSignal[i].Price, buffSignal[i].Action, buffSignal[i].Amount]) } LogStatus(_D(), "\n", "`" + JSON.stringify(buffSignalTbl) + "`") Sleep(1000 *SleePinterval ) } catch (error) { Log("e.name:", error.name, "e.stack:", error.stack, "e.message:", error.message) Sleep(1000 * 5) } }

}

Related Recommendations
Comment
All comments (4)

    exchange.GetPosition(),获取当前持仓信息。若持多仓大于0时,则不下单。

    4 years ago

    好的。谢谢!

    代码是这样吗?
    var nowRefPosAmount = getPosAmount(_C(exchange.GetPosition), ct)
    var x = owRefPosAmount.long
    var y = owRefPosAmount.short

    那个ct要不要?

    4 years ago

    好的。谢谢!

    4 years ago

    策略设计这个具体只能根据自己需求编写了,可以在平台策略广场里找些策略做参考。

    4 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)