پچھلے مضمون میں ، ہم نے ایک ساتھ مل کر ایک سادہ گرڈ حکمت عملی بنائی۔ اس مضمون میں ، ہم نے اس حکمت عملی کو اپ گریڈ کیا اور اس کی توسیع کرکے ایک کثیر اقسام کے اسپاٹ گرڈ حکمت عملی میں کردی ، اور اس حکمت عملی کو عملی طور پر جانچنے دیں۔ مقصد
یہ مضمون، پچھلے ایک کی طرح، اب بھی FMZ Quant (FMZ.COM).
کثیر اقسام
اسے کھل کر بتانے کے لئے، مجھے لگتا ہے کہ یہ گرڈ حکمت عملی نہ صرف کر سکتے ہیںBTC_USDT
، بلکہLTC_USDT
/EOS_USDT
/DOGE_USDT
/ETC_USDT
/ETH_USDT
ویسے بھی، اسپاٹ ٹریڈنگ کے جوڑے اور مختلف قسم کے جو چلنا چاہتے ہیں وہ ایک ہی وقت میں گرڈ پر تجارت کرتے ہیں.
یہ بہت اچھا لگتا ہے کہ متعدد پرجاتیوں کی غیر مستحکم مارکیٹ کو پکڑنے کے لئے. یہ شرط بہت سادہ لگتی ہے، اور مسئلہ ڈیزائن کرتے وقت آتا ہے۔
ETHUSDT:100:0.002|LTCUSDT:20:0.1
ان کے درمیان، ETHUSDT:100:0.002
ETH_USDT ٹریڈنگ جوڑی کو کنٹرول کرتا ہے، اورLTCUSDT:20:0.1
LTC_USDT ٹریڈنگ جوڑی کو کنٹرول کرتا ہے۔ درمیانی ETHUSDT:100:0.002
، جہاں ETHUSDT اس بات کی نشاندہی کرتا ہے کہ آپ کیا ٹریڈنگ جوڑی کرنا چاہتے ہیں ، 100 گرڈ اسپیسنگ ہے ، 0.002 ہر گرڈ میں تجارت شدہ ETH سککوں کی تعداد ہے ، اور
function main() {
var net = [] // The recorded grid parameters, use the data when running to the grid trading logic
var params = "ETHUSDT:100:0.002|LTCUSDT:20:0.1"
var arrPair = params.split("|")
_.each(arrPair, function(pair) {
var arr = pair.split(":")
var symbol = arr[0] // Trading pair name
var diff = parseFloat(arr[1]) // Grid spacing
var amount = parseFloat(arr[2]) // Grid order volume
net.push({symbol : symbol, diff : diff, amount : amount})
})
Log("Grid parameter data:", net)
}
اس کو دیکھ کر، پیرامیٹرز کو تجزیہ کیا جاتا ہے۔ یقینا، آپ براہ راست JSON سٹرنگز بھی استعمال کرسکتے ہیں، جو کہ آسان ہے۔
function main() {
var params = '[{"symbol":"ETHUSDT","diff":100,"amount":0.002},{"symbol":"LTCUSDT","diff":20,"amount":0.1}]'
var net = JSON.parse(params) // The recorded grid parameters, use the data when running to the grid trading logic
_.each(net, function(pair) {
Log("Trading pairs:", pair.symbol, pair)
})
}
_G()
FMZ مقداری ٹریڈنگ پلیٹ فارم پر فنکشن، یا ڈیٹا بیس آپریشن فنکشن استعمال کریںDBExec()
، اور آپ تفصیلات کے لئے FMZ API دستاویزات چیک کر سکتے ہیں.مثال کے طور پر، ہم ایک دم سویپ تقریب ڈیزائن اور_G()
گرڈ کے اعداد و شمار کو بچانے کے لئے تقریب.
var net = null
function main() { // Strategy main functions
// Read the stored net first
net = _G("net")
// ...
}
function onExit() {
_G("net", net)
Log("Perform tail-sweeping processing and save data", "#FF0000")
}
function onexit() { // The exit sweep function defined by the platform system, triggered the execution when the real bot is clicked to stop
onExit()
}
function onerror() { // The abnormal exit function defined by the platform system, triggered the execution when the program is abnormal
onExit()
}
بیک ٹیسٹنگ سسٹم آرڈر کی رقم اور آرڈر کی درستگی پر ایسی سخت پابندیاں عائد نہیں کرتا ہے ، لیکن ہر تبادلے میں اصلی بوٹ میں آرڈر دینے پر قیمت اور آرڈر کی رقم کے لئے سخت معیارات ہوسکتے ہیں ، اور یہ پابندیاں مختلف تبادلے میں ایک جیسی نہیں ہیں۔ لہذا ، ایسے ابتدائی لوگ ہیں جو بیک ٹیسٹنگ سسٹم میں بغیر کسی پریشانی کے ٹیسٹ کرتے ہیں۔ ایک بار جب اصلی بوٹ لانچ ہوجاتا ہے تو ، جب تجارت شروع ہوجاتی ہے تو مختلف مسائل پیدا ہوتے ہیں ، اور پھر غلطی کے پیغام کا مواد نہیں پڑھا جاتا ہے ، اور مختلف پاگل مظاہر ظاہر ہوتے ہیں۔
کثیر پرجاتیوں کے معاملات کے ل this ، یہ ضرورت زیادہ پیچیدہ ہے۔ ایک واحد پرجاتی حکمت عملی کے ل you ، آپ درستگی جیسی معلومات کی وضاحت کرنے کے لئے ایک پیرامیٹر ڈیزائن کرسکتے ہیں ، لیکن جب کثیر پرجاتی حکمت عملی ڈیزائن کرتے ہو تو ، یہ واضح ہے کہ پیرامیٹرز میں اس معلومات کو لکھنے سے پیرامیٹرز بہت پھول جائیں گے۔
اس وقت ، آپ کو یہ دیکھنے کے لئے ایکسچینج کی API دستاویزات کی جانچ پڑتال کرنے کی ضرورت ہے کہ آیا ایکسچینج دستاویزات میں تجارتی جوڑوں سے متعلق انٹرفیس کی معلومات موجود ہیں۔ اگر ایسا ہے تو ، آپ درستگی جیسی معلومات حاصل کرنے کے لئے حکمت عملی میں خودکار رسائی انٹرفیس ڈیزائن کرسکتے ہیں ، اور اسے تجارت میں شامل ٹریڈنگ جوڑی کی معلومات میں تشکیل دے سکتے ہیں (مختصر طور پر ، درستگی یا کچھ خود بخود ایکسچینج سے حاصل کی جاتی ہے ، اور پھر حکمت عملی کے پیرامیٹرز سے متعلق متغیرات کے مطابق ڈھال لیا جاتا ہے) ۔
مندرجہ بالا تجزیہ کی بنیاد پر، ایک ٹیمپلیٹ کلاس لائبریری کو حکمت عملی اور تبادلے کے طریقہ کار اور انٹرفیس کے درمیان جوڑ کو کم کرنے کے لئے ڈیزائن کیا گیا ہے.
ہم اس ٹیمپلیٹ کلاس لائبریری کو اس طرح ڈیزائن کر سکتے ہیں (کوڈ کا حصہ خارج کر دیا گیا ہے):
function createBaseEx(e, funcConfigure) {
var self = {}
self.e = e
self.funcConfigure = funcConfigure
self.name = e.GetName()
self.type = self.name.includes("Futures_") ? "Futures" : "Spot"
self.label = e.GetLabel()
// Interfaces to be implemented
self.interfaceGetTickers = null // Create a function to asynchronously obtain a thread of aggregated market data
self.interfaceGetAcc = null // Create a function that asynchronously obtains account data thread
self.interfaceGetPos = null // Get a position
self.interfaceTrade = null // Create concurrent orders
self.waitTickers = null // Waiting for concurrent market data
self.waitAcc = null // Waiting for account concurrent data
self.waitTrade = null // Waiting for order concurrent data
self.calcAmount = null // Calculate the order volume based on data such as trading pair accuracy
self.init = null // Initialization work, obtaining data such as accuracy
// Execute the configuration function to configure the object
funcConfigure(self)
// Check whether the interfaces agreed by configList are implemented
_.each(configList, function(funcName) {
if (!self[funcName]) {
throw "interface" + funcName + "unimplemented"
}
})
return self
}
$.createBaseEx = createBaseEx
$.getConfigureFunc = function(exName) {
dicRegister = {
"Futures_OKCoin" : funcConfigure_Futures_OKCoin, // Implementation of OK futures
"Huobi" : funcConfigure_Huobi,
"Futures_Binance" : funcConfigure_Futures_Binance,
"Binance" : funcConfigure_Binance,
"WexApp" : funcConfigure_WexApp, // Implementation of wexApp
}
return dicRegister
}
ٹیمپلیٹ میں ، یہ مخصوص تبادلے کے لئے لکھا گیا ہے ، مثال کے طور پر ایف ایم زیڈ
function funcConfigure_WexApp(self) {
var formatSymbol = function(originalSymbol) {
// BTC_USDT
var arr = originalSymbol.split("_")
var baseCurrency = arr[0]
var quoteCurrency = arr[1]
return [originalSymbol, baseCurrency, quoteCurrency]
}
self.interfaceGetTickers = function interfaceGetTickers() {
self.routineGetTicker = HttpQuery_Go("https://api.wex.app/api/v1/public/tickers")
}
self.waitTickers = function waitTickers() {
var ret = []
var arr = JSON.parse(self.routineGetTicker.wait()).data
_.each(arr, function(ele) {
ret.push({
bid1: parseFloat(ele.buy),
bid1Vol: parseFloat(-1),
ask1: parseFloat(ele.sell),
ask1Vol: parseFloat(-1),
symbol: formatSymbol(ele.market)[0],
type: "Spot",
originalSymbol: ele.market
})
})
return ret
}
self.interfaceGetAcc = function interfaceGetAcc(symbol, updateTS) {
if (self.updateAccsTS != updateTS) {
self.routineGetAcc = self.e.Go("GetAccount")
}
}
self.waitAcc = function waitAcc(symbol, updateTS) {
var arr = formatSymbol(symbol)
var ret = null
if (self.updateAccsTS != updateTS) {
ret = self.routineGetAcc.wait().Info
self.bufferGetAccRet = ret
} else {
ret = self.bufferGetAccRet
}
if (!ret) {
return null
}
var acc = {symbol: symbol, Stocks: 0, FrozenStocks: 0, Balance: 0, FrozenBalance: 0, originalInfo: ret}
_.each(ret.exchange, function(ele) {
if (ele.currency == arr[1]) {
// baseCurrency
acc.Stocks = parseFloat(ele.free)
acc.FrozenStocks = parseFloat(ele.frozen)
} else if (ele.currency == arr[2]) {
// quoteCurrency
acc.Balance = parseFloat(ele.free)
acc.FrozenBalance = parseFloat(ele.frozen)
}
})
return acc
}
self.interfaceGetPos = function interfaceGetPos(symbol, price, initSpAcc, nowSpAcc) {
var symbolInfo = self.getSymbolInfo(symbol)
var sumInitStocks = initSpAcc.Stocks + initSpAcc.FrozenStocks
var sumNowStocks = nowSpAcc.Stocks + nowSpAcc.FrozenStocks
var diffStocks = _N(sumNowStocks - sumInitStocks, symbolInfo.amountPrecision)
if (Math.abs(diffStocks) < symbolInfo.min / price) {
return []
}
return [{symbol: symbol, amount: diffStocks, price: null, originalInfo: {}}]
}
self.interfaceTrade = function interfaceTrade(symbol, type, price, amount) {
var tradeType = ""
if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
tradeType = "bid"
} else {
tradeType = "ask"
}
var params = {
"market": symbol,
"side": tradeType,
"amount": String(amount),
"price" : String(-1),
"type" : "market"
}
self.routineTrade = self.e.Go("IO", "api", "POST", "/api/v1/private/order", self.encodeParams(params))
}
self.waitTrade = function waitTrade() {
return self.routineTrade.wait()
}
self.calcAmount = function calcAmount(symbol, type, price, amount) {
// Obtain trading pair information
var symbolInfo = self.getSymbolInfo(symbol)
if (!symbol) {
throw symbol + ", the trading pair information cannot be checked"
}
var tradeAmount = null
var equalAmount = null // Number of coins recorded
if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
tradeAmount = _N(amount * price, parseFloat(symbolInfo.pricePrecision))
// Check the minimum trading volume
if (tradeAmount < symbolInfo.min) {
Log(self.name, " tradeAmount:", tradeAmount, "less than", symbolInfo.min)
return false
}
equalAmount = tradeAmount / price
} else {
tradeAmount = _N(amount, parseFloat(symbolInfo.amountPrecision))
// Check the minimum trading volume
if (tradeAmount < symbolInfo.min / price) {
Log(self.name, " tradeAmount:", tradeAmount, "less than", symbolInfo.min / price)
return false
}
equalAmount = tradeAmount
}
return [tradeAmount, equalAmount]
}
self.init = function init() { // Functions that deal with conditions such as accuracy automatically
var ret = JSON.parse(HttpQuery("https://api.wex.app/api/v1/public/markets"))
_.each(ret.data, function(symbolInfo) {
self.symbolsInfo.push({
symbol: symbolInfo.pair,
amountPrecision: parseFloat(symbolInfo.basePrecision),
pricePrecision: parseFloat(symbolInfo.quotePrecision),
multiplier: 1,
min: parseFloat(symbolInfo.minQty),
originalInfo: symbolInfo
})
})
}
}
پھر ایک حکمت عملی میں اس ٹیمپلیٹ کا استعمال آسان ہے:
function main() {
var fuExName = exchange.GetName()
var fuConfigureFunc = $.getConfigureFunc()[fuExName]
var ex = $.createBaseEx(exchange, fuConfigureFunc)
var arrTestSymbol = ["LTC_USDT", "ETH_USDT", "EOS_USDT"]
var ts = new Date().getTime()
// Test to get tickers
ex.goGetTickers()
var tickers = ex.getTickers()
Log("tickers:", tickers)
// Test to obtain account information
ex.goGetAcc(symbol, ts)
_.each(arrTestSymbol, function(symbol) {
_.each(tickers, function(ticker) {
if (symbol == ticker.originalSymbol) {
// print ticker data
Log(symbol, ticker)
}
})
// print asset data
var acc = ex.getAcc(symbol, ts)
Log("acc:", acc.symbol, acc)
})
}
مندرجہ بالا ٹیمپلیٹ کی بنیاد پر حکمت عملی ڈیزائن اور لکھنا بہت آسان ہے۔ پوری حکمت عملی میں تقریبا 300+ لائنیں ہیں اور یہ ایک ڈیجیٹل کرنسی اسپاٹ ملٹی اسپیسیج گرڈ حکمت عملی کو نافذ کرتی ہے۔
یہ فی الحال پیسے کھو رہا ہےT_T
، ماخذ کوڈ فی الحال جاری نہیں کیا جائے گا۔
یہاں کچھ رجسٹریشن کوڈز ہیں، اگر آپ دلچسپی رکھتے ہیں تو، آپ کوشش کرنے کے لئے wexApp استعمال کر سکتے ہیں:
Buy address: https://www.fmz.com/m/s/284507
Registration code:
adc7a2e0a2cfde542e3ace405d216731
f5db29d05f57266165ce92dc18fd0a30
1735dca92794943ddaf277828ee04c27
0281ea107935015491cda2b372a0997d
1d0d8ef1ea0ea1415eeee40404ed09cc
جب میں نے دوڑنا شروع کیا تو مجھے ایک طرفہ مارکیٹ کا سامنا کرنا پڑا ، لیکن میں آہستہ آہستہ صحت یاب ہوا۔ اسپاٹ گرڈ کا سب سے بڑا فائدہ یہ ہے: