Please tell me how this signal receiving procedure should be modified if there is a hold in the same direction and no more new orders are placed.

Author: Jetter, Created: 2023-01-26 20:31:05, Updated:

/*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”}] */

// Signal structure var Template is { Flag: 45M103Buy , // logo, can be specified at will Exchange: 1, // Specifies the exchange's trading pair Currency: ETH_USDT , // the transaction pair ContractType: swap tip, // contract type, swap, quarter, next_quarter, spot to spot Price: -1, // opening or closing price, -1 for market price Action: long, // type of transaction [ buy: buy on the spot, sell: sell on the spot, long: futures do more, short: futures do nothing, closesell: futures buy on the spot, closebuy: futures sell on the cheap] Amount: 0, // the amount of the transaction I'm not going anywhere.

var BaseUrl = “https://www.fmz.com/api/v1// FMZ extended API interface address var RobotId = _G() // current disk ID var Success = #5cb85c // Successful color var Danger = yellow #ff0000 // dangerous color var Warning = #f0ad4e // Warning color var buffSignal = []

// Check the message format of the signal Diff functionObject ((object1, object2) { const keys1 = Object.keys ((object1) const keys2 = Object.keys ((object2) If (keys1.length!== keys2.length) { return false I'm not going anywhere. for (let i = 0; i < keys1.length; i++) { If (keys1 [i]!== keys2 [i]) { return false I'm not going anywhere. I'm not going anywhere. return true I'm not going anywhere.

function CheckSignal(Signal) { Signal.Price = parseFloat(Signal.Price) Signal.Amount = parseFloat(Signal.Amount) if (Signal.Exchange <= 0 || !Number.isInteger(Signal.ExchangeWhat is it? Log ((The smallest number of hash exchanges is 1 and stands for integer hash, Danger) return I'm not going anywhere. if (Signal.Amount <= 0 の の typeof ((Signal.Amount)!= number )) { Log (the amount of the transaction cannot be less than 0 and is a value of type log, typeof (Signal.Amount, Danger) return I'm not going anywhere. if (typeof ((Signal.Price)!= number ) { Log (the price of the ruble must be the numerical ruble, Danger) return I'm not going anywhere. if (Signal.ContractType == spot button && Signal.Action!= buy button && Signal.Action!= sell button) { Log (Log () is a command for operating on the spot, Action error, Action:Log, Signal.Action, Danger) return I'm not going anywhere. if (Signal.ContractType!= spot button && Signal.Action!= long button && Signal.Action!= short button && Signal.Action!= closesell button && Signal.Action!= closebuy button) { Log (Log () is a command to operate futures, Action error, Action:Log, Signal.Action, Danger) return I'm not going anywhere. return true I'm not going anywhere.

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 is equal to { The method is: click POST click. data:cmd I'm not going anywhere. This is a list of all the different ways Mozilla WebKit is credited in the database. var ret = HttpQuery ((url, postData, array, headers) is the name of the file Log (( emulates a webhook request from TradingView, sending a POST request for testing: , url, body: , cmd, reply: , ret) I'm not going anywhere.

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) { is used. // Detects whether interaction commands are received if (signal) { Log (( receives interaction command:??, signal) // receives interaction command, prints interaction command } else { return // returns directly when not received, not processed I'm not going anywhere.

// 检测交互指令是否是测试指令,测试指令可以由当前策略交互控件发出来进行测试
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 address: , https://www.fmz.com/api/v1?access_key=It is also known as the "secret key" or "secret key". Log (selling type: buy: buy, sell: sell, long: short, closeesell: buy, closebuy: close) Log (includes command templates: log, JSON.stringify (includes templates), 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)
    }
}

}


More

Help (click on the image to get in touch)exchange.GetPosition ((), obtaining the current holdings information. If the holdings are greater than 0, no order is placed.

The Little DreamThis specific strategy can only be written according to your needs, and you can find some strategies for reference in the platform's Strategy Square.

JetterGood. Thank you! Is that the code? var nowRefPosAmount = getPosAmount ((_C ((exchange.GetPosition), ct) var x = owRefPosAmount.long var y = owRefPosAmount.short Do you want that CT?

JetterGood. Thank you!