市場へのアクセスにはRESTとWebsocketがあるが,Websocketは様々な不可抗的な要因によって接続が強制的に切断される場合,策は様々なエラー容認メカニズムを準備する必要がある.RESTは最も安定した方法である. OKExのような複数のポリシーが同じプラットフォーム上で実行されている場合,REST APIへのアクセスには,IP制限,アカウント制限,またはその両者の組み合わせなど,さまざまな制限方法があります. REST リクエストの頻度を低減する
// a client for market center, https://github.com/goex-top/market_center // api list // * GetSupportList // * SubscribeSpotTicker // * SubscribeSpotDepth // * ~~SubscribeSpotTrade~~ // * GetSpotTicker // * GetSpotDepth // * ~~GetSpotTrade~~ // * SubscribeFutureTicker // * SubscribeFutureDepth // * ~~SubscribeFutureTrade~~ // * GetFutureTicker // * GetFutureDepth // * ~~GetFutureTrade~~ // params wit web // var udspath = /tmp/goex.market.center //ref to https://github.com/goex-top/market_center/blob/1e1bb15c69a1da6fddbba3d506920e91f9ec7842/const.go#L35 // local variable // var client = null var ReqType = { ReqType_GetSupportList: 1, ReqType_SubscribeSpotDepth: 2, ReqType_SubscribeSpotTicker: 3, ReqType_SubscribeFutureDepth: 4, ReqType_SubscribeFutureTicker: 5, ReqType_GetSpotDepth: 6, ReqType_GetSpotTicker: 7, ReqType_GetFutureDepth: 8, ReqType_GetFutureTicker: 9, } //--------------------------------------- function newUDSClient() { var client = Dial('unix://'+udspath) if (null === client) { throw 'new usd client fail' } return client } function udsRequest(client, req) { try { client.write(JSON.stringify(req)) var rsp = client.read(20) if (rsp === null) { return null } var obj = JSON.parse(rsp) if(obj.status !== 0) { return null } return obj.data } catch(e) { return null } } function GetSupportList(client) { var req = {type:ReqType.ReqType_GetSupportList} var rsp = udsRequest(client, req) if (rsp === null) { return null } return rsp } function GetSpotDepth(client, exchangeName, pair) { var req = {type:ReqType.ReqType_GetSpotDepth, exchange_name: exchangeName, currency_pair: pair} var rsp = udsRequest(client, req) if(rsp === null) { return null } return {Asks:rsp.AskList, Bids:rsp.BidList, Time:rsp.UTime, Info:rsp.rsp} } function GetSpotTicker(client, exchangeName, pair) { var req = {type:ReqType.ReqType_GetSpotTicker, exchange_name: exchangeName, currency_pair: pair} var rsp = udsRequest(client, req) if(rsp === null) { return null } return { Last:parseFloat(rsp.last), Buy:parseFloat(rsp.buy), Sell:parseFloat(rsp.sell), Volume:parseFloat(rsp.vol), Time:parseFloat(rsp.date), High:parseFloat(rsp.high), Low:parseFloat(rsp.low), Info:rsp } } function SubscribeSpotDepth(client, exchangeName, pair, period) { var req = {type:ReqType.ReqType_SubscribeSpotDepth, exchange_name: exchangeName, currency_pair: pair, period: period} var rsp = udsRequest(client, req) return rsp } function SubscribeSpotTicker(client, exchangeName, pair, period) { var req = {type:ReqType.ReqType_SubscribeSpotTicker, exchange_name: exchangeName, currency_pair: pair, period: period} var rsp = udsRequest(client, req) return rsp } function GetFutureDepth(client, exchangeName, contractType, pair) { var req = {type:ReqType.ReqType_GetFutureDepth, exchange_name: exchangeName, contract_type: contractType, currency_pair: pair} var rsp = udsRequest(client, req) if(rsp === null) { return null } return {Asks:rsp.AskList, Bids:rsp.BidList, Time:rsp.UTime, Info:rsp.rsp} } function GetFutureTicker(client, exchangeName, contractType, pair) { var req = {type:ReqType.ReqType_GetFutureTicker, exchange_name: exchangeName, contract_type: contractType, currency_pair: pair} var rsp = udsRequest(client, req) if(rsp === null) { return null } return { Last:parseFloat(rsp.last), Buy:parseFloat(rsp.buy), Sell:parseFloat(rsp.sell), Volume:parseFloat(rsp.vol), Time:parseFloat(rsp.date), High:parseFloat(rsp.high), Low:parseFloat(rsp.low), Info:rsp } } function SubscribeFutureDepth(client, exchangeName, contractType, pair, period) { var req = {type:ReqType.ReqType_SubscribeFutureDepth, exchange_name: exchangeName, contract_type: contractType, currency_pair: pair, period: period} var rsp = udsRequest(client, req) return rsp } function SubscribeFutureTicker(client, exchangeName, contractType, pair, period) { var req = {type:ReqType.ReqType_SubscribeFutureTicker, exchange_name: exchangeName, contract_type: contractType, currency_pair: pair, period: period} var rsp = udsRequest(client, req) return rsp } var MarketCenterClient = (function() { function MarketCenterClient() { if (typeof udspath === 'undefined' || udspath === '') { throw 'udspath not defined' } this.client = newUDSClient() this.list = GetSupportList(this.client) Log("this.list:" + this.list) } MarketCenterClient.prototype.GetSpotTicker = function(exchangeName, pair) { if (typeof exchangeName === 'undefined' || exchangeName === '') { throw 'GetSpotTicker exchangeName not defined' } if (typeof pair === 'undefined' || pair === '') { throw 'GetSpotTicker pair not defined' } return GetSpotTicker(this.client, exchangeName, pair) } MarketCenterClient.prototype.GetSpotDepth = function(exchangeName, pair) { if (typeof exchangeName === 'undefined' || exchangeName === '') { throw 'GetSpotDepth exchangeName not defined' } if (typeof pair === 'undefined' || pair === '') { throw 'GetSpotDepth pair not defined' } return GetSpotDepth(this.client, exchangeName, pair) } MarketCenterClient.prototype.SubscribeSpotDepth = function(exchangeName, pair, period) { if(typeof(period) === 'undefined') { period = 200 } if (typeof exchangeName === 'undefined' || exchangeName === '') { throw 'SubscribeSpotDepth exchangeName not defined' } if (typeof pair === 'undefined' || pair === '') { throw 'SubscribeSpotDepth pair not defined' } var found = false _.each(this.list, function(item) { if (item === exchangeName) { found = true return false } }) if(!found) { throw 'exchange ('+ exchangeName +') not support, please check it again, https://github.com/goex-top/market_center#support-exchanges' } return SubscribeSpotDepth(this.client, exchangeName, pair, period) } MarketCenterClient.prototype.SubscribeSpotTicker = function(exchangeName, pair, period) { if(typeof(period) === 'undefined') { period = 200 } if (typeof exchangeName === 'undefined' || exchangeName === '') { throw 'SubscribeSpotTicker exchangeName not defined' } if (typeof pair === 'undefined' || pair === '') { throw 'SubscribeSpotTicker pair not defined' } var found = false _.each(this.list, function(item) { if (item === exchangeName) { found = true return false } }) if(!found) { throw 'exchange ('+ exchangeName +') not support, please check it again, https://github.com/goex-top/market_center#support-exchanges' } return SubscribeSpotTicker(this.client, exchangeName, pair, period) } MarketCenterClient.prototype.GetFutureTicker = function(exchangeName, contractType, pair) { if (typeof exchangeName === 'undefined' || exchangeName === '') { throw 'GetFutureTicker exchangeName not defined' } if (typeof pair === 'undefined' || pair === '') { throw 'GetFutureTicker pair not defined' } return GetFutureTicker(this.client, exchangeName, contractType, pair) } MarketCenterClient.prototype.GetFutureDepth = function(exchangeName, contractType, pair) { if (typeof exchangeName === 'undefined' || exchangeName === '') { throw 'GetFutureDepth exchangeName not defined' } if (typeof pair === 'undefined' || pair === '') { throw 'GetFutureDepth pair not defined' } return GetFutureDepth(this.client, exchangeName, contractType, pair) } MarketCenterClient.prototype.SubscribeFutureDepth = function(exchangeName, contractType, pair, period) { if(typeof(period) === 'undefined') { period = 200 } if (typeof exchangeName === 'undefined' || exchangeName === '') { throw 'SubscribeFutureDepth exchangeName not defined' } if (typeof pair === 'undefined' || pair === '') { throw 'SubscribeFutureDepth pair not defined' } var found = false _.each(this.list, function(item) { if (item === exchangeName) { found = true return false } }) if(!found) { throw 'exchange ('+ exchangeName +') not support, please check it again, https://github.com/goex-top/market_center#support-exchanges' } return SubscribeFutureDepth(this.client, exchangeName, contractType, pair, period) } MarketCenterClient.prototype.SubscribeFutureTicker = function(exchangeName, contractType, pair, period) { if(typeof(period) === 'undefined') { period = 200 } if (typeof exchangeName === 'undefined' || exchangeName === '') { throw 'SubscribeFutureTicker exchangeName not defined' } if (typeof pair === 'undefined' || pair === '') { throw 'SubscribeFutureTicker pair not defined' } var found = false _.each(this.list, function(item) { if (item === exchangeName) { found = true return false } }) if(!found) { throw 'exchange ('+ exchangeName +') not support, please check it again, https://github.com/goex-top/market_center#support-exchanges' } return SubscribeFutureTicker(this.client, exchangeName, contractType, pair, period) } MarketCenterClient.prototype.GetSupportList = function() { return GetSupportList(this.client) } return MarketCenterClient })() $.NewMarketCenterClient = function() { return new MarketCenterClient() } function main() { mcc = $.NewMarketCenterClient() Log('support list'+mcc.GetSupportList()) mcc.SubscribeSpotDepth('binance.com', 'BTC_USDT', 200) Sleep(1000) Log(mcc.GetSpotDepth('binance.com', 'BTC_USDT')) mcc.SubscribeSpotTicker('binance.com', 'BTC_USDT', 200) Sleep(1000) Log(mcc.GetSpotTicker('binance.com', 'BTC_USDT')) }
17880207677どうする?
17880207677これはどうするんだ?
アイスクリームドール延期は?
fmゼロテスト結果についてはhttps://www.fmz.com/strategy/183009 を参照してください.
fmゼロ https://www.fmz.com/strategy/183009
fmゼロクライアントからセンターへの遅延は基本的には無視できます.