Снова ActionStrategy в 2.5.2
Atom Ответить
16.11.2010


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

Остаются вопросы по работе 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;
}
*/
}

}


Теги:


Спасибо:




13 Ответов
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
Вообщем я совсем запутался.


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

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

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


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

ustas

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


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 сек. Можете сами проверить весь код выше.

Спасибо и с уважением!
Автор топика
Спасибо:

Mikhail Sukhov

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


ustas

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


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

ustas

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


Mikhail Sukhov
ustas

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


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


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

Спасибо и с уважением!
Автор топика
Спасибо:


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

loading
clippy