UsilaDobry
|
Дата: 21.04.2013
IvanB Всего скорее Вы поместили в TimeFrameComboBox значения не типа double.
<ComboBox x:Name="TimeFrameComboBox" Width="50" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="144,-22,0,0" SelectedIndex="0" > <ComboBoxItem>1</ComboBoxItem> <ComboBoxItem>5</ComboBoxItem> <ComboBoxItem>10</ComboBoxItem> <ComboBoxItem>15</ComboBoxItem> <ComboBoxItem>30</ComboBoxItem> <ComboBoxItem>60</ComboBoxItem> </ComboBox> Здесь значения int32. Как здесь в коде указать тип значения double? Просто поставить 1.0; 5.0... Это не помогает...
|
|
Спасибо:
|
|
|
|
|
IvanB
|
Дата: 21.04.2013
Предлагаю заполнять в коде C#: Код
TimeFrameComboBox.Items.Add(1);
TimeFrameComboBox.Items.Add(5);
...
И можно в цикле это сделать.
|
|
Спасибо:
|
|
|
|
|
UsilaDobry
|
Дата: 21.04.2013
Это все сложно... Хорошо, поставлю элемент TimePicker, он передает значения типа DateTime, а нам надо передать значение типа TimeSpan. Явное преобразование в этой строке не катит, как тогда обратиться к TimePicker в строке:
Finam.History.GetHistoryCandles(InterfaceConnection.SelectedSecurity, TfTimePicker.Value, (DateTime)BeginDatePicker.SelectedDate, (DateTime)EndDatePicker.SelectedDate).ToArray();
|
|
Спасибо:
|
|
|
|
|
UsilaDobry
|
Дата: 21.04.2013
Вот так правильно
Finam.History.GetHistoryCandles(InterfaceConnection.SelectedSecurity, TimeSpan.Parse(TfTimePicker.Value.ToString()), (DateTime)BeginDatePicker.SelectedDate, (DateTime)EndDatePicker.SelectedDate).ToArray();
не правильно... Exception Строка не распознана как действительный TimeSpan.
TimeSpan.Parse(TfTimePicker.Value.ToString()), что здесь не так? берем значение типа DateTime, преобразуем его методом ToString в строку, а потом парсим в тип TimeSpan...
|
|
Спасибо:
|
|
|
|
|
UsilaDobry
|
Дата: 21.04.2013
|
|
Спасибо:
|
|
|
|
|
UsilaDobry
|
Дата: 21.04.2013
|
|
|
|
Я дописал создание candleManager в обработчик события ChartButton_Click. Ошибка не вылетает, но свечи не выводятся на график, появляется только сетка координат Код
using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows;
using Ecng.Xaml;
using StockSharp.Algo.Candles;
using StockSharp.Logging;
using StockSharp.Quik;
using StockSharp.TraderConnection;
using StockSharp.Xaml;
namespace My_FirstROBOT
{
/// <summary>
/// Логика взаимодействия для MainWindow.xaml
/// </summary>
public partial class MainWindow
{
private readonly MonitorWindow _monitor = new MonitorWindow();
private readonly LogManager _logmanager = new LogManager();
public MainWindow()
{
InitializeComponent();
InterfaceConnection.SafeConnection = new SafeConnection(new QuikTrader(QuikTerminal.GetDefaultPath()));
//////////////////////////////////Блок получения информации///////////////////////////////////////////////////////
InterfaceConnection.SafeConnection.Trader.NewSecurities += securities => this.GuiAsync(() =>
{
TabMyTools.ItemsSource = InterfaceConnection.SafeConnection.Trader.Securities;
});
InterfaceConnection.SafeConnection.Trader.NewPortfolios += portfolios => this.GuiAsync(() =>
{
TabMyPortfolios.ItemsSource = InterfaceConnection.SafeConnection.Trader.Portfolios;
});
InterfaceConnection.SafeConnection.Trader.NewPositions += positions => this.GuiAsync(() =>
{
TabMyPosition.ItemsSource = InterfaceConnection.SafeConnection.Trader.Positions;
});
InterfaceConnection.SafeConnection.Trader.NewOrders += orders => this.GuiAsync(() =>
{
TabMyOrders.ItemsSource = InterfaceConnection.SafeConnection.Trader.Orders;
});
InterfaceConnection.SafeConnection.Trader.NewStopOrders += orders => this.GuiAsync(() =>
{
TabMyOrdersStop.ItemsSource = InterfaceConnection.SafeConnection.Trader.StopOrders;
});
InterfaceConnection.SafeConnection.Trader.NewMyTrades += trades => this.GuiAsync(() =>
{
TabMyTrades.ItemsSource = InterfaceConnection.SafeConnection.Trader.MyTrades;
});
////////////////////////////////////////////Блок логирования////////////////////////////////////////////////////
_logmanager.Listeners.Add(new GuiLogListener(_monitor));
_logmanager.Listeners.Add(new FileLogListener("log.txt"));
_logmanager.Sources.Add(InterfaceConnection.SafeConnection.Trader);
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
if (InterfaceConnection.SafeConnection.Trader != null &&
InterfaceConnection.SafeConnection.Trader.IsConnected)
{
InterfaceConnection.SafeConnection.Trader.Dispose();
}
Thread.CurrentThread.Abort();
base.OnClosing(e);
}
/// <summary>
/// Менеджер свечек
/// </summary>
private readonly CandleManager _candleManager;
/// <summary>
/// Основная площадь
/// </summary>
private ChartArea _area;
/// <summary>
/// Элемент свечек на графике
/// </summary>
private ChartCandleElement _candlesElem;
/// <summary>
/// Серия для свечек
/// </summary>
private CandleSeries _series;
/// <summary>
/// Создать и добавить все нужные нам элементы
/// </summary>
private void InitAreas()
{
try
{
//добавляем первую площадь(на которой будем все отмечать)
_area = new ChartArea();
Chart.Areas.Add(_area);
//свечки
_candlesElem = new ChartCandleElement();
_area.Elements.Add(_candlesElem);
if (InterfaceConnection != null)
_series = new CandleSeries(typeof(TimeFrameCandle), InterfaceConnection.SelectedSecurity, TimeSpan.FromMinutes(1));
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
private void CandlesChartStart()
{
try
{
//отрабатываем поступление новых свечек
_series.ProcessCandle += candle =>
{
//законченные свечки используются для расчета индикатора
if (candle.State == CandleStates.Finished)
{
this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
{
{_candlesElem, candle},//свечка
}));
}
else
{
var timeFrame = (TimeSpan)_series.Arg;
var time = timeFrame.GetCandleBounds(_series.Security).Min - timeFrame; //находим последнее время свечки
//добавляем только последние измененные свечки
if (candle.OpenTime >= time)
Chart.ProcessCandle(_candlesElem, candle);
}
};
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
private void ChartButton_Click(object sender, RoutedEventArgs e)
{
try
{
var _candleManager = new CandleManager(InterfaceConnection.SafeConnection.Trader);
//инициализация графика
InitAreas();
//прорисовка свечек
CandlesChartStart();
//запускаем получение свечек
_candleManager.Start(_series);
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
/// <summary>
/// Блок работы торговой стратегии
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TakrProfitCheckBox_Checked(object sender, RoutedEventArgs e)
{
WidthBbLabel.IsEnabled = true;
WidthBbTextBox.IsEnabled = true;
SpradTpLabel.IsEnabled = true;
SpradTpTextBox.IsEnabled = true;
}
private void LevelSARCheckBox_Checked(object sender, RoutedEventArgs e)
{
SignalsLevelSarLabel.IsEnabled = true;
Signal1SarCheckBox.IsEnabled = true;
Signal2SarCheckBox.IsEnabled = true;
StartTradingButton.IsEnabled = true;
}
private void StartTradingButton_Click(object sender, RoutedEventArgs e)
{
StopTradingButton.IsEnabled = true;
StartTradingButton.IsEnabled = false;
}
private void StopTradingButton_Click(object sender, RoutedEventArgs e)
{
StopTradingButton.IsEnabled = false;
StartTradingButton.IsEnabled = true;
}
}
}
|
|
Спасибо:
|
|
|
|
|
UsilaDobry
|
Дата: 22.04.2013
Вопросы отпали после просмотра видео-урока CandleChartsProject. Сразу надо было мне смотреть видео-урок.
|
|
Спасибо:
|
|
|
|
|
Compressor
|
Дата: 15.07.2013
По какой причине CancelActiveOrders() не работает?
|
|
Спасибо:
|
|
|
|
|
IvanB
|
Дата: 15.07.2013
Compressor По какой причине CancelActiveOrders() не работает? Всего скорее Вы вызываете этот метод, где он в принципе не может работать, например если Вы вызываете CancelActiveOrders в переопределенном методе OnStopping, этот метод вызывается когда стратегия уже перешла в остановку и по этому не воспринимает торговые команды. Информация из логирования должна помочь в определении причины не работы CancelActiveOrders.
|
|
Спасибо:
|
|
|
|
|
Compressor
|
Дата: 16.07.2013
Он работает в ProcessCandle(Candle candle), в стандартной схеме (как в болинджере). Какие параметры надо выводить в лог, чтобы понять в чем причина?
|
|
Спасибо:
|
|
|
|