/// <summary> /// sub channel and set callback function /// </summary> /// <param name="subStr"></param> /// <param name="ch"></param> /// <param name="fun"></param> /// <param name="param"></param> /// <returns></returns> protected bool Sub(string subStr, string ch, Delegate fun, Type paramType) { if (_WebSocket == null) { _logger.Log(Log.LogLevel.Error, $"please connect first."); return(false); } while (!_canWork) { System.Threading.Thread.Sleep(10); } ch = ch.ToLower(); if (_onSubCallbackFuns.ContainsKey(ch)) { _onSubCallbackFuns[ch] = new MethonInfo() { fun = fun, paramType = paramType }; return(true); } _WebSocket.Send(subStr); _all_sub_strs.Add(subStr); _logger.Log(Log.LogLevel.Info, $"websocket has send data: {subStr}"); _onSubCallbackFuns[ch] = new MethonInfo() { fun = fun, paramType = paramType };; return(true); }
/// <summary> /// handle req callback fun /// </summary> /// <param name="ch"></param> /// <param name="data"></param> /// <param name="jdata"></param> private void _HandleReqCallbackFun(string ch, string data, JObject jdata) { ch = ch.ToLower(); if (!_onReqCallbackFuns.ContainsKey(ch)) { _logger.Log(Log.LogLevel.Info, $"no callback function to handle: {data}"); return; } MethonInfo mi = _onReqCallbackFuns[ch]; if (mi == null) { _logger.Log(Log.LogLevel.Info, $"no callback function to handle: {data}"); return; } mi.fun.DynamicInvoke(JsonConvert.DeserializeObject(data, mi.paramType)); }
/// <summary> /// request channel data /// </summary> /// <param name="reqStr"></param> /// <param name="ch"></param> /// <param name="fun"></param> /// <param name="paramType"></param> /// <returns></returns> protected bool Req(string reqStr, string ch, Delegate fun, Type paramType) { if (_WebSocket == null) { _logger.Log(Log.LogLevel.Error, $"please connect first."); return(false); } while (!_canWork) { System.Threading.Thread.Sleep(10); } ch = ch.ToLower(); _WebSocket.Send(reqStr); _logger.Log(Log.LogLevel.Info, $"websocket has send data: {reqStr}."); _onReqCallbackFuns[ch] = new MethonInfo() { fun = fun, paramType = paramType }; return(true); }
/// <summary> /// handle sub callback fun /// </summary> /// <param name="ch"></param> /// <param name="data"></param> /// <param name="jdata"></param> private void _HandleSubCallbackFun(string ch, string data, JObject jdata) { ch = ch.ToLower(); MethonInfo mi = null; if (_onSubCallbackFuns.ContainsKey(ch)) { mi = _onSubCallbackFuns[ch]; } else if (ch.StartsWith("orders.") && _onSubCallbackFuns.ContainsKey("orders.*")) { mi = _onSubCallbackFuns["orders.*"]; } else if (ch.StartsWith("matchorders.") && _onSubCallbackFuns.ContainsKey("matchorders.*")) { mi = _onSubCallbackFuns["matchorders.*"]; } else if (ch.StartsWith("trigger_order.") && _onSubCallbackFuns.ContainsKey("trigger_order.*")) { mi = _onSubCallbackFuns["trigger_order.*"]; } else if (ch.EndsWith(".liquidation_orders") && _onSubCallbackFuns.ContainsKey("public.*.liquidation_orders")) { mi = _onSubCallbackFuns["public.*.liquidation_orders"]; } else if (ch == "accounts" || ch == "positions" || ch == "positions_cross") { string contract_code = jdata["data"][0]["contract_code"].ToObject <string>(); string full_ch = $"{ch}.{contract_code}"; full_ch = full_ch.ToLower(); if (_onSubCallbackFuns.ContainsKey(full_ch)) { mi = _onSubCallbackFuns[full_ch]; } else if (_onSubCallbackFuns.ContainsKey($"{ch}.*")) { mi = _onSubCallbackFuns[$"{ch}.*"]; } } else if (ch == "accounts_cross") { string margin_account = jdata["data"][0]["margin_account"].ToObject <string>(); string full_ch = $"{ch}.{margin_account}"; full_ch = full_ch.ToLower(); if (_onSubCallbackFuns.ContainsKey(full_ch)) { mi = _onSubCallbackFuns[full_ch]; } else if (_onSubCallbackFuns.ContainsKey($"{ch}.*")) { mi = _onSubCallbackFuns[$"{ch}.*"]; } } if (mi == null) { _logger.Log(Log.LogLevel.Info, $"no callback function to handle: {data}"); return; } mi.fun.DynamicInvoke(JsonConvert.DeserializeObject(data, mi.paramType)); }