ٹریڈنگ ویو کو اکثر استعمال کرنے والے تاجر جانتے ہیں کہ ٹریڈنگ ویو پیغامات کو دوسرے پلیٹ فارمز میں آگے بڑھا سکتا ہے۔ ایف ایم زیڈ پلیٹ فارم کے ہمارے
اس مضمون کے عنوان اور مذکورہ بالا تفصیل سے کچھ ناواقف لوگ الجھن میں پڑ سکتے ہیں ، اس سے کوئی فرق نہیں پڑتا ہے۔ آئیے مطالبہ کے منظرناموں اور اصولوں کی واضح وضاحت سے شروع کریں۔ ٹھیک ہے ، آئیے یہاں موضوع پر جائیں۔
طلب کے منظرنامے: لہذا ہم چاہتے ہیں کہ یہ کس طرح کا کام کرے؟ اسے آسان طریقے سے بیان کرنے کے ل we ، ہمارے پاس بہت سارے اشارے ، حکمت عملی ، کوڈز وغیرہ ہیں جن کا استعمال ہم ٹریڈنگ ویو پر کرسکتے ہیں ، جو براہ راست ٹریڈنگ ویو پر لائنیں کھینچنے ، حساب کتاب کرنے اور تجارتی سگنل ظاہر کرنے کے لئے چلائے جاسکتے ہیں۔ اس کے علاوہ ، ٹریڈنگ ویو میں حقیقی وقت کی قیمت کے اعداد و شمار اور مختلف اشارے کے حساب کتاب میں سہولت فراہم کرنے کے لئے کافی ک-لائن ڈیٹا موجود ہے۔ ٹریڈنگ ویو پر ان اسکرپٹ کوڈز کو پائن زبان کہا جاتا ہے۔ صرف ایک چیز جو آسان نہیں ہے وہ یہ ہے کہ ٹریڈنگ ویو پر حقیقی بوٹ ٹریڈنگ ہے۔ اگرچہ ایف ایم زیڈ پر پائن زبان کی حمایت کی جاتی ہے ، لیکن اسے حقیقی بوٹ ٹریڈنگ کے لئے بھی استعمال کیا جاسکتا ہے۔ تاہم ، کچھ ٹریڈنگ ویو شائقین ہیں جو ابھی بھی ٹریڈنگ ویو پر چارٹس سے سگنل کا استعمال کرتے ہوئے آرڈر دینا چاہتے ہیں ، لہذا اس کو ایف ایم زیڈ کے ذریعہ حل کیا جاسکتا ہے۔ لہذا اس مضمون میں ، ہم حل کی تفصیلات کی وضاحت کریں گے۔
اصول:
پورے نظام میں چار موضوعات شامل ہیں، جو مختصر طور پر مندرجہ ذیل ہیں:
لہذا اگر آپ اسے ان طریقوں سے استعمال کرنا چاہتے ہیں، تو آپ کو ان تیاریوں کی ضرورت ہے:
پچھلے ورژن میں
پھر ٹریڈنگ ویو کو ترتیب دیا جاسکتا ہے جیسا کہ شبیہہ میں دکھایا گیا ہے تاکہ پیغام کو درخواست باڈی میں لکھیں اور اسے ایف ایم زیڈ کے توسیعی API انٹرفیس پر بھیجیں۔ ایف ایم زیڈ کے توسیعی API انٹرفیس کو کیسے کال کریں؟
FMZ کے توسیع API انٹرفیس کی ایک سیریز میں، ہم استعمال کرنے کی ضرورت ہےCommandRobot
انٹرفیس، جسے عام طور پر مندرجہ ذیل کہا جاتا ہے:
https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"ok12345"]
کےaccess_key
اورsecret_key
میںquery
اس درخواست کا یو آر ایل توسیع شدہ ہےAPI KEY
FMZ پلیٹ فارم کے، یہاں ڈیمو سیٹ کرنے کے لئےxxx
اورyyyy
. پھر کس طرح اس کلید تخلیق کرنے کے لئے؟ اس صفحے میں:https://www.fmz.com/m/account
، اس پر تخلیق کریں، اسے مناسب طریقے سے رکھیں، اسے ظاہر نہ کریں.
واپس نقطہ پر، کی انٹرفیس مسئلہ کے بارے میں بات کرنے کے لئے جاری رکھیںCommandRobot
. اگر آپ کو رسائی کی ضرورت ہےCommandRobot
انٹرفیس،method
درخواست میں مقرر کیا جائے گا:CommandRobot
.CommandRobot
انٹرفیس FMZ پلیٹ فارم کے ذریعے ایک ID کے ساتھ ایک حقیقی بوٹ کو ایک انٹرایکٹو پیغام بھیجنے کے لئے ہے، تو پیرامیٹرargs
اصل بوٹ ID اور پیغام پر مشتمل ہے. مندرجہ بالا درخواست یو آر ایل مثال پیغام بھیجنے کے لئے ہےok12345
ایک حقیقی بوٹ پروگرام کے لئے ایک ID کے ساتھ 186515
اس سے قبل ، یہ طریقہ ایف ایم زیڈ توسیع شدہ اے پی آئی کے کمانڈ روبوٹ انٹرفیس سے درخواست کرنے کے لئے استعمال کیا جاتا تھا۔ پیغامات صرف مذکورہ بالا مثال میں لکھے جاسکتے ہیں ، جیسےok12345
. اگر پیغام مطلوبہ ادارے میں ہے تو، آپ کو ایک اور طریقہ استعمال کرنے کی ضرورت ہے:
https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[130350,+""]
اس طرح کی درخواست کی درخواست میں جسم کے مواد کو ایک انٹرایکٹو پیغام کے طور پر آئی ڈی کے ساتھ حقیقی بوٹ کو بھیج سکتے ہیں130350
ایف ایم زیڈ پلیٹ فارم کے ذریعے۔ اگر ٹریڈنگ ویو پر پیغام کو:{"close": {{close}}, "name": "aaa"}
، پھر اصلی روبوٹ ID کے ساتھ130350
انٹرایکٹو ہدایات حاصل کریں گے:{"close": 39773.75, "name": "aaa"}
تاکہ
{
Flag: "45M103Buy", // Marker, which can be specified at will
Exchange: 1, // Specify exchange trading pairs
Currency: "BTC_USDT", // Trading pair
ContractType: "swap", // Contract type, swap, quarter, next_quarter, fill in spot for spot
Price: "{{close}}", // Opening position or closing position price, -1 is the market price
Action: "buy", // Transaction type [buy: spot buying, sell: spot selling, long: go long futures, short: go short futures, closesell: buy futures and close short positions, close buy: sell futures and close long positions]
Amount: "0", // Transaction amount
}
یہ حکمت عملی ایک ملٹی ایکسچینج فن تعمیر کے طور پر ڈیزائن کی گئی ہے ، لہذا اس حکمت عملی پر متعدد ایکسچینج اشیاء کو تشکیل دیا جاسکتا ہے ، یعنی متعدد مختلف اکاؤنٹس کی آرڈر رکھنے کی کارروائی کو کنٹرول کیا جاسکتا ہے۔ سگنل کی ساخت میں صرف ایکسچینج ہی اس تبادلے کی وضاحت کرتا ہے جس کا آپریشن کیا جائے۔ ترتیب 1 اس سگنل کو اس تبادلے کے اکاؤنٹ کو چلانے کے قابل بنانا ہے جو پہلے شامل کردہ ایکسچینج آبجیکٹ کے مطابق ہے۔ اگر اسپاٹ کنٹریکٹ ٹائپ کو اسپاٹ پر مقرر کیا جاتا ہے تو ، فیوچر مخصوص معاہدے لکھیں گے ، جیسے ، مستقل معاہدوں کے لئے تبادلہ کریں۔ مارکیٹ کی قیمت کی فہرست -1 میں منتقل ہوسکتی ہے۔ فیوچر ، اسپاٹ ، افتتاحی اور اختتامی پوزیشنوں کے لئے ایکشن کی ترتیبات مختلف ہیں ، اور اسے غلط طریقے سے ترتیب نہیں دیا جاسکتا ہے۔
اگلا، آپ حکمت عملی کا کوڈ ڈیزائن کر سکتے ہیں۔ مکمل حکمت عملی کا کوڈ:
//Signal structure
var Template = {
Flag: "45M103Buy", // Marker, which can be specified at will
Exchange: 1, // Specify exchange trading pairs
Currency: "BTC_USDT", // Trading pair
ContractType: "swap", // Contract type, swap, quarter, next_quarter, fill in spot for spot
Price: "{{close}}", // Opening position or closing position price, -1 is the market price
Action: "buy", // Transaction type [buy: spot buying, sell: spot selling, long: go long futures, short: go short futures, closesell: buy futures and close short positions, close buy: sell futures and close long positions]
Amount: "0", // Transaction amount
}
var BaseUrl = "https://www.fmz.com/api/v1" // FMZ extended API interface address
var RobotId = _G() // Current real bot ID
var Success = "#5cb85c" // Color for success
var Danger = "#ff0000" // Color for danger
var Warning = "#f0ad4e" // Color for alert
var buffSignal = []
// Check signal message format
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("The minimum number of the exchange is 1 and it is an integer", Danger)
return
}
if (Signal.Amount <= 0 || typeof(Signal.Amount) != "number") {
Log("The transaction amount cannot be less than 0 and it is numerical type", typeof(Signal.Amount), Danger)
return
}
if (typeof(Signal.Price) != "number") {
Log("Price must be a value", Danger)
return
}
if (Signal.ContractType == "spot" && Signal.Action != "buy" && Signal.Action != "sell") {
Log("The command is to operate spot, Action error, Action:", Signal.Action, Danger)
return
}
if (Signal.ContractType != "spot" && Signal.Action != "long" && Signal.Action != "short" && Signal.Action != "closesell" && Signal.Action != "closebuy") {
Log("The command is to operate future, Action error, 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("Simulate a webhook request from TradingView, sending a POST request for testing purposes:", url, "body:", cmd, "response:", 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("Create task:", 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) {
// Non-spot, then set the contract
e.SetContractType(task.ContractType)
} else if (task.ContractType == "spot" && name.indexOf("Futures_") == -1) {
isFutures = false
} else {
task.error = "The ContractType in the command does not match the configured exchange object type"
return
}
var depth = e.GetDepth()
if (!depth || !depth.Bids || !depth.Asks) {
task.error = "Order book data exception"
return
}
if (depth.Bids.length == 0 && depth.Asks.length == 0) {
task.error = "No orders on the market entry position"
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 = "Failed to obtain precision"
return
}
e.SetPrecision(self.pricePrecision, self.amountPrecision)
// buy: spot buying, sell: spot selling, long: go long futures, short: go short futures, closesell: buy futures and close short positions, close buy: sell futures and close long positions
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 = "Wrong transaction direction:" + 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 = "Wrong transaction direction:" + task.Action
return
}
}
var id = tradeFunc(task.Price, task.Amount)
if (!id) {
task.error = "Failed to place an order"
}
task.finished = true
}
return self
}
var manager = createManager()
function HandleCommand(signal) {
// Detect whether interactive command is received
if (signal) {
Log("Receive interactive command:", signal) // Receive the interactive command, print the interactive command
} else {
return // If it is not received, it will be returned directly without processing
}
// Check whether the interactive command is a test instruction. The test instruction can be sent out by the current strategy interaction control for testing
if (signal.indexOf("TestSignal") != -1) {
signal = signal.replace("TestSignal:", "")
// Call the FMZ extended API interface to simulate the webhook of the TradingView, and the message sent by the interactive button 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("Execute debug code:", js)
eval(js)
} else {
// Process signal command
objSignal = JSON.parse(signal)
if (DiffObject(Template, objSignal)) {
Log("Received transaction signal command:", objSignal)
buffSignal.push(objSignal)
// Check the trading volume and exchange number
if (!CheckSignal(objSignal)) {
return
}
// Create task
manager.newTask(objSignal)
} else {
Log("Command cannot be recognized", signal)
}
}
}
function main() {
Log("WebHook address:", "https://www.fmz.com/api/v1?access_key=" + FMZ_AccessKey + "&secret_key=" + FMZ_SecretKey + "&method=CommandRobot&args=[" + RobotId + ',+""]', Danger)
Log("Transaction type [buy: spot buying, sell: spot selling, long: go long futures, short: go short futures, closesell: buy futures and close short positions, close buy: sell futures and close long positions]", Danger)
Log("Command template:", JSON.stringify(Template), Danger)
while (true) {
try {
// Process interactions
HandleCommand(GetCommand())
// Process tasks
manager.process()
if (buffSignal.length > maxBuffSignalRowDisplay) {
buffSignal.shift()
}
var buffSignalTbl = {
"type" : "table",
"title" : "Signal recording",
"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)
}
}
}
حکمت عملی کے پیرامیٹرز اور تعاملات:
حکمت عملی کو چلانے سے پہلے ، تبادلہ آبجیکٹ کو تشکیل دیا جانا چاہئے ، اور دو پیرامیٹرز
یہ WebHook ایڈریس، حمایت کارروائی کے احکامات، اور پیغام کی شکل ہے کہ TradingView پر بھرنے کی ضرورت ہے پرنٹ کریں گے. اہم بات یہ ہے کہ WebHook ایڈریس ہے:
https://www.fmz.com/api/v1?access_key=22903bab96b26584dc5a22522984df42&secret_key=73f8ba01014023117cbd30cb9d849bfc&method=CommandRobot&args=[505628,+""]
بس کاپی کریں اور براہ راست ٹریڈنگ ویو پر متعلقہ مقام پر پیسٹ کریں.
اگر آپ ٹریڈنگ ویو کی طرف سے بھیجے گئے سگنل کی نقل کرنا چاہتے ہیں تو، آپ حکمت عملی کے تعامل پر ٹیسٹ سگنل بٹن پر کلک کر سکتے ہیں.
یہ حکمت عملی اپنی ہی درخواست بھیجتی ہے (ایک سگنل کی درخواست بھیجنے والے ٹریڈنگ ویو کی تقلید کرتی ہے) ، FMZ
{"Flag":"45M103Buy","Exchange":1,"Currency":"BTC_USDT","ContractType":"swap","Price":"16000","Action":"buy","Amount":"1"}
موجودہ حکمت عملی ایک اور انٹرایکٹو پیغام وصول کرے گا اور عملدرآمد، اور لین دین کے لئے ایک آرڈر رکھیں گے.
ٹریڈنگ ویو ٹیسٹ کا استعمال کرنے کے لئے ضروری ہے کہ ٹریڈنگ ویو اکاؤنٹ پرو سطح پر ہو۔ ٹیسٹ سے پہلے ، آپ کو کچھ پیشگی علم کی ضرورت ہے۔
مثال کے طور پر ایک سادہ 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)
مندرجہ ذیل پلیس ہولڈرز ہیں. مثال کے طور پر، اگر میں لکھتا ہوں{{strategy.order.contracts}}
انتباہ کے
{{strategy.position_size}}
- پائن میں ایک ہی مطلوبہ الفاظ کی قدر واپس، یعنی موجودہ پوزیشن کا سائز.{{strategy.order.action}}
- واپس string {{strategy.order.contracts}}
- معاہدوں کی تعداد جس کے لئے احکامات پر عملدرآمد کیا گیا ہے واپس.{{strategy.order.price}}
- عملدرآمد کے حکم کی قیمت واپس.{{strategy.order.id}}
- عملدرآمد کے حکم کی شناخت واپس (فنانشن کالز میں سے ایک میں پہلا پیرامیٹر کے طور پر استعمال کیا تار ہے کہ حکم پیدا: strategy.entry،strategy.exitیا حکمت عملی.آرڈر).{{strategy.order.comment}}
- عملدرآمد کے حکم کا تبصرہ واپس کریں (آرڈر پیدا کرنے والے فنکشن کالز میں سے ایک میں تبصرہ پیرامیٹر میں استعمال کیا سٹرنگ: strategy.entry،strategy.exit، یا حکمت عملی.آرڈر) ۔ اگر کوئی تبصرہ نہیں کیا جاتا ہے تو ،strategy.order.idاستعمال کیا جائے گا.{{strategy.order.alert_message}}
- alert_message پیرامیٹر کی قدر واپس کرتا ہے جو حکمت عملی میں استعمال کیا جا سکتا ہے {{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 اسکرپٹ ٹرانزیکشن کو ٹرگر کرتا ہے تو ، ایک ویب ہک یو آر ایل کی درخواست بھیجی جائے گی۔
FMZ حقیقی روبوٹ اس سگنل کو انجام دے گا.
اس مضمون کا کوڈ صرف حوالہ کے لیے ہے، اور آپ اسے اپنے استعمال میں خود ایڈجسٹ اور بڑھا سکتے ہیں۔