
[TOC] میں نے 2020 میں ایک مضمون لکھا جس میں اعلی تعدد کی حکمت عملیوں کو متعارف کرایا گیا، https://www.fmz.com/digest-topic/6228۔ اگرچہ اس پر کافی توجہ حاصل ہوئی لیکن اس پر گہرائی سے نہیں لکھا گیا۔ دو سال سے زیادہ کا عرصہ گزر چکا ہے اور بازار بدل گیا ہے۔ اس مضمون کے شائع ہونے کے بعد، میری اعلی تعدد کی حکمت عملی طویل عرصے تک مستقل طور پر پیسہ کمانے میں کامیاب رہی، لیکن منافع آہستہ آہستہ کم ہوتا گیا اور یہاں تک کہ ایک موقع پر اسے روک دیا گیا۔ حالیہ مہینوں میں، میں نے تزئین و آرائش پر کافی محنت کی ہے اور فی الحال کچھ رقم کمانے کے قابل ہوں۔ یہ مضمون اعلی تعدد کی حکمت عملیوں اور کچھ آسان کوڈز کے بارے میں مزید تفصیل سے متعارف کرائے گا، جو بحث کے نقطہ آغاز کے طور پر کام کر سکتے ہیں، ہر کسی کو بات چیت کرنے اور رائے دینے کا خیرمقدم ہے۔
چھوٹ حاصل کرنے والے اکاؤنٹس کے لیے، مثال کے طور پر، موجودہ میکر کی چھوٹ 100,000 کا 0.5% ہے اگر یومیہ لین دین کا حجم 100 ملین U ہے تو چھوٹ 5,000 U ہوگی۔ بلاشبہ، لینے والے کی فیس اب بھی VIP کی شرح پر مبنی ہے، لہذا اگر حکمت عملی کے لیے آرڈر لینے کی ضرورت نہیں ہے، تو VIP سطح کا اعلی تعدد کی حکمت عملیوں پر بہت کم اثر پڑے گا۔ عام طور پر، تبادلے کی مختلف سطحوں پر مختلف چھوٹ کی شرح ہوتی ہے، اور لین دین کے حجم کو زیادہ برقرار رکھنے کی ضرورت ہوتی ہے۔ بہت عرصہ پہلے، جب کچھ کرنسیوں کی مارکیٹ میں بہت زیادہ اتار چڑھاؤ آیا تھا، تب بھی بغیر کسی چھوٹ کے منافع ہوتا تھا، چھوٹ کا منافع کا ایک بڑا حصہ ہوتا تھا، اور یہاں تک کہ مکمل طور پر اعلی تعدد والے تاجروں پر انحصار کیا جاتا تھا۔ سب سے اوپر کی شرح.
رفتار ہائی فریکوئینسی حکمت عملی کو ہائی فریکوئنسی کہنے کی وجہ یہ ہے کہ یہ بہت تیز ہے۔ سب سے کم لیٹنسی اور سب سے زیادہ مستحکم کنکشن حاصل کرنے کے لیے ایکسچینج کے کولو سرور میں شامل ہونا بھی اندرونی گردش کی شرائط میں سے ایک بن گیا ہے۔ حکمت عملی کی اندرونی وقت کی کھپت بھی ممکنہ حد تک کم ہونی چاہیے یہ مضمون میں استعمال کیے جانے والے ویب ساکٹ فریم ورک کو متعارف کرائے گا، جس میں ہم آہنگی کا استعمال ہوتا ہے۔
صحیح بازار۔ ہائی فریکوئنسی ٹریڈنگ کو مقداری تجارت کے زیور کے طور پر جانا جاتا ہے، مجھے یقین ہے کہ بہت سے پروگرامیٹک ٹریڈرز نے اسے آزمایا ہے، لیکن زیادہ تر لوگ شاید اس لیے رک جاتے ہیں کہ وہ پیسہ نہیں کماتے ہیں اور اس کی بنیادی وجہ شاید یہ ہے۔ کہ وہ تجارتی بازار کی تلاش میں ہیں۔ حکمت عملی کے ابتدائی مرحلے میں، کسی کو پیسے کی تجارت کرنے کے لیے نسبتاً آسان بازاروں کی تلاش کرنی چاہیے، تاکہ منافع اور بہتری پر رائے ملے، جو حکمت عملی کو آگے بڑھانے کے لیے سازگار ہو گی۔ اگر آپ سب سے زیادہ مسابقتی مارکیٹ میں شروعات کرتے ہیں اور بہت سے ممکنہ حریفوں سے مقابلہ کرتے ہیں، تو آپ پیسہ کھو دیں گے چاہے آپ کتنی ہی کوشش کریں اور آپ مزید برقرار نہیں رہ پائیں گے۔ میں نئے درج کردہ دائمی تجارتی جوڑوں کی سفارش کرتا ہوں، اس وقت، بہت زیادہ حریف نہیں ہیں، خاص طور پر جب تجارتی حجم نسبتاً زیادہ ہو۔ BTC اور ETH کے پاس سب سے زیادہ تجارتی حجم اور سب سے زیادہ فعال لین دین ہے، لیکن ان کا زندہ رہنا بھی سب سے مشکل ہے۔
مقابلے کا مقابلہ سر پر رکھیں۔ کوئی بھی ٹریڈنگ مارکیٹ متحرک طور پر تبدیل ہو رہی ہے اور یہ زیادہ واضح ہے کہ اس مارکیٹ میں داخل ہونے کا مطلب ہوشیار اور محنتی تاجروں کے گروپ سے ہے۔ صفر کی رقم والی مارکیٹ میں، آپ جتنا زیادہ کمائیں گے، دوسروں کی کمائی اتنی ہی کم ہوگی۔ آپ جتنے بعد میں داخل ہوں گے، یہ اتنا ہی مشکل ہوگا کہ جو لوگ پہلے سے مارکیٹ میں ہیں انہیں بھی بہتر ہونا چاہیے کیونکہ وہ کسی بھی وقت ختم ہو سکتے ہیں۔ تین یا چار سال پہلے کا بہترین موقع ہونا چاہیے تھا حال ہی میں، ڈیجیٹل کرنسی مارکیٹ کی مجموعی سرگرمی میں کمی آئی ہے، اور اب نئے لوگوں کے لیے اعلی تعدد کی تجارت میں مشغول ہونا بہت مشکل ہے۔
اعلی تعدد کی حکمت عملیوں کی بہت سی قسمیں ہیں۔
میری حکمت عملی رجحان اور مارکیٹ بنانے والے کا مجموعہ ہے، میں پہلے رجحان کا تعین کرتا ہوں، اور لین دین مکمل ہونے کے بعد فوری طور پر فروخت کا آرڈر دیتا ہوں۔
مندرجہ ذیل کوڈ بائنانس دائمی معاہدوں کے بنیادی فن تعمیر پر مبنی ہے، اور بنیادی طور پر ویب ساکٹ ڈیپتھ آرڈر فلو ٹریڈز مارکیٹ کی معلومات اور پوزیشن کی معلومات کو سبسکرائب کرتا ہے۔ چونکہ مارکیٹ کی معلومات اور اکاؤنٹ کی معلومات الگ الگ سبسکرائب کی جاتی ہیں، اس لیے ضروری ہے کہ ریڈ (-1) کو مسلسل استعمال کیا جائے تاکہ یہ معلوم کیا جا سکے کہ آیا ایونٹ لوپ (1000) کو یہاں براہ راست لامحدود لوپ سے بچنے اور سسٹم کے بوجھ کو کم کرنے کے لیے استعمال کیا گیا ہے۔ ایونٹ لوپ(1000) کو 1000ms کے ٹائم آؤٹ کے ساتھ، wss یا کنکرنٹ ٹاسک واپس آنے تک بلاک کر دیا جائے گا۔
var datastream = null
var tickerstream = null
var update_listenKey_time = 0
function ConncetWss(){
if (Date.now() - update_listenKey_time < 50*60*1000) {
return
}
if(datastream || tickerstream){
datastream.close()
tickerstream.close()
}
//需要APIKEY
let req = HttpQuery(Base+'/fapi/v1/listenKey', {method: 'POST',data: ''}, null, 'X-MBX-APIKEY:' + APIKEY)
let listenKey = JSON.parse(req).listenKey
datastream = Dial("wss://fstream.binance.com/ws/" + listenKey + '|reconnect=true', 60)
//Symbols是设定的交易对
let trade_symbols_string = Symbols.toLowerCase().split(',')
let wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string.join(Quote.toLowerCase()+"@aggTrade/")+Quote.toLowerCase()+"@aggTrade/"+trade_symbols_string.join(Quote.toLowerCase()+"@depth20@100ms/")+Quote.toLowerCase()+"@depth20@100ms"
tickerstream = Dial(wss_url+"|reconnect=true", 60)
update_listenKey_time = Date.now()
}
function ReadWss(){
let data = datastream.read(-1)
let ticker = tickerstream.read(-1)
while(data){
data = JSON.parse(data)
if (data.e == 'ACCOUNT_UPDATE') {
updateWsPosition(data)
}
if (data.e == 'ORDER_TRADE_UPDATE'){
updateWsOrder(data)
}
data = datastream.read(-1)
}
while(ticker){
ticker = JSON.parse(ticker).data
if(ticker.e == 'aggTrade'){
updateWsTrades(ticker)
}
if(ticker.e == 'depthUpdate'){
updateWsDepth(ticker)
}
ticker = tickerstream.read(-1)
}
makerOrder()
}
function main() {
while(true){
ConncetWss()
ReadWss()
worker()
updateStatus()
EventLoop(1000)
}
}
جیسا کہ پہلے ذکر کیا گیا ہے، میری اعلی تعدد کی حکمت عملی خرید و فروخت کو انجام دینے سے پہلے رجحان کا تعین کرنے کی ضرورت ہے۔ مختصر مدت کے رجحان کو بنیادی طور پر ہر ٹرانزیکشن کے لین دین کے ڈیٹا کی بنیاد پر پرکھا جاتا ہے، یعنی سبسکرپشن میں aggTrade، جس میں لین دین کی سمت، قیمت، مقدار، لین دین کا وقت، وغیرہ شامل ہیں۔ خرید و فروخت کے اہم حوالہ جات گہرائی اور تجارتی حجم ہیں۔ ذیل میں ان اشاریوں کا تفصیلی تعارف ہے جن پر توجہ دینے کی ضرورت ہے۔
//bull代表短期看涨,bear短期看跌
let bull = last_sell_price > avg_sell_price && last_buy_price > avg_buy_price &&
avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
let bear = last_sell_price < avg_sell_price && last_buy_price < avg_buy_price &&
avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;
اگر تازہ ترین فروخت کی قیمت اوسط فروخت کی قیمت سے زیادہ ہے، تازہ ترین قیمت خرید اوسط قیمت خرید سے زیادہ ہے، اور مقررہ وقفہ خریدنے کے آرڈر کی قیمت فروخت کے آرڈر کی قیمت سے زیادہ ہے، تو اسے مختصر مدتی تیزی کے طور پر سمجھا جاتا ہے . اس کے برعکس، یہ مندی ہے.
function updatePrice(depth, bid_amount, ask_amount) {
let buy_price = 0
let sell_price = 0
let acc_bid_amount = 0
let acc_ask_amount = 0
for (let i = 0; i < Math.min(depth.asks.length, depth.bids.length); i++) {
acc_bid_amount += parseFloat(depth.bids[i][1])
acc_ask_amount += parseFloat(depth.asks[i][1])
if (acc_bid_amount > bid_amount && buy_price == 0) {
buy_price = parseFloat(depth.bids[i][0]) + tick_size
}
if (acc_ask_amount > ask_amount && sell_price == 0) {
sell_price = parseFloat(depth.asks[i][0]) - tick_size
}
if (buy_price > 0 && sell_price > 0) {
break
}
}
return [buy_price, sell_price]
}
یہاں ہم اب بھی پرانے خیال کو اپناتے ہیں اور مطلوبہ رقم کی گہرائی کو دہراتے ہیں۔ 10 سککوں کا آرڈر خریدیں گے۔ آپ کو مخصوص ٹائم ونڈو سائز خود سیٹ کرنے کی ضرورت ہے۔
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
تناسب کا مطلب ہے فکسڈ ریشو، جس کا مطلب ہے کہ خرید آرڈر کی مقدار حالیہ فروخت آرڈر کی مقدار کا ایک مقررہ تناسب ہے۔ یہ حکمت عملی موجودہ خرید و فروخت کی سرگرمی کی بنیاد پر آرڈر کے سائز کو ایڈجسٹ کر سکتی ہے۔
if(bull && (sell_price-buy_price) > N * avg_diff) {
trade('buy', buy_price, buy_amount)
}else if(position.amount < 0){
trade('buy', buy_price, -position.amount)
}
if(bear && (sell_price-buy_price) > N * avg_diff) {
trade('sell', sell_price, sell_amount)
}else if(position.amount > 0){
trade('sell', sell_price, position.amount)
}
ان میں، اوسط مارکیٹ کی قیمت کا فرق ہے ایک خرید آرڈر صرف اس وقت دیا جائے گا جب بولی پوچھنے کا اسپریڈ اس قدر کے ایک خاص ملٹیپل سے زیادہ ہو اور اگر آپ کے پاس ایک مختصر آرڈر ہو، تو پوزیشن آرڈر کے طویل مدتی انعقاد سے بچنے کے لیے اس وقت بھی بند کر دیا جائے گا۔ آپ اس بات کو یقینی بنانے کے لیے صرف میکر آرڈر دے سکتے ہیں کہ زیر التواء آرڈر پر عمل ہو جائے۔ اور آپ Binance کی حسب ضرورت آرڈر ID استعمال کر سکتے ہیں، لہذا آپ کو آرڈر کی واپسی کا انتظار نہیں کرنا پڑے گا۔
var tasks = []
var jobs = []
function worker(){
let new_jobs = []
for(let i=0; i<tasks.length; i++){
let task = tasks[i]
jobs.push(exchange.Go.apply(this, task.param))
}
_.each(jobs, function(t){
let ret = t.wait(-1)
if(ret === undefined){
new_jobs.push(t)//未返回的任务下次继续等待
}
})
jobs = new_jobs
tasks = []
}
/*
需要的任务参数写在param里
tasks.push({'type':'order','param': ["IO", "api", "POST","/fapi/v1/order",
"symbol="+symbol+Quote+"&side="+side+"&type=LIMIT&timeInForce=GTX&quantity="+
amount+"&price="+price+"&newClientOrderId=" + UUID() +"×tamp="+Date.now()]})
*/