다른 트레이딩뷰 신호 실행 전략

저자:작은 꿈, 창작: 2022-11-30 10:52:07, 업데이트: 2023-09-18 20:01:09

[TOC]

img

다른 트레이딩뷰 신호 실행 전략

트레이딩뷰를 자주 사용하는 트레이더들은 트레이딩뷰가 다른 플랫폼으로 메시지를 푸싱할 수 있다는 것을 알고 있습니다. 이전에는 트레이딩뷰의 신호 푸싱 전략이 라이브러리에 공개되기도 했습니다. 푸싱 메시지의 내용은 요청 url에 작성되어 있고 다소 유연하지 않습니다. 이 글에서는 트레이딩뷰 신호 실행 전략을 다시 설계하는 방법을 사용했습니다.

시나리오와 원칙

이 글의 제목과 설명이 신입생들한테 조금 이상해 보일지도 모르지만 괜찮습니다. 먼저 필요 시나리오와 원리를 설명해 보겠습니다. 제가 무슨 말을 하는지 알려드리겠습니다.

1차, 수요 시나리오: 간단히 말해서, 우리는 트레이딩뷰에서 사용할 수 있는 많은 지표, 전략, 코드 등을 선택할 수 있습니다. 이 모든 것은 트레이딩뷰에서 직접 실행될 수 있습니다. 라인을 그리거나 계산하거나 거래 신호를 표시할 수 있습니다. 그리고 트레이딩뷰에는 실시간 가격 데이터와 K 라인 데이터가 풍부하여 다양한 지표를 계산할 수 있습니다. 트레이딩뷰에서 이러한 스크립트 코드는 PINE 언어라고 불립니다.

두 번째 원칙:

img

이 프로그램은 4개의 주체를 포함하고 있으며, 간단히 설명하면 다음과 같습니다.

번호 주체 설명
1 트레이딩 뷰 (그림의 트레이딩 뷰) TradingView에서 PINE 스크립트를 실행하여 FMZ의 확장 API 인터페이스에 액세스할 수 있는 신호를 발송합니다.
2 FMZ 플랫폼 (그림에서 FMZ 플랫폼 (웹 사이트)) 디스크 관리, 디스크 페이지에서 인터랙티브 명령어를 보낼 수 있으며, 확장 API 인터페이스를 통해 FMZ 플랫폼이 호스트에 인터랙티브 명령어를 보낼 수 있습니다.
3 관리자 소프트웨어의 실제 디스크 프로그램 (그림에서 FMZ strategy robot) TradingView 신호 실행 전략 실제 실행되는 프로그램
4 거래소 (그림에 있는 exchange) 실제 거래소에서 설정된 거래소, 간탁자에 있는 실제 거래소 프로그램은 주문을 요청하는 거래소에 직접 전송합니다

그래서 이런 게임을 하기 위해서는 다음과 같은 준비가 필요합니다. 1, 트레이딩뷰에서 실행되는 스크립트, FMZ의 확장 API 인터페이스에 신호 요청을 보내는 데 필요한 트레이딩뷰 계정이 적어도 PRO 멤버가 필요합니다. 2, FMZ에 관리자 프로그램을 배포하려면 거래소 인터페이스에 액세스 할 수있는 프로그램이 필요합니다 (예를 들어 싱가포르, 일본, 홍콩 등의 서버). 3, FMZ에서 트레이딩뷰 신호가 전송될 때 트레이딩뷰에서 트레이딩뷰 신호를 전송할 때 트레이딩뷰에서 트레이딩뷰 신호를 전송할 때 트레이딩뷰에서 트레이딩뷰 신호를 전송할 때 4. "TradingView 신호 실행 전략"이 필요합니다. 이 전략은 이 문서의 주요 내용입니다.

트레이딩뷰 신호 실행 전략

이전 버전의 "TradingView 신호 실행 정책"은 덜 유연하게 설계되었으며, 메시지는 트레이딩뷰가 전송한 요청의 url에만 작성됩니다. 만약 우리가 트레이딩뷰가 메시지를 푸시하는 동안 Body에 어떤 변수 정보를 작성하기를 원한다면, 이 경우 작동하지 않습니다. 예를 들어, 트레이딩뷰에서 다음과 같은 메시지의 내용이 있습니다:

img

그렇다면 트레이딩뷰에서는 그림과 같이 메시지를 요청의 본체에 작성하여 FMZ의 확장 API 인터페이스로 보낼 수 있습니다.

FMZ의 확장 API 인터페이스에서 우리가 사용하는 것은CommandRobot이 인터페이스는 일반적으로 다음과 같이 호출됩니다.

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

이 URL을 요청하는query그 중access_key그리고secret_keyFMZ 플랫폼의 확장 프로그램입니다.API KEY이 데모는 이렇게 설정됩니다.xxx그리고yyyy이 페이지에서: "KEY는 어떻게 만들어졌나요?"https://www.fmz.com/m/account이 글의 내용은 이쪽에서 볼 수 있습니다.

img

이 모든 것은 우리가 할 수 있는 일입니다.CommandRobot인터넷에 접속할 수 있는 인터페이스 문제.CommandRobot이 인터페이스는, 요청에method이 문서는CommandRobotCommandRobot이 인터페이스의 기능은 FMZ 플랫폼을 통해 어떤 ID의 디스크에 인터랙티브 메시지를 보내는 것입니다.args이 URL은 실제 디스크 ID와 메시지를 포함하고 있습니다.186515이 비디오는 이 비디오에서 볼 수 있습니다.ok12345

이전에는 FMZ 확장 API의 CommandRobot 인터페이스를 이렇게 요청했지만, 메시지는 표기만 할 수 있었습니다.ok12345만약 메시지가 요청된 본드에 있다면 다른 방법을 사용해야 합니다.

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

이러한 요청은 FMZ 플랫폼을 통해 요청의 Body의 내용을 ID에 상호작용 메시지로 전송할 수 있습니다.130350트레이딩 뷰에서 메시지가 설정되면:{"close": {{close}}, "name": "aaa"}그래서 ID는130350이 비디오는 이 비디오의 실제 디스크에 대한 상호 작용 명령어를 제공합니다.{"close": 39773.75, "name": "aaa"}

"TradingView 신호 실행 정책"이 상호 작용 명령어를 수신할 때 TradingView에서 전송된 명령어를 올바르게 이해하도록 하기 위해서는 미리 메시지 형식을 합의해야 합니다:

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

이 정책은 멀티 거래소 구조로 설계되어 있으므로 이 정책에 여러 거래소 객체를 구성할 수 있으며, 즉, 여러 다른 계정에 대한 하계 작업을 제어할 수 있다. 신호 구조에서 Exchange가 지정하는 거래소만 사용하면, 설정 1은 이 신호가 추가된 첫 번째 거래소 객체에 해당하는 거래소 계정에 동작하도록 하는 것이다. 현장 계약 유형 설정이 작동하는 경우, 선물은 영구 계약 교환과 같은 특정 스포트 계약을 작성한다. 시장 가격 전송 -1은 작성될 수 있다.

다음으로 전략 코드를 설계할 수 있습니다. 전체 전략 코드입니다.

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

전략적 매개 변수와 상호작용:

img

"TradingView 신호 실행 전략"의 전체 전략 주소는:https://www.fmz.com/strategy/392048

간단한 테스트

이 정책은 실행되기 전에 거래소 객체를 구성하기 위해, 정책 파라미터에서 "FMZ 플랫폼의 AccessKey"와 "FMZ 플랫폼의 SecretKey"를 설정하고, 잘못된 설정하지 마십시오.

img

트레이딩 뷰에서 작성해야 할 WebHook 주소, 지원되는 액션 명령어, 메시지 형식 등이 인쇄됩니다. 중요한 것은 WebHook 주소입니다.

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

트레이딩 뷰에서 해당 위치에 있는 페이지를 직접 복사하고 붙여넣을 수 있습니다.

트레이딩뷰의 신호 전송을 시뮬레이션하려면 정책 상호 작용의 테스트 신호 버튼을 클릭하면 됩니다.

img

이 정책은 자체적으로 요청 (TradingView 전송 신호 요청을 모방) 을 보내 FMZ의 확장 API 인터페이스를 호출하여 정책 자체에 메시지를 전송합니다.

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

현재 정책은 다른 상호 작용 메시지를 받고 실행합니다.

img

그리고 거래를 주문합니다.

실제 시나리오에서 TradingView를 사용하는 테스트

트레이딩뷰 테스트를 사용하려면 트레이딩뷰 계정이 필요합니다. 트레이딩뷰는 프로 레벨입니다.

간단한 PINE 스크립트 (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, PINE 스크립트는 다음 명령어를 실행할 때 어떤 정보를 붙일 수 있습니다.

다음은 제가 알람에 "뉴스"라는 부호에 입력한 표기자입니다.{{strategy.order.contracts}}이 경우, 주문이 발동되면 메시지가 전송됩니다. (알람 설정, 메일 푸시, 웹 후크 url 요청, 팝업 창 등에 따라) 메시지는 해당 주문의 실행 수를 포함합니다.

{{strategy.position_size}}- 피네에서 동일한 키워드의 값을 반환합니다.{{strategy.order.action}}- 실행된 명령에 대한 문자열을 반환합니다 buy 또는 sell.{{strategy.order.contracts}}- 주문을 수행한 계약의 수를 반환합니다.{{strategy.order.price}}- 주문을 실행하는 가격을 반환합니다.{{strategy.order.id}}- 실행된 명령어의 ID를 반환합니다 (예: 명령어를 생성하는 함수 호출 중 하나에서 첫 번째 변수로 사용되는 문자열:strategy.entry,strategy.exit 또는strategy.order){{strategy.order.comment}}- 실행된 명령어에 대한 언급을 반환합니다. () 명령어를 생성하는 함수 호출 중 하나에서 comment 파라그램에서 사용되는 문자열:strategy.entry,strategy.exit、또는strategy.order) ─ 만약 논평이 지정되어 있지 않다면, strategy.order.id의 값이 사용된다。{{strategy.order.alert_message}}- 정책의 파인 코드에서 다음 명령에 사용되는 함수 중 하나를 호출할 때 사용할 수 있는 alert_message 변수의 값을 반환합니다:strategy.entry,strategy.exit또는 전략.order;; 이 기능은 Pine v4에서만 지원됩니다.{{strategy.market_position}}- 문자열 형태로 전략의 현재 보유를 반환합니다: long, flat, 또는 short.{{strategy.market_position_size}}- 절대값 (즉, 비부적) 으로 현재의 위치 크기를 반환합니다.{{strategy.prev_market_position}}- 문자열 형태로 전략의 이전 보유를 반환합니다: long, flat, 또는 short.{{strategy.prev_market_position_size}}- 절대값 (즉, 비부적) 으로 전 포지션의 크기를 반환합니다.

2. "TradingView 신호 실행 전략"과 함께 메시지를 구성합니다.

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

3, TradingView가 이 PINE 스크립트를 실행할 때 신호를 보내기 위해, TradingView에서 이 스크립트를 로드할 때 경보를 설정해야 합니다.

img

트레이딩뷰에서 PINE 스크립트가 트레이딩 동작을 촉발할 때, 웹후크 url 요청이 전송됩니다.

img

img

FMZ의 실제 디스크는 이 신호를 실행합니다.

img

img

비디오 주소

오징어 비디오:https://www.ixigua.com/7172134169580372513?utm_source=xiguastudioB역:https://www.bilibili.com/video/BV1BY411d7c6/알다시피:https://www.zhihu.com/zvideo/1581722694294487040

이 문서의 코드는 참고용으로만 사용되며 실제 사용은 자율적으로 조정, 확장할 수 있습니다.


관련

더 많은

wbe3- 작은 튀김몽고, 어떻게 모형 디스크 환경 조작을 실행합니까? 먼저 신호의 정확성을 테스트하고 싶습니다.

구호와질문 하나, 트레이딩뷰의 알림 메시지는 지난 주문에 대한 메시지를 포함할 수 있나요? 마지막 주문이 수익인지 손실인지 확인하고 싶은데, 만약 마지막 주문이 손실인 경우, 로봇은 마지막 주문이 수익인 상태가 될 때까지 주문을 실행하지 않습니다. 이 모든 것을 할 수 있을까요? 감사합니다.

13811047519/upload/asset/2a5a9fa2b97561c42c027.jpg 이 오류가 무슨 뜻이고 어떻게 제거할 수 있는지 물어보세요.

좋은 상황꿈은, 나는 이 신호 거래를 위해 6 7 계좌를 추가했지만 일시적으로 큰, 하나의 거래소 계정 신호가 완료 될 때까지 다음 거래 계좌의 신호는 연속 실행입니다. 동시에 거래 신호를 실행하는 방법을 찾을 수 있습니까?

wbe3- 작은 튀김수신 시그널의 정책에는 인쇄 수익이 없거나 공개되는 것이 생성되지 않는 것처럼 보이므로 관련 계정 정보 표 템플릿을 추가하여 정책 표시를 보실 수 있습니까?

작은 꿈이 문서는 공개 정책의 개요이며, 페이지가 자동으로 추가됩니다.

wbe3- 작은 튀김멘코, 감사합니다, 테스트가 잘 되었지만 거래 후 전략 평점 개요가 없습니다. 직접 추가해야합니까?

작은 꿈OKX 인터페이스, OKX의 아날로그 디스크 테스트 환경으로 전환할 수 있으며, exchange.IO (("simulate", true) 를 사용하여 아날로그 디스크 환경으로 전환할 수 있다.

구호와이 질문에 대한 답변에 감사드립니다. 두 가지 질문을 드리겠습니다. 1, 제가 조금 이해하지 못하는 것은 fmz가 스스로 파인 스크립트를 작성할 수 있다는 것입니다. 왜 이 문서는 트레이딩뷰를 통해 fmz에 알림을 보내고 처리하고 거래해야합니까? 2, 나는 이제 자체적으로 좋은 전략을 찾았습니다. 그러나 소스 코드가 사용 권한이 없습니다. 나는 위에서 말한 방법을 통해 실수를 피하고 싶었습니다. 당신은 푸시 메시지에 {{전략.order.price}}을 추가한다고 말했습니다. 나는 또한 추가했습니다. 그러나 이 푸시는 주문 시 가격으로 보입니다.

작은 꿈이 메세지를 푸시하는 동안 를 푸시할 수 있고, FMZ의 전략은 이 정보를 처리하여 현재 가격 대비에 따라 주문할 것인지 여부를 결정하는 것이 가능해야 한다.

작은 꿈지금 테스트가 정상인가요? 저는 테스트를 정상으로 하고 있습니다.

좋은 상황좋아요. 감사합니다.

작은 꿈FMZ는 새로운 동시 기능이 추가되어 동시로 변경될 수 있어야 하지만 전략 코드는 더 큰 변경이 있을 수 있다. 최근에는 시간이 있으면 동시 사례를 업그레이드한다.