InvalidOperationException - Шлюз не инициализирован
Atom Ответить
28.03.2012


Начинаю изучать S#. Есть такой код:
Код

    public MainWindow() {
      InitializeComponent();
      .....
      Trader = new QuikTrader(Path.Text);
      Trader.NewSecurities += securities => this.GuiAsync(() => editSecurity.ItemsSource = Trader.Securities);
      Trader.NewTrades += trades => this.GuiAsync(() => Trades.AddRange(trades));
      Trader.ReConnectionSettings.ConnectionRestored += () => this.GuiAsync(() => MessageBox.Show(this, "Connection has been restored."));
      // подписываемся на событие разрыва соединения
      Trader.ConnectionError += error => this.GuiAsync( () => MessageBox.Show( this, error.ToString() ) );
      Trader.ProcessDataError += ex => System.Diagnostics.Debug.WriteLine(ex);
      Trader.Connected += () => this.GuiAsync(() => btnDDE.isEnabled = true); // Gjckt соединения активируем кнопку "Start DDE"
      Trader.Connect();
      _candleManager = new CandleManager(Trader);
    }

    private void StartDde_Click() { // Когда нажали на кнопку "Start DDE"
      Trader.StartExport();
    }
    
    private void StartStrategy_Click(object sender, RoutedEventArgs e) { // Когда нажали на кнопку "Start strateg"
      StartStrategy();
    }

    private void StartStrategy() {
      if (_strategy == null) {
        var timeFrame = TimeSpan.FromSeconds(280);
        _strategy = new FirstStrategy(_candleManager, SelectedSecurity, timeFrame);
        var guiListener = new GuiLogListener();
        _logManager.Listeners.Add(guiListener);
        _logManager.Sources.Add(_strategy);
        _strategy.Start();
      }
      _isStrategyStarted = true;
      btnStartStrategy.Content = "Stop strategy";
    }


Код класса FirstStrategy:
Код

  class FirstStrategy : Strategy {
    private readonly CandleManager _candleManager;
    private readonly Strategy _tradingStrategy;
    private Candle lastCandle;

    public FirstStrategy(CandleManager candleManager, Security security, TimeSpan timeFrame) {
      // Задаем интсрумент по которому должна работать стратегия
      this.Security = security;
      // Создаем менеджер свечек
      _candleManager = candleManager;
      // Регистрируем нужный таймфрейм для свечек
      _candleManager.RegisterTimeFrameCandles(this.Security, timeFrame);
      // Подписываемся на событие окончания свечки
      _candleManager.CandlesFinished += OnCandleFinished;
    }

    protected override void OnStarting() {
      ........
      // Вызываем родительский метод
      base.OnStarting(); // Вот здесь получаю исключение InvalidOperationException Шлюз не инициализирован
    }

    protected void OnCandleFinished(CandleToken token, IEnumerable<Candle> candles) {      
      lastCandle = candles.Last();
      this.AddInfoLog("Последнее время {0}. Цена закрытия {1}", new object[] { lastCandle.Time, lastCandle.ClosePrice } );
    }
  }


Сначало нажимаю на кнопку "Start DDE", через 1 минуту нажимаем на кнопку "Start strateg" и
получаю исключение InvalidOperationException с сообщением "Шлюз не инициализирован" в методе OnStarting() при вызове base.OnStarting().
Подскажите пожалуйста, что я делаю не так?

Теги:


Спасибо:




6 Ответов
Alexander

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


плохо читаете документацию
Спасибо:

PavelAd

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


Alexander Mukhanchikov Перейти
плохо читаете документацию

Всю документацию и примеры пересмотрел, не могу понять причину ошибки.
Автор топика
Спасибо:

PavelAd

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


В моем примере кнопка для запуска экспорта по DDE делается активной по событию QuikTrader.Connected.
После этого я нажимаю на эту кнопку, и только после того как начинают поступать данные по инструментам нажимаю на кнопку запуска стратегии.
Сравнивал с примером Sample - все вроде так же делаю.
Отредактировал первоначальный код примера.
Автор топика
Спасибо:

Moadip

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


Код
_strategy = new FirstStrategy(_candleManager, SelectedSecurity, timeFrame)


Инструмент передаете в конструктор. А кто будет устанавливать шлюз и портфель?Smile

Можно также через конструктор, но проще через инициализатор.
Код
_strategy = new FirstStrategy(_candleManager, SelectedSecurity, timeFrame){Trader = ..., Portfolio = ...}


Я не вижу подписки на событие появления портфелей.

Код
Trader.NewPortfolios += ...
Спасибо: PavelAd komaranton

Alexander

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


Если что - у нас есть поддержка пользователей.
Если возникли вопросы на таком этапе - дальше может быть вопросов ещё больше.
Спасибо:

PavelAd

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


Moadip Перейти
Инструмент передаете в конструктор. А кто будет устанавливать шлюз и портфель?Smile
Можно также через конструктор, но проще через инициализатор.
Я не вижу подписки на событие появления портфелей.


Спасибо, ошибка исчезла.
Автор топика
Спасибо:


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

loading
clippy