← 戻る

Прошу совета как среднесрочной стратегией переживать ночное время

Понимаю, что для кого-то вопрос окажется глупым, а ответ очевидным, но…

Если нетрудно, прошу опытных алготрейдеров S# посоветовать каким образом лучше проходить через ночное время в моей ситуации. У кого, так сказать, какой опыт.

Суть в следующем: при торговле через Плаза (вероятно, на Квике та же ситуация) происходит дисконнект (сервера, видимо, выключаются) после окончания вечерней сессии - где-то в 0 - 0:30. Поэтому своего трейдера отключаю предварительно - по расписанию сразу в 23:50, чтобы не было проблем с реконнектом итд., а потом включаю в 9:50. Вопрос в том: если есть среднесрочная стратегия, которая к 23:50, предположим, находится в позиции и, соответственно, есть правила (например, правило полное исполнения ордера order.WhenMatched), заполненные соответствующие словари, коллекции и пр. Каким образом сделать так, чтобы стратегия на следующий день, как ни в чем не бывало, без кардинального изменения своего состояния на момент окончания предыдущего дня, продолжала работать, отрабатывать сформированные правила, подписи на события? Интересно, что произойдет и какие последствия могут быть, если просто ничего не предпринимать со стратегией типа Strategy.

Посоветуйте, пожалуйста. Спасибо. Буду благодарен за любые комментарии.

このトピックは参考になりましたか?

トピックを共有

コメント (2)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

Kazai Mazai
Kazai Mazai

Можно сохранять все что нужно в xml файл вот так.

В вашей стратегии создаем пару свойств

 
private bool _firstStart = true;

public SettingsStorage SettingsStorage;

В конструкторе стратегии создаем файл

 if (!Name) throw new ArgumentNullException("Strategy Name");



          if (File.Exists(Name + "_settings.xml"))
          {
              SettingsStorage = new XmlSerializer<SettingsStorage>().Deserialize(Name + "_settings.xml");

          }
          else
          {
              SettingsStorage = new Ecng.Serialization.SettingsStorage();

          }

В метод "на старте" стратегии добавляем код

 base.OnStarted();
        
          if (_firstStart)
          {
              LoadState(SettingsStorage);
              _firstStart = false;
 
          }
          

Хотя в в расширениях для стратегий, кажется есть такой метод, делаем свой, или как хотите) В моем есть немного мусора, плюс то что нужно мне. Вам стоит обратить внимание на "OrderByTransactionIds".

  protected virtual void LoadState(SettingsStorage storage)
      {


          if (storage == null)
              throw new ArgumentNullException("storage");

          var settings = storage.GetValue<SettingsStorage>("Settings");
          if (settings != null && settings.Count != 0)
          {
             /* if (settings.Contains("security"))
                  Security = Trader.Securities.FirstOrDefault(s => s.Id == settings.GetValue<string>("security"));

              if (settings.Contains("portfolio"))
                  Portfolio = Trader.Portfolios.FirstOrDefault(p => p.Name == settings.GetValue<string>("portfolio"));
              
              var id = Id;

           

              if (Id != id)
                  throw new InvalidOperationException();
               * */
          }
          else
          {
                settings = new SettingsStorage();
                settings.SetValue("PortfolioCurrentMinValue", _defaultCurrentMinValue);
                settings.SetValue("MaxPositionValue", _defaultMaxPositionValue);
                settings.SetValue("MinPnL", _defaultMinPnL);
                settings.SetValue(TradeSize, _defaultSize);
                settings.SetValue(IsTradeAllowed, _defaultIsTradeAllowed);
              

              
                storage.SetValue("Settings", settings);
          }
             Load(storage);
         
          var statistics = storage.GetValue<SettingsStorage>("Statistics");
          if (statistics != null)
          {
              foreach (var parameter in StatisticManager.Parameters.Where(parameter => statistics.ContainsKey(parameter.Name)))
              {
                  parameter.Load(statistics.GetValue<SettingsStorage>(parameter.Name));
              }
          }


          var orderTransactionIds = storage.GetValue<Dictionary<long, Order>>("OrderByTransactionIds");
          if (orderTransactionIds != null)
          {
              foreach (var transactionId in orderTransactionIds.Keys)
              {
                  var order = Trader.Orders.First(o => o.TransactionId == transactionId);
                  if (order != null) AttachOrder(order, order.GetTrades());

                  
              }
          }

      }

Ну и переопределяем метод сохранения.

public override void Save(SettingsStorage storage)
      {
          

          var ordersToWrite = new Dictionary<long, Order>();
          foreach (var order in Orders)
          {
              ordersToWrite.Add(order.TransactionId, order);
          }
          if (storage.ContainsKey("OrderByTransactionIds")) storage["OrderByTransactionIds"] = ordersToWrite;
          else storage.Add("OrderByTransactionIds", ordersToWrite);


          var xmlSerializer = new XmlSerializer<SettingsStorage>();
          xmlSerializer.Serialize(storage, Name + "_settings.xml");
          base.Save(storage);

      }

Так стратегия будет восстанавливать orders, trades, positions,pnl и т.д. Но только в том случае, если из шлюза приходят зарегестрированные ранее заявки,сделки и т.д.

Если нет, то нужно наследоваться от шлюза Trader и нечто похожее на то, что делалось для стратегии проделать и там, сохраняя сделки, ордера, портфели, инструменты.

В стокшарпе есть как бы ORM для этого - EntityStorage. Но у меня ее как бы не особо получается заставить работать. После добавления недостающих полей в БД, без которых, естественно, ничего никуда не сохраняется, можно с горем пополам сохранять ордера, сделки, инструменты, портфели. Но отношения между таблицами нихрена не работают, подозреваю, что в Ecng.Data какая-то жопа.

Почему бы не мигрировать S# на EntityFramework и не сделать прекрасную модель данных для всего, что только можно. Понятно, что будут возникать проблемы при обновлении версий, но они ж и так возникают=))

И даже, видимо, не обязательно ковырять и перенаследовать все сущности, благодаря first code with POCO.

Lipot Jeta ghost-mo
Stason
Stason

"Так стратегия будет восстанавливать orders, trades, positions,pnl и т.д. Но только в том случае, если из шлюза приходят зарегестрированные ранее заявки,сделки и т.д. " В Квике не сохраняются заявки и сделки за предыдущий день, данный метод для шлюза Квик не подходит?