एक और ट्रेडिंगव्यू सिग्नल निष्पादन रणनीति समाधान
जो व्यापारी ट्रेडिंगव्यू का अक्सर उपयोग करते हैं, वे जानते हैं कि ट्रेडिंगव्यू अन्य प्लेटफार्मों पर संदेश भेज सकता है। इससे पहले, TradingView सिग्नल पुश रणनीति को दस्तावेज़ लाइब्रेरी में प्रकाशित किया गया था। पुश किए गए संदेश की सामग्री अनुरोध URL में हार्ड-कोड की गई थी, जो कुछ हद तक अनम्य थी। इस लेख में, हम ट्रेडिंगव्यू सिग्नल निष्पादन रणनीति को एक अलग तरीके से पुनः डिज़ाइन करेंगे।
परिदृश्य और सिद्धांत
कुछ नौसिखिए छात्र इस लेख का शीर्षक और उपरोक्त विवरण देखकर भ्रमित हो सकते हैं, इससे कोई फर्क नहीं पड़ता! आइए सबसे पहले मांग परिदृश्य और सिद्धांतों को स्पष्ट करें। मैं तुम्हें बता दूँ कि मैं किस बारे में बात कर रहा हूँ। ठीक है, चलिए मुद्दे पर आते हैं।
-
मांग परिदृश्य:
इतनी सारी बातचीत के बाद, इस चीज़ का क्या करना है? सीधे शब्दों में कहें तो, हमारे पास कई संकेतक, रणनीतियां, कोड आदि हैं जिन्हें हम TradingView पर उपयोग करने के लिए चुन सकते हैं। इन्हें सीधे TradingView पर चलाया जा सकता है, और रेखाएँ खींची जा सकती हैं, गणना की जा सकती है, ट्रेडिंग सिग्नल दिखाए जा सकते हैं, आदि। इसके अलावा, ट्रेडिंगव्यू में विभिन्न संकेतकों की गणना को सुविधाजनक बनाने के लिए वास्तविक समय मूल्य डेटा और पर्याप्त के-लाइन डेटा उपलब्ध है। TradingView पर इन स्क्रिप्ट कोड को PINE भाषा कहा जाता है। TradingView पर वास्तविक ट्रेडिंग में एकमात्र असुविधा यही है। यद्यपि FMZ पर PINE भाषा पहले से ही समर्थित है, इसे वास्तविक समय में भी चलाया जा सकता है। हालांकि, ट्रेडिंग व्यू के कुछ ऐसे भी प्रशंसक हैं जो अभी भी ट्रेडिंग व्यू पर चार्ट द्वारा भेजे गए संकेतों के आधार पर ऑर्डर देने की उम्मीद करते हैं। इस मांग को भी FMZ द्वारा हल किया जा सकता है। इसलिए यह आलेख इस समाधान का विशिष्ट विवरण बताता है। -
सिद्धांत:
पूरी योजना में चार मुख्य निकाय शामिल हैं, जो संक्षेप में इस प्रकार हैं:
| क्रम संख्या | मुख्य भाग | वर्णन करना |
|---|---|---|
| 1 | ट्रेडिंग व्यू (चित्र में ट्रेडिंग व्यू) | ट्रेडिंगव्यू PINE स्क्रिप्ट चलाता है, जो सिग्नल भेज सकता है और FMZ के विस्तारित API इंटरफ़ेस तक पहुंच सकता है। |
| 2 | एफएमजेड प्लेटफॉर्म (चित्र में एफएमजेड प्लेटफॉर्म (वेबसाइट)) | वास्तविक बाजार का प्रबंधन करें, वास्तविक बाजार पृष्ठ पर इंटरैक्टिव निर्देश भेजें, और FMZ प्लेटफॉर्म को कस्टोडियन पर वास्तविक बाजार रणनीति कार्यक्रम के लिए इंटरैक्टिव निर्देश भेजने देने के लिए विस्तारित API इंटरफ़ेस का उपयोग करें |
| 3 | होस्टिंग सॉफ्टवेयर पर वास्तविक कार्यक्रम (चित्र में FMZ रणनीति रोबोट) | वास्तविक प्रोग्राम जो TradingView सिग्नल निष्पादन रणनीति को निष्पादित करता है |
| 4 | एक्सचेंज (चित्र में एक्सचेंज) | वास्तविक बाजार पर कॉन्फ़िगर किया गया एक्सचेंज, वह एक्सचेंज जिस पर कस्टोडियन पर वास्तविक बाजार कार्यक्रम सीधे ऑर्डर देने का अनुरोध भेजता है |
इसलिए यदि आप इस तरह खेलना चाहते हैं, तो आपको निम्नलिखित तैयारियां करनी होंगी:
- TradingView पर चलने वाली स्क्रिप्ट FMZ के विस्तारित API इंटरफ़ेस को सिग्नल अनुरोध भेजने के लिए जिम्मेदार है। TradingView खाते को कम से कम PRO सदस्य होना चाहिए।
- FMZ पर एक कस्टोडियन प्रोग्राम तैनात करें, जिसे एक्सचेंज इंटरफ़ेस (जैसे सिंगापुर, जापान, हांगकांग, आदि में सर्वर) तक पहुंचने में सक्षम होना चाहिए।
- जब TradingView सिग्नल भेजा जाता है तो FMZ पर एक्सचेंज की API KEY को संचालित करने (ऑर्डर देने) के लिए कॉन्फ़िगर करें।
- आपके पास एक "ट्रेडिंगव्यू सिग्नल निष्पादन रणनीति" होनी चाहिए, जिसके बारे में यह लेख मुख्य रूप से बात करता है।
ट्रेडिंगव्यू सिग्नल निष्पादन रणनीति
"ट्रेडिंगव्यू सिग्नल निष्पादन रणनीति" के पिछले संस्करण को लचीला बनाने के लिए डिज़ाइन नहीं किया गया था, और संदेश को केवल ट्रेडिंगव्यू द्वारा भेजे गए अनुरोध के URL में ही हार्ड-कोड किया जा सकता था। यदि हम चाहते हैं कि TradingView संदेश भेजते समय Body में कुछ परिवर्तनशील जानकारी लिखे, तो इस समय हम कुछ नहीं कर सकते। उदाहरण के लिए, TradingView पर संदेश सामग्री इस प्रकार दिखती है:
फिर TradingView को चित्र में दिखाए अनुसार सेट किया जा सकता है, अनुरोध बॉडी में संदेश लिखकर उसे FMZ के विस्तारित API इंटरफ़ेस पर भेजा जा सकता है। तो फिर आप FMZ के इस विस्तारित API इंटरफ़ेस को क्या कहेंगे?
FMZ के विस्तारित API इंटरफेस की श्रृंखला में, हम उपयोग करने जा रहे हैंCommandRobotइस इंटरफ़ेस को आमतौर पर इस तरह कहा जाता है:
https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"ok12345"]
यह अनुरोध यू.आर.एल.queryमेंaccess_keyऔरsecret_keyयह FMZ प्लेटफॉर्म का विस्तार हैAPI KEY, यहाँ हम प्रदर्शित करते हैं इसलिए इसे सेट करेंxxxऔरyyyy. यह कुंजी कैसे बनाएं? इस पृष्ठ पर:https://www.fmz.com/m/accountबस एक बनाएं, इसे ठीक से रखें और इसे कभी भी उजागर न करें।
विषय पर वापस आते हैं, चलिए जारी रखते हैंCommandRobotइंटरफ़ेस समस्या. यदि आपको पहुँच की आवश्यकता हैCommandRobotइंटरफ़ेस, अनुरोध मेंmethodबस इसे इस पर सेट करें:CommandRobot。CommandRobotइस इंटरफ़ेस का कार्य FMZ प्लेटफ़ॉर्म के माध्यम से एक निश्चित आईडी की वास्तविक डिस्क पर एक इंटरैक्टिव संदेश भेजना है, इसलिए पैरामीटरargsअनुरोध की सामग्री वास्तविक आईडी और संदेश है। उपरोक्त अनुरोध URL उदाहरण आईडी को अनुरोध भेजने के लिए है186515वास्तविक कार्यक्रम, संदेश भेजेंok12345。
पहले, इस विधि का उपयोग FMZ एक्सटेंशन API के CommandRobot इंटरफ़ेस का अनुरोध करने के लिए किया जाता था। संदेश को केवल हार्डकोड किया जा सकता था, जैसा कि ऊपर दिए गए उदाहरण में है।ok12345. यदि संदेश अनुरोध बॉडी में है, तो दूसरी विधि की आवश्यकता है:
https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[130350,+""]
इस तरह, अनुरोध FMZ प्लेटफ़ॉर्म के माध्यम से भेजा जा सकता है, और अनुरोध निकाय की सामग्री आईडी वाले उपयोगकर्ता को एक इंटरैक्टिव संदेश के रूप में भेजी जाती है130350वास्तविक सौदा। यदि TradingView पर संदेश इस पर सेट है:{"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 पर सेट करने का मतलब है कि यह सिग्नल पहले जोड़े गए एक्सचेंज ऑब्जेक्ट के अनुरूप एक्सचेंज अकाउंट को संचालित करेगा। यदि स्पॉट अनुबंध को संचालित किया जाना है, तो ContractType को स्पॉट पर सेट करें; वायदा के लिए, विशिष्ट अनुबंध लिखें, उदाहरण के लिए, सतत अनुबंधों के लिए स्वैप लिखें। बाजार आदेश मूल्य के लिए, बस -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)
}
}
}
रणनीति पैरामीटर और अंतःक्रियाएँ:
「ट्रेडिंगव्यू सिग्नल निष्पादन रणनीति」पूर्ण रणनीति पता: https://www.fmz.com/strategy/392048
सरल परीक्षण
रणनीति चलाने से पहले, आपको एक्सचेंज ऑब्जेक्ट को कॉन्फ़िगर करना होगा और रणनीति मापदंडों में दो पैरामीटर "FMZ प्लेटफ़ॉर्म की एक्सेसकी" और "FMZ प्लेटफ़ॉर्म की सीक्रेटकी" सेट करनी होगी। सुनिश्चित करें कि आप उन्हें गलत तरीके से सेट न करें। इसे चलाने पर पता चलता है:
निम्नलिखित को क्रम से मुद्रित किया जाएगा: वेबहुक पता जिसे ट्रेडिंगव्यू पर भरना होगा, समर्थित कार्रवाई निर्देश, और संदेश प्रारूप। महत्वपूर्ण बात है वेबहुक पता:
https://www.fmz.com/api/v1?access_key=22903bab96b26584dc5a22522984df42&secret_key=73f8ba01014023117cbd30cb9d849bfc&method=CommandRobot&args=[505628,+""]
बस इसे कॉपी और पेस्ट करें और इसे TradingView पर संबंधित स्थिति में लिखें।
यदि आप TradingView को सिग्नल भेजने का अनुकरण करना चाहते हैं, तो आप रणनीति इंटरैक्शन पर TestSignal बटन पर क्लिक कर सकते हैं:
यह रणनीति स्वयं एक अनुरोध भेजेगी (ट्रेडिंगव्यू द्वारा सिग्नल अनुरोध भेजने का अनुकरण करते हुए), FMZ विस्तारित API इंटरफ़ेस को कॉल करेगी, तथा रणनीति को स्वयं एक संदेश भेजेगी:
{"Flag":"45M103Buy","Exchange":1,"Currency":"BTC_USDT","ContractType":"swap","Price":"16000","Action":"buy","Amount":"1"}
वर्तमान रणनीति एक अन्य इंटरैक्टिव संदेश प्राप्त करेगी और कार्यान्वित होगी:
और ऑर्डर दें.
वास्तविक दुनिया के परिदृश्यों में TradingView का उपयोग करके परीक्षण करना
TradingView परीक्षण का उपयोग करने के लिए, आपको एक प्रो-लेवल 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)
- जब स्क्रिप्ट कोई आदेश निर्देश जारी करती है तो PINE स्क्रिप्ट कुछ जानकारी संलग्न कर सकती है
निम्नलिखित प्लेसहोल्डर हैं। उदाहरण के लिए, मैंने अलार्म में "संदेश" बॉक्स में लिखा:{{strategy.order.contracts}}, फिर जब कोई ऑर्डर ट्रिगर होता है, तो एक संदेश भेजा जाएगा (अलार्म, ईमेल पुश, वेबहुक यूआरएल अनुरोध, पॉप-अप विंडो, आदि पर सेटिंग्स के आधार पर), और संदेश में इस समय निष्पादित ऑर्डर की मात्रा शामिल होगी। समय।
{{strategy.position_size}} - पाइन में समान कीवर्ड का मान लौटाता है, जो वर्तमान स्थिति का आकार है।
{{strategy.order.action}} - निष्पादित ऑर्डर के लिए "खरीदें" या "बेचें" स्ट्रिंग लौटाता है।
{{strategy.order.contracts}} - निष्पादित ऑर्डर के लिए अनुबंधों की संख्या लौटाता है।
{{strategy.order.price}} - वह मूल्य लौटाता है जिस पर ऑर्डर निष्पादित किया गया था।
{{strategy.order.id}} - निष्पादित ऑर्डर की आईडी लौटाता है (ऑर्डर उत्पन्न करने वाले फ़ंक्शन कॉल में से किसी एक में प्रथम तर्क के रूप में प्रयुक्त स्ट्रिंग: रणनीति.प्रविष्टि, रणनीति.निकास या रणनीति.ऑर्डर)।
{{strategy.order.comment}} - निष्पादित ऑर्डर की टिप्पणी लौटाता है (ऑर्डर उत्पन्न करने वाले फ़ंक्शन कॉल में से किसी एक में टिप्पणी पैरामीटर में प्रयुक्त स्ट्रिंग: रणनीति.प्रविष्टि, रणनीति.निकास, या रणनीति.ऑर्डर)। यदि कोई एनोटेशन निर्दिष्ट नहीं किया गया है, तो strategies.order.id का मान उपयोग किया जाएगा।
{{strategy.order.alert_message}} - alert_message पैरामीटर का मान लौटाता है, जिसका उपयोग रणनीति के पाइन कोड में ऑर्डर देने के लिए किसी एक फ़ंक्शन को कॉल करते समय किया जा सकता है: strategies.entry, strategies.exit, या strategies.order. यह सुविधा केवल पाइन v4 में समर्थित है।
{{strategy.market_position}} - रणनीति की वर्तमान स्थिति को एक स्ट्रिंग के रूप में लौटाता है: "लंबा", "सपाट", या "छोटा"।
{{strategy.market_position_size}} - वर्तमान स्थिति का आकार निरपेक्ष मान (अर्थात गैर-ऋणात्मक संख्या) के रूप में लौटाता है।
{{strategy.prev_market_position}} - रणनीति की अंतिम स्थिति को एक स्ट्रिंग के रूप में लौटाता है: "लंबा", "सपाट", या "छोटा"।
{{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 स्क्रिप्ट चल रही हो तो TradingView को सिग्नल उत्सर्जित करने दें। TradingView पर इस स्क्रिप्ट को लोड करते समय आपको अलार्म सेट करना होगा
जब TradingView पर PINE स्क्रिप्ट किसी ट्रेडिंग क्रिया को ट्रिगर करती है, तो एक वेबहुक URL अनुरोध भेजा जाता है।
FMZ का वास्तविक व्यापार इस संकेत को निष्पादित करेगा।
वीडियो यूआरएल
ज़िगुआ वीडियो: https://www.ixigua.com/7172134169580372513?utm_source=xiguastudio
स्टेशन बी:
झिहु: https://www.zhihu.com/zvideo/1581722694294487040
लेख में दिए गए कोड केवल संदर्भ के लिए हैं। आप उन्हें वास्तविक उपयोग के लिए समायोजित और विस्तारित कर सकते हैं।
请教一个问题,tradingview的警报消息能包含上一个订单的消息吗?
我想获取上一个订单是盈利还是亏损,如果上一个订单是亏损则机器人不执行下单操作,直到获取的上一个订单是盈利状态才执行下单操作
请问能做到吗?感谢!
应该可以实现,你可以在推送消息的时候推送{{strategy.order.price}} 内容,然后FMZ上的策略处理这个信息,根据当前价格对比,是否决定下单。
感谢回复,我有两个问题需要请教:
1、我有点没明白的是fmz自己本身就能编写pine脚本,为什么本文还要通过TradingView发送警报到fmz然后再处理然后交易?
2、我现在找到一个本身就很不错的策略,不过没有源码有使用权,我想通过我上面说的方法规避连错,您说的在推送消息里增加{{strategy.order.price}} 我也添加了,但是这个推送的貌似是下单时的价格,后面在fmz里面如何通过这个价钱来判断上一单是盈利还是亏损,我有点不明白。您这边要是愿意帮忙调试,我可以付费,我的邮箱是[email protected]
- 1















