finsight / QUIKSharp

QUIK# (QUIK Sharp) is the QUIK Lua interface ported to .NET.
Other
230 stars 134 forks source link

Зависает при клирингах на бирже #307

Closed nick-ez closed 2 years ago

nick-ez commented 2 years ago

Добрый день!

Зависает при клирингах на бирже, тк демо сервер, хрен поймешь когда там клиринг или перерыв. Перед выставлением заявки делаю проверку на статус биржи

var t = _quik.Trading.GetParamEx(tool.ClassCode, tool.SecurityCode, ParamNames.TRADINGSTATUS).Result.Result;
      if (t != "1")
      {
        AppendText2TextBox(textBoxLogs, "Сессия закрыта" + Environment.NewLine);
        return;
      }
  try
  {
    if (lastPos != null && lastPos.operation == Operation.Sell)
    {
      robVar.robotOrderBy = new RobotOrder();
      robVar.robotOrderBy.Order = _quik.Orders.SendLimitOrder(tool.ClassCode, tool.SecurityCode, tool.AccountID, Operation.Buy, robVar.curPikPrice -k, lastPos.curentQty).Result;
      robVar.robotOrderBy.RobotOrderType = RobotOrderType.ClosePos;
      robVar.robotOrderBy.EntranceOrderNum = lastPos.entranceOrderNumber;
    }
    else if (!settings.OnlyShort)
    {
      robVar.robotOrderBy = new RobotOrder();
      robVar.robotOrderBy.Order = _quik.Orders.SendLimitOrder(tool.ClassCode, tool.SecurityCode, tool.AccountID, Operation.Buy, robVar.curPikPrice - k, settings.QtyOrder).Result;
      robVar.robotOrderBy.RobotOrderType = RobotOrderType.NewPos;
      robVar.robotOrderBy.EntranceOrderNum = 0;
    }` 

Все хорошо работает пока не начинается клиринг или закрытие торгов

Pr0phet1c commented 2 years ago

Непонятно, почему Вы сравниваете значение получаемого параметра с единицей? Если сессия открыта, то возвращается значение = "открыта".

При этом, в своих роботах я для надежности выполняю сразу три проверки:

  1. Торгуется ли конкретный инструмент
  2. Открыта ли сессия
  3. Не попадаем ли мы в период дневного клиринга.

Если все три проверки пройдены - работаем и можем выставлять заявки. Иначе не торгуем.

nick-ez commented 2 years ago

Спасибо за развернутый ответ. Подскажите еще пожалуйста третий пункт делаете проверкой по времени?

Pr0phet1c commented 2 years ago

Сделаем проще (я не очень жадный).

public static bool IsExchangeTradingEnable(Instrument instrument)
{
    bool sessionTrading = true;
    bool clearing = false;
    try
    {
        if (mainQuik != null)
        {
            if (mainQuik.Trading.GetParamEx(instrument.ClassCode, instrument.SecurityCode, ParamNames.STATUS).Result.ParamImage != "торгуется" || mainQuik.Trading.GetParamEx(instrument.ClassCode, instrument.SecurityCode, ParamNames.TRADINGSTATUS).Result.ParamImage != "открыта")
                sessionTrading = false;
        }
        if (DateTime.Now >= StringTime_to_DateTime(startDayClearing) && DateTime.Now < StringTime_to_DateTime(endDayClearing) && instrument.ClassCode == "SPBFUT")  clearing = true;
        return ((DateTime.Now > StringTime_to_DateTime(startDaySession) && DateTime.Now < StringTime_to_DateTime(endDaySession)) || (DateTime.Now > StringTime_to_DateTime(startNightSession) && DateTime.Now < StringTime_to_DateTime(endNightSession))) && !clearing && sessionTrading;
    }
    catch (NullReferenceException e)
    {
        Console.WriteLine("Ошибка в методе IsExchangeTradingEnable: " + e.Message);
        return false;
    }
}
nick-ez commented 2 years ago

Супер! Спасибо огромное!

Pr0phet1c commented 2 years ago

Если проблема решена - закройте тему, пожалуйста.