avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Dicipta dalam: 2022-11-30 10:52:07, dikemas kini pada: 2025-05-16 16:18:13
comments   17
hits   4333

[TOC]

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Pedagang yang kerap menggunakan TradingView tahu bahawa TradingView boleh menolak mesej ke platform lain. Sebelum ini, strategi tolak isyarat TradingView telah diterbitkan dalam pustaka dokumen Kandungan mesej yang ditolak adalah dikodkan keras dalam URL permintaan, yang agak tidak fleksibel. Dalam artikel ini, kami akan mereka bentuk semula strategi pelaksanaan isyarat TradingView dengan cara yang berbeza.

Senario dan prinsip

Sesetengah pelajar novis mungkin keliru apabila melihat tajuk artikel ini dan penerangan di atas, tidak mengapa! Mari kita jelaskan dahulu senario dan prinsip permintaan. Beritahu anda apa yang saya maksudkan. OK, mari kita ke intinya.

  1. Senario permintaan: Selepas semua perbincangan ini, apa yang perlu dilakukan oleh perkara ini? Ringkasnya, kami mempunyai banyak penunjuk, strategi, kod, dsb. yang boleh kami pilih untuk digunakan pada TradingView Ini boleh dijalankan terus pada TradingView, dan boleh melukis garisan, mengira, memaparkan isyarat dagangan, dsb. Selain itu, TradingView mempunyai data harga masa nyata dan data K-line yang mencukupi untuk memudahkan pengiraan pelbagai penunjuk. Kod skrip pada TradingView ini dipanggil bahasa PINE Satu-satunya kesulitan ialah perdagangan sebenar di TradingView. Walaupun bahasa PINE sudah disokong pada FMZ, ia juga boleh dijalankan dalam masa nyata. Walau bagaimanapun, terdapat juga peminat tegar TradingView yang masih berharap untuk membuat pesanan berdasarkan isyarat yang dihantar oleh carta pada TradingView Permintaan ini juga boleh diselesaikan oleh FMZ. Jadi artikel ini menerangkan butiran khusus penyelesaian ini.

  2. Prinsip:

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Keseluruhan rancangan ini melibatkan empat badan utama, iaitu secara ringkas:

nombor siri badan utama huraikan
1 TradingView (Pandangan Perdagangan dalam gambar) TradingView menjalankan skrip PINE, yang boleh menghantar isyarat dan mengakses antara muka API lanjutan FMZ.
2 Platform FMZ (platform FMZ (laman web) dalam gambar) Urus pasaran sebenar, hantar arahan interaktif pada halaman pasaran sebenar, dan juga gunakan antara muka API lanjutan untuk membenarkan platform FMZ menghantar arahan interaktif kepada program strategi pasaran sebenar pada kustodian
3 Program sebenar pada perisian pengehosan (robot strategi FMZ dalam gambar) Program sebenar yang melaksanakan strategi pelaksanaan isyarat TradingView
4 Tukar (tukar dalam gambar) Pertukaran yang dikonfigurasikan pada pasaran sebenar, pertukaran yang program pasaran sebenar pada penjaga menghantar permintaan untuk membuat pesanan secara langsung

Jadi jika anda ingin bermain seperti ini, anda memerlukan persediaan berikut: 1. Skrip yang berjalan pada TradingView bertanggungjawab untuk menghantar permintaan isyarat kepada antara muka API lanjutan bagi FMZ Akaun TradingView perlu sekurang-kurangnya ahli PRO. 2. Pasang program penjaga di FMZ, yang perlu boleh mengakses antara muka pertukaran (seperti pelayan di Singapura, Jepun, Hong Kong, dll.). 3. Konfigurasikan API KUNCI pertukaran di FMZ untuk beroperasi (membuat pesanan) apabila isyarat TradingView dihantar. 4. Anda perlu mempunyai “Strategi pelaksanaan isyarat TradingView”, yang merupakan perkara utama yang dibincangkan oleh artikel ini.

Strategi Pelaksanaan Isyarat TradingView

Versi sebelumnya “Strategi Pelaksanaan Isyarat TradingView” tidak direka bentuk untuk menjadi fleksibel, dan mesej hanya boleh dikod keras dalam URL permintaan yang dihantar oleh TradingView. Jika kita mahu TradingView menulis beberapa maklumat berubah dalam Badan apabila menolak mesej, tiada apa yang boleh kita lakukan pada masa ini. Sebagai contoh, kandungan mesej pada TradingView kelihatan seperti ini:

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Kemudian TradingView boleh disediakan seperti yang ditunjukkan dalam rajah, menulis mesej dalam badan permintaan dan menghantarnya ke antara muka API lanjutan FMZ. Jadi bagaimana anda memanggil antara muka API lanjutan FMZ ini?

Antara siri antara muka API lanjutan FMZ, kami akan gunakanCommandRobotAntara muka ini biasanya dipanggil seperti ini:

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

URL permintaan iniqueryDalamaccess_keydansecret_keyIa adalah lanjutan daripada platform FMZAPI KEY, jadi di sini kita tetapkanxxxdanyyyy. Bagaimana untuk mencipta KEY ini? Pada halaman ini:https://www.fmz.com/m/account, buat sahaja satu, simpan dengan betul dan jangan sekali-kali mendedahkannya.

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Kembali kepada topik, mari kita sambungCommandRobotMasalah antara muka. Jika anda perlu mengaksesCommandRobotAntara muka, dalam permintaanmethodHanya tetapkan kepada:CommandRobotCommandRobotFungsi antara muka ini adalah untuk menghantar mesej interaktif ke cakera sebenar ID tertentu melalui platform FMZ, jadi parameterargsKandungan permintaan adalah ID dan mesej sebenar Contoh URL permintaan di atas adalah untuk menghantar permintaan kepada ID186515Program sebenar, hantar mesejok12345

Sebelum ini, kaedah ini digunakan untuk meminta antara muka CommandRobot API sambungan FMZ Mesej hanya boleh dikodkan, seperti dalam contoh di atas.ok12345. Jika mesej berada dalam badan permintaan, kaedah lain diperlukan:

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

Dengan cara ini, permintaan boleh dihantar melalui platform FMZ, dan kandungan badan permintaan dihantar sebagai mesej interaktif kepada pengguna dengan ID130350Perkara sebenar. Jika mesej pada TradingView ditetapkan kepada:{"close": {{close}}, "name": "aaa"}, maka ID ialah130350Cakera sebenar akan menerima arahan interaktif:{"close": 39773.75, "name": "aaa"}

Agar “Strategi Pelaksanaan Isyarat TradingView” memahami dengan betul arahan yang dihantar oleh TradingView apabila ia menerima arahan interaktif, format mesej mesti dipersetujui 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 direka bentuk sebagai seni bina berbilang pertukaran, jadi berbilang objek pertukaran boleh dikonfigurasikan pada strategi ini, yang bermaksud bahawa operasi pesanan berbilang akaun berbeza boleh dikawal. Hanya gunakan Exchange dalam struktur isyarat untuk menentukan pertukaran yang akan dikendalikan. Menetapkannya kepada 1 bermakna isyarat ini akan mengendalikan akaun pertukaran yang sepadan dengan objek pertukaran yang pertama. Jika kontrak spot akan dikendalikan, tetapkan ContractType kepada spot untuk niaga hadapan, tulis kontrak khusus, contohnya, tulis swap untuk kontrak kekal. Untuk harga pesanan pasaran, hanya lulus -1. Tetapan tindakan adalah berbeza untuk kedudukan hadapan, spot, pembukaan dan penutupan, dan tidak boleh ditetapkan dengan salah.

Seterusnya, anda boleh mereka bentuk kod strategi Kod strategi yang lengkap ialah:

//信号结构
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 strategi dan interaksi:

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

「Strategi Pelaksanaan Isyarat TradingView」Alamat strategi penuh: https://www.fmz.com/strategy/392048

Ujian mudah

Sebelum menjalankan strategi, anda mesti mengkonfigurasi objek pertukaran dan menetapkan dua parameter “Kekunci Akses platform FMZ” dan “Kekunci Rahsia platform FMZ” dalam parameter strategi Pastikan anda tidak menetapkannya dengan salah. Menjalankannya menunjukkan:

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Perkara berikut akan dicetak mengikut urutan: alamat WebHook yang perlu diisi pada TradingView, arahan Tindakan yang disokong dan format mesej. Perkara penting ialah alamat WebHook:

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

Hanya salin dan tampal dan tulis pada kedudukan yang sepadan pada TradingView.

Jika anda ingin mensimulasikan TradingView menghantar isyarat, anda boleh mengklik butang TestSignal pada interaksi strategi:

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Strategi ini akan menghantar permintaan dengan sendirinya (mensimulasikan TradingView menghantar permintaan isyarat), memanggil antara muka API lanjutan FMZ dan menghantar mesej kepada strategi itu sendiri:

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

Strategi semasa akan menerima satu lagi mesej interaktif dan melaksanakan:

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Dan buat pesanan.

Menguji menggunakan TradingView dalam senario dunia sebenar

Untuk menggunakan ujian TradingView, anda memerlukan akaun TradingView peringkat Pro Sebelum ujian, terdapat beberapa pengetahuan prasyarat yang perlu dijelaskan secara ringkas.

Ambil skrip PINE mudah (saya dapati ia di TradingView dan ubah suainya 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 boleh melampirkan beberapa maklumat apabila skrip mengeluarkan arahan pesanan

Berikut ialah pemegang tempat Sebagai contoh, saya menulis dalam kotak “Mesej” dalam penggera.{{strategy.order.contracts}}, kemudian apabila pesanan dicetuskan, mesej akan dihantar (berdasarkan tetapan pada penggera, tolak e-mel, permintaan URL webhook, tetingkap timbul, dsb.), dan mesej akan menyertakan kuantiti pesanan yang dilaksanakan ini masa.

{{strategy.position_size}} - Mengembalikan nilai kata kunci yang sama dalam Pine, iaitu saiz kedudukan semasa. {{strategy.order.action}} - Mengembalikan rentetan “beli” atau “jual” untuk pesanan yang dilaksanakan. {{strategy.order.contracts}} - Mengembalikan bilangan kontrak untuk pesanan yang dilaksanakan. {{strategy.order.price}} - Mengembalikan harga di mana pesanan telah dilaksanakan. {{strategy.order.id}} - Mengembalikan ID perintah yang dilaksanakan (rentetan yang digunakan sebagai argumen pertama dalam salah satu panggilan fungsi yang menjana pesanan: strategy.entry, strategy.exit atau strategy.order). {{strategy.order.comment}} - Mengembalikan ulasan pesanan yang dilaksanakan (rentetan yang digunakan dalam parameter ulasan dalam salah satu panggilan fungsi yang menghasilkan pesanan: strategi.entry, strategy.exit atau strategy.order). Jika tiada anotasi dinyatakan, nilai strategy.order.id akan digunakan. {{strategy.order.alert_message}} - Mengembalikan nilai parameter alert_message, yang boleh digunakan dalam kod Pine strategi apabila memanggil salah satu fungsi untuk membuat pesanan: strategy.entry, strategy.exit, atau strategy.order. Ciri ini hanya disokong dalam Pine v4. {{strategy.market_position}} - Mengembalikan kedudukan semasa strategi sebagai rentetan: “panjang”, “rata”, atau “pendek”. {{strategy.market_position_size}} - Mengembalikan saiz kedudukan semasa sebagai nilai mutlak (iaitu nombor bukan negatif). {{strategy.prev_market_position}} - Mengembalikan kedudukan terakhir strategi sebagai rentetan: “panjang”, “rata”, atau “pendek”. {{strategy.prev_market_position_size}} - Mengembalikan saiz kedudukan sebelumnya sebagai nilai mutlak (iaitu nombor bukan negatif).

  1. Gabungkan “Strategi Pelaksanaan Isyarat TradingView” untuk membina mesej
{
    "Flag":"{{strategy.order.id}}",
    "Exchange":1,
    "Currency":"BTC_USDT",
    "ContractType":"swap",
    "Price":"-1",
    "Action":"{{strategy.order.comment}}",
    "Amount":"{{strategy.order.contracts}}"
}
  1. Biarkan TradingView mengeluarkan isyarat apabila skrip PINE ini berjalan Anda perlu menetapkan penggera semasa memuatkan skrip ini pada TradingView

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Apabila skrip PINE pada TradingView mencetuskan tindakan perdagangan, permintaan url webhook dihantar.

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Dagangan sebenar FMZ akan melaksanakan isyarat ini.

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

Satu lagi penyelesaian strategi pelaksanaan isyarat TradingView

URL video

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

Kod dalam artikel adalah untuk rujukan sahaja. Anda boleh melaraskan dan mengembangkannya untuk kegunaan sebenar.