Strategi Eksekusi Sinyal TradingView lainnya

Penulis:Mimpi kecil, Dibuat: 2022-11-30 10:52:07, Diperbarui: 2023-09-18 20:01:09

[TOC]

img

Strategi Eksekusi Sinyal TradingView lainnya

Traders yang sering menggunakan TradingView tahu bahwa TradingView dapat mendorong pesan ke platform lain. Sebelumnya, strategi push sinyal TradingView juga telah diumumkan di pustaka.

Skenario dan prinsip

Mungkin teman-teman sekelas baru yang melihat judul artikel ini dan deskripsi di atas agak aneh, tidak apa-apa! Mari kita jelaskan skenario kebutuhan, prinsip-prinsipnya; biar Anda tahu apa yang saya bicarakan.

Skenario permintaan: Apa yang harus dilakukan dengan hal ini? Sederhananya, kita memiliki banyak indikator, strategi, kode, dll yang dapat dipilih untuk digunakan di TradingView, yang dapat dijalankan langsung di TradingView, dapat menggambar garis, menghitung, menampilkan sinyal perdagangan, dll. Dan TradingView memiliki data harga secara real-time, data K-line yang cukup untuk menghitung berbagai indikator. Kode skrip di TradingView disebut bahasa PINE, satu hal yang tidak terlalu nyaman adalah berdagang secara real di TradingView. Meskipun FMZ sudah mendukung bahasa PINE, itu juga dapat dijalankan secara real-time.

2 Prinsip:

img

Program ini melibatkan empat subjek, yang secara sederhana adalah:

Nomor Subjek Deskripsi
1 TradingView (dalam gambar Trading View) Menjalankan skrip PINE di TradingView untuk mengirim sinyal dan mengakses antarmuka API ekstensi FMZ
2 Platform FMZ (foto di atas) Mengelola disk, dapat mengirim instruksi interaktif di halaman disk, atau menggunakan antarmuka API yang diperluas untuk memungkinkan platform FMZ mengirim instruksi interaktif ke administrator
3 Program pada perangkat lunak administrator (dalam gambar, FMZ strategy robot) Strategi pelaksanaan sinyal TradingView
4 Bursa (di gambar) Bursa yang dikonfigurasi di tempat nyata, program di tempat nyata pada pengelola langsung mengirim permintaan untuk melakukan pemesanan ke bursa

Jadi, jika Anda ingin bermain game ini, Anda perlu mempersiapkan beberapa hal: 1, skrip yang berjalan di TradingView, yang bertanggung jawab untuk mengirim permintaan sinyal ke antarmuka API ekstensi FMZ, yang membutuhkan akun TradingView minimal sebagai anggota PRO. 2. Untuk mendistribusikan program administrator di FMZ, Anda memerlukan program yang dapat mengakses antarmuka pertukaran (misalnya server di Singapura, Jepang, Hong Kong, dll.). 3. Di FMZ, ketika sinyal TradingView dikirim, Anda harus mengkonfigurasi API KEY dari bursa yang akan dioperasikan. 4. Anda perlu memiliki "Strategy Eksekusi Sinyal TradingView", yang merupakan topik utama artikel ini.

Strategi pelaksanaan sinyal TradingView

Pada versi sebelumnya, Strategi Eksekusi Sinyal TradingView tidak begitu fleksibel, karena pesan hanya dapat ditulis mati di url permintaan yang dikirim oleh TradingView. Jika kita ingin TradingView menulis beberapa informasi variabel di Body saat mengirim pesan, ini tidak berfungsi. Misalnya pada TradingView, isi pesan seperti:

img

Jadi pada TradingView, Anda dapat mengaturnya seperti di gambar di atas, menulis pesan ke dalam request body dan mengirimkannya ke antarmuka API ekstensi FMZ. Bagaimana antarmuka API ekstensi FMZ ini dipanggil?

Di FMZ, kami akan menggunakan beberapa antarmuka API ekstensi.CommandRobotPerangkat lunak ini biasanya disebut sebagai:

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

URL yang dimintaqueryDi dalamaccess_keydansecret_keyIni adalah perpanjangan dari platform FMZ.API KEYJadi, ini adalah sebuah demonstrasi.xxxdanyyyy◎ Bagaimana membuat KEY? di halaman ini:https://www.fmz.com/m/accountJika Anda ingin membuat sebuah situs web, Anda dapat membuatnya, simpan dengan baik, dan jangan pernah membocorkannya.

img

Kembali ke topik utama, lanjutkan.CommandRobotMasalah antarmuka.CommandRobotPerangkat lunak ini dapat digunakan untuk membuat aplikasi.methodJika Anda tidak bisa mengaksesnya, Anda akan mengalami masalah.CommandRobotCommandRobotFungsi dari antarmuka ini adalah untuk mengirim pesan interaktif melalui platform FMZ ke disk ID tertentu, jadi parameterargsIni berisi ID disk dan pesan, contoh url permintaan di atas adalah ID untuk186515Perangkat lunak ini dapat digunakan untuk mengirim pesan.ok12345

Sebelumnya, pesan hanya bisa ditulis mati seperti contoh di atas.ok12345Jika pesan berada di Body yang diminta, Anda harus menggunakan cara lain:

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

Dengan demikian, permintaan dapat dikirim melalui platform FMZ, dan isi dari request Body dapat dikirim sebagai pesan interaktif ke ID sebagai130350Jika pesan di TradingView disetel ke:{"close": {{close}}, "name": "aaa"}Jadi, ID adalah130350Pada saat yang sama, Google akan mengirim pesan kepada pengguna untuk mengirim pesan ke perangkat keras mereka, yang kemudian akan menerima instruksi interaksi:{"close": 39773.75, "name": "aaa"}

Untuk memastikan bahwa "TradingView Signal Execution Policy" menerima instruksi interaktif dan memahami dengan benar instruksi yang dikirim oleh TradingView, Anda harus menyetujui format pesan 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",           // 交易量
}

Kebijakan ini dirancang untuk arsitektur multi-exchange, sehingga dapat mengkonfigurasi beberapa objek pertukaran pada kebijakan ini, yang berarti dapat mengendalikan operasi suborder dari beberapa akun yang berbeda. Hanya dengan menggunakan Exchange yang ditentukan dalam struktur sinyal untuk beroperasi, pengaturan 1 adalah untuk membuat sinyal ini beroperasi pada akun perdagangan yang sesuai dengan objek perdagangan pertama yang ditambahkan. Jika pengaturan untuk beroperasi adalah Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak Kontak.

Setelah itu, Anda dapat membuat kode strategi, kode strategi 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 Eksekusi Sinyal TradingView"https://www.fmz.com/strategy/392048

Tes sederhana

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

img

Ini akan mencetak: alamat WebHook yang harus diisi di TradingView, instruksi tindakan yang didukung, format pesan; penting adalah alamat WebHook:

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

Anda dapat langsung menyalin dan menempelkan tulisan di TradingView.

Jika Anda ingin mensimulasikan sinyal yang dikirim TradingView, Anda dapat mengklik tombol TestSignal pada interaksi kebijakan:

img

Kebijakan ini sendiri akan mengirim sebuah permintaan (analogue TradingView send signal request) yang memanggil antarmuka API ekstensi FMZ dan mengirim pesan kepada kebijakan itu sendiri:

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

Setelah itu, kebijakan saat ini akan menerima pesan interaksi lain dan melakukan:

img

"Saya tidak tahu apa yang akan terjadi", katanya.

Pengujian menggunakan TradingView dalam skenario nyata

TradingView adalah tingkat Pro, dan ada beberapa pengetahuan awal yang perlu dijelaskan secara sederhana sebelum diuji.

Contoh dari skrip PINE sederhana (dilihat dari 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, Skripsi PINE dapat menyertakan beberapa informasi saat skrip mengeluarkan perintah berikut

Di bawah ini adalah tanda-tanda, misalnya, yang saya tulis di kotak "berita" dalam alarm.{{strategy.order.contracts}}Jika Anda tidak dapat melakukan pemesanan, maka pesan akan dikirim saat pemesanan dipicu (tergantung pada pengaturan di alarm, push email, permintaan webhook url, jendela popup, dll.), dan pesan tersebut akan berisi jumlah pemesanan yang dieksekusi.

{{strategy.position_size}}- Mengembalikan nilai dari kata kunci yang sama di Pine, yaitu ukuran posisi saat ini.{{strategy.order.action}}- Mengembalikan string untuk perintah yang akan dieksekusi dengan tombol buy atau tombol sell.{{strategy.order.contracts}}- Mengembalikan jumlah kontrak yang telah dieksekusi.{{strategy.order.price}}- Mengembalikan harga untuk memenuhi pesanan.{{strategy.order.id}}- Mengembalikan ID perintah yang telah dieksekusi ((String yang digunakan sebagai parameter pertama dalam salah satu panggilan fungsi yang menghasilkan perintah: strategi.entry, strategi.exit atau strategi.order)).{{strategy.order.comment}}- Mengembalikan komentar atas perintah yang telah dijalankan (string yang digunakan dalam parameter komentar dalam salah satu panggilan fungsi yang menghasilkan perintah:strategy.entry,strategy.exit、 atau strategi.order) 、 Jika tidak ditentukan komentar, nilai dari strategi.order.id akan digunakan.{{strategy.order.alert_message}}- Mengembalikan nilai dari parameter alert_message, yang dapat digunakan dalam kode Pine dari kebijakan saat memanggil salah satu fungsi yang akan di-order: strategi.entry,strategy.exit、 atau strategi.order‬ hanya mendukung fitur ini di Pine v4‬{{strategy.market_position}}- Strategi yang dikembalikan dalam bentuk string untuk posisi saat ini: long, flat, atau short.{{strategy.market_position_size}}- Mengembalikan ukuran posisi saat ini dalam bentuk nilai absolut (misalnya non-negatif).{{strategy.prev_market_position}}- Strategi yang dikembalikan dalam bentuk string untuk posisi sebelumnya: long, flat, atau short.{{strategy.prev_market_position_size}}- Mengembalikan ukuran posisi sebelumnya dalam bentuk nilai absolut (misalnya non-negatif).

2. Membangun pesan dengan "Strategi Eksekusi Sinyal TradingView"

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

3 ̊ Untuk membuat TradingView menyalakan sinyal saat menjalankan skrip PINE ini, Anda harus mengatur alarm saat loading skrip ini di TradingView

img

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

img

img

Di sini, Anda dapat melihat bahwa FMZ akan mengeksekusi sinyal tersebut.

img

img

Alamat video

Video Cucumis:https://www.ixigua.com/7172134169580372513?utm_source=xiguastudioStasiun B:https://www.bilibili.com/video/BV1BY411d7c6/Ketahuilah:https://www.zhihu.com/zvideo/1581722694294487040

Kode dalam artikel ini hanya untuk referensi dan dapat disesuaikan dan diperluas untuk penggunaan praktis.


Berkaitan

Lebih banyak

wbe3- Potret kecilMonggo, bagaimana cara menjalankan operasi lingkungan analog?

GuohwaSaya ingin bertanya, apakah pesan peringatan tradingview dapat berisi pesan pesanan terakhir? Saya ingin melihat apakah pesanan terakhir yang saya dapatkan adalah keuntungan atau kerugian, jika pesanan terakhir yang saya dapatkan adalah kerugian, maka robot tidak akan melakukan transaksi sampai pesanan terakhir yang saya dapatkan adalah keuntungan. Apakah Anda bisa melakukannya? Terima kasih!

13811047519/upload/asset/2a5a9fa2b97561c42c027.jpg Tolong Tuhan, apa arti dari laporan ini dan bagaimana cara menghapusnya?

KeindahanDream Big, saya menambahkan 6 7 akun untuk melakukan perdagangan sinyal ini, tapi sementara cukup besar, satu sinyal akun bursa selesai akan melakukan sinyal akun perdagangan berikutnya, adalah pelaksanaan berturut-turut, apakah ada cara untuk melakukan sinyal perdagangan paralel secara bersamaan?

wbe3- Potret kecilDalam kebijakan penerimaan sinyal, tampaknya tidak ada pendapatan cetak, dan publik tampaknya tidak akan dihasilkan, jadi tolong tambahkan tampilan kebijakan yang terkait dengan template tabel informasi akun.

Mimpi kecilItu adalah kebijakan terbuka yang secara otomatis menambahkan halaman.

wbe3- Potret kecilTerima kasih bro, sudah diuji dengan baik, tapi setelah transaksi tidak ada strategi rating review, apakah perlu menambahkan sendiri

Mimpi kecilOKX interface, yang dapat beralih ke lingkungan pengujian cakram analog OKX, menggunakan exchange.IO (("simulate", true), yang dapat beralih ke lingkungan cakram analog.

GuohwaTerima kasih atas jawabannya, saya memiliki dua pertanyaan: 1, yang saya sedikit tidak mengerti adalah bahwa fmz sendiri dapat menulis skrip pine sendiri, mengapa artikel ini harus mengirim peringatan ke fmz melalui TradingView dan kemudian memproses dan kemudian berdagang? 2. saya sekarang menemukan strategi yang cukup bagus sendiri, tetapi tidak memiliki hak akses sumber, saya ingin menghindari kesalahan dengan metode yang saya sebutkan di atas, Anda mengatakan untuk menambahkan {{strategy.order.price}} dalam pesan push. Saya juga menambahkannya, tetapi push ini tampaknya harga saat pesanan, di belakang fmz bagaimana dengan harga ini untuk menilai apakah itu menguntungkan atau merugikan, saya agak tidak mengerti.

Mimpi kecilAnda dapat mendorong konten pada saat mengirim pesan, dan kemudian strategi di FMZ memproses informasi ini dan memutuskan apakah akan memesan berdasarkan perbandingan harga saat ini.

Mimpi kecilApakah tes normal sekarang? Saya melakukan tes normal di sini.

KeindahanBagus. Terima kasih bos.

Mimpi kecilFMZ baru menambahkan fungsi paralel, seharusnya dapat diubah menjadi paralel, meskipun kode strategi mungkin akan berubah lebih besar.