Снова 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;
}
*/
}

}


Теги:


Спасибо:


< 1 2 
ustas

Фотография
Дата: 19.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

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


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


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

Спасибо и с уважением!
Спасибо:
< 1 2 

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

loading
clippy