میں نے 2020 میں ایک مضمون لکھا تھا جس میں ہائی فریکوئنسی کی حکمت عملی متعارف کرائی گئی تھی،https://www.fmz.com/bbs-topic/9750. اگرچہ اس نے کافی توجہ حاصل کی ، لیکن یہ بہت گہرائی میں نہیں تھا۔ اس کے بعد سے دو سال سے زیادہ کا عرصہ گزر چکا ہے ، اور مارکیٹ بدل گئی ہے۔ اس مضمون کی اشاعت کے بعد ، میری ہائی فریکوئنسی حکمت عملی طویل عرصے تک مستحکم منافع کما سکتی تھی ، لیکن آہستہ آہستہ ، منافع میں کمی واقع ہوئی اور یہاں تک کہ ایک مقام پر رک گئی۔ حالیہ مہینوں میں میں نے اس کی تجدید کے لئے کچھ کوششیں کیں ، اور اب یہ ابھی بھی کچھ منافع کما سکتا ہے۔ اس مضمون میں ، میں اپنے ہائی فریکوئنسی حکمت عملی کے خیالات کا مزید تفصیلی تعارف پیش کروں گا اور گفتگو کے لئے ایک نقطہ اغاز کے طور پر کچھ آسان کوڈ فراہم کروں گا۔ اور آراء کا خیرمقدم کیا جاتا ہے۔
ریبیٹ اکاؤنٹس ، بائننس کو مثال کے طور پر لیتے ہوئے ، اس وقت اس کی تخلیق کار کی چھوٹ 0.0005٪ ہے۔ اگر روزانہ کی ٹرانزیکشن کی رقم 100 ملین یو ہے تو ، چھوٹ 5000 یو ہوگی۔ یقینا ، لینے والے کی فیسیں اب بھی وی آئی پی کی شرحوں پر مبنی ہیں ، لہذا اگر حکمت عملی میں لینے والوں کی ضرورت نہیں ہے تو ، وی آئی پی کی سطح کا اعلی تعدد کی حکمت عملیوں پر بہت کم اثر پڑتا ہے۔ تبادلے کی مختلف سطحوں میں عام طور پر مختلف چھوٹ کی شرحیں ہوتی ہیں اور اعلی ٹرانزیکشن کی رقم کو برقرار رکھنے کی ضرورت ہوتی ہے۔ ابتدائی اوقات میں جب کچھ کرنسی مارکیٹوں میں بہت اتار چڑھاؤ ہوتا تھا ، تب بھی چھوٹ کے بغیر منافع ہوتا تھا۔ جیسے جیسے مقابلہ شدت اختیار کرتا گیا ، چھوٹ میں منافع کا ایک بڑا حصہ ہوتا تھا یا یہاں تک کہ صرف ان پر انحصار ہوتا تھا۔ اعلی تعدد کے تاجر اعلی سطح کی فیسوں کا پیچھا کرتے تھے۔
رفتار۔ ہائی فریکوئنسی حکمت عملیوں کو ہائی فریکوئنسی کیوں کہا جاتا ہے اس کی وجہ یہ ہے کہ وہ بہت تیز ہیں۔ ایکسچینج کے کلو سرور میں شامل ہونا ، کم سے کم تاخیر اور مستحکم ترین کنکشن حاصل کرنا بھی اندرونی مقابلہ کی شرائط میں سے ایک بن گیا ہے۔ حکمت عملی کا اندرونی استعمال کا وقت کم سے کم ہونا چاہئے ، اور یہ مضمون میرے استعمال کردہ ویب ساکٹ فریم ورک کا تعارف کرائے گا ، جو بیک وقت عمل درآمد کو اپناتا ہے۔
مناسب مارکیٹ۔ ہائی فریکوئنسی ٹریڈنگ کو مقداری تجارت کا موتی کہا جاتا ہے ، اور بہت سارے پروگرامٹک تاجروں نے اس کی کوشش کی ہے ، لیکن زیادہ تر لوگوں نے اس کی کوشش کو روک دیا کیونکہ وہ منافع نہیں کما سکتے اور بہتری کی سمت نہیں ڈھونڈ سکتے ہیں۔ اس کی بنیادی وجہ یہ ہونی چاہئے کہ انہوں نے غلط تجارتی مارکیٹ کا انتخاب کیا ہے۔ حکمت عملی کی ترقی کے ابتدائی مرحلے میں ، تجارت میں منافع کمانے کے لئے نسبتا easy آسان مارکیٹوں کا انتخاب کیا جانا چاہئے تاکہ منافع اور اصلاح کے لئے آراء موجود ہوں ، جو حکمت عملی کی ترقی کے لئے موزوں ہو۔ اگر آپ بہت سارے ممکنہ مخالفین کے ساتھ انتہائی مسابقتی مارکیٹ میں مقابلہ کرنا شروع کردیں تو ، چاہے آپ کتنی ہی کوشش کریں ، آپ جلد ہی پیسہ کھو دیں گے اور ہار مان لیں گے۔ میں نئے دائمی معاہدے کی تجارت کے جوڑوں کی سفارش کرتا ہوں جب اتنے زیادہ حریف نہیں ہیں ، خاص طور پر نسبتا large بڑی ٹرانزیکشن کی رقم والے۔ یہ وہ وقت ہوتا ہے جب منافع کمانا سب سے آسان ہوتا ہے۔ بی ٹی سی اور ایچ ٹی میں سب سے زیادہ ٹرانزیکشن کی رقم ہوتی ہے اور سب سے زیادہ فعال ٹرانزیکشنز
مقابلہ کا سامنا کرنا۔ کسی بھی لین دین کے لئے مارکیٹ مستقل طور پر بدلتی رہتی ہے ، اور کوئی بھی تجارتی حکمت عملی ہمیشہ کے لئے نہیں چل سکتی ، خاص طور پر اعلی تعدد کی تجارت میں۔ اس مارکیٹ میں داخل ہونے کا مطلب ہے کہ براہ راست ہوشیار اور محنتی تاجروں کے ساتھ مقابلہ کرنا۔ صفر رقم والے کھیل کی مارکیٹ میں ، جتنا زیادہ آپ کمائیں گے ، دوسروں کو کم کمائیں گے۔ جتنا دیر سے آپ داخل ہوں گے ، مشکل اتنی ہی زیادہ ہوگی۔ پہلے سے ہی مارکیٹ میں موجود لوگوں کو بھی مستقل طور پر بہتری لانا ہوگی۔ 3-4 سال پہلے شاید بہترین موقع تھا؛ حال ہی میں ، ڈیجیٹل کرنسی مارکیٹوں میں مجموعی سرگرمی میں کمی واقع ہوئی ہے ، جس سے نئے آنے والوں کے لئے اب اعلی تعدد کی تجارت شروع کرنا بہت مشکل ہے۔
مختلف ہائی فریکوئنسی کی حکمت عملی ہیں:
مندرجہ ذیل کوڈ بائننس دائمی معاہدوں کے بنیادی فریم ورک پر مبنی ہے ، بنیادی طور پر ویب ساکٹ کی گہرائی ، گہرائی آرڈر فلو ٹریڈز مارکیٹ کے اعداد و شمار اور پوزیشن کی معلومات کو سبسکرائب کرتا ہے۔ چونکہ مارکیٹ کے اعداد و شمار اور اکاؤنٹ کی معلومات کو الگ الگ سبسکرائب کیا جاتا ہے ، لہذا یہ معلوم کرنے کے لئے مستقل طور پر پڑھنے کی ضرورت ہے کہ آیا تازہ ترین معلومات حاصل کی گئیں۔ یہاں ایونٹ لوپ 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()
}
//Need 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 are the set trading pairs
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)
}
}
جیسا کہ پہلے ذکر کیا گیا ہے ، میری اعلی تعدد کی حکمت عملی میں خرید و فروخت کے عمل کو انجام دینے سے پہلے رجحان کا تعین کرنے کی ضرورت ہے۔ قلیل مدتی رجحان بنیادی طور پر ٹک ٹاک ٹرانزیکشن کے اعداد و شمار ، یعنی سبسکرپشن میں ایگ ٹریڈ کی بنیاد پر فیصلہ کیا جاتا ہے ، جس میں ٹرانزیکشن کی سمت ، قیمت ، مقدار ، ٹرانزیکشن کا وقت وغیرہ شامل ہے۔ خرید و فروخت بنیادی طور پر گہرائی اور تجارتی رقم سے مراد ہے۔ مندرجہ ذیل اشارے کے بارے میں تفصیلی تعارف ہیں جن کے بارے میں فکر مند ہونا چاہئے۔ ان میں سے بیشتر کو خرید و فروخت کے گروپوں میں تقسیم کیا جاتا ہے اور ایک خاص وقت کی کھڑکی کے اندر متحرک طور پر شمار کیا جاتا ہے۔ میری حکمت عملی کی وقت کی کھڑکی 10 سیکنڈ کے اندر ہے۔
//bull represents short-term bullish, bear represents short-term bearish
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;
اگر آخری فروخت کی قیمت اوسط فروخت کی قیمت سے زیادہ ہے ، آخری خریداری کی قیمت اوسط خریداری کی قیمت سے زیادہ ہے ، اور مقررہ وقفے خرید آرڈر کی قیمت فروخت آرڈر کی قیمت سے زیادہ ہے ، تو اسے قلیل مدتی تیزی سے سمجھا جاتا ہے۔ اس کے برعکس ، یہ bearish ہے۔
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 سکے 1 سیکنڈ میں تجارت کی جاسکتی ہے ، بغیر کسی نئے زیر التواء آرڈرز پر غور کیے ، فروخت کی قیمت اس پوزیشن پر طے کی جاتی ہے جہاں 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)
}
جہاں avg_diff اوسط مارکیٹ کی قیمت کا فرق ہے ، اور خرید آرڈر صرف اس وقت دیا جائے گا جب بولی مانگنے کا پھیلاؤ اس قدر کے ایک خاص ضرب سے زیادہ ہو اور یہ تیزی سے ہو۔ اگر مختصر پوزیشن رکھنا ہے تو ، یہ طویل عرصے تک رکھنے سے بچنے کے لئے پوزیشن کو بھی بند کردے گا۔ احکامات کو صرف بنانے والے احکامات کے طور پر رکھا جاسکتا ہے تاکہ ان کی کارروائی کو یقینی بنایا جاسکے۔ مزید برآں ، بائننس کی کسٹم آرڈر آئی ڈی کا استعمال کیا جاسکتا ہے تاکہ آرڈر کے جواب کا انتظار کرنے کی ضرورت نہ ہو۔
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)//Unreturned tasks will continue to wait next time
}
})
jobs = new_jobs
tasks = []
}
/*
Write the required task parameters in 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()]})
*/