Wie sollte das Signalempfängerverfahren geändert werden, wenn es keine neuen Bestellungen mehr gibt, wenn es eine Lagerhaltung in derselben Richtung gibt?

Schriftsteller:Jetter, Erstellt: 2023-01-26 20:31:05, Aktualisiert:

/*Backtest Start: 2022-01-15 00:00:00 Ende: 2023-01-21 00:00:00 Dauer: 1 Stunde BasisZeitraum: 15m Die Kommission hat eine Reihe von Maßnahmen ergriffen, um die Auswirkungen der Umstrukturierung auf die Wirtschaft der Union zu verringern. */

// Signalstruktur Das ist ein sehr schwieriger Fall. Flag: 45M103Buy , // Kennzeichnung, beliebig angegeben Exchange: 1, // Angabe des Handelspares der Börse Währung: ETH_USDT , // Transaktionspaare ContractType: swap, // Vertragstyp, swap, quarter, next_quarter, Umschlagplatz Preis: -1, // Preis der Eröffnung oder des Stillstands, -1 ist der Marktpreis Action: long, // Transaktionsart [ buy: sofort kaufen, sell: sofort verkaufen, long: Futures machen mehr, short: Futures machen leere, closesell: Futures kaufen mehr, closebuy: Futures verkaufen weniger] Amount: 0, // Handelsvolumen Wir sind hier.

Vär BaseUrl = https://www.fmz.com/api/v1Anschluss an die FMZ-Erweiterung var RobotId = _G() // aktuelle Festplatten-ID var Success = #5cb85c // Erfolgskleur var Danger = Farbe #ff0000 // gefährliche Farbe var Warning = #f0ad4e // Warnung Farbe Var buff Signal = []

// Überprüft Signalnachrichtenformat Diff functionObject ((object1, object2) { const keys1 = Object.keys (object1) const keys2 = Object.keys (object2) Wenn (keys1.length!== keys2.length) { zurückkehren false Wir sind hier. Für (lass i = 0; i < keys1.length; i++) { Wenn (keys1[i]!== keys2[i]) { zurückkehren false Wir sind hier. Wir sind hier. return true Das ist nicht wahr Wir sind hier.

Funktion CheckSignal ((Signal)) { Signal.Price = ParseFloat (Signal.Price) Signal.Amount = parseFloat ((Signal.Amount) wenn (Signal.ExchangeDie Zahl ist ein Ganzes.Signal.Exchange(Siehe unten.) Log (die kleinste Nummer der Tafelbörse ist 1 und steht für die ganze Tafel, Danger) Rückkehr Wir sind hier. wenn (Signal.Amount <= 0 の の typeof ((Signal.Amount)!= number ) { Log ((Die Anzahl der Transaktionen darf nicht kleiner als 0 sein und ist für den Zahlentyp Log, typeof ((Signal.Amount), Danger) bestimmt) Rückkehr Wir sind hier. if (typeof ((Signal.Price)!= number) { Log ((Die Preise müssen die Zahlenwerten sein, Danger)) Rückkehr Wir sind hier. if (Signal.ContractType == spot-Key && Signal.Action!= buy-Key && Signal.Action!= sell-Key) { Log (Log-Instruktion für Handhabung von Aktien, Aktionsfehler, Aktion: Log, Signal.Action, Danger) Rückkehr Wir sind hier. if (Signal.ContractType!= spot && Signal.Action!= long && Signal.Action!= short && Signal.Action!= closesell && Signal.Action!= closebuy) { Log (Anweisungen für Futures, Aktionsfehler, Aktion: Anzeige, Signal.Action, Danger) Rückkehr Wir sind hier. return true Das ist nicht wahr Wir sind hier.

FunktionsbefehlRobot ((url, accessKey, secretKey, robotId, cmd) { - Was ist los?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 + +,""] War PostData = { Methode: Übertragen POST Daten: cmd Wir sind hier. 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, Anschlüsse, Kopfzeilen) Log (( simuliert Webhook-Anfragen von TradingView, die POST-Anfragen für Tests senden:??, url, body:??, cmd, Antwort:??, ret) Wir sind hier.

Funktion erstellenManager() { Vergleiche mit Selbst.Aufgaben = []

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 Funktion HandleCommand ((signal) { ist eine Funktion, die // Prüft, ob eine Interaktionsanweisung empfangen wurde Wenn (Signal) { Log (( Empfang der Interaktionsanweisung:??, signal) // Empfang der Interaktionsanweisung, Druck der Interaktionsanweisung } else { return // kehrt direkt zurück, wenn es nicht empfangen wird, ohne zu bearbeiten Wir sind hier.

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

}

Funktion main (() { Log ((( WebHook Adresse:https://www.fmz.com/api/v1?access_key=Siehe auch: + FMZ_AccessKey + &secret_key= + FMZ_SecretKey + &method=CommandRobot&args=[ + RobotId + +,""], Danger) Log ((Kleiner Handelstyp[ buy: sofort kaufen, sell: sofort verkaufen, long: Futures machen mehr, short: Futures machen leere, closesell: Futures kaufen in die Leere, closebuy: Futures verkaufen billiger] Log (( Kommandovorlage:??, 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)
    }
}

}


Mehr

Bitte klicken Sie hier, um Hilfe zu erhalten.exchange.GetPosition ((), erhält aktuelle Lagerinformationen. Wenn mehrere Lager größer als 0 sind, wird nicht bestellt.

Kleine TräumeDas Konzept der Strategie kann nur auf eigene Bedürfnisse zugeschnitten werden und kann auf der Plattform Strategie Square als Referenz gefunden werden.

JetterDas ist gut. Danke! Ist das der Code? Var nowRefPosAmount = getPosAmount (_C (exchange.GetPosition), ct) Das ist nicht das Problem. Var y = owRefPosAmount.short Was ist mit dem CT?

JetterDas ist gut. Danke!