میں نے 2020 میں ایک مضمون لکھا تھا جس میں ہائی فریکوئینسی ٹریڈنگ کی حکمت عملی متعارف کروائی گئی تھی (https://www.fmz.com/digest-topic/6228اگرچہ اس نے کچھ توجہ حاصل کی ، لیکن یہ بہت گہرائی میں نہیں تھا۔ اس کے بعد سے ڈھائی سال گزر چکے ہیں ، اور مارکیٹ بدل گئی ہے۔ اس مضمون کو شائع کرنے کے بعد ، میری ہائی فریکوئنسی حکمت عملی ایک طویل عرصے تک مستحکم منافع کمانے میں کامیاب رہی ، لیکن منافع آہستہ آہستہ کم ہوا اور یہاں تک کہ ایک مقام پر رک گیا۔ حالیہ مہینوں میں ، میں نے اس کو تجدید کرنے میں وقت صرف کیا ہے ، اور یہ اب بھی کچھ چھوٹے منافع حاصل کرسکتا ہے۔ یہ مضمون میری ہائی فریکوئنسی ٹریڈنگ حکمت عملی اور کچھ آسان کوڈ کا مزید تفصیلی تعارف فراہم کرے گا ، جو بحث اور آراء کے لئے ایک نقطہ اغاز کے طور پر کام کرتا ہے۔
کمیشن کے ریبیٹ اکاؤنٹس
مثال کے طور پر بائننس کا استعمال کرتے ہوئے ، فی الحال ہر 100،000 یونٹ کی تجارت کے لئے 0.05٪ کی تخفیف پیش کرتے ہیں۔ اگر روزانہ ٹریڈنگ کا حجم 100 ملین یو ہے تو ، تخفیف 5،000 یو ہے۔ یقینا ، لینے والا معاوضہ اب بھی وی آئی پی کی شرح پر منحصر ہے ، لہذا اگر حکمت عملی کو آرڈر لینے کی ضرورت نہیں ہے تو ، وی آئی پی کی سطح کا اعلی تعدد کی حکمت عملی پر بہت کم اثر پڑتا ہے۔ مختلف تبادلے پر کمیشن کی چھوٹ کی مختلف سطحیں دستیاب ہیں ، جس کی وجہ سے اعلی تجارتی حجم کی ضرورت ہوتی ہے۔ ابتدائی دنوں میں ، ابھی بھی چھوٹ کے بغیر منافع حاصل کیا جاسکتا تھا ، لیکن چونکہ مقابلہ شدت اختیار کر گیا ہے ، چھوٹ میں منافع کا ایک بڑا حصہ تھا ، اور اعلی تعدد کے تاجروں نے اعلی شرحوں کا پیچھا کیا۔
رفتار
ہائی فریکوئنسی ٹریڈنگ کو اس کی تیز رفتار کی وجہ سے کہا جاتا ہے۔ تجارتی تبادلے کے کلوکیشن سرور میں شامل ہونا اور کم سے کم تاخیر اور مستحکم ترین کنکشن حاصل کرنا مقابلہ کی شرائط میں سے ایک بن گیا ہے۔ حکمت عملی کا داخلی پروسیسنگ کا وقت بھی کم سے کم ہونا چاہئے۔ اس مضمون میں ویب ساکٹ فریم ورک کا تعارف کروایا جائے گا جس کا میں نے استعمال کیا ہے ، جو بیک وقت عملدرآمد کا استعمال کرتا ہے۔
مناسب مارکیٹ
ہائی فریکوئنسی ٹریڈنگ کو مقداری تجارت کے تاج میں جواہرات سمجھا جاتا ہے ، اور مجھے یقین ہے کہ بہت سارے الگورتھمک تاجروں نے اس کی کوشش کی ہے ، لیکن زیادہ تر لوگوں کو اس کی کوشش کرنی چاہئے تھی کیونکہ وہ پیسہ نہیں کما سکتے تھے اور بہتر بنانے کا کوئی طریقہ نہیں ڈھونڈ سکتے تھے۔ اس کی بنیادی وجہ شاید اس لئے ہے کیونکہ انہوں نے غلط تجارتی مارکیٹ کا انتخاب کیا تھا۔ حکمت عملی کے ابتدائی مرحلے میں ، منافع کمانے کے ل relatively نسبتا easy آسان مارکیٹوں کو تجارت کے لئے نشانہ بنایا جانا چاہئے اور بہتری کے لئے آراء موصول کرنا چاہئے ، جو حکمت عملی کی ترقی کے لئے سازگار ہے۔ اگر آپ انتہائی مسابقتی مارکیٹ میں شروع کرتے ہیں اور بہت سارے مخالفین کے ساتھ مقابلہ کرتے ہیں تو ، آپ کتنی ہی کوشش کریں ، آپ پیسہ کھو دیں گے ، اور آپ جلدی سے ہار جائیں گے۔ میں تجویز کرتا ہوں کہ نئے لانچ کردہ دائمی معاہدے کے تجارتی جوڑوں سے شروع کریں ، جہاں کم حریف ہیں ، خاص طور پر نسبتا large بڑے تجارتی حجم والے ، جس سے پیسہ کمانا آسان ہوجاتا ہے۔ بی ٹی سی اور ایچ ایچ میں سب سے زیادہ حجم اور سب سے زیادہ سرگرمی ہوتی ہے ، لیکن وہ
مقابلہ کا سامنا کریں
کسی بھی تجارت کے لئے مارکیٹ مسلسل بدل رہی ہے ، اور کوئی بھی تجارتی حکمت عملی ایک وقت کا حل نہیں ہوسکتی ہے۔ یہ ہائی فریکوئنسی ٹریڈنگ میں اور بھی واضح ہے ، جہاں مارکیٹ میں داخل ہونے کا مطلب ہے کہ ذہین ترین اور محنتی ترین تاجروں کے ساتھ براہ راست مقابلہ کرنا۔ صفر رقم والے گیم مارکیٹ میں ، جتنا زیادہ آپ کمائیں گے ، دوسروں کو کم کمائیں گے۔ جتنا دیر سے آپ داخل ہوں گے ، اتنا ہی مشکل ہوگا ، اور جو پہلے سے ہی مارکیٹ میں ہیں انہیں مستقل طور پر بہتر ہونا چاہئے اور کسی بھی وقت ختم کیا جاسکتا ہے۔ تین یا چار سال پہلے شاید بہترین موقع تھا ، لیکن ڈیجیٹل کرنسی مارکیٹ میں سرگرمی میں حالیہ مجموعی کمی کے ساتھ ، ابتدائیوں کے لئے ہائی فریکوئنسی ٹریڈنگ کرنا شروع کرنا بہت مشکل ہوگیا ہے۔
اعلی تعدد کی تجارت کی کئی حکمت عملی ہیں ، جیسے ہائی فریکوئینسی آربراج ، جس میں اس یا دوسرے تبادلے کے ذریعہ آربراج کے مواقع تلاش کرنا شامل ہے ، دوسروں سے پہلے آرڈر کھانے اور رفتار کے فائدہ کے ساتھ منافع کمانے کا موقع استعمال کرنا۔ ہائی فریکوئینسی ٹرینڈ ٹریڈنگ ، جس میں قلیل مدتی رجحانات سے فائدہ اٹھانا شامل ہے۔ اور مارکیٹ بنانے ، جس میں خرید و فروخت کی تجارت کے دونوں اطراف پر آرڈر دینا ، پوزیشنوں کو اچھی طرح سے کنٹرول کرنا اور کمیشن کی چھوٹ کے ذریعے منافع کمانا شامل ہے۔ میری حکمت عملی میں رجحان اور مارکیٹ بنانے کا امتزاج ہے ، پہلے رجحانات کی نشاندہی کریں اور پھر آرڈر دیں ، عمل درآمد کے فورا بعد فروخت کریں اور انوینٹری پوزیشنوں کو نہ رکھیں۔ ذیل میں حکمت عملی کوڈ کا تعارف ہے۔
مندرجہ ذیل کوڈ بائننس دائمی معاہدے کی بنیادی فن تعمیر پر مبنی ہے اور بنیادی طور پر ویب ساکٹ گہرائی آرڈر فلو تجارت اور پوزیشن کی معلومات کو سبسکرائب کرتا ہے۔ چونکہ مارکیٹ کے اعداد و شمار اور اکاؤنٹ کی معلومات کو الگ الگ سبسکرائب کیا جاتا ہے ، لہذا یہ معلوم کرنے کے لئے مستقل طور پر پڑھنے (-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()
}
// 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 is the pair of symbol
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 سیکنڈ کے اندر ہے۔
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]
}
یہاں ، مطلوبہ مقدار تک گہرائی کو دہرانے کا پرانا طریقہ اب بھی استعمال ہوتا ہے۔ فرض کریں کہ ایک خرید آرڈر جو 1 سیکنڈ کے اندر 10 سکے کے لئے عملدرآمد کیا جاسکتا ہے اور نئے احکامات کی صورتحال پر غور کیے بغیر ، فروخت کی قیمت اس پوزیشن پر طے کی جاتی ہے جہاں خرید آرڈر
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)//未返回的任务下次继续等待
}
})
jobs = new_jobs
tasks = []
}
/*
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()]})
*/