ট্রেডিং ভিউ সিগন্যাল এক্সিকিউশন কৌশল

লেখক:ছোট্ট স্বপ্ন, সৃষ্টিঃ ২০২২-১১-৩০ 10:52:07, আপডেটঃ ২০২৩-০৯-১৮ 20:01:09

[TOC]

img

ট্রেডিং ভিউ সিগন্যাল এক্সিকিউশন কৌশল

ট্রেডিং ভিউ ব্যবহারকারীরা জানেন যে ট্রেডিং ভিউতে বার্তা অন্য প্ল্যাটফর্মেও পাঠানো যেতে পারে। পূর্বে ট্রেডিং ভিউতে একটি সিগন্যাল প্রেরণ কৌশল প্রকাশ করা হয়েছিল।

দৃশ্য এবং নীতিমালা

এই নিবন্ধের শিরোনাম এবং উপরের বর্ণনাটি নতুন শিক্ষার্থীদের কাছে কিছুটা অদ্ভুত মনে হতে পারে, ঠিক আছে! আমরা প্রথমে প্রয়োজনীয়তার দৃশ্য, নীতিগুলি পরিষ্কারভাবে ব্যাখ্যা করব। আমি কী বলছি তা আপনাকে জানাব। ঠিক আছে, আমরা বিষয়টিতে চলে যাব।

১। চাহিদা দৃশ্যঃ ট্রেডিং ভিউতে আমরা অনেকগুলি সূচক, কৌশল, কোড ইত্যাদি ব্যবহার করতে পারি, যা ট্রেডিং ভিউতে সরাসরি চালানো যায়, লাইন আঁকতে, গণনা করতে, ট্রেডিং সিগন্যাল প্রদর্শন করতে পারে ইত্যাদি। এবং ট্রেডিং ভিউতে রিয়েল-টাইম মূল্যের ডেটা রয়েছে, বিভিন্ন সূচক গণনা করার জন্য পর্যাপ্ত কে-লাইন ডেটা রয়েছে। ট্রেডিং ভিউতে এই স্ক্রিপ্ট কোডগুলি পাইন ভাষা নামে পরিচিত, কেবলমাত্র এটি খুব সুবিধাজনক নয় যে ট্রেডিং ভিউতে বাস্তব ট্রেডিং করা হয়। যদিও এফএমজেড ইতিমধ্যে পাইন ভাষা সমর্থন করে, তবে এটিও কার্যকরভাবে চালানো যায়।

২। নীতিঃ

img

এই প্রকল্পটি চারটি বিষয়কে নিয়ে গঠিত, যা সংক্ষেপে বলা যায়ঃ

নাম্বার মূল বিষয় বর্ণনা
1 ট্রেডিং ভিউ (চিত্রের মধ্যে ট্রেডিং ভিউ) ট্রেডিং ভিউতে পাইন স্ক্রিপ্ট চালানো হয় যা সিগন্যাল প্রেরণ করে এবং এফএমজেডের এক্সটেনশন এপিআই ইন্টারফেসে অ্যাক্সেস করে
2 এফএমজেড প্ল্যাটফর্ম (ছবিতে এফএমজেড প্ল্যাটফর্ম (ওয়েবসাইট)) ডিস্ক পরিচালনা, ডিস্ক পৃষ্ঠায় ইন্টারঅ্যাকশন নির্দেশাবলী প্রেরণ করা যেতে পারে, অথবা একটি বর্ধিত এপিআই ইন্টারফেসের মাধ্যমে FMZ প্ল্যাটফর্মের জন্য ডিস্ক নীতিগত প্রোগ্রামগুলিকে হোস্টের কাছে ইন্টারঅ্যাকশন নির্দেশাবলী প্রেরণ করা যেতে পারে
3 হোস্টের সফটওয়্যারে রিয়েল ডিস্ক প্রোগ্রাম (চিত্রিত এফএমজেড কৌশল রোবট) ট্রেডিং ভিউ সিগন্যাল এক্সিকিউশন কৌশল বাস্তবে চলমান প্রক্রিয়া
4 এক্সচেঞ্জ (চিত্রের মধ্যে এক্সচেঞ্জ) এক্সচেঞ্জের সাথে কনফিগার করা, ম্যানেজারের সাথে সরাসরি অনুরোধ পাঠানো এক্সচেঞ্জ

তাই এই গেমটি খেলতে হলে আপনাকে এই কিছু প্রস্তুতি নিতে হবেঃ ১। ট্রেডিং ভিউতে চালিত স্ক্রিপ্ট, যা FMZ এর এক্সটেনশন এপিআই ইন্টারফেসে সিগন্যাল অনুরোধ পাঠানোর জন্য দায়ী, ট্রেডিং ভিউ অ্যাকাউন্টের জন্য কমপক্ষে PRO সদস্য হওয়া প্রয়োজন। ২। FMZ-তে একটি ট্রাস্টার প্রোগ্রাম স্থাপন করার জন্য, এক্সচেঞ্জ ইন্টারফেসের (যেমন সিঙ্গাপুর, জাপান, হংকং ইত্যাদিতে সার্ভার) অ্যাক্সেসযোগ্য হতে হবে। ৩। এফএমজেডে কনফিগার করা হয়েছে যে ট্রেডিং ভিউ সিগন্যাল প্রেরণের সময় এক্সচেঞ্জের এপিআই কীটি (অর্ডার স্থাপন) অপারেট করা হবে। ৪। আপনার একটি "ট্রেডিং ভিউ সিগন্যাল এক্সিকিউশন কৌশল" থাকা দরকার, যা এই নিবন্ধে মূলত আলোচনা করা হয়েছে।

ট্রেডিং ভিউ সিগন্যাল এক্সিকিউশন কৌশল

পূর্ববর্তী সংস্করণে "ট্রেডিং ভিউ সিগন্যাল এক্সিকিউশন পলিসি" এর নকশাটি খুব নমনীয় ছিল না, বার্তাটি কেবলমাত্র ট্রেডিং ভিউতে প্রেরিত অনুরোধের ইউআরএলে লিখতে পারে। যদি আমরা চাই যে ট্রেডিং ভিউ বার্তাটি প্রেরণের সময় বডিতে কিছু ভেরিয়েবল বার্তা লিখতে পারে তবে এটি কার্যকর হবে না। উদাহরণস্বরূপ, ট্রেডিং ভিউতে বার্তার সামগ্রীঃ

img

তাহলে ট্রেডিং ভিউতে আপনি এইভাবে সেট করতে পারেন যে, অনুরোধের বডিতে বার্তা লিখুন এবং FMZ এর এক্সটেনশন API ইন্টারফেসে পাঠান।

FMZ এর একটি বিস্তৃত API ইন্টারফেসে, আমরা যা ব্যবহার করব তা হলCommandRobotএই ইন্টারফেসটি সাধারণত এইভাবে বলা হয়ঃ

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

এই অনুরোধের URLqueryভিতরেaccess_keyএবংsecret_keyএফএমজেড প্ল্যাটফর্মের সম্প্রসারণ।API KEYএবং এখানে, এই ডেমো সেট করা আছেxxxএবংyyyy⇒ এই কী কিভাবে তৈরি করা হয়?https://www.fmz.com/m/account"একটি তৈরি করা যায়, ভালভাবে সংরক্ষণ করা যায় এবং কখনও ফাঁস করা হয় না।

img

আসুন, আসল বিষয়ের দিকে ফিরে যাই।CommandRobotইন্টারফেস সমস্যা।CommandRobotইন্টারফেস, অনুরোধের মধ্যেmethodএটি নিম্নরূপ সেট করা হয়েছেঃCommandRobotCommandRobotএই ইন্টারফেসের কাজ হল FMZ প্ল্যাটফর্মের মাধ্যমে একটি ইন্টারেক্টিভ মেসেজ পাঠানো যেটি একটি আইডি এর ডিস্কের দিকে যাবে, তাই প্যারামিটারargsএর মধ্যে ভার্চুয়াল ডিস্ক আইডি এবং বার্তা রয়েছে।186515ডিস্কের প্রোগ্রাম, বার্তা পাঠানok12345

পূর্বে FMZ এক্সটেনশান এপিআই এর CommandRobot ইন্টারফেসের জন্য এই ভাবে অনুরোধ করা হয়েছিল, বার্তাটি কেবল মরে যেতে পারে যেমন উপরের উদাহরণে।ok12345❖ যদি বার্তাটি অনুরোধকৃত বডিতে থাকে, তাহলে অন্য পদ্ধতিতে ব্যবহার করতে হবেঃ

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

এই অনুরোধটি FMZ প্ল্যাটফর্মের মাধ্যমে একটি ইন্টারেক্টিভ বার্তা হিসাবে একটি আইডিতে অনুরোধের মধ্যে থাকা উপাদানগুলি প্রেরণ করতে পারে130350ট্রেডিং ভিউতে যদি বার্তা সেট করা থাকেঃ{"close": {{close}}, "name": "aaa"}তাহলে আইডি হচ্ছে130350এই ভিডিওটি একটি ভিডিওতে দেখানো হয়েছে।{"close": 39773.75, "name": "aaa"}

ট্রেডিং ভিউ দ্বারা প্রেরিত নির্দেশটি সঠিকভাবে বোঝার জন্য ট্রেডিং ভিউ সিগন্যাল এক্সিকিউশন পলিসির সাথে যোগাযোগ করার জন্য, বার্তার ফর্ম্যাটটি আগে থেকেই নির্ধারণ করুনঃ

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

নীতিটি একটি মাল্টি-এক্সচেঞ্জ আর্কিটেকচার হিসাবে ডিজাইন করা হয়েছে, তাই এই নীতিতে একাধিক এক্সচেঞ্জ অবজেক্ট কনফিগার করা যায়, অর্থাৎ একাধিক ভিন্ন অ্যাকাউন্টের জন্য অর্ডার অপারেশন নিয়ন্ত্রণ করা যায়। কেবলমাত্র সিগন্যাল কাঠামোতে এক্সচেঞ্জ দ্বারা নির্দিষ্ট করা এক্সচেঞ্জটি ব্যবহার করে, সেটিং 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

"ট্রেডিং ভিউ সিগন্যাল এক্সিকিউশন পলিসি" এর সম্পূর্ণ পলিসি ঠিকানাঃhttps://www.fmz.com/strategy/392048

সহজ পরীক্ষা

নীতিটি চালানোর আগে এক্সচেঞ্জ অবজেক্টটি কনফিগার করতে হবে, নীতি প্যারামিটারে "FMZ প্ল্যাটফর্মের অ্যাক্সেস কী" এবং "FMZ প্ল্যাটফর্মের সিক্রেট কী" উভয় প্যারামিটার সেট করুন, ভুল সেট করবেন না।

img

এটি নিম্নলিখিতভাবে মুদ্রণ করা হবেঃ ট্রেডিং ভিউতে ওয়েবহুক ঠিকানা, সমর্থিত অ্যাকশন নির্দেশাবলী, বার্তা বিন্যাস; গুরুত্বপূর্ণ ওয়েবহুক ঠিকানাঃ

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

ট্রেডিং ভিউতে লিখিত পজিশনের সাথে সরাসরি কপি-পেস্ট করতে পারেন।

আপনি যদি ট্রেডিং ভিউতে সিগন্যাল প্রেরণের অনুকরণ করতে চান তবে নীতি ইন্টারঅ্যাকশনের টেস্টসিগন্যাল বোতামটি ক্লিক করুনঃ

img

এই নীতিটি নিজেই একটি অনুরোধ পাঠায় (অ্যালগরিদম ট্রেডিং ভিউ সিগন্যাল অনুরোধ পাঠায়) এবং FMZ এর এক্সটেনশন API ইন্টারফেসকে কল করে নীতিটিকে নিজেই একটি বার্তা পাঠায়ঃ

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

বর্তমান নীতিটি অন্য একটি ইন্টারঅ্যাকশন বার্তা গ্রহণ করে এবং এটি সম্পাদন করেঃ

img

এই ভিডিওতে, আমি আমার বন্ধুদের সাথে কথা বলেছি।

বাস্তব পরিস্থিতিতে ট্রেডিং ভিউ ব্যবহার করে পরীক্ষা

ট্রেডিং ভিউ ব্যবহার করে পরীক্ষা করার জন্য ট্রেডিং ভিউ অ্যাকাউন্টের প্রয়োজন।

উদাহরণস্বরূপ, একটি সহজ পাইন স্ক্রিপ্ট (যেটা ট্রেডিং ভিউতে পাওয়া যায়) ।

//@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)

১, পাইন স্ক্রিপ্টগুলি নিম্নলিখিত নির্দেশনাগুলি প্রেরণের সময় কিছু তথ্য সংযুক্ত করতে পারে

নিচে আমি যেসব অক্ষর লিখেছি, উদাহরণস্বরূপ, "বার্তা" বাক্সে।{{strategy.order.contracts}}আপনি যদি আপনার অর্ডারটি সক্রিয় করতে চান তবে আপনার অর্ডারটি সক্রিয় করার সময় একটি বার্তা প্রেরণ করা হবে (অ্যালার্ম, ইমেল প্রেরণ, ওয়েবহুক ইউআরএল অনুরোধ, পপ-আপ উইন্ডো ইত্যাদির উপর নির্ভর করে) ।

{{strategy.position_size}}- পাইনে একই কীওয়ার্ডের মান ফেরত দেয়, যা বর্তমান অবস্থানের আকার।{{strategy.order.action}}- সম্পাদিত আদেশের জন্য স্ট্রিংটি ফিরে আসে buy ট্যাব বা sell ট্যাব ।{{strategy.order.contracts}}- অর্ডার বাস্তবায়িত চুক্তির সংখ্যা ফেরত দেয়।{{strategy.order.price}}- অর্ডার বাস্তবায়নের দাম ফেরত দেওয়া।{{strategy.order.id}}- অর্ডারের আইডি ফেরত দেয় ((অর্ডার তৈরির ফাংশন কলগুলির মধ্যে একটিতে প্রথম প্যারামিট হিসাবে ব্যবহৃত স্ট্রিংঃ strategy.entry, strategy.exit বা strategy.order) );{{strategy.order.comment}}- অর্ডারের সম্পাদিত টীকা ফেরত দেয় ((অর্ডার তৈরির ফাংশন কলগুলির মধ্যে একটিতে মন্তব্য পরামিতিতে ব্যবহৃত স্ট্রিংঃstrategy.entry,strategy.exit、 অথবা strategy.order) ─ যদি কোন মন্তব্য না থাকে তবে strategy.order.id এর মান ব্যবহার করা হবে─{{strategy.order.alert_message}}- alert_message পরামিতির মান ফেরত দেয়, যা পলিসির পাইন কোডে ব্যবহার করা যেতে পারে যখন একটি ফাংশনকে কল করা হয় যা পরবর্তী আদেশের জন্য ব্যবহৃত হয়ঃ strategy.entry,strategy.exit│ অথবা strategy.order│ শুধুমাত্র পাইন v4-এ এই বৈশিষ্ট্যটি সমর্থিত।{{strategy.market_position}}- স্ট্রিং আকারে কৌশলটি ফেরত দেওয়ার জন্য বর্তমান হোল্ডিংঃ long, flat, অথবা short.{{strategy.market_position_size}}- বর্তমান পজিশনের আকারকে নিখুঁত মান (যেমন, অ-নেগেটিভ) হিসেবে ফেরত দেয়।{{strategy.prev_market_position}}- স্ট্রিং আকারে ফিরে আসা কৌশলটির পূর্ববর্তী হোল্ডিংঃ long, flat, অথবা short.{{strategy.prev_market_position_size}}- পূর্ববর্তী পজিশনের আকারকে নিখুঁত মান (যেমন, অ-নেগেটিভ) হিসেবে ফেরত দেয়।

২। "ট্রেডিং ভিউ সিগন্যাল এক্সিকিউশন পলিসি" এর সাথে মেসেজ তৈরি করুন

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

৩। ট্রেডিং ভিউকে এই PINE স্ক্রিপ্টটি চালানোর সময় সিগন্যাল দেওয়ার জন্য, ট্রেডিং ভিউতে এই স্ক্রিপ্টটি লোড করার সময় একটি অ্যালার্ম সেট করতে হবে

img

যখন ট্রেডিং ভিউতে PINE স্ক্রিপ্ট ট্রেডিং অ্যাকশন শুরু করে, তখন ওয়েবহুক url অনুরোধ পাঠানো হয়।

img

img

এফএমজেডের রিয়েল ডিস্ক এই সংকেতটি কার্যকর করবে।

img

img

ভিডিও ঠিকানা

সিগারেট ভিডিওঃhttps://www.ixigua.com/7172134169580372513?utm_source=xiguastudioবি স্টেশনঃhttps://www.bilibili.com/video/BV1BY411d7c6/জানা যায়ঃhttps://www.zhihu.com/zvideo/1581722694294487040

নিবন্ধের কোডটি কেবলমাত্র রেফারেন্সের জন্য এবং ব্যবহারের জন্য স্বয়ংক্রিয়ভাবে সামঞ্জস্য এবং প্রসারিত হতে পারে।


সম্পর্কিত

আরো

wbe3- ছোট টমেটোমঙ্গো, আমি কিভাবে এনালগ ডিস্ক পরিবেশ পরিচালনা করতে পারি?

গুওহুয়াপ্রশ্নঃ ট্রেডিংভিউ-এর সতর্কতা বার্তায় কি আগের অর্ডারের বার্তা অন্তর্ভুক্ত করা যাবে? আমি শেষ অর্ডারটি লাভজনক বা ক্ষতিগ্রস্থ কিনা তা পেতে চাই, যদি শেষ অর্ডারটি ক্ষতিগ্রস্থ হয় তবে রোবটটি অর্ডারটি শেষ না হওয়া পর্যন্ত অর্ডারটি শেষ করবে না। দয়া করে এটা করতে পারেন? ধন্যবাদ!

13811047519/upload/asset/2a5a9fa2b97561c42c027.jpg দয়া করে ভগবান, এই ত্রুটির অর্থ কী এবং কীভাবে এটি সরানো যায়?

ভালো অবস্থামনের কথা, আমি ৬-৭টি অ্যাকাউন্ট যোগ করেছি এই সিগন্যাল দিয়ে ট্রেড করার জন্য, কিন্তু সাময়িকভাবে বেশ বড়, একটি এক্সচেঞ্জ অ্যাকাউন্টের সিগন্যাল শেষ হওয়ার আগে পরবর্তী ট্রেডিং অ্যাকাউন্টের সিগন্যালটি সম্পন্ন হবে, এটি একটি সিরিয়াল এক্সিকিউশন, কি কোনও উপায় আছে যে একই সাথে সমান্তরালভাবে ট্রেডিং সিগন্যালটি কার্যকর করা যায়? আমি দেখতে পাচ্ছি যে এতে একটি ব্যবধানের সময় কনফিগারেশন রয়েছে, আমি জানি না এটিকে ০ সেকেন্ডে পরিবর্তন করা হয়েছে, এটি কি সমান্তরাল ট্রেডিং বাস্তবায়ন করতে পারে?

wbe3- ছোট টমেটোসিগন্যাল গ্রহণের নীতিতে, মুদ্রণ উপার্জন নেই এবং প্রকাশের নীতিটি উত্পন্ন হবে না বলে মনে হচ্ছে, তাই দয়া করে সম্পর্কিত অ্যাকাউন্ট তথ্য ফর্ম টেমপ্লেট যোগ করুন নীতি প্রদর্শন দেখুন

ছোট্ট স্বপ্নএটি একটি উন্মুক্ত নীতিমালা, যা পৃষ্ঠাটি স্বয়ংক্রিয়ভাবে যুক্ত করে।

wbe3- ছোট টমেটোধন্যবাদ মঙ্গো, আমি পরীক্ষা করেছি, কিন্তু ট্রেডিংয়ের পর কোন কৌশল নেই, আপনি কি নিজের মত যোগ করতে চান?

ছোট্ট স্বপ্নOKX ইন্টারফেস, যা OKX এর অ্যানালগ ডিস্ক পরীক্ষার পরিবেশে স্যুইচ করা যায়, exchange.IO (("simulate", true) ব্যবহার করে, যা অ্যানালগ ডিস্ক পরিবেশে স্যুইচ করা যায়।

গুওহুয়াধন্যবাদ উত্তর দেওয়ার জন্য, আমার দুটি প্রশ্ন আছেঃ ১, আমি কিছুটা অবাক হয়েছি যে fmz নিজেই পাইন স্ক্রিপ্ট লিখতে পারে, কেন এই নিবন্ধটি ট্রেডিং ভিউয়ের মাধ্যমে fmz কে সতর্কতা পাঠাতে হবে এবং তারপরে প্রক্রিয়া করতে হবে এবং তারপরে ট্রেড করতে হবে? ২। আমি এখন একটি কৌশল খুঁজে পেয়েছি যা নিজে থেকেই খুব ভাল, তবে সোর্স কোডটি ব্যবহারের অধিকার নেই, আমি আমার উপরের পদ্ধতিটি ব্যবহার করে ভুলগুলি এড়াতে চাই, আপনি যেভাবে বলেছেন তা আমি যুক্ত করেছি, তবে এই প্রচারটি সম্ভবত অর্ডার করার সময় মূল্য, আমি কিছুটা অজানা যে কীভাবে এই দামটি এফএমজে এর পিছনে লাভজনক বা ক্ষতিগ্রস্থ কিনা তা নির্ধারণ করতে হয়। আপনি যদি চেষ্টা করতে ইচ্ছুক হন তবে আমি অর্থ প্রদান করতে পারি, আমার ইমেল ঠিকানাটি গুওহোয়া@qq.com।

ছোট্ট স্বপ্নএটি বাস্তবায়নযোগ্য হওয়া উচিত, আপনি যখন বার্তাটি প্রেরণ করেন তখন আপনি {{strategy.order.price}} সামগ্রীটি প্রেরণ করতে পারেন, এবং তারপরে FMZ-এর কৌশলটি এই বার্তাটি প্রক্রিয়া করে, বর্তমান মূল্যের তুলনার ভিত্তিতে অর্ডার করার সিদ্ধান্ত নেয়।

ছোট্ট স্বপ্নএখন কি টেস্ট ঠিক আছে? আমি এখানে টেস্ট ঠিক আছে।

ভালো অবস্থাভাল, ধন্যবাদ বস।

ছোট্ট স্বপ্নএফএমজেড নতুন সমান্তরাল বৈশিষ্ট্য যুক্ত করেছে, এটি সমান্তরাল হতে পারে, তবে কৌশলগত কোডটি সম্ভবত আরও বড় পরিবর্তন হবে। সাম্প্রতিক সময়ে, যদি সময় থাকে তবে একটি সমান্তরাল উদাহরণ আপগ্রেড করুন।