private void OnRspQryPosition(object sender, RspEventArgs e)
        {
            switch (sender.ToString())
            {
            case "ProgramTradeApi.XTradeSpi":
                if (e.ErrorID == 0)
                {
                    var pos = PositionDetail.CreateDetail((e as TypedRspEventArgs <CLRDFITCPositionInfoRtnField, CLRDFITCErrorRtnField>).Data);
                    if (pos.InstrumentID != "")
                    {
                        Positions.AddOrUpdate(pos.InstrumentID + pos.Direction, pos, (k, v) => v);

                        /*if (e.IsLast)
                         * {
                         *  Thread.Sleep(500);
                         *  eventPositionChanged?.Invoke(this, null);
                         * }*/
                        eventPositionChanged?.Invoke(pos, null);
                    }
                }
                else
                {
                    var err = (e as TypedRspEventArgs <CLRDFITCPositionInfoRtnField, CLRDFITCErrorRtnField>).Error;
                }
                break;
            }
        }
 private void OnOrderDeal(object sender, RspEventArgs e)
 {
     switch (sender.ToString())
     {
     case "ProgramTradeApi.XTradeSpi":
         PositionDetail odr = PositionDetail.CreateDetail((e as TypedRspEventArgs <CLRDFITCMatchRtnField, object>).Data);
         try
         {
             Positions.AddOrUpdate(odr.InstrumentID + odr.Direction, odr, (k, v) => { return(v += odr); });
             eventPositionChanged?.Invoke(this, null);
         }
         catch (Exception)
         {
             //deal exception
         }
         break;
     }
 }