Por favor, ¿cómo se puede cambiar el sistema de recepción de señales si no se pueden hacer nuevos pedidos si se tiene un almacén en la misma dirección?

El autor:El Jetter, Creado: 2023-01-26 20:31:05, Actualizado:

/* prueba de retroceso Comienza el 15 de enero de 2022 Fin: 2023-01-21 00:00:00 período: 1 hora basePeriodo: 15m En el caso de las bolsas: [{eid:Futures_Binance,currency:ETH_USDT}] */

// estructura de la señal El modelo var es { Flag: 45M103Buy , // Marca, puede ser seleccionada Exchange: 1, // Especifica el par de transacciones de la bolsa Currency: ETH_USDT , // el par de transacciones ContractType: swap , // tipo de contrato, swap, quarter, next_quarter, punto de llenado de efectivo Price: -1, // precio de apertura o liquidación, -1 es el precio de mercado Action: long, // Tipo de transacción [ buy: compra al instante, sell: venta al instante, long: hacer más futuros, short: hacer vacíos futuros, closesell: comprar futuros al vacío, closebuy: vender futuros más baratos ] Amount: 0, // volumen de las transacciones ¿Qué es eso?

var BaseUrl = https://www.fmz.com/api/v1Dirección de la API de extensión de FMZ var RobotId = _G() // ID de disco real actual var Success = #5cb85c // Color de éxito var Danger = #ff0000 // color peligroso var Warning = #f0ad4e // Color de advertencia Var buffSignal = []

// El formato del mensaje de la señal de verificación Función Objeto (objeto 1, objeto 2) { const keys1 = Object.keys ((object1)) es el número de teclas de un objeto. Const keys2 = Object.keys ((object2)) es el número de teclas de un objeto. Si (claves 1. longitud!== claves 2. longitud) { No es cierto. ¿Qué es eso? para (dejemos que i = 0; i < keys1.length; i++) { Si (claves1 [i]!== claves2 [i]) { No es cierto. ¿Qué es eso? ¿Qué es eso? No es cierto. ¿Qué es eso?

Función de verificaciónSignal ((Signal) { El precio de la señal es el parseFloat (Signal). La cantidad de información que se requiere para el análisis de los datos de los Estados miembros es la siguiente: si (Signal.ExchangeEl número es un número entero.Signal.Exchange¿Qué es esto? Log (el número mínimo de los intercambios de tiburones es 1 y representa el número entero tiburón, Danger) regresar ¿Qué es eso? si (Signal.Amount <= 0 の typeof ((Signal.Amount)!= number ) { Log (el volumen de transacción no puede ser menor que 0 y tiene el tipo de valor de log, typeof (Signal.Amount), Danger) regresar ¿Qué es eso? si (typeof ((Signal.Price)!= number ) { Log (el precio del aluminio debe ser el valor del aluminio, Danger) regresar ¿Qué es eso? si (Signal.ContractType == spot && Signal.Action!= buy && Signal.Action!= sell) { Log ((la instrucción de accionar para operar en el momento, Error de acción, Acción: accionar, Signal.Acción, Danger) regresar ¿Qué es eso? si (Signal.ContractType!= spot && Signal.Action!= long && Signal.Action!= short && Signal.Action!= closesell && Signal.Action!= closebuy) { Log (la instrucción de accionar para operar futuros, error de acción, acción: accionar, señal.acción, peligro) regresar ¿Qué es eso? No es cierto. ¿Qué es eso?

Comando de funciónRobot ((url, acceso, clave secreta, robotId, cmd) { - ¿ Qué pasa?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 = { El número de datos es el número de El método es el siguiente: Data: cmd Es el nombre de la página. ¿Qué es eso? 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 también disponible en el sitio web de la compañía var ret = HttpQuery ((url, postData, parámetros, encabezados) Log (( simula las solicitudes webhook de TradingView, enviando las solicitudes POST para su prueba:??, url, body:??, cmd, respuesta:??, ret) ¿Qué es eso?

Crear un administrador de funciones el valor de la misma = { auto. tareas = []

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 (en inglés) Función HandleCommand (signo) { // Detecta si se reciben las instrucciones de interacción Si (señal) { Log (( recibe instrucciones de interacción:??, signal) // recibe instrucciones de interacción, imprime instrucciones de interacción ¿Por qué no? return // no se devuelve directamente cuando se recibe, no se procesa ¿Qué es eso?

// 检测交互指令是否是测试指令,测试指令可以由当前策略交互控件发出来进行测试
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)
    }
}

}

La función principal ((() { Log (( WebHook dirección: ,https://www.fmz.com/api/v1?access_key=La clave de acceso es el código de acceso de la máquina. La clave de acceso es el código de acceso de la máquina. Log ((tipo de operación de venta: buy: compra al instante, sell: venta al instante, long: hacer más futuros, short: hacer vacíos futuros, closesell: comprar futuros al vacío, closebuy: vender futuros más baratos) Log (Template de instrucciones de acoplamiento: acoplamiento, 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)
    }
}

}


Más.

Para obtener ayuda, haga clic en la imagen principal.exchange.GetPosition ((), obtiene información sobre el mantenimiento actual. Si tiene más de 0, no se realiza el pedido.

Un sueño pequeño.El diseño de estrategias se puede escribir solo según sus necesidades, y se pueden encontrar algunas estrategias para consultar en la Plaza de la Plataforma de Estrategias.

El JetterEstá bien. Gracias. ¿Es ese el código? var nowRefPosAmount = getPosAmount (_C) (exchange.GetPosition), ct) var x = owRefPosAmount.long es el valor de la función var y = owRefPosAmount.short y ¿Quieres ese CT?

El JetterEstá bien. Gracias.