Một chiến lược thực hiện tín hiệu khác của TradingView

Tác giả:Giấc mơ nhỏ, Tạo: 2022-11-30 10:52:07, Cập nhật: 2023-09-18 20:01:09

[TOC]

img

Một chiến lược thực hiện tín hiệu khác của TradingView

Các nhà giao dịch thường xuyên sử dụng TradingView đều biết rằng TradingView có thể đẩy tin nhắn đến các nền tảng khác. Trước đây, một chiến lược đẩy tín hiệu của TradingView cũng đã được công bố trong thư viện.

Cảnh tượng và nguyên tắc

Có thể một số học sinh mới có thể thấy tiêu đề của bài viết này và mô tả ở trên hơi kỳ cục, nhưng không sao đâu! Chúng ta sẽ giải thích rõ hơn về tình huống nhu cầu, nguyên tắc.

Một, tình huống nhu cầu: Nói cách đơn giản, chúng ta có rất nhiều chỉ số, chiến lược, mã v.v. có thể sử dụng trong TradingView, tất cả đều có thể chạy trực tiếp trên TradingView, có thể vẽ đường, tính toán, hiển thị tín hiệu giao dịch, v.v. Và TradingView có dữ liệu giá thời gian thực, đầy đủ dữ liệu đường K để tính toán các chỉ số khác nhau. Mã kịch bản trên TradingView được gọi là ngôn ngữ PINE, chỉ có một điểm không thuận tiện là giao dịch thực trên TradingView. Mặc dù FMZ đã hỗ trợ ngôn ngữ PINE, nhưng cũng có thể chạy nhưng.

2 Nguyên tắc:

img

Chương trình này bao gồm 4 chủ thể, đơn giản là:

Số Chủ đề Mô tả
1 TradingView (Trading View trong hình) Trò chơi này chạy kịch bản PINE trên TradingView để phát tín hiệu và truy cập giao diện API mở rộng của FMZ.
2 Nền tảng FMZ (WEB Quản lý ổ đĩa, có thể gửi các lệnh tương tác trên trang ổ đĩa hoặc có thể sử dụng API mở rộng để cho phép nền tảng FMZ gửi các lệnh tương tác cho các chương trình chính sách ổ đĩa trên máy chủ
3 Các chương trình trên ổ đĩa thực trên phần mềm quản lý (hình trên là FMZ strategy robot) TradingView lệnh thực thi chiến lược thực sự chạy
4 Sàn giao dịch (exchange trong hình) Các sàn giao dịch được cấu hình trên thực tế, các chương trình trên thực tế trên người quản lý trực tiếp gửi yêu cầu đặt hàng đến sàn giao dịch

Vì vậy, nếu bạn muốn chơi như vậy, bạn cần chuẩn bị như sau: Các kịch bản chạy trên TradingView, chịu trách nhiệm gửi các yêu cầu tín hiệu đến giao diện API mở rộng của FMZ, yêu cầu tài khoản TradingView ít nhất là thành viên PRO. 2, để triển khai một chương trình quản lý trên FMZ, bạn cần một chương trình có thể truy cập vào giao diện giao dịch (ví dụ như máy chủ ở Singapore, Nhật Bản, Hong Kong, vv). 3, trong FMZ, cấu hình API KEY của sàn giao dịch để thực hiện khi tín hiệu TradingView được gửi đến. Bạn cần có một chiến lược thực hiện tín hiệu TradingView, đó là chủ đề của bài viết này.

Chiến lược thực hiện tín hiệu TradingView

Các phiên bản trước của "TradingView Signal Execution Policy" được thiết kế ít linh hoạt hơn, thông điệp chỉ được viết chết trong url của yêu cầu được gửi bởi TradingView. Nếu chúng ta muốn TradingView viết một số thông tin biến trong Body khi gửi thông điệp, thì điều này không hiệu quả. Ví dụ, trên TradingView, nội dung thông điệp như:

img

Trong trường hợp đó, bạn có thể cài đặt trên TradingView để viết tin nhắn trong request body và gửi đến FMZ's extension API.

FMZ là một bộ API mở rộng mà chúng ta sẽ sử dụng.CommandRobotMột số người sử dụng các giao diện khác nhau, nhưng không phải là tất cả các giao diện khác nhau.

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

URL yêu cầu nàyqueryTrongaccess_keysecret_keyĐây là một phần mở rộng của nền tảng FMZ.API KEYVì vậy, nó được thiết lập nhưxxxyyyyTrong khi đó, một số người khác đã viết bài viết trên trang web của mình về việc làm thế nào để tạo ra KEY.https://www.fmz.com/m/accountMột số người cho rằng việc tạo ra một trang web có thể, được lưu trữ đúng cách và không được tiết lộ.

img

Trở lại chủ đề chính, tiếp tục.CommandRobotVấn đề về giao diện. Nếu cần truy cập là:CommandRobotCác giao diện, trong yêu cầumethodBạn có thể đặt cho:CommandRobotCommandRobotChức năng của giao diện này là gửi một tin nhắn tương tác qua nền tảng FMZ đến ổ đĩa thực của một ID, vì vậy các tham sốargsTrong đó có ID đĩa thực và tin nhắn, ví dụ như trên đây là một URL yêu cầu để ID là186515Các chương trình trên đĩa thực, gửi tin nhắnok12345

Trước đây, FMZ được yêu cầu mở rộng API theo cách này, thông điệp chỉ có thể được viết tắt như trong ví dụ trên.ok12345Nếu tin nhắn nằm trong phần Body được yêu cầu, bạn cần sử dụng một cách khác:

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

Điều này giúp bạn có thể gửi nội dung của Body trong yêu cầu qua nền tảng FMZ như là một thông điệp tương tác cho ID.130350Trong khi đó, các thông báo trên TradingView được đặt là:{"close": {{close}}, "name": "aaa"}Vậy ID là130350Trong khi đó, một số người khác cũng nhận được lệnh tương tác:{"close": 39773.75, "name": "aaa"}

Để "Chính sách thực thi tín hiệu TradingView" có thể hiểu chính xác chỉ thị giao tiếp được gửi bởi TradingView khi nhận được chỉ thị này, hãy thỏa thuận định dạng tin nhắn trước:

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

Các chính sách được thiết kế theo cấu trúc đa giao dịch, do đó, nhiều đối tượng giao dịch có thể được cấu hình trên chính sách này, tức là có thể kiểm soát các hoạt động đặt hàng trên nhiều tài khoản khác nhau. Chỉ cần sử dụng giao dịch mà Exchange chỉ định trong cấu trúc tín hiệu, cài đặt 1 là để cho tín hiệu này hoạt động đối tượng giao dịch đầu tiên được thêm vào tương ứng với tài khoản giao dịch. Nếu cài đặt hiện tại là cài đặt ContractType, tương lai sẽ được viết theo các hợp đồng cụ thể, chẳng hạn như hợp đồng chuyển đổi vĩnh viễn.

Sau đó, bạn có thể thiết kế mã chiến lược, mã chiến lược đầy đủ:

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

Các tham số chiến lược và tương tác:

img

Địa chỉ chính sách đầy đủ của chiến lược thực hiện tín hiệu TradingView:https://www.fmz.com/strategy/392048

Kiểm tra đơn giản

Trước khi chạy chính sách, hãy cấu hình đối tượng sàn giao dịch trước khi cài đặt hai tham số "AccessKey của nền tảng FMZ" và "SecretKey của nền tảng FMZ" trong các tham số chính sách, không đặt sai.

img

Nó sẽ in theo: địa chỉ WebHook cần điền trong TradingView, lệnh hành động được hỗ trợ, định dạng tin nhắn; quan trọng là địa chỉ WebHook:

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

Bạn có thể trực tiếp sao chép và dán các vị trí tương ứng trên TradingView.

Nếu bạn muốn mô phỏng việc gửi tín hiệu của TradingView, bạn có thể nhấp vào nút TestSignal trên giao tiếp chính sách:

img

Chính sách này sẽ tự gửi một yêu cầu (điều tương tự như TradeView gửi tín hiệu yêu cầu) và gọi giao diện API mở rộng của FMZ, gửi một thông báo cho chính sách:

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

Sau đó, bạn sẽ nhận được một thông báo tương tác khác và thực hiện:

img

Và đặt mua hàng.

Kiểm tra TradingView trong các cảnh thực tế

Sử dụng thử nghiệm TradingView yêu cầu tài khoản TradingView là cấp Pro, có một số kiến thức trước cần được giải thích một cách đơn giản trước khi thử nghiệm.

Ví dụ như một kịch bản PINE đơn giản (một chút sửa đổi mà tôi tìm thấy trên 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)

Các kịch bản PINE có thể kèm theo thông tin khi các kịch bản phát lệnh.

Dưới đây là những ký hiệu, ví dụ như những gì tôi đã viết trong hộp "thông báo" trong báo động.{{strategy.order.contracts}}Khi kích hoạt đặt hàng, bạn sẽ được gửi tin nhắn (tùy theo cài đặt trên báo động, email push, webhook url request, popup window, v.v.) với số lần đặt hàng được thực hiện.

{{strategy.position_size}}- Trả về giá trị của cùng một từ khóa trong Pine, đó là kích thước vị trí hiện tại.{{strategy.order.action}}- Trả về các lệnh được thực hiện bằng các chuỗi buy hoặc sell.{{strategy.order.contracts}}- Trả về số lượng hợp đồng đã được thực hiện.{{strategy.order.price}}- Trả lại giá thực hiện đơn đặt hàng.{{strategy.order.id}}- Trả về ID của lệnh đã được thực hiện ((được sử dụng như một trong các chuỗi tham số đầu tiên trong một trong các cuộc gọi chức năng tạo lệnh: chiến lược.entry, chiến lược.exit hoặc chiến lược.order)).{{strategy.order.comment}}- Trả lại lời chú thích của lệnh đã được thực hiện (được sử dụng trong một trong các tham số comment trong một trong các cuộc gọi chức năng tạo lệnh:strategy.entry,strategy.exit、 hoặc strategi.order) 、 Nếu không có chú thích, giá trị của strategi.order.id sẽ được sử dụng.{{strategy.order.alert_message}}- Trả về giá trị của tham số alert_message, được sử dụng trong mã Pine của chính sách khi gọi một trong những hàm được dùng để đặt lệnh tiếp theo:strategy.entry,strategy.exit│ hoặc strategy.order‬ chỉ hỗ trợ chức năng này trong Pine v4‬{{strategy.market_position}}- Lưu trữ hiện tại của chiến lược được trả về dưới dạng chuỗi: long, flat, hoặc short.{{strategy.market_position_size}}- Trả về kích thước của vị trí hiện tại dưới dạng giá trị tuyệt đối (tức là không âm).{{strategy.prev_market_position}}- Trả về chiến lược nắm giữ trước đó dưới dạng chuỗi: long, flat, hoặc short.{{strategy.prev_market_position_size}}- Trả về kích thước của vị trí trước đó dưới dạng giá trị tuyệt đối (tức là không âm).

2, Xây dựng thông báo kết hợp với "Chính sách thực hiện tín hiệu TradingView"

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

3, để TradingView phát tín hiệu khi chạy theo kịch bản PINE này, cần thiết lập báo động khi kịch bản này được tải trên TradingView

img

Khi kịch bản PINE trên TradingView kích hoạt hành động giao dịch, nó sẽ gửi yêu cầu url webhook.

img

img

FMZ thực tế sẽ thực hiện tín hiệu này.

img

img

Địa chỉ video

Các video về dưa leo:https://www.ixigua.com/7172134169580372513?utm_source=xiguastudioĐường B:https://www.bilibili.com/video/BV1BY411d7c6/Có thể:https://www.zhihu.com/zvideo/1581722694294487040

Mã trong bài viết chỉ dùng để tham khảo và sử dụng thực tế có thể tự điều chỉnh, mở rộng.


Có liên quan

Thêm nữa

wbe3- Bánh nướng nhỏMongko, làm thế nào để chạy các hoạt động môi trường đĩa tương tự?

guohwaXin hỏi, thông báo cảnh báo của tradingview có thể bao gồm thông báo về đơn đặt hàng trước đó không? Tôi muốn nhận được lệnh cuối cùng có lợi nhuận hay thua lỗ, nếu lệnh cuối cùng là thua lỗ, robot sẽ không thực hiện lệnh cuối cùng cho đến khi lệnh cuối cùng được nhận là có lợi nhuận. Xin vui lòng làm được không?

13811047519/upload/asset/2a5a9fa2b97561c42c027.jpg Xin Chúa, báo cáo này có nghĩa là gì và làm thế nào để xóa nó?

Tình trạng tốt đẹpTôi đã thêm 6 và 7 tài khoản để giao dịch bằng tín hiệu này, nhưng tạm thời khá lớn, tín hiệu của một tài khoản giao dịch sẽ được thực hiện trước khi tín hiệu của tài khoản giao dịch tiếp theo được thực hiện, đó là một chuỗi thực hiện, có cách nào để đồng thời thực hiện tín hiệu giao dịch?

wbe3- Bánh nướng nhỏTrong chính sách nhận tín hiệu, dường như không có thu nhập in và công khai dường như sẽ không được tạo ra, vì vậy xin vui lòng thêm mẫu biểu mẫu thông tin tài khoản liên quan xem chính sách hoạt động

Giấc mơ nhỏĐó là nội dung chính sách công khai, trang được thêm tự động.

wbe3- Bánh nướng nhỏCảm ơn anh bạn, đã thử nghiệm tốt, nhưng sau khi giao dịch không có chiến lược đánh giá tổng quan, có phải cần tự động thêm

Giấc mơ nhỏOKX giao diện, có thể chuyển sang môi trường thử nghiệm đĩa analog của OKX bằng cách sử dụng exchange.IO (("simulate", true), có thể chuyển sang môi trường đĩa analog.

guohwaXin cảm ơn đã trả lời, tôi có hai câu hỏi: Một điều tôi không hiểu là FMZ có thể tự viết kịch bản pine, tại sao bài viết này lại gửi cảnh báo đến FMZ qua TradingView và xử lý và giao dịch? 2, Tôi đã tìm thấy một chiến lược rất tốt, nhưng không có mã nguồn được quyền sử dụng, tôi muốn tránh sai lầm bằng cách tôi nói ở trên, bạn nói rằng trong tin nhắn đẩy tăng {{strategy.order.price}} Tôi cũng đã thêm vào, nhưng việc đẩy này dường như là giá khi đặt hàng, sau đó trong fmz làm thế nào để đánh giá giá này là lợi nhuận hoặc lỗ, tôi hơi không hiểu.

Giấc mơ nhỏCó thể thực hiện được, bạn có thể đẩy nội dung {{strategy.order.price}} vào thời điểm gửi tin nhắn, sau đó các chiến lược trên FMZ xử lý thông tin này và quyết định đặt hàng hay không dựa trên sự so sánh giá hiện tại.

Giấc mơ nhỏTôi đã thử nghiệm ở đây và nó là bình thường.

Tình trạng tốt đẹpTốt. Cảm ơn ông chủ.

Giấc mơ nhỏFMZ bổ sung tính năng song song, nên có thể được thay đổi thành song song, mặc dù mã chiến lược có thể thay đổi khá lớn.