
بہت سے صارف کے مطالبات کے جواب میں، FMZ پلیٹ فارم نے حال ہی میں وکندریقرت ایکسچینج dYdX کی حمایت کی۔ حکمت عملی والے دوست خوشی سے dYdX کی میراث کر سکتے ہیں۔ یہ صرف اتنا ہوا کہ میں بہت پہلے سے ایک بے ترتیب تجارتی حکمت عملی لکھنا چاہتا تھا اس سے کوئی فرق نہیں پڑتا کہ میں پیسہ کماتا ہوں یا کھوتا ہوں مقصد ایک ہی وقت میں حکمت عملی کے ڈیزائن کو سکھانا ہے۔ تو آئیے مل کر ایک بے ترتیب تبادلے کی حکمت عملی بنائیں۔
اس مضمون میں اسٹریٹجک کان کنی کا اسکرین شاٹ۔

جن دوستوں کے پاس کان کنی کی حکمت عملی کے اچھے آئیڈیاز ہیں ان کا بھی ایک پیغام چھوڑنے کا خیرمقدم ہے!
آئیے “جنگلی طور پر سوچیں”! میں ایک ایسی حکمت عملی وضع کرنے کا ارادہ رکھتا ہوں جو اشارے یا قیمتوں کو دیکھے بغیر آرڈرز کو لمبا یا مختصر کرنے سے زیادہ کچھ نہیں ہے، اور آپ کو صرف امکانات کی پیش گوئی کرنا ہے۔ پھر ہم طویل اور مختصر کا تعین کرنے کے لیے بے ترتیب نمبر 1 سے 100 کا استعمال کرتے ہیں۔
طویل حالات: بے ترتیب نمبر 1~50۔ مختصر فروخت کی شرائط: بے ترتیب نمبر 51~100۔
لمبی اور مختصر دونوں پوزیشنوں کے نمبر 50 ہیں۔ آگے، آئیے سوچتے ہیں کہ پوزیشن کو کیسے بند کیا جائے کیونکہ یہ ایک جوا ہے، اس لیے جیتنے اور ہارنے کے لیے ایک معیار ہونا چاہیے۔ پھر لین دین میں ہم نے جیتنے یا ہارنے کے معیار کے طور پر فکسڈ ٹیک پرافٹ اور اسٹاپ لاس کو سیٹ کیا۔ اگر آپ منافع کو روکتے ہیں، تو آپ جیت جاتے ہیں؛ اگر آپ نقصان کو روکتے ہیں، تو آپ ہار جاتے ہیں۔ جہاں تک مناسب ٹیک پرافٹ اور اسٹاپ لاس سیٹنگز کا تعلق ہے، یہ دراصل منافع اور نقصان کے تناسب کو متاثر کرتا ہے، اوہ ہاں! یہ جیتنے کی شرح کو بھی متاثر کرتا ہے! (کیا یہ ڈیزائن کی حکمت عملی کارآمد ہے؟ کیا یہ ایک مثبت ریاضیاتی توقع کی ضمانت دے سکتی ہے؟ آئیے اسے پہلے کرتے ہیں! آخر کار، یہ سیکھنے اور تحقیق کے لیے ہے!)
ٹریڈنگ لاگت سے پاک نہیں ہے جیسے کہ پھسلن اور ہینڈلنگ فیس ہماری رینڈم ٹریڈنگ جیت کی شرح کو 50% سے کم کرنے کے لیے کافی ہیں۔ مجھے اس کو ذہن میں رکھ کر ڈیزائننگ کیسے جاری رکھنی چاہیے؟ ایک سے زیادہ پوزیشن میں اضافہ ڈیزائن کرنا بہتر ہے چونکہ یہ ایک جوا ہے، اس لیے لگاتار 10 میں سے 8 بے ترتیب لین دین کے ہارنے کا امکان بہت زیادہ نہیں ہونا چاہیے۔ اس لیے میں پہلے لین دین کو ڈیزائن کرنا چاہتا ہوں تاکہ آرڈر کا سائز بہت چھوٹا ہو، جتنا ممکن ہو چھوٹا ہو۔ پھر اگر آپ شرط ہار جاتے ہیں تو آرڈر کی مقدار میں اضافہ کریں اور بے ترتیب آرڈرز جاری رکھیں۔
ٹھیک ہے، حکمت عملی کا ڈیزائن اتنا آسان ہے۔
ڈیزائن سورس کوڈ:
var openPrice = 0
var ratio = 1
var totalEq = null
var nowEq = null
function cancelAll() {
while (1) {
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
break
}
for (var i = 0 ; i < orders.length ; i++) {
exchange.CancelOrder(orders[i].Id, orders[i])
Sleep(500)
}
Sleep(500)
}
}
function main() {
if (isReset) {
_G(null)
LogReset(1)
LogProfitReset()
LogVacuum()
Log("重置所有数据", "#FF0000")
}
exchange.SetContractType(ct)
var initPos = _C(exchange.GetPosition)
if (initPos.length != 0) {
throw "策略启动时有持仓!"
}
exchange.SetPrecision(pricePrecision, amountPrecision)
Log("设置精度", pricePrecision, amountPrecision)
if (!IsVirtual()) {
var recoverTotalEq = _G("totalEq")
if (!recoverTotalEq) {
var currTotalEq = _C(exchange.GetAccount).Balance // equity
if (currTotalEq) {
totalEq = currTotalEq
_G("totalEq", currTotalEq)
} else {
throw "获取初始权益失败"
}
} else {
totalEq = recoverTotalEq
}
} else {
totalEq = _C(exchange.GetAccount).Balance
}
while (1) {
if (openPrice == 0) {
// 更新账户信息,计算收益
var nowAcc = _C(exchange.GetAccount)
nowEq = IsVirtual() ? nowAcc.Balance : nowAcc.Balance // equity
LogProfit(nowEq - totalEq, nowAcc)
var direction = Math.floor((Math.random()*100)+1) // 1~50 , 51~100
var depth = _C(exchange.GetDepth)
if (depth.Asks.length <= 2 || depth.Bids.length <= 2) {
Sleep(1000)
continue
}
if (direction > 50) {
// long
openPrice = depth.Bids[1].Price
exchange.SetDirection("buy")
exchange.Buy(Math.abs(openPrice) + slidePrice, amount * ratio)
} else {
// short
openPrice = -depth.Asks[1].Price
exchange.SetDirection("sell")
exchange.Sell(Math.abs(openPrice) - slidePrice, amount * ratio)
}
Log("下", direction > 50 ? "买单" : "卖单", ",价格:", Math.abs(openPrice))
continue
}
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
var pos = _C(exchange.GetPosition)
if (pos.length == 0) {
openPrice = 0
continue
}
// 平仓检测
while (1) {
var depth = _C(exchange.GetDepth)
if (depth.Asks.length <= 2 || depth.Bids.length <= 2) {
Sleep(1000)
continue
}
var stopLossPrice = openPrice > 0 ? Math.abs(openPrice) - stopLoss : Math.abs(openPrice) + stopLoss
var stopProfitPrice = openPrice > 0 ? Math.abs(openPrice) + stopProfit : Math.abs(openPrice) - stopProfit
var winOrLoss = 0 // 1 win , -1 loss
// 画线
$.PlotLine("bid", depth.Bids[0].Price)
$.PlotLine("ask", depth.Asks[0].Price)
// 止损
if (openPrice > 0 && depth.Bids[0].Price < stopLossPrice) {
exchange.SetDirection("closebuy")
exchange.Sell(depth.Bids[0].Price - slidePrice, pos[0].Amount)
winOrLoss = -1
} else if (openPrice < 0 && depth.Asks[0].Price > stopLossPrice) {
exchange.SetDirection("closesell")
exchange.Buy(depth.Asks[0].Price + slidePrice, pos[0].Amount)
winOrLoss = -1
}
// 止盈
if (openPrice > 0 && depth.Bids[0].Price > stopProfitPrice) {
exchange.SetDirection("closebuy")
exchange.Sell(depth.Bids[0].Price - slidePrice, pos[0].Amount)
winOrLoss = 1
} else if (openPrice < 0 && depth.Asks[0].Price < stopProfitPrice) {
exchange.SetDirection("closesell")
exchange.Buy(depth.Asks[0].Price + slidePrice, pos[0].Amount)
winOrLoss = 1
}
// 检测挂单
Sleep(2000)
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
pos = _C(exchange.GetPosition)
if (pos.length == 0) {
if (winOrLoss == -1) {
ratio++
} else if (winOrLoss == 1) {
ratio = 1
}
break
}
} else {
// 撤销挂单
cancelAll()
Sleep(2000)
pos = _C(exchange.GetPosition)
// 撤销后更新持仓,需要再次检查
if (pos.length == 0) {
if (winOrLoss == -1) {
ratio++
} else if (winOrLoss == 1) {
ratio = 1
}
break
}
}
var tbl = {
"type" : "table",
"title" : "info",
"cols" : ["totalEq", "nowEq", "openPrice", "bid1Price", "ask1Price", "ratio", "pos.length"],
"rows" : [],
}
tbl.rows.push([totalEq, nowEq, Math.abs(openPrice), depth.Bids[0].Price, depth.Asks[0].Price, ratio, pos.length])
tbl.rows.push(["pos", "type", "amount", "price", "--", "--", "--"])
for (var j = 0 ; j < pos.length ; j++) {
tbl.rows.push([j, pos[j].Type, pos[j].Amount, pos[j].Price, "--", "--", "--"])
}
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
}
} else {
// 撤销挂单
// 重置openPrice
cancelAll()
openPrice = 0
}
Sleep(1000)
}
}
حکمت عملی کے پیرامیٹرز:

اوہ ہاں! حکمت عملی کو ایک نام کی ضرورت ہے، آئیے اسے “Gues the Size (dYdX ورژن)” کہتے ہیں۔
بیک ٹیسٹنگ صرف حوالہ کے لیے ہے۔_<! بنیادی مقصد یہ چیک کرنا ہے کہ آیا حکمت عملی میں کوئی کیڑے موجود ہیں اور بائنانس فیوچر بیک ٹیسٹنگ کا استعمال کریں۔




بیک ٹیسٹنگ مکمل ہے، کوئی کیڑے نہیں۔ لیکن مجھے ایسا لگتا ہے کہ میں بیک ٹیسٹنگ سسٹم کو اوور فٹ کر سکتا ہوں…T_T، مجھے اسے حقیقی وقت میں آزمانے دیں۔



یہ حکمت عملی صرف سیکھنے اور حوالہ کے لیے ہے۔10 ملین~10 ملیناسے حقیقی طور پر استعمال نہ کریں! !