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


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


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

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

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

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

Теги:


Спасибо:




2 Ответов
Kazai Mazai

Фотография
Автор статей
Дата: 20.08.2013
Ответить


Можно сохранять все что нужно в 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

Фотография
Дата: 05.11.2013
Ответить


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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy