Собственно первый раз дошли руки до создания стратегии, до этого копался с базовыми элементами S#. В результате, следуя примеру, написал своего рода тестер(работает или нет), который открывает заявку, если цена меньше определенного числа, никаких ошибок VS не выдает, сделки регистрируются, но стратегия не подает никаких признаков жизни(даже при нажатии Start в логгере не пишется про запуск). До последнего не хотел обращаться к форуму, чтобы не загружать его банальными темами, но все же в итоге выкладываю все, что есть в проекте, так как решения вопроса так и не нашел.
MainWindow:
Код
namespace MyStock
{
public partial class MainWindow
{
private readonly Dictionary<CandleToken, MainWindow> chart = new Dictionary<CandleToken, MainWindow>();
public AlfaTrader Trader;
public bool _isConnected;
public Portfolio _portfolio;
public CandleManager _candleManager;
private readonly ObservableCollection<Security> _securitiesSource = new ObservableCollection<Security>();
private readonly LogManager _logManager = new LogManager();
//private DateTime _lastCandleTime;
public readonly TimeSpan timeFrame = (TimeSpan)(AlfaTimeFrames.Minute1);
public IndStrategy _strategy;
private Security security;
private Security security_2;
public Ind _ind { get; private set; }
public MainWindow()
{
InitializeComponent();
Security.ItemsSource = _securitiesSource;
Security_2.ItemsSource = _securitiesSource;
var From = DateTime.Today - TimeSpan.FromDays(1);
var To = DateTime.Now;
_logManager.Listeners.Add(new FileLogListener());
var security = (Security)SelectedSecurity;
}
public void button1_Click(object sender, RoutedEventArgs e)
{
try
{
if (!_isConnected)
{
if (Trader == null)
{
var monitor = new MonitorWindow();
monitor.Show();
Trader = new AlfaTrader
{
Login = textBox1.Text,
Password = passwordBox1.Password
};
Trader.NewSecurities += securities => this.Dispatcher.BeginInvoke((Action)(() => _securitiesSource.AddRange(securities)));
Trader.NewPortfolios += portfolios => this.Dispatcher.BeginInvoke((Action)(() => portfolios.ForEach(Trader.RegisterPortfolio)));
Trader.NewSecurities += securities => this.Dispatcher.BeginInvoke((Action)(() => securities.ForEach(Trader.RegisterTrades)));
_logManager.Listeners.Add(new GuiLogListener(monitor));
_logManager.Sources.Add(Trader);
_logManager.Sources.Add(_strategy);
}
Trader.Connect();
Trader.StartExport();
_candleManager = new CandleManager(Trader);
}
}
catch (Exception)
{
//System.Windows.MessageBox.Show(this, ex.Message, "Error");
//return;
}
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
}
private void button2_Click(object sender, RoutedEventArgs e)
{
Trader.Disconnect();
}
private void textBox1_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
}
private void passwordBox1_PasswordChanged(object sender, RoutedEventArgs e)
{
}
public Security SelectedSecurity
{
get { return (Security)Security.SelectedValue; }
}
public Security SelectedSecurity_2
{
get { return (Security)Security_2.SelectedValue; }
}
public void SecuritySelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
public void Security_2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void button3_Click(object sender, RoutedEventArgs e)
{
if (_strategy == null)
{
var ind = new Ind();
security = (Security)SelectedSecurity;
// создаем торговую стратегию
_strategy = new IndStrategy(_candleManager, ind, timeFrame)
{
Volume = 1,
Security = (Security)SelectedSecurity,
Trader = Trader,
TimeFrame = timeFrame,
};
// начинаем получать текущие сделки (для построения свечек реального времени)
Trader.RegisterTrades(security);
//Trader.GetHistoryData(security, timeFrame,
// new Range<DateTime>(DateTime.Today - TimeSpan.FromDays(5), Trader.MarketTime));
_lastHistoryCandle = timeFrame.GetCandleBounds(Trader).Min;
// регистрируем наш тайм-фрейм
_candleManager.RegisterTimeFrameCandles(security, timeFrame);
}
if (_strategy.ProcessState == ProcessStates.Stopped)
{
// запускаем процесс получения стакана, необходимый для работы алгоритма котирования
Trader.RegisterQuotes(_strategy.Security);
_strategy.Start();
}
else
{
Trader.UnRegisterQuotes(_strategy.Security);
_strategy.Stop();
}
}
}
}
"Индикатор"[huh]
Код
using System;
namespace MyStock
{
public class Ind : BaseIndicator<decimal>
{
public Ind()
: base(typeof(TimeFrameCandle))
{
}
public override bool IsFormed
{
get { return true; }
}
public override decimal OnProcess(IIndicatorValue input)
{
return input.GetValue<TimeFrameCandle>().ClosePrice;
}
}
}
Стратегия:
Код
namespace MyStock
{
using System;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.AlfaDirect;
public class IndStrategy : TimeFrameStrategy
{
public readonly CandleManager _candleManager;
public bool _isSmaller;
private DateTime _nextTime;
public IndStrategy(CandleManager candleManager, Ind Ind1, TimeSpan timeFrame)
: base(timeFrame)
{
_candleManager = candleManager;
this.ind = Ind1;
}
public Ind ind { get; private set; }
protected override void OnStarting()
{
_isSmaller = this.ind.LastValue < 200;
_nextTime = base.TimeFrame.GetCandleBounds(base.Trader).Max;
base.OnStarting();
}
protected override ProcessResults OnProcess()
{
if (base.ProcessState == ProcessStates.Stopping)
{
base.CancelActiveOrders();
return ProcessResults.Stop;
}
if (base.Trader.MarketTime < _nextTime)
{
return ProcessResults.Continue;
}
var candle = _candleManager.GetTimeFrameCandle(base.Security, base.TimeFrame, _nextTime - base.TimeFrame);
if (candle == null)
{
if ((base.Trader.MarketTime - _nextTime) > TimeSpan.FromSeconds(10))
_nextTime = base.TimeFrame.GetCandleBounds(base.Trader.MarketTime).Max;
return ProcessResults.Continue;
}
_nextTime += base.TimeFrame;
this.ind.Process((DecimalIndicatorValue)candle.ClosePrice);
var isSmaller = this.ind.LastValue < 200;
if (isSmaller == true)
{
var direction = isSmaller ? OrderDirections.Sell : OrderDirections.Buy;
var order = this.CreateOrder(direction, base.Security.GetMarketPrice(direction), 1);
var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
base.ChildStrategies.Add(strategy);
_isSmaller = isSmaller;
}
return ProcessResults.Continue;
}
}
}
Очень надеюсь на хелп, а то стопорится все что можно