← Zurück

InvalidOperationException - Шлюз не инициализирован

Начинаю изучать 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(). Подскажите пожалуйста, что я делаю не так?

War dieses Thema hilfreich?

Thema teilen

Kommentare (6)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander

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

PavelAd
PavelAd Autor

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

PavelAd
PavelAd Autor

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

Moadip
Moadip
_strategy = new FirstStrategy(_candleManager, SelectedSecurity, timeFrame)

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

Можно также через конструктор, но проще через инициализатор.

_strategy = new FirstStrategy(_candleManager, SelectedSecurity, timeFrame){Trader = ..., Portfolio = ...}

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

Trader.NewPortfolios += ...
PavelAd komaranton
PavelAd
PavelAd Autor

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

Спасибо, ошибка исчезла.

Alexander
Alexander

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