avatar of 发明者量化-小小梦 发明者量化-小小梦
konzentrieren Sie sich auf Private Nachricht
4
konzentrieren Sie sich auf
1271
Anhänger

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Erstellt in: 2022-11-30 10:52:07, aktualisiert am: 2025-05-16 16:18:13
comments   17
hits   4333

[TOC]

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Händler, die TradingView häufig verwenden, wissen, dass TradingView Nachrichten an andere Plattformen pushen kann. Zuvor wurde in der Dokumentbibliothek eine TradingView-Signal-Push-Strategie veröffentlicht. Der Inhalt der Push-Nachricht war in der Anforderungs-URL fest codiert, was etwas unflexibel war. In diesem Artikel werden wir eine TradingView-Signalausführungsstrategie auf eine andere Art neu gestalten.

Szenarien und Prinzipien

Einige Studienanfänger könnten beim Lesen des Titels dieses Artikels und der Beschreibung oben verwirrt sein, aber das macht nichts! Lassen Sie uns zunächst die Bedarfsszenarien und Grundsätze klären. Lassen Sie mich wissen, wovon ich spreche. Okay, kommen wir zur Sache.

  1. Nachfrageszenario: Was soll dieses Ding nach all dem Gerede denn tun? Einfach ausgedrückt haben wir viele Indikatoren, Strategien, Codes usw., die wir auf TradingView verwenden können. Diese können direkt auf TradingView ausgeführt werden und können Linien zeichnen, Berechnungen durchführen, Handelssignale anzeigen usw. Darüber hinaus verfügt TradingView über Echtzeit-Preisdaten und ausreichend K-Line-Daten, um die Berechnung verschiedener Indikatoren zu erleichtern. Diese Skriptcodes auf TradingView werden als PINE-Sprache bezeichnet. Die einzige Unannehmlichkeit ist der tatsächliche Handel auf TradingView. Obwohl die PINE-Sprache auf FMZ bereits unterstützt wird, kann sie auch in Echtzeit ausgeführt werden. Es gibt jedoch auch eingefleischte Fans von TradingView, die immer noch hoffen, Aufträge basierend auf den von den Charts auf TradingView gesendeten Signalen zu erteilen. Auch diese Nachfrage kann von FMZ erfüllt werden. In diesem Artikel werden die spezifischen Details dieser Lösung erläutert.

  2. Grundsatz:

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Der gesamte Plan umfasst vier Hauptteile, die kurz zusammengefasst sind:

Seriennummer Hauptteil beschreiben
1 TradingView (Trading View im Bild) TradingView führt das PINE-Skript aus, das Signale senden und auf die erweiterte API-Schnittstelle von FMZ zugreifen kann.
2 FMZ-Plattform (FMZ-Plattform (Website) im Bild) Verwalten Sie den realen Markt, senden Sie interaktive Anweisungen auf der Seite des realen Marktes und nutzen Sie die erweiterte API-Schnittstelle, um die FMZ-Plattform interaktive Anweisungen an das reale Marktstrategieprogramm auf der Depotbank senden zu lassen.
3 Das reale Programm auf der Hosting-Software (FMZ Strategieroboter im Bild) Das eigentliche Programm, das die TradingView-Signalausführungsstrategie ausführt
4 Austausch (Austausch im Bild) Die auf dem realen Markt konfigurierte Börse, an die das reale Marktprogramm der Depotbank die Anfrage zur Platzierung einer Order direkt sendet.

Wenn Sie also so spielen möchten, benötigen Sie folgende Vorbereitungen: 1. Das auf TradingView ausgeführte Skript ist für das Senden von Signalanfragen an die erweiterte API-Schnittstelle von FMZ verantwortlich. Das TradingView-Konto muss mindestens ein PRO-Mitglied sein. 2. Stellen Sie auf FMZ ein Depotprogramm bereit, das auf die Börsenschnittstelle zugreifen können muss (z. B. Server in Singapur, Japan, Hongkong usw.). 3. Konfigurieren Sie den API-Schlüssel der Börse auf FMZ so, dass er aktiviert wird (eine Bestellung aufgibt), wenn das TradingView-Signal gesendet wird. 4. Sie benötigen eine „TradingView-Signalausführungsstrategie“, worüber in diesem Artikel hauptsächlich gesprochen wird.

TradingView Signalausführungsstrategie

Die vorherige Version der „TradingView Signal Execution Strategy“ war nicht auf Flexibilität ausgelegt und die Nachricht konnte nur in der URL der von TradingView gesendeten Anfrage fest codiert werden. Wenn TradingView beim Pushen einer Nachricht variable Informationen in den Text schreiben soll, können wir derzeit nichts tun. Beispielsweise sieht der Nachrichteninhalt auf TradingView folgendermaßen aus:

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Anschließend kann TradingView wie in der Abbildung dargestellt eingerichtet werden, indem die Nachricht in den Anforderungstext geschrieben und an die erweiterte API-Schnittstelle von FMZ gesendet wird. Wie also nennt man diese erweiterte API-Schnittstelle der FMZ?

Unter den erweiterten API-Schnittstellen von FMZ verwenden wirCommandRobotDiese Schnittstelle wird üblicherweise folgendermaßen aufgerufen:

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

Diese Anforderungs-URLqueryInaccess_keyUndsecret_keyEs ist eine Erweiterung der FMZ-PlattformAPI KEY, also setzen wir es hier aufxxxUndyyyy. Wie erstelle ich diesen SCHLÜSSEL? Auf dieser Seite:https://www.fmz.com/m/account, erstellen Sie einfach eins, bewahren Sie es sorgfältig auf und geben Sie es niemals weiter.

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Zurück zum Thema, weiter geht’sCommandRobotSchnittstellenproblem. Wenn Sie Zugriff benötigenCommandRobotSchnittstelle, in der AnfragemethodStellen Sie es einfach ein auf:CommandRobotCommandRobotDie Funktion dieser Schnittstelle besteht darin, über die FMZ-Plattform eine interaktive Nachricht an eine reale Festplatte mit einer bestimmten ID zu senden, sodass die ParameterargsDer Inhalt der Anfrage ist die echte ID und Nachricht. Das obige Beispiel einer Anfrage-URL dient zum Senden einer Anfrage an die ID186515Echtes Programm, Nachricht sendenok12345

Bisher wurde diese Methode verwendet, um die CommandRobot-Schnittstelle der FMZ-Erweiterungs-API anzufordern. Die Nachricht konnte nur fest codiert werden, wie im obigen Beispiel.ok12345. Wenn sich die Nachricht im Anforderungstext befindet, ist eine andere Methode erforderlich:

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

Auf diese Weise kann die Anfrage über die FMZ-Plattform gesendet werden, und der Inhalt des Anfragetexts wird als interaktive Nachricht an den Benutzer mit ID gesendet.130350Das einzig Wahre. Wenn die Nachricht auf TradingView wie folgt eingestellt ist:{"close": {{close}}, "name": "aaa"}, dann ist die ID130350Die reale Festplatte erhält interaktive Anweisungen:{"close": 39773.75, "name": "aaa"}

Damit die „TradingView Signal Execution Strategy“ die von TradingView gesendete Anweisung beim Empfang der interaktiven Anweisung richtig versteht, muss das Nachrichtenformat im Voraus 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 ausgelegt, so dass auf dieser Strategie mehrere Exchange-Objekte konfiguriert werden können und somit die Ordervorgänge mehrerer unterschiedlicher Konten gesteuert werden können. Geben Sie in der Signalstruktur einfach mit „Exchange“ die zu betreibende Börse an. Wenn Sie den Wert auf 1 setzen, wird dieses Signal das Börsenkonto betreiben, das dem ersten hinzugefügten Börsenobjekt entspricht. Wenn der Spot-Kontrakt ausgeführt werden soll, setzen Sie ContractType auf Spot. Schreiben Sie für Futures den spezifischen Kontrakt, schreiben Sie beispielsweise Swap für unbefristete Kontrakte. Geben Sie für den Marktauftragspreis einfach -1 ein. Die Aktionseinstellungen sind für Futures, Spot-, Eröffnungs- und Schlusspositionen unterschiedlich und können nicht falsch eingestellt werden.

Als nächstes können Sie den Strategiecode entwerfen. Der vollständige Strategiecode lautet:

//信号结构
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 Interaktionen:

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

„TradingView Signal Execution Strategy“ Vollständige Strategieadresse: https://www.fmz.com/strategy/392048

Einfacher Test

Bevor Sie die Strategie ausführen, müssen Sie das Austauschobjekt konfigurieren und die beiden Parameter „AccessKey der FMZ-Plattform“ und „SecretKey der FMZ-Plattform“ in den Strategieparametern festlegen. Stellen Sie sicher, dass Sie sie nicht falsch festlegen. Beim Ausführen wird Folgendes angezeigt:

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Folgendes wird der Reihe nach ausgedruckt: die WebHook-Adresse, die in TradingView eingegeben werden muss, die unterstützten Aktionsanweisungen und das Nachrichtenformat. Wichtig ist die WebHook-Adresse:

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

Kopieren Sie es einfach, fügen Sie es ein und schreiben Sie es an die entsprechende Stelle in TradingView.

Wenn Sie das Senden eines Signals durch TradingView simulieren möchten, können Sie bei der Strategieinteraktion auf die Schaltfläche „TestSignal“ klicken:

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Diese Strategie sendet selbst eine Anfrage (simuliert das Senden einer Signalanfrage durch TradingView), ruft die erweiterte API-Schnittstelle von FMZ auf und sendet eine Nachricht an die Strategie selbst:

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

Die aktuelle Strategie erhält eine weitere interaktive Nachricht und führt Folgendes aus:

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Und geben Sie eine Bestellung auf.

Testen mit TradingView in realen Szenarien

Um TradingView testen zu können, benötigen Sie ein TradingView-Konto auf Pro-Niveau. Vor dem Testen sind einige Vorkenntnisse erforderlich, die kurz erläutert werden müssen.

Nehmen Sie als Beispiel ein einfaches PINE-Skript (ich habe es auf TradingView gefunden und ein wenig modifiziert)

//@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. Das PINE-Skript kann einige Informationen anhängen, wenn das Skript eine Bestellanweisung ausgibt

Folgendes sind Platzhalter. Ich habe beispielsweise in das Feld „Nachricht“ im Alarm Folgendes geschrieben:{{strategy.order.contracts}}, dann wird bei Auslösen einer Bestellung eine Nachricht gesendet (basierend auf den Einstellungen für Alarm, E-Mail-Push, Webhook-URL-Anfrage, Popup-Fenster usw.), und die Nachricht enthält die Menge der ausgeführten Bestellung Zeit.

{{strategy.position_size}} – Gibt den Wert desselben Schlüsselworts in Pine zurück, der der Größe der aktuellen Position entspricht. {{strategy.order.action}} - Gibt die Zeichenfolge „kaufen“ oder „verkaufen“ für eine ausgeführte Bestellung zurück. {{strategy.order.contracts}} - Gibt die Anzahl der Kontrakte für die ausgeführte Bestellung zurück. {{strategy.order.price}} - Gibt den Preis zurück, zu dem die Bestellung ausgeführt wurde. {{strategy.order.id}} – Gibt die ID der ausgeführten Bestellung zurück (eine Zeichenfolge, die als erstes Argument in einem der Funktionsaufrufe verwendet wird, die eine Bestellung generiert haben: strategy.entry, strategy.exit oder strategy.order). {{strategy.order.comment}} – Gibt den Kommentar der ausgeführten Bestellung zurück (die Zeichenfolge, die im Kommentarparameter in einem der Funktionsaufrufe verwendet wurde, die die Bestellung generiert haben: strategy.entry, strategy.exit oder strategy.order). Wenn keine Annotation 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 beim Aufrufen einer der Funktionen zum Platzieren von Bestellungen verwendet werden kann: strategy.entry, strategy.exit oder strategy.order. Diese Funktion wird nur in Pine v4 unterstützt. {{strategy.market_position}} – Gibt die aktuelle Position der Strategie als Zeichenfolge zurück: „long“, „flat“ oder „short“. {{strategy.market_position_size}} – Gibt die Größe der aktuellen Position als absoluten Wert (d. h. nicht negative Zahl) zurück. {{strategy.prev_market_position}} – Gibt die letzte Position der Strategie als Zeichenfolge zurück: „long“, „flat“ oder „short“. {{strategy.prev_market_position_size}} – Gibt die Größe der vorherigen Position als absoluten Wert (d. h. nicht negative Zahl) zurück.

  1. Kombinieren Sie die „TradingView Signal Execution Strategy“, um Nachrichten zu konstruieren
{
    "Flag":"{{strategy.order.id}}",
    "Exchange":1,
    "Currency":"BTC_USDT",
    "ContractType":"swap",
    "Price":"-1",
    "Action":"{{strategy.order.comment}}",
    "Amount":"{{strategy.order.contracts}}"
}
  1. Lassen Sie TradingView ein Signal senden, wenn dieses PINE-Skript ausgeführt wird. Sie müssen einen Alarm einstellen, wenn dieses Skript auf TradingView geladen wird

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Wenn das PINE-Skript auf TradingView eine Handelsaktion auslöst, wird eine Webhook-URL-Anfrage gesendet.

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Der reale Handel von FMZ wird dieses Signal ausführen.

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Eine weitere TradingView-Lösung für die Signalausführungsstrategie

Video-URL

Xigua-Video: https://www.ixigua.com/7172134169580372513?utm_source=xiguastudio Station B: https://www.bilibili.com/video/BV1BY411d7c6/ Zhihu: https://www.zhihu.com/zvideo/1581722694294487040

Die Codes im Artikel dienen nur als Referenz. Sie können sie für den tatsächlichen Gebrauch anpassen und erweitern.