/// <summary> /// 撤销所有未成交订单 /// </summary> public async Task ClearOrders() { //获取所有未成交订单 SwapApi api = CommonData.Ins.V_SwapApi; JObject obj = await api.getOrdersAsync(V_Instrument_id, "6", null, null, null); string s = obj["order_info"].ToString(); List <Order> orders = Order.GetOrderList(s); foreach (var item in orders) { await api.cancelOrderAsync(V_Instrument_id, item.Order_id); } }
/// <summary> /// 刷新历史数据 /// </summary> public virtual async Task RunHistory() { Console.WriteLine(V_Instrument_id + ":获取历史数据"); Debugger.Log(V_Instrument_id + ":获取历史数据"); if (V_HistoryCache == null) { V_HistoryCache = new KLineCache(); } List <KLine> history_data = new List <KLine>(); SwapApi api = CommonData.Ins.V_SwapApi; int length = V_Min; DateTime t_start = DateTime.Now.AddMinutes(-length * 2000); DateTime t_end = DateTime.Now; while (t_start.AddMinutes(length * 200) < t_end) { JContainer con = await api.getCandlesDataAsync(V_Instrument_id, t_start, t_start.AddMinutes(length * 200), length * 60); List <KLine> d = KLine.GetListFormJContainer(con); d.AddRange(history_data); history_data.Clear(); history_data.AddRange(d); t_start = t_start.AddMinutes(length * 200); } Console.WriteLine(V_Instrument_id + ":历史数据 " + history_data.Count + "条"); Debugger.Log(V_Instrument_id + ":历史数据 " + history_data.Count + "条"); V_HistoryCache.RefreshData(history_data); V_LastOpTime = history_data[history_data.Count - 1].V_Timestamp; }
/// <summary> /// 对手价平仓 /// </summary> public async Task ClearPositions(int dir = 0, float percent = 1) { if (V_Positions == null || V_Positions.Count == 0) { return; } for (int i = 0; i < V_Positions.Count; i++) { Position p = V_Positions[i]; if (dir == 0 || (dir > 0 && p.V_Dir > 0) || (dir < 0 && p.V_Dir < 0)) { SwapApi api = CommonData.Ins.V_SwapApi; await api.makeOrderAsync(V_Instrument_id, p.V_Dir > 0? "3" : "4", (decimal)V_CurPrice, (int)(p.V_AvailVol * percent), "", 0, "1"); } } Console.WriteLine("{0} {1}: 平仓: price {2},方向:{3},盈利率{4},平仓百分比 {5},剩余 {6}", DateTime.Now, V_Instrument_id, V_CurPrice, V_Position.V_Dir > 0 ? "平多" : "平空", V_Position.GetPercent(V_CurPrice), percent * 100, GetAvailMoney()); Debugger.Warn(string.Format("{0} {1}: 平仓: price {2},方向:{3},盈利率{4},平仓百分比 {5},剩余 {6}", DateTime.Now, V_Instrument_id, V_CurPrice, V_Position.V_Dir > 0 ? "平多" : "平空", V_Position.GetPercent(V_CurPrice), percent * 100, GetAvailMoney())); JObject obj = await CommonData.Ins.V_SwapApi.getAccountsByInstrumentAsync(V_Instrument_id); RefreshData(obj["info"].ToString()); }
/// <summary> /// 对手价开仓 /// </summary> /// <param name="dir">方向 >0 多</param> /// <param name="vol">金额</param> /// <returns></returns> public async Task <bool> MakeOrder(int dir, float vol, float percent = 1) { if (vol * percent > GetAvailMoney()) { return(false); } else { //获取张数(BTC 1张=100USD EOS 1张=10USD) int v = GetOrderVol(vol * percent); SwapApi api = CommonData.Ins.V_SwapApi; double price = V_CurPrice * (dir > 0 ? 1.05f : 0.95f); await api.makeOrderAsync(V_Instrument_id, dir > 0? "1" : "2", (decimal)price, v, "", 0, "1"); Console.WriteLine("{0} {1}: 开仓:{2} 价格:{3} 张数:{4}", DateTime.Now, V_Instrument_id, dir > 0 ? "多" : "空", price, v); Debugger.Warn(string.Format("可用 {0} 量 {1}", GetAvailMoney(), vol)); Debugger.Warn(string.Format("{0} {1}: 开仓:{2} 价格:{3} 张数:{4}", DateTime.Now, V_Instrument_id, dir > 0 ? "多" : "空", price, v)); return(true); } }
//public void Start() { // Console.WriteLine("start {0}",V_Instrument_id); // Update(); //} public virtual async void Update() { if (V_TacticsState == EM_TacticsState.Stop) { return; } if (DateTime.Now.Minute % 30 == 0 && DateTime.Now.Second < 5) { debug = true; } try { SwapApi api = CommonData.Ins.V_SwapApi; //更新账号信息 JObject obj = await api.getAccountsByInstrumentAsync(V_Instrument_id); V_AccountInfo.RefreshData(obj["info"].ToString()); //更新持仓信息 obj = await api.getPositionByInstrumentAsync(V_Instrument_id); V_AccountInfo.RefreshPositions(Position.GetPositionList(obj["holding"].ToString())); //更新未完成订单信息,全部撤销掉 await V_AccountInfo.ClearOrders(); if (V_AccountInfo.V_Position == null && (DateTime.Now - m_LastRefreshTime).Ticks > (long)m_TaticsHelper.V_Min * Util.Minute_Ticks * AppSetting.Ins.GetInt("RefreshSettingTime"))//更新设置操作 { //更新参数 await m_TaticsHelper.RunHistory(); m_LastRefreshTime = DateTime.Now; Console.WriteLine("{0} {1}:更新设置", DateTime.Now, V_Instrument_id); } else { if (debug) { Console.WriteLine("{0} {1}:获取数据", DateTime.Now, V_Instrument_id); } //获取近200条K线 JContainer con = await api.getCandlesDataAsync(V_Instrument_id, DateTime.Now.AddMinutes(-m_TaticsHelper.V_Min * 200), DateTime.Now, m_TaticsHelper.V_Min * 60); cache.RefreshData(con); V_AccountInfo.V_CurPrice = cache.V_KLineData[0].V_ClosePrice; if (!V_AccountInfo.HasEnoughMoney(orderPercent) && V_AccountInfo.V_Position == null) { Console.WriteLine("{0} 钱不够。。。。", V_Instrument_id); Debugger.Error(string.Format("{0} 钱不够。。。。", V_Instrument_id)); TimeEventHandler.Ins.AddEvent(new TimeEventModel(600, 1, Update)); return; } await Handle(); } } catch (Exception ex) { //Console.WriteLine(ex.ToString()); Console.WriteLine("{0} {1}:处理数据异常", DateTime.Now, V_Instrument_id); error = true; } debug = false; Update(); //TimeEventHandler.Ins.AddEvent(new TimeEventModel(1, 1, Update)); }