پچھلے مضمون میں ہم نے ایک سادہ گرڈ کی حکمت عملی کے لین دین کی منطقی تجزیہ کی وضاحت کی ، اور اس مضمون میں ہم اس تدریسی حکمت عملی کے ڈیزائن کو مکمل کرنے کے لئے جاری رہے ہیں۔
ٹرانزیکشن لاجسٹک تجزیہ پچھلے مضمون میں ہم نے کہا تھا کہ صرف گرڈ کی ہر گرڈ لائن کو گھومنے کے بعد ، موجودہ قیمت کا فیصلہ کرتے ہوئے گرڈ لائن کو عبور کرکے تجارت کی کارروائی کو متحرک کیا جاسکتا ہے۔ لیکن حقیقت میں منطقی تفصیلات بہت زیادہ ہیں ، جو اکثر حکمت عملی لکھنے کے بارے میں نہیں جانتے ہیں وہ ایک غلط فہمی کا شکار ہوجاتے ہیں کہ گرڈ منطق بہت آسان ہے ، کوڈ کو بھی کچھ لائنوں میں ہی ہونا چاہئے ، حقیقت میں تفصیلات لکھنا بہت زیادہ ہے۔
سب سے پہلے، پہلی چیز جس پر ہم غور کرنا چاہتے ہیں وہ یہ ہے کہ لامحدود گرڈ کا ڈیزائن کیا گیا ہے۔ پچھلے مضمون کو یاد رکھیں، ہم نے ایک فنکشن ڈیزائن کیا ہے جو ابتدائی گرڈ کے اعداد و شمار کی ساخت پیدا کرتا ہے.createNet
تو؟ یہ فنکشن ایک گرڈ ڈھانچہ پیدا کرتا ہے جس میں ایک محدود تعداد میں گرڈ لائنز ہوتی ہیں۔ تو کیا ہوتا ہے اگر حکمت عملی چلتی ہے تو قیمت اس گرڈ ڈھانچے کی حدود سے باہر جاتی ہے (سب سے اوپر قیمت سے زیادہ ، سب سے نیچے قیمت سے کم گرڈ لائن) ؟
لہذا ہم سب سے پہلے گرڈ کے اعداد و شمار کی ساخت میں توسیع کے میکانزم کو شامل کرنا چاہتے ہیں۔
ہم نے اس پالیسی کو شروع کر دیا ہے، اور ہم نے اس کو شروع کر دیا ہے.
var diff = 50 // 全局变量,网格间距,可以设计成参数,方便讲解,我们把这个参数写死在代码里。
function main() {
// 实盘开始运行后,从这里开始执行策略代码
var ticker = _C(exchange.GetTicker) // 获取市场最新的行情数据ticker,ticker这个数据的结构参看FMZ API文档:https://www.fmz.com/api#ticker
var net = createNet(ticker.Last, diff) // 我们上篇设计的初始构造网格数据结构的函数,这里构造一个网格数据结构net
while (true) { // 然后程序逻辑就进入了这个while死循环,策略执行到此将不停的循环执行这里{}符号之内的代码
ticker = _C(exchange.GetTicker) // 死循环代码部分的第一行,获取最新的行情数据,更新给ticker变量
// 检查网格范围
while (ticker.Last >= net[net.length - 1].price) {
net.push({
buy : false,
sell : false,
price : net[net.length - 1].price + diff,
})
}
while (ticker.Last <= net[0].price) {
var price = net[0].price - diff
if (price <= 0) {
break
}
net.unshift({
buy : false,
sell : false,
price : price,
})
}
// 还有其它代码...
}
}
اس کوڈ کا ایک ٹکڑا (اوپر والے کوڈ میں سے منتخب کردہ) اس نیٹ ورک کے اعداد و شمار کی ساخت کو بڑھا سکتا ہے:
// 检查网格范围
while (ticker.Last >= net[net.length - 1].price) { // 如果价格超过网格最高价格的网格线
net.push({ // 就在网格最高价格的网格线之后加入一个新的网格线
buy : false, // 初始化卖出标记
sell : false, // 初始化买入标记
price : net[net.length - 1].price + diff, // 在之前最高价格的基础上再加一个网格间距
})
}
while (ticker.Last <= net[0].price) { // 如果价格低于网格最低价格的网格线
var price = net[0].price - diff // 区别于向上添加,要注意向下添加新网格线的价格不能小于等于0,所以这里要判断
if (price <= 0) { // 小于等于0就不添加了,跳出这层循环
break
}
net.unshift({ // 就在网格最低价格的网格线之前添加一个新的网格线
buy : false,
sell : false,
price : price,
})
}
اس کے بعد ، ہم اس بات پر غور کریں گے کہ کس طرح ٹرانزیکشن ٹرگر کو عملی جامہ پہنانا ہے۔
var diff = 50
var amount = 0.002 // 增加一个全局变量,也可以设计成参数,当然为了简便讲解,我们也写死在策略代码,
// 这个参数控制每次网格线上触发交易时的交易量
function main() {
var ticker = _C(exchange.GetTicker)
var net = createNet(ticker.Last, diff)
var preTicker = ticker // 在主循环(死循环)开始前,设置一个变量,记录上一次的行情数据
while (true) {
ticker = _C(exchange.GetTicker)
// 检查网格范围
while (ticker.Last >= net[net.length - 1].price) {
net.push({
buy : false,
sell : false,
price : net[net.length - 1].price + diff,
})
}
while (ticker.Last <= net[0].price) {
var price = net[0].price - diff
if (price <= 0) {
break
}
net.unshift({
buy : false,
sell : false,
price : price,
})
}
// 检索网格
for (var i = 0 ; i < net.length ; i++) { // 遍历网格数据结构中的所有网格线
var p = net[i]
if (preTicker.Last < p.price && ticker.Last > p.price) { // 上穿,卖出,当前节点已经交易过不论SELL BUY ,都不再交易
if (i != 0) {
var downP = net[i - 1]
if (downP.buy) {
exchange.Sell(-1, amount, ticker)
downP.buy = false
p.sell = false
continue
}
}
if (!p.sell && !p.buy) {
exchange.Sell(-1, amount, ticker)
p.sell = true
}
} else if (preTicker.Last > p.price && ticker.Last < p.price) { // 下穿,买入
if (i != net.length - 1) {
var upP = net[i + 1]
if (upP.sell) {
exchange.Buy(-1, amount * ticker.Last, ticker)
upP.sell = false
p.buy = false
continue
}
}
if (!p.buy && !p.sell) {
exchange.Buy(-1, amount * ticker.Last, ticker)
p.buy = true
}
}
}
preTicker = ticker // 把当前的行情数据记录在preTicker中,在下一次循环中,作为“上一次”行情数据和最新的对比,判断上穿下穿
Sleep(500)
}
}
آپ دیکھ سکتے ہیں:
preTicker.Last < p.price && ticker.Last > p.price
preTicker.Last > p.price && ticker.Last < p.price
یہ وہی ہے جس کے بارے میں ہم نے پچھلے مضمون میں کہا تھا:
اوپر اور نیچے کی طرف سے گزرنا صرف اس بات کا فیصلہ کرنے کا پہلا مرحلہ ہے کہ آیا آپ آرڈر کرسکتے ہیں یا نہیں ، جس میں گرڈ لائن ڈیٹا میں نشانات کا بھی فیصلہ کرنا ضروری ہے۔
اگر اوپر پہننا ہے تو ، قیمت موجودہ گرڈ لائن سے کم ہے اور حالیہ گرڈ لائن پر خرید کا نشان ہے۔ اگر خرید کا نشان سچ ہے تو ، یہ ظاہر کرتا ہے کہ پچھلی گرڈ لائن خریدی گئی ہے ، اس پر ایک خرید کو غلط اور موجودہ گرڈ لائن فروخت کو غلط کے طور پر دوبارہ ترتیب دیں۔
حال ہی میں ہونے والے حالات کا فیصلہ کرنے کے بعد ، اگر کوئی ٹرگر نہیں ہے تو فیصلہ جاری رکھیں ، اگر موجودہ گرڈ لائن پر خرید / فروخت کے نشانات غلط ہیں تو ، اس کا مطلب یہ ہے کہ موجودہ گرڈ لائن میں تجارت کی جاسکتی ہے ، کیونکہ یہ پہننے کے لئے ہے ، ہم یہاں فروخت کا عمل انجام دیتے ہیں ، عمل کے بعد موجودہ گرڈ لائن کو نشان زد کرتے ہیں sell نشان درست ہے۔
اس کے بعد ، ہم نے اس کے بارے میں مزید معلومات حاصل کیں ، اور ہم نے اس کے بارے میں مزید معلومات حاصل کیں ، اور ہم نے اس کے بارے میں مزید معلومات حاصل کیں۔
آپ کو کچھ اعداد و شمار کو دوبارہ دیکھنے کے لئے ایک تقریب لکھنے کے لئے ہے.showTbl
اعداد و شمار دکھائیں۔
function showTbl(arr) {
var tbl = {
type : "table",
title : "网格",
cols : ["网格信息"],
rows : []
}
var arrReverse = arr.slice(0).reverse()
_.each(arrReverse, function(ele) {
var color = ""
if (ele.buy) {
color = "#FF0000"
} else if (ele.sell) {
color = "#00FF00"
}
tbl.rows.push([JSON.stringify(ele) + color])
})
LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`", "\n 账户信息:", exchange.GetAccount())
}
مکمل حکمت عملی کا کوڈ:
/*backtest
start: 2021-04-01 22:00:00
end: 2021-05-22 00:00:00
period: 1d
basePeriod: 1m
exchanges: [{"eid":"OKEX","currency":"ETH_USDT","balance":100000}]
*/
var diff = 50
var amount = 0.002
function createNet(begin, diff) {
var oneSideNums = 10
var up = []
var down = []
for (var i = 0 ; i < oneSideNums ; i++) {
var upObj = {
buy : false,
sell : false,
price : begin + diff / 2 + i * diff,
}
up.push(upObj)
var j = (oneSideNums - 1) - i
var downObj = {
buy : false,
sell : false,
price : begin - diff / 2 - j * diff,
}
if (downObj.price <= 0) { // 价格不能小于等于0
continue
}
down.push(downObj)
}
return down.concat(up)
}
function showTbl(arr) {
var tbl = {
type : "table",
title : "网格",
cols : ["网格信息"],
rows : []
}
var arrReverse = arr.slice(0).reverse()
_.each(arrReverse, function(ele) {
var color = ""
if (ele.buy) {
color = "#FF0000"
} else if (ele.sell) {
color = "#00FF00"
}
tbl.rows.push([JSON.stringify(ele) + color])
})
LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`", "\n 账户信息:", exchange.GetAccount())
}
function main() {
var ticker = _C(exchange.GetTicker)
var net = createNet(ticker.Last, diff)
var preTicker = ticker
while (true) {
ticker = _C(exchange.GetTicker)
// 检查网格范围
while (ticker.Last >= net[net.length - 1].price) {
net.push({
buy : false,
sell : false,
price : net[net.length - 1].price + diff,
})
}
while (ticker.Last <= net[0].price) {
var price = net[0].price - diff
if (price <= 0) {
break
}
net.unshift({
buy : false,
sell : false,
price : price,
})
}
// 检索网格
for (var i = 0 ; i < net.length ; i++) {
var p = net[i]
if (preTicker.Last < p.price && ticker.Last > p.price) { // 上穿,卖出,当前节点已经交易过不论SELL BUY ,都不再交易
if (i != 0) {
var downP = net[i - 1]
if (downP.buy) {
exchange.Sell(-1, amount, ticker)
downP.buy = false
p.sell = false
continue
}
}
if (!p.sell && !p.buy) {
exchange.Sell(-1, amount, ticker)
p.sell = true
}
} else if (preTicker.Last > p.price && ticker.Last < p.price) { // 下穿,买入
if (i != net.length - 1) {
var upP = net[i + 1]
if (upP.sell) {
exchange.Buy(-1, amount * ticker.Last, ticker)
upP.sell = false
p.buy = false
continue
}
}
if (!p.buy && !p.sell) {
exchange.Buy(-1, amount * ticker.Last, ticker)
p.buy = true
}
}
}
showTbl(net)
preTicker = ticker
Sleep(500)
}
}
اسٹریٹجی کا جائزہ:
آپ نیٹ ورک کی حکمت عملی کی خصوصیات دیکھ سکتے ہیں ، جب رجحان کی مارکیٹ ہوتی ہے تو بڑے پیمانے پر نقصان ہوتا ہے ، اور جب مارکیٹ میں ہلچل ہوتی ہے تو منافع واپس آجاتا ہے۔ لہذا گرڈ کی حکمت عملی خطرے سے پاک نہیں ہے ، اس وقت کی حکمت عملی ابھی بھی معمولی اور سخت ہوسکتی ہے ، جبکہ مستقبل کے معاہدے کی گرڈ کی حکمت عملی زیادہ خطرہ ہے ، جس میں گرڈ پیرامیٹرز کے لئے زیادہ محتاط ترتیبات کی ضرورت ہے۔
ہسر12345یہ C++ زبان ہے۔
ٹونی233اگر آپ کو لگتا ہے کہ آپ کو ہر گرڈ لائن کا اندازہ لگانا ہوگا ، تو آپ کو اس بات کا یقین ہونا چاہئے کہ آپ کو اس وقت کی قیمت سے زیادہ گرڈ لائن کو گھومنا چاہئے ، کیا آپ کو اس وقت کی قیمت سے زیادہ گرڈ لائن کو گھومنا نہیں چاہئے؟ اور تبادلے.Sell ((-1, رقم ، ٹکر) یہ فنکشن API دستاویز سے مختلف ہے ، میں نے دیکھا کہ API دستاویز میں یہ لکھا ہے exchange.Sell ((Price ، Amount) ، آپ کے پاس تین پیرامیٹرز ہیں ، آپ کو سمجھ نہیں آرہا ہے ، یہ بہت پیچیدہ ہے ، میں بھی پاگل ہوں
ٹونی233یہ مشکل ہے
ہالجب اوپر اور نیچے جاتے ہیں تو ، exchange.Buy ((-1 ، رقم * ticker.Last ، ticker) ، رقم * ticker.Last عجیب بات ہے ، کیوں نہیں؟
CYZWXhttps://www.fmz.com/strategy/291160 last_tick = [] لائن = [] grid_buy_list = [] def خالص ((now_price): گلوبل لائن print ((now_price) لائن = [now_price*(1+0.003*i) رینج میں i کے لئے ((-1000,1000) ] لاگ (لائن) def ontick ((): عالمی آخری_ٹِک گلوبل لائن گلوبل گرڈ_بائی_لسٹ اکاؤنٹ = تبادلہ.GetAccount() ٹکر = تبادلہ.GetTicker() last_tick.append ((ticker['آخری']) if len ((last_tick) == 1: واپسی elif len ((last_tick) == 100:del last_tick[0] رینج میں i کے لئے ((لین)) لائن): if last_tick[-1] > line[i] and last_tick[-2] < line[i] and len(grid_buy_list)!= 0 اور i > min(grid_buy_list) اور اکاؤنٹ['اسٹاکس'] >= 0.001: exchange.Sell ((last_tick[-1،0.01) del grid_buy_list[grid_buy_list.index(min(grid_buy_list))] لاگ ((تبادلہ.GetAccount()) elif last_tick[-1] < لائن[i] اور last_tick[-2] > لائن[i] اور i grid_buy_list میں نہیں ہیں: exchange.Buy ((last_tick[-1،0.01) grid_buy_list.append ((i) لاگ ((تبادلہ.GetAccount()) ڈیف اہم ((): نیٹ ((تبادلہ.GetTicker() ['آخری']) لاگ ((تبادلہ.GetAccount()) جبکہ ((صحیح): ontick ((() نیند ((1000)
CYZWXبہت شکریہ ڈریم گوڈ ، بہت تفصیل سے ، میں نے اسے دوبارہ خریدنے کے لئے وضاحت کی ، جیسے میں نے ایک پیئ ورژن لکھا ہو۔
ایجاد کاروں کی مقدار - خواباس کی حکمت عملی ``JavaScript `` ` زبان ہے۔
ٹونی233کیا آپ کو معلوم ہے کہ آپ کے پاس کیا ہے؟
ایجاد کاروں کی مقدار - خوابفیوچر معاہدے کی رقم ہیں ، فوری مارکیٹ قیمت ادائیگی کی رقم ہے۔ فوری فروخت کی رقم ہے۔
ٹونی233اوہ ، ایک اور سوال ، اس کا کیا مطلب ہے۔ نوٹ: ایکسچینج کے نیچے والے آرڈر انٹرفیس کو مارکیٹ کی قیمت کی فہرست کی حمایت کرنے کی ضرورت ہے۔ نیچے والے آرڈر کی قسم ادائیگی کے لئے ہے ، نیچے والے یونٹ کی پیرامیٹرز کی قیمتوں کا تعین کرنسیوں کی اکائیوں میں کی گئی رقم ہے۔ ڈیجیٹل کرنسی کے مستقبل کی مارکیٹ کی قیمت کی ترتیب میں ، نیچے والے آرڈر کی پیرامیٹرز کی اکائیوں میں معاہدے کی تعداد ہے۔ میں نے دیکھا کہ آپ کا یہ پوسٹ اوکیکس کے ایتھ کے یو ایس ڈی ٹی مستقل معاہدے کی جانچ پڑتال کرتا ہے ، کیا یہ فاریکس مارکیٹ کی قیمتوں کا تعین کرنے کا طریقہ نہیں ہے؟ نیچے والے آرڈر کی پیرامیٹرز کی ادائیگی کے لئے یہ معاہدہ نہیں ہے؟
ٹونی233اوہ، میں سمجھتا ہوں.
ایجاد کاروں کی مقدار - خوابFMZ کے API افعال میں لاگ آؤٹ پٹ افعال جیسے: لاگ ((...) ؛ exchange.Buy ((Price, Amount) ؛ exchange.CancelOrder ((Id) وغیرہ پیدا کیے جاسکتے ہیں جو ضروری پیرامیٹرز کے بعد کچھ ضمنی آؤٹ پٹ پیرامیٹرز کے ساتھ ہیں۔https://www.fmz.com/api#exchange.cancelorderid