Type/to search
0
Follow
0
Followers
Por favor, avíseme, si hay una posición en la misma dirección, no se colocará un nuevo pedido. ¿Cómo se debe modificar este programa de recepción de señales?
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"}]
*/

// La estructura de la señal
var Template = {
Flag: "45M103Buy", // Identificación, se puede especificar libremente
Exchange: 1, // Especifica el par de transacciones del intercambio
Currency: "ETH_USDT", // el par de operaciones
ContractType: "swap", // tipo de contrato, swap, quarter, next_quarter, punto de cumplimiento
Price: "-1", // precio de apertura o cierre de posición, -1 es el precio de mercado
Action: "long", // tipo de transacción[buy: compra en efectivo, sell: venta en efectivo, long: compra a la par, short: compra a la baja, closesell: compra a la baja, closebuy: venta a la baja]
Amount: "0", // volumen de la operación
}

var BaseUrl = "https://www.fmz.com/api/v1" // Dirección de la interfaz de la API de extensión FMZ
var RobotId = _G (() // Identificación del disco duro actual
var Success = "#5cb85c" // Color de éxito
var Danger = "#ff0000" // color peligroso
var Warning = "#f0ad4e" // Color de advertencia
var buffSignal = []

// Verificar el formato del mensaje de la señal
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 (("El número mínimo de la bolsa es 1, y es un número entero", Danger)
return
}
if (Signal.Amount <= 0 || typeof(Signal.Amount) != "number") {
Log (("el volumen de transacciones no puede ser menor a 0 y es de tipo numérico", typeof ((Signal.Amount), Danger)
return
}
if (typeof(Signal.Price) != "number") {
Log ("El precio tiene que ser un valor numérico", Danger)
return
}
if (Signal.ContractType == "spot" && Signal.Action != "buy" && Signal.Action != "sell") {
Log ("Señales de acción, peligro, error de acción")
return
}
if (Signal.ContractType != "spot" && Signal.Action != "long" && Signal.Action != "short" && Signal.Action != "closesell" && Signal.Action != "closebuy") {
Log (("Instrucciones para operar el futuro, error de acción, acción:", 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 (((" simula una solicitud webhook de TradingView, envía una POST para la prueba:", url, "body:", cmd, "respuesta:", 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) {
// Detectar si se ha recibido una instrucción interactiva
if (signal) {
Log (("Recibió instrucciones de interacción:", signal) // Recibió instrucciones de interacción, imprimió instrucciones de interacción
} else {
return // Regresa directamente si no se ha recibido, sin procesar
}

// 检测交互指令是否是测试指令,测试指令可以由当前策略交互控件发出来进行测试 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)
Tipo de transacción[Danger (en inglés: Danger) es un término que se utiliza para referirse a las operaciones de compra y venta de acciones, compras y ventas de acciones en efectivo, ventas y ventas en efectivo, compras y ventas de acciones en efectivo, ventas y ventas en efectivo, ventas y ventas en efectivo, ventas y ventas en efectivo, compras y ventas en efectivo, ventas y ventas en efectivo, compras y ventas en efectivo, ventas y ventas en efectivo, compras y ventas en efectivo, ventas y ventas en efectivo, compras y ventas en efectivo, ventas y ventas en efectivo, compras y ventas en efectivo, ventas y ventas en efectivo, ventas y ventas en efectivo, compras y ventas en efectivo, ventas y ventas en efectivo, compras y ventas en efectivo, ventas y ventas en efectivo, ventas y ventas en efectivo.
Log (("Instrucciones de la plantilla:", 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)