Die Ressourcen sind geladen. Beförderung...

Eine andere Strategie zur Ausführung von TradingView-Signalen

Schriftsteller:Die Erfinder quantifizieren - Kleine Träume, Erstellt: 2022-11-30 10:52:07, Aktualisiert: 2023-09-18 20:01:09

[TOC]

img

Eine andere Strategie zur Ausführung von TradingView-Signalen

Traders, die häufig TradingView verwenden, wissen, dass TradingView Nachrichten auf andere Plattformen schicken kann. Zuvor wurde auch eine Signal-Push-Strategie für TradingView in der Bibliothek veröffentlicht, die in der Anfrage-URL geschrieben wurde und etwas unflexibel ist.

Szenen und Prinzipien

Einige Neulinge mögen den Titel und die Beschreibung dieses Artikels als etwas verrückt empfinden, aber das ist okay! Wir erklären erst einmal die Bedarfsszenarien und -prinzipien.

1. Das Bedarfsszenario: Was soll das Ding eigentlich tun? Einfach gesagt, wir haben in TradingView viele Indikatoren, Strategien, Codes und so weiter, die direkt in TradingView ausgeführt werden können, die Linien zeichnen, berechnen, Handelssignale anzeigen und so weiter. Und TradingView hat Echtzeit-Preisdaten, genügend K-Liniendaten, um alle Arten von Indikatoren zu berechnen.

2. Prinzip:

img

Das Programm beinhaltet vier Themen, die in einfachen Worten folgendermaßen beschrieben werden:

Nummern Der Subjekt Beschreibung
1 TradingView (Trading View in der Abbildung) Das PINE-Skript läuft in TradingView und kann Signale ausstrahlen, um die erweiterte API-Schnittstelle von FMZ zu erreichen
2 FMZ-Plattform (im Bild FMZ-Plattform (Website)) Verwaltung von Festplatten, die Interaktionsanweisungen auf einer Festplattenseite senden können, oder die Funktion, die die FMZ-Plattform durch eine erweiterte API-Schnittstelle ermöglicht, um Interaktionsanweisungen an einen Administrator zu senden
3 Festplattenprogramme in der Administratorsoftware (siehe Bild FMZ strategy robot) TradingView-Signal-Ausführungsstrategien, die tatsächlich ausgeführt werden
4 Börse (siehe Bild) Anhand der auf dem Markt konfigurierten Börse, die auf dem Markt befindliche Prozedur des Verwalters sendet die Anfrage direkt an die Börse, an der die Bestellung erfolgt.

Wenn man also so spielen will, braucht man folgende Vorbereitungen: 1, ein Skript, das auf TradingView ausgeführt wird und für die Sendung von Signalwünschen an die FMZ-Erweiterungs-API-Schnittstelle verantwortlich ist, erfordert, dass ein TradingView-Konto mindestens ein PRO-Mitglied ist. 2. Um einen Trustee auf FMZ zu implementieren, benötigt man einen, der Zugang zu den Interfaces der Börse hat (z.B. Server in Singapur, Japan, Hongkong usw.). 3. Auf der FMZ wird die API KEY der Börse konfiguriert, die bei der Sendung des TradingView-Signals betrieben werden soll. 4. Sie benötigen eine "TradingView Signal Execution Strategy", die in diesem Artikel behandelt wird.

TradingView-Signal-Ausführung

Die "TradingView Signal Execution Policy" war in der letzten Version weniger flexibel konzipiert, und die Nachrichten konnten nur in der URL der Anfrage geschrieben werden, die von TradingView gesendet wurde.

img

In TradingView ist es möglich, wie in der Abbildung dargestellt, eine Nachricht in den Request-Body zu schreiben und an die FMZ-Erweiterungs-API-Schnittstelle zu senden. Wie wird diese erweiterte API-Schnittstelle von FMZ aufgerufen?

In der Reihe der FMZ-Erweiterungs-API-Schnittstellen, die wir verwenden werden, istCommandRobotDie Schnittstelle wird normalerweise so bezeichnet:

https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"ok12345"]

Das ist die URL der Anfrage.queryInnerlichaccess_keyundsecret_keyDas ist eine Erweiterung der FMZ-Plattform.API KEYDie Vorführung hier ist so eingestellt.xxxundyyyyWie entsteht dieser KEY? auf dieser Seite:https://www.fmz.com/m/accountDas heißt, Sie können ein Buch erstellen, es gut aufbewahren und es niemals preisgeben.

img

Zurück zum Thema und weiter:CommandRobotInterface-Probleme.CommandRobotDie Benutzer-Interface, in der AnfragemethodSie werden auf folgende Weise eingestellt:CommandRobotCommandRobotDie Funktion dieser Schnittstelle ist es, eine interaktive Nachricht über die FMZ-Plattform an die Festplatte einer ID zu senden, also die ParameterargsDas ist die Festplatten-ID und die Nachricht.186515Die Daten werden von einem Computer auf der Festplatte gespeichert.ok12345

Früher wurde die FMZ-Erweiterung API in dieser Weise an die CommandRobot-Schnittstelle angefordert, die Nachricht konnte nur abgeschrieben werden, wie zum Beispiel im Beispiel oben.ok12345Wenn die Nachricht im angeforderten Body ist, müssen Sie es anders machen:

https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[130350,+""]

Diese Anfrage kann über die FMZ-Plattform als Interaktionsbotschaft an die ID gesendet werden.130350Wenn die Nachricht in TradingView so eingestellt ist:{"close": {{close}}, "name": "aaa"}Also ist die ID:130350Die Funktion wird von einem Computer-Rechner mit einem Interaktionsbefehl angezeigt:{"close": 39773.75, "name": "aaa"}

Damit die TradingView-Signal-Ausführungspolitik die von TradingView gesendete Anweisung beim Empfang der Interaktionsanweisung richtig verstehen kann, muss im Voraus ein Nachrichtenformat vereinbart werden:

{
    Flag: "45M103Buy",     // 标识,可随意指定
    Exchange: 1,           // 指定交易所交易对
    Currency: "BTC_USDT",  // 交易对
    ContractType: "swap",  // 合约类型,swap,quarter,next_quarter,现货填写spot
    Price: "{{close}}",    // 开仓或者平仓价格,-1为市价
    Action: "buy",         // 交易类型[ buy:现货买入 , sell:现货卖出 , long:期货做多 , short:期货做空 , closesell:期货买入平空 , closebuy:期货卖出平多]
    Amount: "0",           // 交易量
}

Die Strategie ist als Multi-Exchange-Architektur konzipiert, so dass mehrere Exchange-Objekte auf dieser Strategie konfiguriert werden können, d.h. es ist möglich, Unteraufträge für mehrere verschiedene Konten zu steuern. Nur wenn Exchange in der Signalstruktur den zu bedienenden Austausch angibt, ist die Einstellung 1 die Einstellung, dass dieses Signal das zuerst hinzugefügte Exchange-Objekt für das entsprechende Austauschkonto bedient.

Das nächste, was wir tun können, ist, den Strategiecode zu entwerfen, den vollständigen Strategiecode:

//信号结构
var Template = {
    Flag: "45M103Buy",     // 标识,可随意指定
    Exchange: 1,           // 指定交易所交易对
    Currency: "BTC_USDT",  // 交易对
    ContractType: "swap",  // 合约类型,swap,quarter,next_quarter,现货填写spot
    Price: "{{close}}",    // 开仓或者平仓价格,-1为市价
    Action: "buy",         // 交易类型[ buy:现货买入 , sell:现货卖出 , long:期货做多 , short:期货做空 , closesell:期货买入平空 , closebuy:期货卖出平多]
    Amount: "0",           // 交易量
}

var BaseUrl = "https://www.fmz.com/api/v1"   // FMZ扩展API接口地址 
var RobotId = _G()                           // 当前实盘ID
var Success = "#5cb85c"    // 成功颜色
var Danger = "#ff0000"     // 危险颜色
var Warning = "#f0ad4e"    // 警告颜色
var buffSignal = []

// 校验信号消息格式
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("交易所最小编号为1,并且为整数", Danger)
        return
    }
    if (Signal.Amount <= 0 || typeof(Signal.Amount) != "number") {
        Log("交易量不能小于0,并且为数值类型", typeof(Signal.Amount), Danger)
        return
    }
    if (typeof(Signal.Price) != "number") {
        Log("价格必须是数值", Danger)
        return
    }
    if (Signal.ContractType == "spot" && Signal.Action != "buy" && Signal.Action != "sell") {
        Log("指令为操作现货,Action错误,Action:", Signal.Action, Danger)
        return 
    }
    if (Signal.ContractType != "spot" && Signal.Action != "long" && Signal.Action != "short" && Signal.Action != "closesell" && Signal.Action != "closebuy") {
        Log("指令为操作期货,Action错误,Action:", 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("模拟TradingView的webhook请求,发送用于测试的POST请求:", url, "body:", cmd, "应答:", 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) {
    // 检测是否收到交互指令
    if (signal) {
        Log("收到交互指令:", signal)     // 收到交互指令,打印交互指令
    } else {
        return                            // 没有收到时直接返回,不做处理
    }
    
    // 检测交互指令是否是测试指令,测试指令可以由当前策略交互控件发出来进行测试
    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)
    Log("交易类型[ buy:现货买入 , sell:现货卖出 , long:期货做多 , short:期货做空 , closesell:期货买入平空 , closebuy:期货卖出平多]", Danger)
    Log("指令模板:", 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 * 10)
        }
    }
}

Strategieparameter und Interaktion:

img

"TradingView Signal Execution Policy" Die vollständige Strategie-Adresse ist:https://www.fmz.com/strategy/392048

Ein einfacher Test

Bevor die Strategie ausgeführt wird, müssen Sie das Austauschobjekt konfigurieren. In den Strategieparametern müssen Sie die beiden Parameter "AccessKey für die FMZ-Plattform" und "SecretKey für die FMZ-Plattform" einstellen.

img

Es wird in folgender Weise gedruckt: WebHook-Adresse, die in TradingView ausgefüllt werden muss, unterstützte Aktionsanweisungen, Nachrichtenformat. Wichtig ist die WebHook-Adresse:

https://www.fmz.com/api/v1?access_key=22903bab96b26584dc5a22522984df42&secret_key=73f8ba01014023117cbd30cb9d849bfc&method=CommandRobot&args=[505628,+""]

Sie können die entsprechenden Positionen in TradingView direkt kopieren und kleben.

Wenn Sie das Versenden von Signalen in TradingView simulieren möchten, klicken Sie auf die TestSignal-Schaltfläche auf der Strategie-Interaktion:

img

Die Strategie sendet selbst eine Anfrage (Analogie TradingView sends signal request) und ruft FMZs erweiterte API-Schnittstelle an, um der Strategie selbst eine Nachricht zu senden:

{"Flag":"45M103Buy","Exchange":1,"Currency":"BTC_USDT","ContractType":"swap","Price":"16000","Action":"buy","Amount":"1"}

Die aktuelle Strategie erhält eine weitere Interaktionsnachricht und führt:

img

Ich habe mich in meinem Büro aufgehalten.

Tests mit TradingView in realen Szenen

Der Test mit TradingView ist Pro-Level. Es gibt einige Vorkenntnisse, die vor dem Test einfach erklärt werden müssen.

Ein Beispiel ist ein einfaches PINE-Skript (ein paar Änderungen, die ich in TradingView gefunden habe).

//@version=5
strategy("Consecutive Up/Down Strategy", overlay=true)
consecutiveBarsUp = input(3)
consecutiveBarsDown = input(3)
price = close
ups = 0.0
ups := price > price[1] ? nz(ups[1]) + 1 : 0
dns = 0.0
dns := price < price[1] ? nz(dns[1]) + 1 : 0
if (not barstate.ishistory and ups >= consecutiveBarsUp and strategy.position_size <= 0)
    action = strategy.position_size < 0 ? "closesell" : "long"
    strategy.order("ConsUpLE", strategy.long, 1, comment=action)
if (not barstate.ishistory and dns >= consecutiveBarsDown and strategy.position_size >= 0)
    action = strategy.position_size > 0 ? "closebuy" : "short"
    strategy.order("ConsDnSE", strategy.short, 1, comment=action)

1. Ein PINE-Skript kann Informationen beiliegen, wenn ein Skript eine Anweisung ausgibt

Hier sind die Symbole, die ich zum Beispiel in den "Nachrichten"-Boxen der Alarmmeldungen eingegeben habe.{{strategy.order.contracts}}Wenn Sie eine Bestellung anrufen, wird eine Nachricht gesendet (je nach Alarm-Einstellungen, E-Mail-Push, Webhook-URL-Anfrage, Popup-Fenster usw.), die die Anzahl der ausgeführten Bestellungen enthält.

{{strategy.position_size}}- Gibt den Wert des gleichen Schlüsselworts in Pine zurück, also die Größe der aktuellen Position.{{strategy.order.action}}- Zurückkehr der String für den ausgeführten Auftrag ist die Buy-Tunnel oder die Sell-Tunnel.{{strategy.order.contracts}}- Rückgabe der Anzahl der ausgeführten Aufträge.{{strategy.order.price}}- Preis für die Ausführung der Bestellung zurück.{{strategy.order.id}}- Die ID des ausgeführten Auftrages zurückgegeben (String für den ersten Parameter in einem der Funktionsanrufe, die den Auftrag erzeugen: strategy.entry, strategy.exit oder strategy.order).{{strategy.order.comment}}- Rückgabe der Kommentare, die bereits ausgeführt wurden (String, der in einem der Kommentarparameter verwendet wurde, der einen der Funktionsanrufe erzeugt hat):strategy.exit、oder strategy.order) 、Wenn keine Anmerkung angegeben ist, wird der Wert von strategy.order.id verwendet.{{strategy.order.alert_message}}- Gibt den Wert des Parameters alert_message zurück, der im Pine-Code der Strategie verwendet werden kann, wenn eine der Funktionen, die für die nächste Bestellung verwendet werden, aufgerufen wird: strategy.entry,strategy.exitDie Funktion wird nur in Pine v4 unterstützt.{{strategy.market_position}}- Die String-Rückgabe der Strategie zur aktuellen Positionen: long, flat oder short.{{strategy.market_position_size}}- Gibt die Größe der aktuellen Position in der Form eines absoluten Wertes (d.h. einer nicht-negativen Zahl) zurück.{{strategy.prev_market_position}}- Die letzte Position, die die Strategie in Stringform zurückgibt: long, flat oder short.{{strategy.prev_market_position_size}}- Gibt die Größe der vorherigen Position in der Form eines absoluten Wertes zurück.

2. Nachrichten erstellen mit "TradingView Signal Execution Policy"

{
    "Flag":"{{strategy.order.id}}",
    "Exchange":1,
    "Currency":"BTC_USDT",
    "ContractType":"swap",
    "Price":"-1",
    "Action":"{{strategy.order.comment}}",
    "Amount":"{{strategy.order.contracts}}"
}

3. Wenn TradingView ein Signal ausstrahlt, wenn dieses PINE-Skript ausgeführt wird, muss ein Alarm gesetzt werden, wenn dieses Skript in TradingView geladen wird

img

Wenn ein PINE-Skript in TradingView eine Transaktionsaktion auslöst, wird eine Webhook-URL-Anfrage gesendet.

img

img

Das ist die Funktion, die FMZ auf der Festplatte ausführt.

img

img

Video-Adresse

Das Video von den Kürbisen:https://www.ixigua.com/7172134169580372513?utm_source=xiguastudioB-Station:https://www.bilibili.com/video/BV1BY411d7c6/Das wissen wir:https://www.zhihu.com/zvideo/1581722694294487040

Der Code in diesem Artikel ist nur für Referenzen und kann für den tatsächlichen Gebrauch selbst angepasst oder erweitert werden.


Verwandt

Mehr

Q102133Ich bin nicht derjenige, der das Problem hat, aber ich bin derjenige, der das Problem hat.

Q102133Monk, das läuft falsch.

N95Monk, wie laufen die Simulationen in der Umgebung?

GohwaEine Frage, kann die Warnmeldung von Tradingview die Nachricht über den letzten Auftrag enthalten? Ich möchte wissen, ob die letzte Bestellung ein Gewinn oder ein Verlust war, und wenn die letzte Bestellung ein Verlust war, wird der Roboter die Bestellung erst dann ausführen, wenn die letzte Bestellung, die ich erhalten habe, ein Gewinn war. Können Sie das bitte tun? Danke!

13811047519/upload/asset/2a5a9fa2b97561c42c027.jpg Bitte Gott, was bedeutet dieser Fehler und wie kann er beseitigt werden?

Das ist gut.Drehbuch, ich habe 6 7 Konten hinzugefügt, um mit diesem Signal zu handeln, aber vorübergehend ist es ziemlich groß, das Signal eines Börsenkontos wird erst nach dem Abschluss des nächsten Transaktionskontos ausgeführt, ist eine serielle Ausführung, gibt es eine Möglichkeit, dass das Transaktionssignal gleichzeitig parallel ausgeführt wird?

Die Erfinder quantifizieren - Kleine TräumeVersuchen Sie, die chinesische Sprache aus der Interaktionsstruktur der Nachrichten zu entfernen.

Die Erfinder quantifizieren - Kleine TräumeVersuchen Sie, die chinesischen Texte zu entfernen.

N95In der Politik, die das Signal empfängt, sieht es so aus, als ob keine Einnahmen gedruckt und öffentlich gemacht werden würden, also bitte geben Sie mir eine entsprechende Account-Informations-Formular-Vorlage, um zu sehen, wie die Politik funktioniert.

Die Erfinder quantifizieren - Kleine TräumeDas ist eine öffentliche Politik, die automatisch hinzugefügt wird.

N95Danke Monko, ich habe es getestet, aber es gibt keine Strategie Bewertung Übersicht nach der Transaktion, ist es notwendig, selbst hinzuzufügen

Die Erfinder quantifizieren - Kleine TräumeOKX-Schnittstelle, die in die Analogdisk-Testumgebung von OKX umgeschaltet werden kann, indem exchange.IO (< "simulate", true) verwendet wird.

GohwaDank für die Antwort, aber ich habe zwei Fragen: 1. Was mir ein wenig nicht klar ist, ist, dass fmz selbst ein Pine-Skript schreiben kann, warum sollte dieser Artikel auch eine Warnung an fmz über TradingView senden und dann verarbeiten und dann handeln? 2. Ich habe jetzt eine ziemlich gute Strategie gefunden, aber ohne die Berechtigung für den Quellcode, und ich möchte die Fehler vermeiden, die ich oben erwähnt habe. Sie haben gesagt, dass Sie in der Push-Nachricht den {{strategy.order.price}} erhöhen. Ich habe ihn auch hinzugefügt, aber dieser Push scheint der Preis zu sein, der bei der Bestellung angegeben wurde.

Die Erfinder quantifizieren - Kleine TräumeEs sollte möglich sein, dass Sie die {{strategy.order.price}}-Inhalte bei der Push-Meldung schieben, und dann werden die Strategien auf FMZ diese Informationen verarbeiten, um zu entscheiden, ob Sie eine Bestellung aufgrund des aktuellen Preisvergleichs aufgeben möchten.

Die Erfinder quantifizieren - Kleine TräumeIch habe hier einen Test gemacht, der normal ist.

Das ist gut.Gut. Danke an den Chef.

Die Erfinder quantifizieren - Kleine TräumeFMZ hat neue Parallelfunktionen hinzugefügt, die in Parallel umgewandelt werden sollten, allerdings könnte der Strategiecode erheblich verändert werden.