avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Solusi strategi eksekusi sinyal TradingView lainnya

Dibuat di: 2022-11-30 10:52:07, diperbarui pada: 2025-05-16 16:18:13
comments   17
hits   4333

[TOC]

Solusi strategi eksekusi sinyal TradingView lainnya

Solusi strategi eksekusi sinyal TradingView lainnya

Pedagang yang sering menggunakan TradingView mengetahui bahwa TradingView dapat mengirim pesan ke platform lain. Sebelumnya, strategi push sinyal TradingView dipublikasikan di pustaka dokumen. Konten pesan yang di-push dikodekan secara permanen di URL permintaan, yang agak tidak fleksibel. Dalam artikel ini, kami akan mendesain ulang strategi eksekusi sinyal TradingView dengan cara yang berbeda.

Skenario dan prinsip

Beberapa pelajar pemula mungkin akan kebingungan ketika melihat judul artikel ini dan uraian di atas, tidak masalah! Mari kita perjelas terlebih dahulu skenario dan prinsip permintaan. Biar kamu tahu apa yang sedang aku bicarakan. Baiklah, langsung saja ke intinya.

  1. Skenario permintaan: Setelah semua pembicaraan ini, apa yang seharusnya dilakukan benda ini? Sederhananya, kita memiliki banyak indikator, strategi, kode, dll. yang dapat kita pilih untuk digunakan di TradingView. Semua itu dapat dijalankan langsung di TradingView, dan dapat menggambar garis, menghitung, menampilkan sinyal perdagangan, dll. Selain itu, TradingView memiliki data harga real-time dan data K-line yang memadai untuk memfasilitasi perhitungan berbagai indikator. Kode skrip pada TradingView ini disebut bahasa PINE. Satu-satunya kendala adalah perdagangan nyata pada TradingView. Meskipun bahasa PINE sudah didukung di FMZ, bahasa ini juga dapat dijalankan secara real time. Akan tetapi, ada juga penggemar berat TradingView yang masih berharap untuk menempatkan order berdasarkan sinyal yang dikirim oleh grafik pada TradingView. Permintaan ini juga dapat diatasi oleh FMZ. Jadi artikel ini menjelaskan rincian spesifik dari solusi ini.

  2. Prinsip:

Solusi strategi eksekusi sinyal TradingView lainnya

Seluruh rencana ini melibatkan empat badan utama, yang secara singkat adalah:

nomor seri badan utama menggambarkan
1 TradingView (Tampilan Trading pada gambar) TradingView menjalankan skrip PINE, yang dapat mengirimkan sinyal dan mengakses antarmuka API FMZ yang diperluas.
2 Platform FMZ (platform FMZ (situs web) dalam gambar) Kelola pasar nyata, kirim instruksi interaktif di halaman pasar nyata, dan juga gunakan antarmuka API yang diperluas untuk membiarkan platform FMZ mengirimkan instruksi interaktif ke program strategi pasar nyata di kustodian
3 Program nyata pada perangkat lunak hosting (robot strategi FMZ dalam gambar) Program sebenarnya yang menjalankan strategi eksekusi sinyal TradingView
4 Penukaran (penukaran pada gambar) Pertukaran yang dikonfigurasi pada pasar riil, pertukaran yang mana program pasar riil pada kustodian secara langsung mengirimkan permintaan untuk melakukan pemesanan

Jadi jika Anda ingin bermain seperti ini, Anda memerlukan persiapan berikut: 1. Skrip yang berjalan pada TradingView bertanggung jawab untuk mengirim permintaan sinyal ke antarmuka API FMZ yang diperluas. Akun TradingView harus setidaknya menjadi anggota PRO. 2. Terapkan program kustodian pada FMZ, yang harus dapat mengakses antarmuka pertukaran (seperti server di Singapura, Jepang, Hong Kong, dll.). 3. Konfigurasikan KUNCI API bursa di FMZ untuk beroperasi (menempatkan pesanan) saat sinyal TradingView dikirim. 4. Anda perlu memiliki “strategi eksekusi sinyal TradingView”, yang merupakan topik utama yang dibahas dalam artikel ini.

Strategi Eksekusi Sinyal TradingView

Versi sebelumnya dari “Strategi Eksekusi Sinyal TradingView” tidak dirancang agar fleksibel, dan pesan hanya dapat dikodekan secara kaku di URL permintaan yang dikirim oleh TradingView. Jika kita ingin TradingView menuliskan beberapa informasi variabel dalam Body saat mengirim pesan, tidak ada yang dapat kita lakukan saat ini. Misalnya, konten pesan di TradingView terlihat seperti ini:

Solusi strategi eksekusi sinyal TradingView lainnya

Kemudian TradingView dapat disiapkan seperti yang ditunjukkan dalam gambar, menulis pesan di badan permintaan dan mengirimkannya ke antarmuka API FMZ yang diperluas. Jadi bagaimana Anda menyebut antarmuka API FMZ yang diperluas ini?

Di antara serangkaian antarmuka API FMZ yang diperluas, kami akan menggunakanCommandRobotAntarmuka ini biasanya disebut seperti ini:

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

URL permintaan iniqueryDi dalamaccess_keyDansecret_keyIni adalah perluasan dari platform FMZAPI KEY, jadi di sini kita mengaturnya menjadixxxDanyyyy. Bagaimana cara membuat KUNCI ini? Di halaman ini:https://www.fmz.com/m/account, buat saja satu, simpan dengan benar, dan jangan pernah mengungkapkannya.

Solusi strategi eksekusi sinyal TradingView lainnya

Kembali ke topik, mari kita lanjutkanCommandRobotMasalah antarmuka. Jika Anda perlu mengaksesCommandRobotAntarmuka, dalam permintaanmethodCukup atur ke:CommandRobotCommandRobotFungsi dari interface ini adalah untuk mengirimkan pesan interaktif ke disk nyata dengan ID tertentu melalui platform FMZ, sehingga parameternyaargsIsi permintaan adalah ID dan pesan yang sebenarnya. Contoh URL permintaan di atas adalah untuk mengirim permintaan ke ID186515Program nyata, kirim pesanok12345

Sebelumnya, metode ini digunakan untuk meminta antarmuka CommandRobot dari API ekstensi FMZ. Pesan tersebut hanya dapat dikodekan secara permanen, seperti pada contoh di atas.ok12345. Jika pesan ada di badan permintaan, metode lain diperlukan:

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

Dengan cara ini, permintaan dapat dikirim melalui platform FMZ, dan konten badan permintaan dikirim sebagai pesan interaktif kepada pengguna dengan ID130350Kesepakatan sesungguhnya. Jika pesan pada TradingView diatur ke:{"close": {{close}}, "name": "aaa"}, maka IDnya adalah130350Disk sebenarnya akan menerima instruksi interaktif:{"close": 39773.75, "name": "aaa"}

Agar “Strategi Eksekusi Sinyal TradingView” dapat memahami instruksi yang dikirim oleh TradingView dengan benar saat menerima instruksi interaktif, format pesan harus disetujui terlebih dahulu:

{
    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",           // 交易量
}

Strategi ini dirancang sebagai arsitektur multi-pertukaran, sehingga beberapa objek pertukaran dapat dikonfigurasikan pada strategi ini, yang berarti bahwa operasi pesanan dari beberapa akun yang berbeda dapat dikontrol. Cukup gunakan Exchange dalam struktur sinyal untuk menentukan bursa yang akan dioperasikan. Menetapkannya ke 1 berarti sinyal ini akan mengoperasikan akun bursa yang sesuai dengan objek bursa yang ditambahkan pertama. Jika kontrak spot akan dioperasikan, tetapkan ContractType ke spot; untuk futures, tulis kontrak spesifik, misalnya, tulis swap untuk kontrak perpetual. Untuk harga pesanan pasar, cukup lewati -1. Pengaturan tindakan berbeda untuk posisi berjangka, spot, pembukaan dan penutupan, dan tidak dapat ditetapkan secara tidak benar.

Selanjutnya, Anda dapat merancang kode strategi. Kode strategi lengkapnya adalah:

//信号结构
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)
        }
    }
}

Parameter dan interaksi strategi:

Solusi strategi eksekusi sinyal TradingView lainnya

「Strategi Eksekusi Sinyal TradingView」Alamat strategi lengkap: https://www.fmz.com/strategy/392048

Tes sederhana

Sebelum menjalankan strategi, Anda harus mengonfigurasi objek pertukaran dan menetapkan dua parameter “AccessKey platform FMZ” dan “SecretKey platform FMZ” dalam parameter strategi. Pastikan Anda tidak menetapkannya dengan salah. Menjalankannya akan menunjukkan:

Solusi strategi eksekusi sinyal TradingView lainnya

Berikut ini akan dicetak secara berurutan: alamat WebHook yang perlu diisi pada TradingView, instruksi Tindakan yang didukung, dan format pesan. Yang penting adalah alamat WebHook:

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

Cukup salin dan tempel dan tulis di posisi yang sesuai di TradingView.

Jika Anda ingin mensimulasikan TradingView mengirimkan sinyal, Anda dapat mengklik tombol TestSignal pada interaksi strategi:

Solusi strategi eksekusi sinyal TradingView lainnya

Strategi ini akan mengirimkan permintaan dengan sendirinya (mensimulasikan TradingView mengirimkan permintaan sinyal), memanggil antarmuka API FMZ yang diperluas, dan mengirim pesan ke strategi itu sendiri:

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

Strategi saat ini akan menerima pesan interaktif lain dan dieksekusi:

Solusi strategi eksekusi sinyal TradingView lainnya

Dan lakukan pemesanan.

Pengujian menggunakan TradingView dalam skenario dunia nyata

Untuk menggunakan pengujian TradingView, Anda memerlukan akun TradingView tingkat Pro. Sebelum melakukan pengujian, ada beberapa pengetahuan prasyarat yang perlu dijelaskan secara singkat.

Ambil skrip PINE sederhana (saya menemukannya di TradingView dan memodifikasinya sedikit) sebagai contoh

//@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. Skrip PINE dapat melampirkan beberapa informasi saat skrip mengeluarkan instruksi pesanan

Berikut ini adalah placeholder. Misalnya, saya menulis di kotak “Pesan” di alarm:{{strategy.order.contracts}}, kemudian ketika order dipicu, akan dikirim pesan (berdasarkan pengaturan pada alarm, email push, permintaan URL webhook, jendela pop-up, dll.), dan pesan akan menyertakan jumlah order yang dieksekusi ini waktu.

{{strategy.position_size}} - Mengembalikan nilai kata kunci yang sama di Pine, yang merupakan ukuran posisi saat ini. {{strategy.order.action}} - Mengembalikan string “beli” atau “jual” untuk pesanan yang dieksekusi. {{strategy.order.contracts}} - Mengembalikan jumlah kontrak untuk pesanan yang dieksekusi. {{strategy.order.price}} - Mengembalikan harga di mana pesanan dieksekusi. {{strategy.order.id}} - Mengembalikan ID perintah yang dieksekusi (string yang digunakan sebagai argumen pertama dalam salah satu pemanggilan fungsi yang menghasilkan perintah: strategy.entry, strategy.exit atau strategy.order). {{strategy.order.comment}} - Mengembalikan komentar dari perintah yang dieksekusi (string yang digunakan dalam parameter komentar di salah satu panggilan fungsi yang menghasilkan perintah: strategy.entry, strategy.exit, atau strategy.order). Jika tidak ada anotasi yang ditentukan, nilai strategy.order.id akan digunakan. {{strategy.order.alert_message}} - Mengembalikan nilai parameter alert_message, yang dapat digunakan dalam kode Pine strategi saat memanggil salah satu fungsi untuk menempatkan pesanan: strategy.entry, strategy.exit, atau strategy.order. Fitur ini hanya didukung di Pine v4. {{strategy.market_position}} - Mengembalikan posisi strategi saat ini sebagai string: “panjang”, “datar”, atau “pendek”. {{strategy.market_position_size}} - Mengembalikan ukuran posisi saat ini sebagai nilai absolut (yaitu angka non-negatif). {{strategy.prev_market_position}} - Mengembalikan posisi terakhir strategi sebagai string: “long”, “flat”, atau “short”. {{strategy.prev_market_position_size}} - Mengembalikan ukuran posisi sebelumnya sebagai nilai absolut (yaitu angka non-negatif).

  1. Gabungkan “Strategi Eksekusi Sinyal TradingView” untuk membangun pesan
{
    "Flag":"{{strategy.order.id}}",
    "Exchange":1,
    "Currency":"BTC_USDT",
    "ContractType":"swap",
    "Price":"-1",
    "Action":"{{strategy.order.comment}}",
    "Amount":"{{strategy.order.contracts}}"
}
  1. Biarkan TradingView memancarkan sinyal saat skrip PINE ini berjalan. Anda perlu menyetel alarm saat memuat skrip ini di TradingView

Solusi strategi eksekusi sinyal TradingView lainnya

Ketika skrip PINE pada TradingView memicu tindakan perdagangan, permintaan url webhook dikirim.

Solusi strategi eksekusi sinyal TradingView lainnya

Solusi strategi eksekusi sinyal TradingView lainnya

Perdagangan nyata FMZ akan mengeksekusi sinyal ini.

Solusi strategi eksekusi sinyal TradingView lainnya

Solusi strategi eksekusi sinyal TradingView lainnya

URL videonya

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

Kode-kode dalam artikel ini hanya untuk referensi. Anda dapat menyesuaikan dan mengembangkannya untuk penggunaan aktual.