Type/to search
0
Follow
0
Followers
Xin hãy tư vấn, nếu có vị trí cùng hướng thì sẽ không có lệnh mới nào được đặt. Chương trình nhận tín hiệu này nên được sửa đổi như thế nào?
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"}]
*/

// Cấu trúc tín hiệu
var Template = {
Flag: "45M103Buy", // Chữ hiệu, tùy chọn
Exchange: 1, // chỉ định cặp giao dịch giao dịch
Currency: "ETH_USDT", // giao dịch cặp
ContractType: "swap", // loại hợp đồng, swap,quarter,next_quarter, spot
Giá: "-1", // giá mở hoặc giá bán, -1 là giá thị trường
Action: "long", // loại giao dịch[buy: mua ngay, sell: bán ngay, long: giao dịch tương lai làm nhiều, short: giao dịch tương lai làm trống, closesell: giao dịch tương lai mua trống, closebuy: giao dịch tương lai bán rẻ
Amount: "0", // Số lượng giao dịch
}

var BaseUrl = "https://www.fmz.com/api/v1" // Địa chỉ giao diện API mở rộng FMZ
var RobotId = _G (() // ID ổ cứng hiện tại
var Success = "#5cb85c" // màu thành công
var Danger = "#ff0000" // màu nguy hiểm
var Warning = "#f0ad4e" // Warning màu
var buffSignal = []

// Kiểm tra định dạng tin nhắn tín hiệu
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 (("Tỷ số nhỏ nhất của sàn giao dịch là 1 và là số nguyên", Danger)
return
}
if (Signal.Amount <= 0 || typeof(Signal.Amount) != "number") {
Log (("khối lượng giao dịch không thể nhỏ hơn 0 và là loại số", typeof ((Signal.Amount), Danger)
return
}
if (typeof(Signal.Price) != "number") {
Log ("Giá phải là giá trị số", Danger)
return
}
if (Signal.ContractType == "spot" && Signal.Action != "buy" && Signal.Action != "sell") {
Log ((" chỉ thị là hoạt động hiện tại, Action Error, Action:", Signal.Action, Danger)
return
}
if (Signal.ContractType != "spot" && Signal.Action != "long" && Signal.Action != "short" && Signal.Action != "closesell" && Signal.Action != "closebuy") {
Log (("Chỉ thị cho hoạt động tương lai, Action Error, 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 (((" mô phỏng yêu cầu webhook của TradingView, gửi yêu cầu POST để thử nghiệm:", url, "body:", cmd, "trả lời:", 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) {
// Kiểm tra nhận được lệnh tương tác
if (signal) {
Log (("receive interaction instruction:", signal) // nhận được interaction instruction, in interaction instruction
} else {
return // Không nhận được thì trả về, không xử lý
}

// 检测交互指令是否是测试指令,测试指令可以由当前策略交互控件发出来进行测试 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 địa chỉ:", "https://www.fmz.com/api/v1?access_key=" + FMZ_AccessKey + "&secret_key=" + FMZ_SecretKey + "&method=CommandRobot&args=[" + RobotId + ',+""]', Danger)
Loại giao dịch[buy: mua ngay, sell: bán ngay, long: giao dịch tương lai làm nhiều, short: giao dịch tương lai làm rỗng, closesell: giao dịch tương lai mua trống, closebuy: giao dịch tương lai bán rỗng.
Log (("định hướng mẫu:", 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)