Снова ActionStrategy в 2.5.2

Снова ActionStrategy в 2.5.2
Atom
11/16/2010
ustas


Добрый день уважаемым Михаилу и коллегам.

Остаются вопросы по работе ActionStrategy в 2.5.2

Вот простой пример (ниже), который работает как и ожидается - т.е. просто переодически выводит слово "Работает" плюс текущее время

Но, есть два вопрса

  1. Судя по выводу When отрабатывает раз в секунду а не за Interval стратегии который я пытался установить (см. в TryCreateStrategy
    _strat.Interval = TimeSpan.FromSeconds(0.10);)

  2. Если в стратегии переписать OnProcess, например так

 
  protected override StrategyProcessResults OnProcess()
        {
              return StrategyProcessResults.Continue;
        }  


то стратегия просто перестанет выполняться. Что я снова сделал не так?

Спасибо и с уважением!

Пример привожу полностью можете легко воспроизвести у себя


namespace test
{
    using System;
    using System.Linq;
    using System.Threading;
    using System.Collections.Generic;
    using System.ComponentModel;
  
    using Ecng.Trading.Algo;
    using Ecng.Trading.Algo.Candles;
    using Ecng.Trading.Algo.Strategies;
    using Ecng.Trading.Algo.Logging;
    using Ecng.Trading.BusinessEntities;
    using Ecng.Trading.Quik;
    using Ecng.Interop;
    using Ecng.Data;
    using Ecng.Common;
    using Ecng.ComponentModel;

   
    public class Program
    {
        private static TestStrategy _strat;
        private static StrategyManager _manager;
        private static Portfolio _port;
        private static Security _sec;
        private static QuikTrader _trader;
        private static void OnLog(Strategy strategy, StrategyErrorStates errorState, string message)
        {
            // если стратегия вывела не просто сообщение, то вывести на экран.
            //            if (errorState != StrategyErrorStates.None)
            Console.WriteLine(message);
        }

       
        private static void TryCreateStrategy()
        {
                _strat = new TestStrategy() { Volume=1};
                _strat.Log += OnLog;
                _strat.PropertyChanged += OnStrategyPropertyChanged;
                _manager.Register(_strat, _port, _sec);
                _strat.Interval = TimeSpan.FromSeconds(0.10);
                _strat.I = 0;
                _strat.Start();
                var logger = new FileStrategyLogger("mylog.txt");
               logger.Strategies.Add(_strat);
        }


        static void Main()
        {           
                     using (var waitHandle = new ManualResetEvent(false))
                {
       
                _trader = new QuikTrader();
                _trader.Connect();

                _trader.NewPortfolios += portfolios =>
                {
                    if (_port == null)
                    {
                        _port = portfolios.FirstOrDefault();

                        if (_port != null)
                        {
                            Console.WriteLine("Портфель {0} появился.", _port.Name);                        
                                waitHandle.Set();
                        }
                    }
                };

                _manager = new StrategyManager(_trader);

                _trader.NewSecurities += securities =>
                {
                    if (_sec == null)
                    {
                        _sec = securities.FirstOrDefault(sec => sec.Code == "SRZ0");
                        if (_sec != null)
                        {
                            Console.WriteLine(_sec.Code+" появился");
                            waitHandle.Set();

                        }
                    }
                 };

                waitHandle.WaitOne();

                _trader.IsAsyncMode = true;
                _trader.Terminal.StartDde(new[] { _trader.SecuritiesTable }); 
                

                _trader.Connected += () =>
                {

                    Console.WriteLine("Connected");
                    waitHandle.Set();


                };

                waitHandle.WaitOne();


                TryCreateStrategy();
                        Console.WriteLine("Чтобы закончить, нажмите любую кнопку...");
                        Console.Read();

            }

        }

        static private void OnStrategyPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            Console.WriteLine("process state: " + _strat.ProcessState);
            Console.WriteLine("PnL: " + _strat.PnLManager.PnL);
            Console.WriteLine("slippage: " + _strat.SlippageManager.Slippage);
            Console.WriteLine("Position: " + _strat.PositionManager.Position);
            Console.WriteLine("Latency: " + _strat.LatencyManager.Latency);
        }

        private static void OnError(Exception error)
        {
            Console.BackgroundColor = ConsoleColor.White;
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(error);
            //           Console.Read();
        }
    }



       class TestStrategy : ActionStrategy
    {
        
        private int i=0;
     
        public int I
        {
            get { return i; }
            set
            {
                i = value;
                When(     () => true ).
			Do(() => {
                Console.WriteLine("Работает "+DateTime.Now.TimeOfDay);
                    
                 		}).
            MakePeriodical(); 
            }
        }

        
        //не работает если раскомментировать OnProcess
/*
  protected override StrategyProcessResults OnProcess()
        {
  
            return StrategyProcessResults.Continue;
        }  
 */
    }
           
}


Tags:


Thanks:


< 1 2 
ustas

Avatar
Date: 11/19/2010
Reply


Mikhail Sukhov:

ustas:

Mikhail Sukhov:

ustas: Вообщем я совсем запутался.

Основное условие - интервал не меняется динамически. Только перед регистрацией стратегии. Спасибо. Но я его и не меняю - он задаётся при создании стратегии - можете проверить. Весь код выше.

Спасибо и с уважением!

Не совсем понял. Вы же как раз и пишите, что хотите поменять интервал... Так что Вы хотите сделать?

:))) я его не меняю динамически я его задаю перед регистрацией стратегии, вот же код
_strat.Interval = TimeSpan.FromSeconds(0.10);

        private static void TryCreateStrategy()
        {
                _strat = new TestStrategy() { Volume=1};
                _strat.Log += OnLog;
                _strat.PropertyChanged += OnStrategyPropertyChanged;
                _manager.Register(_strat, _port, _sec);
                _strat.Interval = TimeSpan.FromSeconds(0.10);
                _strat.I = 0;
                _strat.Start();
                var logger = new FileStrategyLogger("mylog.txt");
               logger.Strategies.Add(_strat);
        }

Я хочу чтобы интервал был 0.1 секунды. Но он после некоторой работы снова сбивается на 1 сек. Можете сами проверить весь код выше.

Спасибо и с уважением!

Thanks:

Mikhail Sukhov

Avatar
Date: 11/19/2010
Reply


ustas: Можете сами проверить весь код выше.

Я и смотрю, сначала идет регистрация, а затем изменение интервала. Что нельзя.

Thanks: ustas

ustas

Avatar
Date: 11/19/2010
Reply


Mikhail Sukhov:

ustas: Можете сами проверить весь код выше.

Я и смотрю, сначала идет регистрация, а затем изменение интервала. Что нельзя.

Спасибо! Тупанул два раза в одной теме, бывает. Я предупреждал что я туповат. Спутал регистрацию со стартом стратегии.

Спасибо и с уважением!

Thanks:
< 1 2 

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy