Strategi pelaksanaan isyarat TradingView yang lain

Penulis:Mimpi kecil, Dicipta: 2022-11-30 10:52:07, Dikemas kini: 2023-09-18 20:01:09

[TOC]

img

Strategi pelaksanaan isyarat TradingView yang lain

Peniaga yang sering menggunakan TradingView tahu bahawa TradingView boleh mendorong mesej ke platform lain. Sebelum ini, strategi push isyarat TradingView telah diumumkan di perpustakaan.

Skenario dan prinsip

Mungkin ada rakan-rakan yang baru belajar yang melihat tajuk artikel ini dan keterangan di atas agak pelik, tidak mengapa! Mari kita jelaskan senario keperluan, prinsip-prinsipnya.

Skenario permintaan: Apa yang perlu dilakukan oleh perkara ini? Secara ringkasnya, kita mempunyai banyak petunjuk, strategi, kod dan lain-lain yang boleh dipilih untuk digunakan dalam TradingView, yang boleh dijalankan secara langsung di TradingView, boleh menarik garis, mengira, memaparkan isyarat dagangan dan lain-lain. Dan TradingView mempunyai data harga masa nyata, data K-line yang mencukupi untuk mengira pelbagai indikator. Kod skrip di TradingView dipanggil bahasa PINE, hanya satu perkara yang tidak begitu mudah ialah berdagang secara langsung di TradingView. Walaupun FMZ telah menyokong bahasa PINE, ia juga boleh dijalankan tetapi.

2. Prinsip:

img

Program ini melibatkan empat subjek, yang secara ringkasnya ialah:

nombor Subjek Penerangan
1 TradingView (Trading View dalam gambar) Menjalankan skrip PINE di TradingView untuk menghantar isyarat dan mengakses antara muka API lanjutan FMZ
2 Platform FMZ (dalam gambar) Mengurus cakera, boleh menghantar arahan interaksi di halaman cakera, atau boleh menggunakan antarmuka API yang diperluaskan untuk membolehkan platform FMZ menghantar arahan interaksi kepada pelayan
3 Program cakera sebenar pada perisian hos (dalam gambar, FMZ strategy robot) Strategi pelaksanaan isyarat TradingView
4 Bursa (dalam gambar) Bursa yang dikonfigurasikan di tempat nyata, program di tempat nyata yang diuruskan secara langsung menghantar permintaan kepada bursa yang membuat pesanan

Oleh itu, jika anda ingin bermain dengan cara ini, anda perlu membuat beberapa persiapan: 1, skrip yang dijalankan di TradingView yang bertanggungjawab untuk menghantar permintaan isyarat ke antara muka API lanjutan FMZ, memerlukan akaun TradingView sekurang-kurangnya ahli PRO. 2. Untuk menggunakan program pengurus di FMZ, anda memerlukan program yang boleh mengakses antara muka pertukaran (seperti pelayan di Singapura, Jepun, Hong Kong, dan lain-lain). 3. Pada FMZ, apabila isyarat TradingView dihantar, API KEY pertukaran yang akan dioperasikan akan disusun. 4. anda perlu mempunyai "strategi pelaksanaan isyarat TradingView", yang merupakan topik utama artikel ini.

Strategi pelaksanaan isyarat TradingView

Versi terdahulu "Strategi pelaksanaan isyarat TradingView" tidak begitu fleksibel, mesej hanya boleh ditulis mati dalam url permintaan yang dihantar oleh TradingView. Jika kita mahu TradingView menulis beberapa maklumat pembolehubah di Body ketika menghantar mesej, ini tidak berfungsi. Contohnya pada TradingView, kandungan mesej seperti ini:

img

Jadi, dalam TradingView, anda boleh mengaturnya seperti di gambar di atas, untuk menulis mesej di dalam badan permintaan dan menghantarnya ke antara muka API lanjutan FMZ. Bagaimana antara muka API lanjutan FMZ ini dipanggil?

Dalam rangkaian FMZ, antara muka API yang akan kita gunakan ialahCommandRobotPerisian ini biasanya dipanggil sebagai:

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

URL yang dimintaqueryDalamaccess_keydansecret_keyIni adalah sambungan kepada platform FMZ.API KEYPersembahan di sini, jadi ia ditetapkan sebagaixxxdanyyyy│ bagaimana untuk membuat KEY? di laman ini:https://www.fmz.com/m/account"Satu yang boleh dibuat, disimpan dengan baik, jangan pernah dibocorkan.

img

Kembali ke topik utama, teruskan.CommandRobotMasalah antara muka.CommandRobotAntara muka, permintaanmethodSeting untuk:CommandRobotCommandRobotFungsi antara muka ini adalah untuk menghantar mesej interaktif melalui platform FMZ ke cakera keras ID tertentu, jadi parameterargsIni mengandungi ID cakera dan mesej, contoh url permintaan di atas adalah untuk ID sebagai186515Perisian cakera sebenar, menghantar mesejok12345

Sebelum ini, FMZ telah menggunakan cara ini untuk meminta antarmuka CommandRobot untuk memperluaskan API, dan mesej hanya boleh ditulis mati seperti contoh di atas.ok12345Jika mesej berada dalam Body yang diminta, anda perlu menggunakan cara lain:

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

Permintaan ini boleh dihantar melalui platform FMZ untuk menghantar kandungan badan dalam permintaan sebagai mesej interaksi kepada ID sebagai:130350Jika mesej di TradingView ditetapkan sebagai:{"close": {{close}}, "name": "aaa"}Jadi, ID ialah130350Di mana-mana tempat di dunia, anda akan mendapat arahan interaktif:{"close": 39773.75, "name": "aaa"}

Untuk memastikan "Pelaksanaan Isyarat TradingView" dapat memahami arahan yang dihantar oleh TradingView ketika menerima arahan interaksi, anda perlu menyetujui format mesej 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",           // 交易量
}

Kaedah ini direka untuk menjadi struktur pelbagai bursa, jadi anda boleh mengkonfigurasi pelbagai objek bursa pada dasar ini, iaitu anda boleh mengawal operasi pesanan bawah untuk beberapa akaun yang berbeza. Hanya menggunakan pertukaran yang ditetapkan oleh Exchange dalam struktur isyarat, tetapan 1 adalah untuk membuat isyarat ini beroperasi dengan akaun bursa yang sepadan dengan objek bursa pertama yang ditambahkan. Jika anda ingin beroperasi dengan tetapan Kontak Jenis Tukar, masa hadapan akan menulis kontrak spot tertentu, seperti pertukaran kontrak kekal.

Kemudian anda boleh membuat kod strategi, kod strategi yang lengkap:

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

img

"Strategi Pelaksanaan Isyarat TradingView" alamat lengkap:https://www.fmz.com/strategy/392048

Ujian mudah

Untuk mengkonfigurasi objek bursa sebelum menjalankan dasar, atur kedua-dua parameter "AccessKey untuk platform FMZ" dan "SecretKey untuk platform FMZ" dalam parameter dasar, jangan atur dengan salah.

img

Ia akan dicetak mengikut: alamat WebHook yang perlu diisi dalam TradingView, arahan tindakan yang disokong, format mesej. Yang penting ialah alamat WebHook:

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

Anda boleh menyalin dan menampal dengan tepat pada lokasi yang sesuai dalam TradingView.

Jika anda ingin meniru isyarat yang dihantar oleh TradingView, anda boleh mengklik butang TestSignal pada interaksi dasar:

img

Kaedah ini sendiri akan menghantar permintaan (Animal TradingView Send Signal Request) yang memanggil antara muka API lanjutan FMZ dan menghantar mesej kepada kaedah itu sendiri:

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

Jika anda tidak mempunyai maklumat yang diperlukan, anda akan menerima mesej interaksi yang lain dan menjalankan:

img

"Sudah tentu, saya tidak akan membuat sebarang keputusan", katanya.

Ujian menggunakan TradingView dalam situasi sebenar

Penggunaan ujian TradingView memerlukan akaun TradingView adalah peringkat Pro. Terdapat beberapa pengetahuan awal yang perlu dijelaskan secara ringkas sebelum ujian.

Contohnya dengan skrip PINE yang mudah (diubahsuai sedikit di TradingView)

//@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 memuat beberapa maklumat apabila skrip mengeluarkan arahan berikut

Berikut adalah tanda-tanda yang saya tulis dalam kotak "Mesej" dalam amaran.{{strategy.order.contracts}}Apabila pesanan dihidupkan, mesej akan dihantar (bergantung pada tetapan pada pemberitahuan, push e-mel, permintaan url webhook, tetingkap popup, dan lain-lain) yang akan mengandungi jumlah pesanan yang dieksekusi.

{{strategy.position_size}}- Mengembalikan nilai kata kunci yang sama dalam Pine, iaitu saiz kedudukan semasa.{{strategy.order.action}}- Mengembalikan tali untuk perintah yang dilaksanakan dengan tali buy atau sell.{{strategy.order.contracts}}- Mengembalikan jumlah kontrak yang telah dilaksanakan.{{strategy.order.price}}- Mengembalikan harga pelaksanaan pesanan.{{strategy.order.id}}- Mengembalikan ID perintah yang telah dilaksanakan (dalam salah satu panggilan fungsi yang menghasilkan perintah, senar yang digunakan sebagai parameter pertama: strategi.entry, strategi.exit atau strategi.order).{{strategy.order.comment}}- Mengembalikan notasi perintah yang telah dilaksanakan ((string yang digunakan dalam parameter komen dalam salah satu panggilan fungsi yang menghasilkan perintah:strategy.entry,strategy.exit、 atau strategi.order) ; jika tiada notasi yang ditetapkan, nilai strategi.order.id akan digunakan.{{strategy.order.alert_message}}- Mengembalikan nilai parameter alert_message, yang boleh digunakan dalam kod Pine untuk dasar apabila memanggil salah satu fungsi yang digunakan untuk perintah seterusnya: strategi.entry,strategy.exit、 atau strategi.order‬ hanya menyokong fungsi ini di Pine v4‬{{strategy.market_position}}- Strategi yang dikembalikan dalam bentuk rentetan dengan pegangan semasa: pegangan long, pegangan flat, atau pegangan short.{{strategy.market_position_size}}- Mengembalikan saiz kedudukan semasa dalam bentuk nilai mutlak (iaitu bukan negatif);{{strategy.prev_market_position}}- Mengembalikan strategi pada pegangan terakhir dalam bentuk rentetan: pegangan long, pegangan flat, atau pegangan short.{{strategy.prev_market_position_size}}- Mengembalikan saiz kedudukan sebelumnya dalam bentuk nilai mutlak (iaitu bukan negatif).

2. Membina mesej dengan "Strategi Pelaksanaan Isyarat TradingView"

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

3. Buat TradingView memberi isyarat apabila skrip PINE ini berjalan, perlu menetapkan amaran apabila skrip ini dimuat di TradingView

img

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

img

img

Di sini, anda boleh melihat gambar di bawah.

img

img

Alamat video

Video Cucuk:https://www.ixigua.com/7172134169580372513?utm_source=xiguastudioStesen B:https://www.bilibili.com/video/BV1BY411d7c6/Difahamkan:https://www.zhihu.com/zvideo/1581722694294487040

Kod dalam artikel ini adalah untuk rujukan sahaja dan boleh disesuaikan atau diperluas dengan penggunaan sebenar.


Berkaitan

Lebih lanjut

wbe3- ketumbar kecilMonk, bagaimana untuk menjalankan operasi persekitaran analog?

GuohwaSaya ingin bertanya, adakah mesej amaran tradingview boleh mengandungi pesanan terakhir? Saya ingin mendapatkan pesanan terakhir yang menguntungkan atau rugi, jika pesanan terakhir yang rugi, robot tidak akan melakukan operasi pesanan sehingga pesanan terakhir yang diperoleh adalah keuntungan. Adakah anda boleh melakukannya? Terima kasih!

13811047519/upload/asset/2a5a9fa2b97561c42c027.jpg Tolong Tuhan, apa maksud laporan ini dan bagaimana untuk menghapusnya?

Keadaan yang baikSaya telah menambahkan 6 dan 7 akaun untuk melakukan perdagangan isyarat ini, tetapi sementara ini agak besar, isyarat akaun bursa akan selesai sebelum isyarat akaun perdagangan seterusnya, adalah pelaksanaan berturut-turut, adakah ada cara untuk menjalankan isyarat perdagangan secara serentak?

wbe3- ketumbar kecilDalam dasar penerimaan isyarat, seolah-olah tidak ada pendapatan cetak, terbuka seolah-olah tidak akan dihasilkan, jadi bolehkah anda menambah templat borang maklumat akaun yang berkaitan untuk melihat bagaimana ia berfungsi?

Mimpi kecilIni adalah pandangan dasar awam, halaman ditambah secara automatik.

wbe3- ketumbar kecilTerima kasih bro, telah diuji dengan baik, tetapi tidak ada ulasan penilaian strategi selepas transaksi, adakah perlu menambah sendiri

Mimpi kecilAntara muka OKX, yang boleh ditukar ke persekitaran ujian cakera analog OKX, menggunakan exchange.IO (("simulate", true), yang boleh ditukar ke persekitaran cakera analog.

GuohwaTerima kasih kerana menjawab, saya mempunyai dua soalan: 1. apa yang saya agak tidak faham ialah fmz sendiri boleh menulis skrip pine, mengapa artikel ini perlu menghantar amaran kepada fmz melalui TradingView dan kemudian memproses dan kemudian berdagang? 2, Saya kini mendapati satu strategi yang sangat baik sendiri, tetapi tidak ada kod sumber yang dibenarkan, saya ingin mengelakkan kesilapan dengan kaedah yang saya katakan di atas, anda berkata dalam mesej dorongan menambah {{strategy.order.price}} Saya juga menambahkan, tetapi dorongan ini nampaknya adalah harga semasa pesanan, di belakang dalam fmz bagaimana dengan harga ini untuk menilai sama ada keuntungan atau kerugian, saya agak tidak faham. Anda bersedia untuk membantu, saya boleh membayar, alamat e-mel saya adalah guohwa@qq.com

Mimpi kecilSekiranya boleh dilaksanakan, anda boleh mendorong kandungan {{strategy.order.price}} semasa menghantar mesej, dan kemudian strategi di FMZ memproses maklumat ini, berdasarkan perbandingan harga semasa, untuk memutuskan sama ada untuk memesan.

Mimpi kecilAdakah ujian normal sekarang? Saya menguji normal di sini.

Keadaan yang baikBagus. Terima kasih bos.

Mimpi kecilFMZ telah menambah ciri-ciri paralel yang sepatutnya dapat diubah menjadi paralel, walaupun kod strategi mungkin berubah dengan lebih besar.