Снова ActionStrategy в 2.5.2
Atom
16.11.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;
        }  
 */
    }
           
}


Теги:


Спасибо:


1 2  >
Serg

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


А если сделать вот так то все работает

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

Спасибо:

Mikhail Sukhov

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


Serg: А если сделать вот так то все работает

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


В первом случае Вы полностью переопределяете логику ActionStrategy (собственно никто не отслеживает условия и не вызывает действия).
Спасибо:

ustas

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


Спасибо, коллеги. Да, я тупанул, согласен. Но вопрос на первый вопрос остаётся открытым. - Почему интервал стратегии не поменялся? Спасибо и с уважением!

Спасибо:

Mikhail Sukhov

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


ustas: Почему интервал стратегии не поменялся? Спасибо и с уважением!

А как это проверялось?

Спасибо:

ustas

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


Mikhail Sukhov: А как это проверялось?

выводом из стратегии

When( () => true ). Do(() => { Console.WriteLine("Работает "+DateTime.Now.TimeOfDay); }). MakePeriodical();

как было раз в секунду так и осталось

С уважением!

Спасибо:

ustas

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


ustas:

Mikhail Sukhov: А как это проверялось?

выводом из стратегии

When( () => true ). Do(() => { Console.WriteLine("Работает "+DateTime.Now.TimeOfDay); }). MakePeriodical();

как было раз в секунду так и осталось

С уважением!

да, а если вставить в OnProcess Console.WriteLine(DateTime.Now.TimeOfDay); то всё работает с заданным интервалом.

Интересно.

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

Спасибо:

ustas

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


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

Сейчас в вечерку снова вывод работает только раз в секунду. Хотя пару часов назад точно работал по заданному интервалу с таким Вот OnProcess

 
protected override StrategyProcessResults OnProcess()
{
 base.OnProcess();
 Console.WriteLine("++++++++++++++++++++++++++++++++++++++++++++++++++++++++" + DateTime.Now.TimeOfDay);
 return StrategyProcessResults.Continue;
} 

Какие то непонятки всё ещё.

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

Спасибо:

Mikhail Sukhov

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


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

Основное условие - интервал не меняется динамически. Только перед регистрацией стратегии.

Спасибо:

ustas

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


Mikhail Sukhov:

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

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

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

Спасибо:

Mikhail Sukhov

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


ustas:

Mikhail Sukhov:

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

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

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

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

Спасибо:
1 2  >

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

loading
clippy