Xin vui lòng nói cho tôi biết, nếu có hàng tồn kho ở cùng một hướng và không được đặt hàng mới, làm thế nào để thay đổi quy trình nhận tín hiệu này?

Tác giả:Jetter, Tạo: 2023-01-26 20:31:05, Cập nhật:

/*Backtest bắt đầu: 2022-01-15 00:00:00 kết thúc: 2023-01-21 00:00:00 Thời gian: 1h cơ sở Thời gian: 15m trao đổi: [{eid:Futures_Binance,currency:ETH_USDT}] */

// cấu trúc tín hiệu var Template = { Flag: 45M103Buy , // biểu tượng, có thể tùy chọn Exchange: 1, // Đặt cặp giao dịch giao dịch Tiền tệ: ETH_USDT , // cặp giao dịch ContractType: swap , // loại hợp đồng, swap, quarter, next_quarter, hiện tại fillspot Price: -1, // giá mở hoặc đóng cửa, -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 nhiều, short: giao dịch tương lai trống, closesell: giao dịch tương lai mua trống, closebuy: giao dịch tương lai bán rẻ] Amount: 0, // khối 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 ổ đĩa hiện tại var Success = #5cb85c // thành công màu sắc var Danger = #ff0000 // màu nguy hiểm var Warning = #f0ad4e // màu cảnh báo var buffSignal = []

// Hình dạng thông báo tín hiệu kiểm tra Diff functionObject ((object1, object2) { const keys1 = Object.keys ((object1)) const keys2 = Object.keys ((object2)) if (keys1.length!== keys2.length) { return false là sai for (let i = 0; i < keys1.length; i++) { if (keys1[i]!== keys2[i]) { return false là sai return true

checkSignal{\displaystyle \mathbb {S} {\displaystyle \mathbb {S} } Signal.Price = parseFloat ((Signal.Price) Signal.Amount = parseFloat ((Signal.Amount)) nếu (Signal.Exchange<= 0 ∈!Number.isInteger(Signal.Exchange) { Log (đối với các giao dịch, số ít nhất là 1 và là một số nguyên tử, Danger) return if (Signal.Amount <= 0 の typeof ((Signal.Amount)!= number ) { Log (đồng độ giao dịch không thể nhỏ hơn 0 và là số lượng type log, typeof (Signal.Amount), Danger) return if (typeof ((Signal.Price)!= number ) { Log ((Phần giá phải là một phần giá trị, Danger)) return if (Signal.ContractType == spot && Signal.Action!= buy && Signal.Action!= sell) { Log (Log () là lệnh để vận hành hiện tại, Action error, Action: log, Signal.Action, Danger) return if (Signal.ContractType!= spot && Signal.Action!= long && Signal.Action!= short && Signal.Action!= closesell && Signal.Action!= closebuy) { Log (định lệnh cho giao dịch tương lai, Action error, Action: , Signal.Action, Danger) return Trả lời đúng

function commandRobot ((url, accessKey, secretKey, robotId, cmd) { - Không.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 các yêu cầu webhook của TradingView, gửi các 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 (tạm dịch: function HandleCommand ((signal) { // Kiểm tra nhận lệnh tương tác if (signal) { Log (( nhận lệnh tương tác: , signal) // nhận lệnh tương tác, in lệnh tương tác } else { return // không nhận được, 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) Log (( giao dịch loại [ mua: mua ngay, bán: bán ngay, dài: tương lai làm nhiều, ngắn: tương lai làm trống, closesell: tương lai mua vào trống, closebuy: tương lai bán rẻ] , Danger) Log (), JSON.stringify (), 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)
    }
}

}


Thêm nữa

Các bạn có thể liên hệ với chúng tôi bằng cách nhấp vào hình ảnh trên.exchange.GetPosition ((), lấy thông tin nắm giữ hiện tại. Nếu nắm giữ nhiều hơn 0, không đặt hàng.

Giấc mơ nhỏCác chiến lược này chỉ được viết dựa trên nhu cầu của bạn, bạn có thể tìm kiếm một số chiến lược để tham khảo trên quảng trường chiến lược nền tảng.

JetterTốt. Cảm ơn! Có phải mã là như vậy không? var nowRefPosAmount = getPosAmount ((_C ((exchange.GetPosition), ct) var x = owRefPosAmount.long var y = owRefPosAmount.short Tôi cần cái CT đó chứ?

JetterTốt. Cảm ơn!