Type/to search
8
Follow
1363
Followers
ایک اور TradingView سگنل پر عمل درآمد کی حکمت عملی کا حل
Discussions
Created 2022-11-30 10:52:07  Updated 2025-05-16 16:18:13
 17
 4890

img

ایک اور TradingView سگنل پر عمل درآمد کی حکمت عملی کا حل

وہ تاجر جو اکثر TradingView استعمال کرتے ہیں وہ جانتے ہیں کہ TradingView پیغامات کو دوسرے پلیٹ فارمز تک پہنچا سکتا ہے۔ اس سے پہلے، ایک TradingView سگنل پش حکمت عملی دستاویز کی لائبریری میں شائع کی گئی تھی۔ اس آرٹیکل میں، ہم ٹریڈنگ ویو سگنل پر عمل درآمد کی حکمت عملی کو مختلف انداز میں دوبارہ ڈیزائن کریں گے۔

منظرنامے اور اصول

اس مضمون کا عنوان اور اوپر دی گئی تفصیل کو دیکھ کر کچھ نوآموز طلباء الجھن میں پڑ سکتے ہیں، اس سے کوئی فرق نہیں پڑتا! آئیے سب سے پہلے مطالبہ کے منظرناموں اور اصولوں کو واضح کرتے ہیں۔ آپ کو بتائیں کہ میں کس کے بارے میں بات کر رہا ہوں۔ ٹھیک ہے، آئیے بات کی طرف آتے ہیں۔

  1. مطالبہ کا منظرنامہ:
    اس ساری گفتگو کے بعد اس چیز کا کیا کرنا ہے؟ سیدھے الفاظ میں، ہمارے پاس بہت سے اشارے، حکمت عملی، کوڈز، وغیرہ ہیں جنہیں ہم TradingView پر استعمال کرنے کا انتخاب کر سکتے ہیں، یہ براہ راست TradingView پر چلائے جا سکتے ہیں، اور لائنیں کھینچ سکتے ہیں، حساب لگا سکتے ہیں، تجارتی سگنل وغیرہ دکھا سکتے ہیں۔ اس کے علاوہ، ٹریڈنگ ویو کے پاس ریئل ٹائم پرائس ڈیٹا اور کافی K-line ڈیٹا ہے تاکہ مختلف اشاریوں کے حساب کتاب کو آسان بنایا جا سکے۔ ٹریڈنگ ویو پر اسکرپٹ کوڈز کو PINE لینگویج کہا جاتا ہے۔ اگرچہ PINE زبان پہلے سے ہی FMZ پر تعاون یافتہ ہے، لیکن اسے حقیقی وقت میں بھی چلایا جا سکتا ہے۔ تاہم، ٹریڈنگ ویو کے ڈائی ہارڈ پرستار بھی ہیں جو اب بھی ٹریڈنگ ویو پر چارٹس کی طرف سے بھیجے گئے سگنلز کی بنیاد پر آرڈر دینے کی امید رکھتے ہیں۔ تو یہ مضمون اس حل کی مخصوص تفصیلات بتاتا ہے۔

  2. اصول:

img

پورے منصوبے میں چار اہم ادارے شامل ہیں، جو مختصراً یہ ہیں:

سیریل نمبرمرکزی جسمبیان کریں
1TradingView (تصویر میں تجارتی منظر)TradingView PINE اسکرپٹ چلاتا ہے، جو سگنل بھیج سکتا ہے اور FMZ کے توسیعی API انٹرفیس تک رسائی حاصل کر سکتا ہے۔
2ایف ایم زیڈ پلیٹ فارم (تصویر میں ایف ایم زیڈ پلیٹ فارم (ویب سائٹ))حقیقی مارکیٹ کا نظم کریں، حقیقی مارکیٹ کے صفحہ پر انٹرایکٹو ہدایات بھیجیں، اور ایف ایم زیڈ پلیٹ فارم کو کسٹوڈین پر حقیقی مارکیٹ حکمت عملی پروگرام کو انٹرایکٹو ہدایات بھیجنے کے لیے توسیعی API انٹرفیس کا بھی استعمال کریں۔
3ہوسٹنگ سافٹ ویئر پر حقیقی پروگرام (تصویر میں FMZ حکمت عملی روبوٹ)اصل پروگرام جو TradingView سگنل پر عمل درآمد کی حکمت عملی کو انجام دیتا ہے۔
4تبادلہ (تصویر میں تبادلہ)ریئل مارکیٹ پر ترتیب شدہ ایکسچینج، وہ ایکسچینج جس کو کسٹوڈین پر حقیقی مارکیٹ پروگرام براہ راست آرڈر دینے کی درخواست بھیجتا ہے

لہذا اگر آپ اس طرح کھیلنا چاہتے ہیں تو آپ کو درج ذیل تیاریوں کی ضرورت ہے:

  1. TradingView پر چلنے والی اسکرپٹ FMZ کے توسیعی API انٹرفیس کو سگنل کی درخواستیں بھیجنے کے لیے ذمہ دار ہے TradingView اکاؤنٹ کا کم از کم ایک PRO ممبر ہونا ضروری ہے۔
  2. FMZ پر ایک نگہبان پروگرام تعینات کریں، جس کے لیے ایکسچینج انٹرفیس تک رسائی حاصل کرنے کے قابل ہونا ضروری ہے (جیسے کہ سنگاپور، جاپان، ہانگ کانگ وغیرہ میں سرورز)۔
  3. ٹریڈنگ ویو سگنل بھیجے جانے پر کام کرنے (آرڈر کرنے) کے لیے FMZ پر ایکسچینج کی API KEY کو ترتیب دیں۔
  4. آپ کے پاس "TradingView سگنل پر عمل درآمد کی حکمت عملی" کی ضرورت ہے، جس کے بارے میں یہ مضمون بنیادی طور پر بات کرتا ہے۔

ٹریڈنگ ویو سگنل پر عمل درآمد کی حکمت عملی

"TradingView Signal Execution Strategy" کا پچھلا ورژن لچکدار ہونے کے لیے ڈیزائن نہیں کیا گیا تھا، اور پیغام کو TradingView کے ذریعے بھیجی گئی درخواست کے URL میں ہی سخت کوڈ کیا جا سکتا ہے۔ اگر ہم چاہتے ہیں کہ TradingView پیغام کو آگے بڑھاتے وقت باڈی میں کچھ متغیر معلومات لکھے، تو اس وقت ہم کچھ نہیں کر سکتے۔ مثال کے طور پر، TradingView پر پیغام کا مواد اس طرح لگتا ہے:

img

پھر 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. اس KEY کو کیسے بنایا جائے؟ اس صفحہ پر:https://www.fmz.com/m/account، صرف ایک بنائیں، اسے صحیح طریقے سے رکھیں اور اسے کبھی ظاہر نہ کریں۔

img

موضوع پر واپس، چلیں جاری رکھیںCommandRobotانٹرفیس کا مسئلہ۔ اگر آپ کو رسائی کی ضرورت ہے۔CommandRobotانٹرفیس، درخواست میںmethodبس اسے سیٹ کریں:CommandRobotCommandRobotاس انٹرفیس کا کام ایف ایم زیڈ پلیٹ فارم کے ذریعے کسی مخصوص ID کی حقیقی ڈسک پر ایک انٹرایکٹو پیغام بھیجنا ہے، لہذا پیرامیٹرزargsدرخواست کا مواد اصلی ID اور پیغام ہے مندرجہ بالا درخواست یو آر ایل کی مثال ID کو درخواست بھیجنا ہے۔186515حقیقی پروگرام، پیغام بھیجیں۔ok12345

پہلے، یہ طریقہ FMZ ایکسٹینشن API کے کمانڈروبوٹ انٹرفیس کی درخواست کرنے کے لیے استعمال کیا جاتا تھا، جیسا کہ اوپر کی مثال میں پیغام کو صرف ہارڈ کوڈ کیا جا سکتا ہے۔ok12345. اگر پیغام درخواست کے باڈی میں ہے تو، ایک اور طریقہ کی ضرورت ہے:

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

اس طرح، درخواست کو FMZ پلیٹ فارم کے ذریعے بھیجا جا سکتا ہے، اور درخواست کے باڈی کا مواد ID کے ساتھ صارف کو ایک انٹرایکٹو پیغام کے طور پر بھیجا جاتا ہے۔130350اصل سودا۔ اگر TradingView پر پیغام اس پر سیٹ ہے:{"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", // 交易量 }

حکمت عملی کو ملٹی ایکسچینج آرکیٹیکچر کے طور پر ڈیزائن کیا گیا ہے، لہذا اس حکمت عملی پر متعدد ایکسچینج اشیاء کو ترتیب دیا جا سکتا ہے، جس کا مطلب ہے کہ متعدد مختلف اکاؤنٹس کے آرڈر آپریشنز کو کنٹرول کیا جا سکتا ہے۔ صرف ایکسچینج کو چلانے کے لیے سگنل ڈھانچہ میں استعمال کریں اسے 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) } } }

حکمت عملی کے پیرامیٹرز اور تعاملات:

img

「TradingView سگنل پر عمل درآمد کی حکمت عملی」مکمل حکمت عملی کا پتہ: https://www.fmz.com/strategy/392048

سادہ ٹیسٹ

حکمت عملی کو چلانے سے پہلے، آپ کو ایکسچینج آبجیکٹ کو ترتیب دینا ہوگا اور حکمت عملی کے پیرامیٹرز میں دو پیرامیٹرز "FMZ پلیٹ فارم کی ایکسیس کی" اور "SecretKey of FMZ پلیٹ فارم" کو سیٹ کرنا ہوگا۔ اسے چلانے سے ظاہر ہوتا ہے:

img

درج ذیل کو ترتیب کے ساتھ پرنٹ کیا جائے گا: WebHook ایڈریس جسے TradingView پر بھرنے کی ضرورت ہے، معاون کارروائی کی ہدایات، اور پیغام کی شکل۔ اہم چیز WebHook ایڈریس ہے:

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

بس اسے کاپی اور پیسٹ کریں اور TradingView پر متعلقہ پوزیشن میں لکھیں۔

اگر آپ TradingView کو سگنل بھیجنے کی نقل کرنا چاہتے ہیں، تو آپ حکمت عملی کے تعامل پر TestSignal بٹن پر کلک کر سکتے ہیں:

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}}، پھر جب کوئی آرڈر ٹرگر ہوتا ہے تو، ایک پیغام بھیجا جائے گا (الارم پر سیٹنگز، ای میل پش، ویب ہک یو آر ایل کی درخواست، پاپ اپ ونڈو وغیرہ کی بنیاد پر)، اور پیغام میں اس پر عمل درآمد کرنے والے آرڈر کی مقدار شامل ہوگی۔ وقت

{{strategy.position_size}} - پائن میں اسی مطلوبہ الفاظ کی قدر لوٹاتا ہے، جو موجودہ پوزیشن کا سائز ہے۔
{{strategy.order.action}} - ایک عملدرآمد آرڈر کے لیے "خرید" یا "فروخت" کی تار لوٹاتا ہے۔
{{strategy.order.contracts}} - عملدرآمد آرڈر کے لیے معاہدوں کی تعداد لوٹاتا ہے۔
{{strategy.order.price}} - وہ قیمت لوٹاتا ہے جس پر آرڈر پر عمل کیا گیا تھا۔
{{strategy.order.id}} - پھانسی شدہ آرڈر کی 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۔ یہ خصوصیت صرف Pine v4 میں تعاون یافتہ ہے۔
{{strategy.market_position}} - حکمت عملی کی موجودہ پوزیشن کو سٹرنگ کے طور پر لوٹاتا ہے: "لمبا"، "فلیٹ" یا "مختصر"۔
{{strategy.market_position_size}} - موجودہ پوزیشن کا سائز بطور مطلق قدر لوٹاتا ہے (یعنی غیر منفی نمبر)۔
{{strategy.prev_market_position}} - حکمت عملی کی آخری پوزیشن کو سٹرنگ کے طور پر لوٹاتا ہے: "لمبا"، "فلیٹ" یا "مختصر"۔
{{strategy.prev_market_position_size}} - پچھلی پوزیشن کا سائز بطور مطلق قدر (یعنی غیر منفی نمبر) لوٹاتا ہے۔

  1. پیغامات کی تعمیر کے لیے "TradingView Signal Execution Strategy" کو یکجا کریں۔
{ "Flag":"{{strategy.order.id}}", "Exchange":1, "Currency":"BTC_USDT", "ContractType":"swap", "Price":"-1", "Action":"{{strategy.order.comment}}", "Amount":"{{strategy.order.contracts}}" }
  1. جب یہ PINE اسکرپٹ چل رہا ہو تو TradingView کو سگنل خارج کرنے دیں جب آپ TradingView پر اس اسکرپٹ کو لوڈ کرتے وقت ایک الارم سیٹ کریں۔

img

جب TradingView پر PINE اسکرپٹ ٹریڈنگ ایکشن کو متحرک کرتا ہے، تو ویب ہُک یو آر ایل کی درخواست بھیجی جاتی ہے۔

img

img

FMZ کی حقیقی تجارت اس سگنل پر عمل کرے گی۔

img

img

ویڈیو URL

Xigua ویڈیو: https://www.ixigua.com/7172134169580372513?utm_source=xiguastudio
اسٹیشن بی:

Zhihu: https://www.zhihu.com/zvideo/1581722694294487040

مضمون میں موجود کوڈز صرف حوالہ کے لیے ہیں آپ ان کو درست استعمال کے لیے بڑھا سکتے ہیں۔

Comment
All comments (17)

    img

    2 years ago

    删掉交互结构消息中的中文试下。

    2 years ago

    梦哥,这个运行起来有错误

    2 years ago

    把消息中的中文删掉试下。

    2 years ago

    梦哥,如何运行模拟盘环境操作呢?想先测试一下信号准确率

    3 years ago

    OKX接口,可以切换至OKX的模拟盘测试环境,使用exchange.IO("simulate", true),即可切换为模拟盘环境。

    3 years ago

    谢谢梦哥,已经测试好了,但是交易后没有策略评分概览,是不是需要自主添加

    3 years ago

    那个是公开策略围观,页面自动增加的。

    3 years ago

    接收信号的策略里,好像没有打印收益,公开好像也不会生成,所以想请教一下有相关的账户信息表格模版添加查看策略表现吗

    3 years ago

    请教一个问题,tradingview的警报消息能包含上一个订单的消息吗?
    我想获取上一个订单是盈利还是亏损,如果上一个订单是亏损则机器人不执行下单操作,直到获取的上一个订单是盈利状态才执行下单操作
    请问能做到吗?感谢!

    3 years ago

    应该可以实现,你可以在推送消息的时候推送{{strategy.order.price}} 内容,然后FMZ上的策略处理这个信息,根据当前价格对比,是否决定下单。

    3 years ago

    感谢回复,我有两个问题需要请教:
    1、我有点没明白的是fmz自己本身就能编写pine脚本,为什么本文还要通过TradingView发送警报到fmz然后再处理然后交易?
    2、我现在找到一个本身就很不错的策略,不过没有源码有使用权,我想通过我上面说的方法规避连错,您说的在推送消息里增加{{strategy.order.price}} 我也添加了,但是这个推送的貌似是下单时的价格,后面在fmz里面如何通过这个价钱来判断上一单是盈利还是亏损,我有点不明白。您这边要是愿意帮忙调试,我可以付费,我的邮箱是[email protected]

    3 years ago

    梦大,我加了6 7个账号用这个做信号交易,但是暂时挺大,一个交易所账号信号完成才会进行下个交易账号的信号,是串行的执行,有办法让同时并行执行交易信号吗? 我看里面有个间隔时间的配置,不知道改成0秒,是不是就能实现并行交易了?

    3 years ago

    FMZ新增了并发功能,应该是可以改成并发的,不过策略代码可能改动会比较大。最近如果有时间,升级一个并发的例子。

    3 years ago

    好的 感谢老板

    3 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)