বিটমেক্স ক্রিপ্টোকারেন্সি লিভারেজ ট্রেডিংয়ের জন্য পছন্দের প্ল্যাটফর্ম হয়ে উঠেছে, তবে এর এপিআই ট্রেডিংয়ের বিধিনিষেধগুলি কঠোর এবং স্বয়ংক্রিয় ব্যবসায়ীরা খুব বিভ্রান্ত বোধ করে। এই নিবন্ধটি প্রধানত FMZ পরিমাণগত ট্রেডিং প্ল্যাটফর্মে এপিআই ব্যবহারের কিছু টিপস ভাগ করে, মূলত বাজার তৈরির কৌশল জন্য।
সর্বাধিক উল্লেখযোগ্য সুবিধা হল যে ট্রেডিং তরলতা খুব সক্রিয়, বিশেষ করে বিটকয়েন চিরস্থায়ী চুক্তি, লেনদেনের পরিমাণ প্রতি মিনিটে প্রায়শই এক মিলিয়ন বা এমনকি দশ মিলিয়ন মার্কিন ডলার ছাড়িয়ে যায়; বিটমেক্স পেনডিং অর্ডার ট্রেডিংয়ের রিটার্ন কমিশন ফি নীতি রয়েছে, যদিও এটি খুব বেশি নয়, তবে বিপুল সংখ্যক মার্কেট মেকিং ট্রেডিংয়ের আকর্ষণ করেছে, যা দামের গভীরতাকে খুব সমৃদ্ধ করেছে। সর্বশেষ ক্রয় এবং বিক্রয় মূল্যের প্রায়শই এক মিলিয়ন ডলারেরও বেশি মূল্যের পেনডিং অর্ডার থাকে; এই কারণে, লেনদেনের দাম প্রায়শই $ 0.50 এর সর্বনিম্ন পরিবর্তন ইউনিটের চারপাশে ওঠানামা করে।
REST API এর অনুরোধের ফ্রিকোয়েন্সি প্রতি 5 মিনিটে 300 বার সীমাবদ্ধ, প্রায় প্রতি সেকেন্ডে 1 বার সমান, এই সীমাটি অন্যান্য ট্রেডিং প্ল্যাটফর্মের তুলনায় খুব কঠোর বলে বলা যেতে পারে। সীমা অতিক্রম করার পরে,
বিটমেক্স আরইএসটি এপিআই আরও সীমাবদ্ধ। অফিসিয়াল সুপারিশটি হ'ল ওয়েবসকেট প্রোটোকলটি আরও বেশি ব্যবহার করা, এবং গড় বিনিময় থেকে আরও ডেটা প্রকারের চাপ দেওয়া। নির্দিষ্ট ব্যবহারের জন্য নিম্নলিখিত পয়েন্টগুলিতে মনোযোগ দিনঃ
যদি গভীরতা ডেটা পুশ সময় খুব দীর্ঘ হয়, একটি ত্রুটি হবে, যা প্রকৃত গভীরতার সাথে মিলে না। এটি অনুমান করা হয় যে সেখানে অনেক গভীরতা পরিবর্তন আছে এবং পুশ মধ্যে বাদ দেওয়া আছে, কিন্তু সাধারণভাবে, চমৎকার তরলতা কারণে, আপনি
var ticker = {price:0, buy:0, sell:0, time:0} //Ticker information, the latest price, "buy one" price, "sell one" price, update time
//Account information, respectively, position, buying and selling price, buying and selling quantity, position status, order Id
var info = {position:0, buyPrice:0, sellPrice:0, buyAmount:0, sellAmount:0, buyState:0, sellState:0, buyId:0, sellId:0}
var buyListId = []//Global variables, pre-emptive buying id list, will described below
var sellListId = []
var APIKEY = 'your api id' //Need to fill in the BitMEX API ID here. Note that it is not a key, which is required for websocket protocol authentication.
var expires = parseInt(Date.now() / 1000) + 10
var signature = exchange.HMAC("sha256", "hex", "GET/realtime" + expires, "{{secretkey}}")//The secretkey will be automatically replaced at the bottom level and does not need to be filled in.
var bitmexClient = Dial("wss://www.bitmex.com/realtime", 60)
var auth = JSON.stringify({args: [APIKEY, expires, signature], op: "authKeyExpires"})//Authentication information, otherwise you cannot subscribe to the account
bitmexClient.write(auth)
bitmexClient.write('{"op": "subscribe", "args": ["position","execution","trade:XBTUSD"]}')//Subscribed to positions, order execution and perpetual contract real-time transaction
while(true){
var data = bitmexClient.read()
if(data){
bitmexData = JSON.parse(data)
if('table' in bitmexData && bitmexData.table == 'trade'){
data = bitmexData.data
ticker.price = parseFloat(data[data.length-1].price)//The latest transaction price, will push multiple transactions at a time, take one will be ok
//You can get the "buy one" and "sell one" price according to the direction of the latest transaction, without subscribing to the depth.
if(data[data.length-1].side == 'Buy'){
ticker.sell = parseFloat(data[data.length-1].price)
ticker.buy = parseFloat(data[data.length-1].price)-0.5
}else{
ticker.buy = parseFloat(data[data.length-1].price)
ticker.sell = parseFloat(data[data.length-1].price)+0.5
}
ticker.time = new Date(data[data.length-1].timestamp);//Update time, can be used to determine the delay
}
}else if(bitmexData.table == 'position'){
var position = parseInt(bitmexData.data[0].currentQty)
if(position != info.position){
Log('Position change: ', position, info.position, '#FF0000@')//Position change Log, and pushed to WeChat, remove @ means Do not push
info.position = position
}
info.position = parseInt(bitmexData.data[0].currentQty)
}
}
বিটমেক্স আনুষ্ঠানিকভাবে অর্ডার দেওয়ার জন্য
নিম্নলিখিতটি হ'ল নির্দিষ্ট বাস্তবায়ন কোডঃ
// Cancel all orders and reset global variables
function cancelAll(){
exchange.IO("api","DELETE","/api/v1/order/all","symbol=XBTUSD")//Call IO extension revocation
info = {position:0, buyPrice:0, sellPrice:0, buyAmount:0, sellAmount:0, buyState:0, sellState:0, buyId:0, sellId:0}
buyListId = []
sellListId = []
}
//placing alternate order
function waitOrders(){
var orders = []
if(buyListId.length<4){
//When the number of inspections is insufficient, place another "bulk"
for(var i=0;i<7;i++){
//Due to BitMEX restrictions, the price can not be excessively excessive, the order quantity can not be too small, and the "execInst" parameter guarantees that only the market making transaction can be executed.
orders.push({symbol:'XBTUSD', side:'Buy', orderQty:100, price:ticker.buy-400+i, execInst:'ParticipateDoNotInitiate'})
}
}
if(sellListId.length<4){
for(var i=0;i<7;i++){
orders.push({symbol:'XBTUSD', side:'Sell', orderQty:100, price:ticker.buy+400+i, execInst:'ParticipateDoNotInitiate'})
}
}
if(orders.length>0){
var param = "orders=" + JSON.stringify(orders);
var ids = exchange.IO("api", "POST", "/api/v1/order/bulk", param);//Bulk orders submitted here
for(var i=0;i<ids.length;i++){
if(ids.side == 'Buy'){
buyListId.push(ids.orderID)
}else{
sellListId.push(ids.orderID)
}
}
}
}
//Modify order function
function amendOrders(order, direction, price, amount, id){
var param = "orders=" + JSON.stringify(order);
var ret = exchange.IO("api", "PUT", "/api/v1/order/bulk", param);//Modify one order at a time
//Modification occurs error
if(!ret){
var err = GetLastError()
//overloaded unmodified strategy, need to recycle the order id
if(err.includes('The system is currently overloaded')){
if(id){
if(direction == 'buy'){
buyListId.push(id)
}else{
sellListId.push(id)
}
}
Sleep(1000)
return
}
//Illegal order status, indicating that the order to be modified has been completely executed
else if(err.includes('Invalid ordStatus')){
Log(order, direction)
if(direction == 'buy'){
info.buyId = 0
info.buyState = 0
info.buyAmount = 0
info.buyPrice = 0
}else{
info.sellId = 0
info.sellState = 0
info.sellAmount = 0
info.sellPrice = 0
}
//Since the push is not timely, update the position with the "rest" protocol here.
pos = _C(exchange.GetPosition)
if(pos.length>0){
info.position = pos[0].Type == 0 ? pos[0].Amount : -pos[0].Amount
}else{
info.position = 0
}
}
//Unknown error cannot be modified, all orders are cancelled, reset once
else if(err.includes('Invalid orderID')){
cancelAll()
Log('Invalid orderID,reset once')
}
//Exceed the frequency limit, you can continue to try after hibernation
else if(err.includes('Rate limit exceeded')){
Sleep(2000)
return
}
//The account is banned, all orders are revoked, and sleep is awaiting recovery for a long time.
else if(err.includes('403 Forbidden')){
cancelAll()
Log('403,reset once')
Sleep(5*60*1000)
}
}else{
//Modify order successfully
if(direction == 'buy'){
info.buyState = 1
info.buyPrice = price
info.buyAmount = amount
}else{
info.sellState = 1
info.sellPrice = price
info.sellAmount = amount
}
}
}
//0.5 price change
function fixSize(num){
if(num>=_N(num,0)+0.75){
num = _N(num,0)+1
}else if(num>=_N(num,0)+0.5){
num=_N(num,0)+0.5
}else{
num=_N(num,0)
}
return num
}
//Trading function
function trade(){
waitOrders()//Check if you need a replacement order
var buyPrice = fixSize(ticker.buy-5) //For demonstration purposes only, specific transactions should be written by yourself.
var sellPrice = fixSize(ticker.sell+5)
var buyAmount = 500
var sellAmount = 500
//Modify from an alternate order when there is no order
if(info.buyState == 0 && buyListId.length > 0){
info.buyId = buyListId.shift()
amendOrders([{orderID:info.buyId, price:buyPrice, orderQty:buyAmount}],'buy', group, buyPrice, buyAmount, info.buyId)
}
if(info.sellState == 0 && sellListId.length > 0){
info.sellId = sellListId.shift()
amendOrders([{orderID: info.sellId, price:sellPrice, orderQty:sellAmount}],'sell', group, sellPrice, sellAmount, info.sellId )
}
//Existing orders need to change price
if(buyPrice != info.buyPrice && info.buyState == 1){
amendOrders([{orderID:info.buyId, price:buyPrice, orderQty:buyAmount}],'buy', group, buyPrice, buyAmount)
}
if(sellPrice != info.sellPrice && info.sellState == 1){
amendOrders([{orderID:info.sellId, price:sellPrice, orderQty:sellAmount}],'sell', group, sellPrice, sellAmount)
}
}
বিটমেক্স এর সার্ভারটি আয়ারল্যান্ডের ডাবলিনে অবস্থিত আমাজন এর সার্ভারে অবস্থিত। আপনি ডাবলিনে একটি এডাব্লুএস ক্লাউড সার্ভার নির্বাচন করলে সার্ভার চলমান কৌশল পিং 1 এমএস এরও কম হয়, তবে যখন এখনও ধাক্কা দেওয়ার ক্ষেত্রে বিলম্ব হয়, তখন ওভারলোড সমস্যা সমাধান করা যায় না। এছাড়াও, যখন অ্যাকাউন্টটি লগ ইন হয়, সার্ভার এজেন্ট মার্কিন যুক্তরাষ্ট্র এবং অন্যান্য জায়গায় অবস্থিত হতে পারে না যেখানে ক্রিপ্টোকারেন্সি ট্রেডিংয়ের অনুমতি দেয় না। নিয়ন্ত্রণের কারণে অ্যাকাউন্টটি নিষিদ্ধ করা হবে।
এই নিবন্ধে কোডটি আমার ব্যক্তিগত কৌশল থেকে পরিবর্তিত হয়েছে এবং রেফারেন্সের জন্য সম্পূর্ণরূপে সঠিক হওয়ার নিশ্চয়তা দেওয়া হয় না। বাজারের কোডের নির্দিষ্ট ব্যবহারটি মূল ফাংশনে সম্পাদিত হওয়া উচিত, ট্রেডিং সম্পর্কিত কোডটি মূল ফাংশনের আগে স্থাপন করা হয় এবং ট্রেড ((() ফাংশনটি পুশ মার্কেট কোটে স্থাপন করা হয়।
জিএমজিফিলডাব্লুএস সংযোগকারী একটি ত্রুটি উৎপন্ন করেঃ ReferenceError: identifier 'data' undefined at... রেফারেন্স ত্রুটিঃ সনাক্তকারী 'ডেটা' সংজ্ঞায়িত নয়...
ঘাসএকটি কোড ত্রুটি, সমস্যা সংশোধন করা হয়েছে