S'il vous plaît, dites-moi comment modifier le processus de réception des signaux si vous avez des stocks dans la même direction et que vous ne faites plus de nouvelles commandes.

Auteur:Jetter, Créé: 2023-01-26 20:31:05, mis à jour:

/* test de retour Début: le 15 janvier 2022 00:00:00 Fin: le 21 janvier 2023 période: 1h basePériode: 15m Les échanges: {eid:Futures_Binance,monnaie:ETH_USDT} */

// structure du signal Var Template = { Il est possible de modifier Flag: 45M103Buy , // marque, peut être spécifiée à volonté Exchange: 1, // spécifie la paire de transactions Currency: ETH_USDT , // la paire de négociation ContractType: coupon swap coupon, // type de contrat, swap, quarter, next_quarter, spot de remplissage au comptant Price: -1, // prix d'ouverture ou de clôture, -1 est le prix du marché Action: long, // type de transaction [ buy: acheter sur le champ, sell: vendre sur le champ, long: faire plus de futures, short: faire le vide sur les futures, closesell: acheter sur le champ, closebuy: vendre sur le champ] Amount: 0, // le volume des opérations Je ne sais pas.

Var BaseUrl = https://www.fmz.com/api/v1L'adresse de l'interface d'extension de l'API FMZ var RobotId = _G() // ID du disque réel actuel var Success = couleur #5cb85c var Danger = couleur dangereuse var Warning = #f0ad4e // couleur d'avertissement Var buffSignal = []

// Format de message de vérification du signal Diff functionObject ((object1, object2) { est une fonction const keys1 = Object.keys ((object1)) est le nombre de clés d'un objet const keys2 = Object.keys ((object2)) est le nombre de clés d'un objet Si (clés 1.longueur!== clés 2.longueur) { retourner faux Je ne sais pas. pour (pour i = 0; i < keys1.length; i++) { si (clés1 [i]!== clés2 [i]) { retourner faux Je ne sais pas. Je ne sais pas. retourner vrai Je ne sais pas.

fonction CheckSignal ((Signal)) { Signal.Price = parseFloat ((Signal.Price) est le nom de l'appareil Signal.Amount = parseFloat ((Signal.Amount) est le numéro de téléphone de l'équipage. si (Signal.ExchangeLe nombre est entier.Signal.ExchangeJe ne sais pas. Log (le plus petit numéro d'un échange de jetons est 1 et représente l'entier jeton, Danger) retourner Je ne sais pas. si (Signal.Amount <= 0 の typeof ((Signal.Amount)!= number ) { Log ((Le montant de la transaction ne peut pas être inférieur à 0 et est de type numérique pour la transaction, typeof ((Signal.Amount, Danger) retourner Je ne sais pas. si (typeof ((Signal.Price)!= number ) { Log (le prix du cuivre doit être le prix du cuivre numérique, Danger) retourner Je ne sais pas. si (Signal.ContractType == spot typo && Signal.Action!= buy typo && Signal.Action!= sell typo) { Log (l'instruction de l'appareil est utilisée pour les opérations instantanées, Action erreur, Action: appareil, Signal.Action, Danger) retourner Je ne sais pas. si (Signal.ContractType!= le signe de l'interrupteur && Signal.Action!= le signe de l'interrupteur && Signal.Action!= le signe de l'interrupteur && Signal.Action!= le signe de l'interrupteur && Signal.Action!= le signe de l'interrupteur && Signal.Action!= le signe de l'interrupteur && Signal.Action!= le signe de l'interrupteur) { Log (l'instruction de l'aiguille est utilisée pour les futures, l'erreur d'action, l'action: aiguille, le signal.Action, le danger) retourner Je ne sais pas. retourner vrai Je ne sais pas.

commandes de fonction Robot ((url, accèsClé, secretClé, robotId, cmd) { - Je ne sais pas.https://www.fmz.com/api/v1?access_key=xxx&secret_key=xxx&method=CommandRobot&args=[xxx+, 11] Il s'agit d'un outil de communication qui permet aux utilisateurs d'accéder à des informations personnelles et à des informations personnelles. Var postData est égal à { méthode: cliquez sur le bouton POST. Je suis désolé. Je ne sais pas. Il s'agit d'un logiciel qui est utilisé par les utilisateurs de Mac OS X pour gérer les données de leurs clients. Il est également utilisé par les utilisateurs de Mac OS X. Var ret = HttpQuery ((url, postData, balises et en-têtes) Log (( est une requête de webhook simulant TradingView, envoyée pour tester une requête POST:??, url, body:??, cmd, réponse:??, ret) Je ne sais pas.

fonction créerManager (() { le nombre d'heures de travail Autonomie des tâches

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 = créer le gestionnaire fonction HandleCommand ((signal) {) est une fonction // Détecte si une instruction d'interaction a été reçue Si (signal) { Log (( reçu l'instruction d'interaction:??, signal) // reçu l'instruction d'interaction, imprimé l'instruction d'interaction Je ne sais pas. return // retourne directement sans traitement. Je ne sais pas.

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

}

fonction main (() { Log ((( WebHook) Adresse: Ooh, Ooh (en anglais)https://www.fmz.com/api/v1?access_key=Il s'agit d'un système d'exploitation qui utilise une clé secrète pour gérer les données de votre ordinateur. Log (type de transaction) [ acheter: acheter sur le champ, vendre: vendre sur le champ, long: faire plus de futures, short: faire moins de futures, closesell: acheter sur le champ, closebuy: vendre sur le champ] Log (template de commande pour le référencement: référencement, 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)
    }
}

}


Plus de

Pour obtenir de l'aide (cliquez ici pour contacter l'image)exchange.GetPosition ((), qui obtient l'information sur la position actuelle. Si la position est supérieure à 0, aucune commande ne sera passée.

Le petit rêveLes stratégies de conception peuvent être conçues uniquement en fonction de vos besoins, et vous pouvez trouver des stratégies de référence sur la plate-forme Stratégie Square.

JetterC'est bien. Merci! C'est le code? Var nowRefPosAmount = getPosAmount (_C (exchange.GetPosition), ct) est un référentiel de référencement pour le référencement. Var x = owRefPosAmount.long Il est possible de modifier le nombre de mots dans le répertoire Var y = owRefPosAmount.short est un ensemble de références. Tu veux le CT?

JetterC'est bien. Merci!