Снова ActionStrategy в 2.5.2
Добрый день уважаемым Михаилу и коллегам.
Остаются вопросы по работе ActionStrategy в 2.5.2
Вот простой пример (ниже), который работает как и ожидается - т.е. просто переодически выводит
слово "Работает" плюс текущее время
Но, есть два вопрса
1. Судя по выводу When отрабатывает раз в секунду а не за Interval стратегии который я пытался установить (см. в TryCreateStrategy
_strat.Interval = TimeSpan.FromSeconds(0.10);)
2. Если в стратегии переписать OnProcess, например так
Code
protected override StrategyProcessResults OnProcess()
{
return StrategyProcessResults.Continue;
}
то стратегия просто перестанет выполняться. Что я снова сделал не так?
Спасибо и с уважением!
Пример привожу полностью можете легко воспроизвести у себя
Code
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;
}
*/
}
}