Serg
|
Дата: 27.09.2012
Спасибо за статьи) Пытаюсь разбираться. Завис на реализации QuikTraderBuilder. Никак не разберусь почему монитор не получает сообщения от QuikTraderBuilder, видимо что-то с реализацией ILogSource. Код
private void RaiseLog(LogMessage logMessage)
{
var handler = Log;
if (handler != null)
handler(logMessage); <<-- здесь возникает ошибка Current thread is not a GUI.
}
Буду рад помощи)
|
|
|
|
FinDirector
|
Дата: 27.09.2012
Код
LogManager.Listeners.Add(new GuiLogListener(_monitor));
|
Автор топика
|
|
|
Serg
|
Дата: 27.09.2012
FinDirector  Код
LogManager.Listeners.Add(new GuiLogListener(_monitor));
Да я вроде так и делаю но почемуто все вообще виснет. Может проблема в версии 4.0.23? Вы какую версию используете? ps: да и в логфайл сообщения от трейдера также не попадают( Мне кажется что гуи синхронизация здесь непричем. Скорее проблема с реализацией ILogSourse. Хотя могу только догадыватся так как не профи) FinDirector, подскажите, у вас то все работает или всетаки чтото меняли после публикации своих статей?
|
|
|
|
FinDirector
|
Дата: 27.09.2012
Тоже использую 4.0.23. Все работает. Могу только посоветовать создать новый пустой проект и наладить в нем логи, и в уже имеющемся проекте отключить логи. Тогда и разберетесь, что именно и почему не работает.
|
Автор топика
|
|
|
Serg
|
Дата: 27.09.2012
Даже не знаю в чем точто была проблема но все заработало. FinDirector, с вашего позволения могу выложить проект-шаблон целиком.
|
|
|
|
Gunn7
|
Дата: 25.10.2012
Присоединяюсь к serq, спасибо за статьи. Может все же выложите реализацию получения свечей с финама. Повис на этом уже который день...
|
|
|
|
FinDirector
|
Дата: 20.11.2012
|
|
|
|
Код
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Net;
using FinDirector.Infrastructure;
namespace FinDirector.Modules.SharedServices
{
public class FinamHistoryCandleProvider : IHistoryCandleProvider
{
public int FinamSecurityCode { get; set; }
[Description("Таймфрейм.")]
public TimeSpan TimeFrame { get; set; }
public FinamHistoryCandleProvider()
{
FinamSecurityCode = 17455;
TimeFrame = TimeSpan.FromHours(1);
}
public IList<Candle> GetHistoryCandles(DateTime beginDate, DateTime endDate)
{
string uri = GetInstrumentUrl(beginDate, endDate);
WebRequest request = WebRequest.Create(uri);
using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream()))
{
IList<Candle> result = new CandleReader().ReadCandles(sr);
return result;
}
}
private int GetPeriodCode()
{
int period = 3;
if (TimeFrame == TimeSpan.FromMinutes(5))
period = 3;
else if (TimeFrame == TimeSpan.FromHours(1))
period = 7;
else if (TimeFrame == TimeSpan.FromDays(1))
period = 8;
return period;
}
private string GetInstrumentUrl(DateTime beginDate, DateTime endDate)
{
int period = GetPeriodCode();
string Ticker = "data";
string fileName = Ticker + ".txt";
string url = string.Format(CultureInfo.InvariantCulture,
"http://195.128.78.52/{0}?d=d&market=14&em={8}&df={2}&mf={3}&yf={4}&dt={5}&mt={6}&yt={7}&p={9}&f={0}&e=.txt&cn={1}&dtf=1&tmf=1&MSOR=0&sep=1&sep2=1&datf=1&at=1",
fileName, Ticker,
beginDate.Day, beginDate.Month - 1, beginDate.Year,
endDate.Day, endDate.Month - 1, endDate.Year,
FinamSecurityCode, period);
return url;
}
}
}
class CandleReader
{
private bool SkipFirstLine = true;
private char Separator = ',';
public IList<Candle> ReadCandles(StreamReader sr)
{
List<Candle> result = new List<Candle>();
if (SkipFirstLine)
{
sr.ReadLine();
}
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
string[] values = line.Split(new char[] { Separator });
Candle candle = ReadCandle(values);
result.Add(candle);
}
return result;
}
private Candle ReadCandle(string[] line)
{
int dateIndex = 2;
int timeIndex = 3;
int openIndex = 4;
int highIndex = 5;
int lowIndex = 6;
int closeIndex = 7;
int date = Int32.Parse(line[dateIndex], CultureInfo.InvariantCulture);
int time = Int32.Parse(line[timeIndex], CultureInfo.InvariantCulture);
var result = new Candle()
{
DateTime = new DateTime(date / 10000, (date / 100) % 100, date % 100,
time / 10000, (time / 100) % 100, 0),
OpenPrice = double.Parse(line[openIndex], CultureInfo.InvariantCulture),
ClosePrice = double.Parse(line[closeIndex], CultureInfo.InvariantCulture),
HighPrice = double.Parse(line[highIndex], CultureInfo.InvariantCulture),
LowPrice = double.Parse(line[lowIndex], CultureInfo.InvariantCulture)
};
return result;
}
}
|
Автор топика
|
|
|
Gunn7
|
Дата: 21.11.2012
Огромное спасибо!
|
|
|
|
Den
|
Дата: 28.11.2012
FinDirector  Код
FinamSecurityCode = 17455;
Пока, я просто выбираю руками нужный инструмент и слушаю tcpmon'ом запрос браузра и оттуда достаю код. Подскажите, пожалуйста, как получить список всех доступных кодов инструментов?
|
|
|
|
serebryakov_a
|
Дата: 02.12.2012
Serg  Даже не знаю в чем точто была проблема но все заработало. FinDirector, с вашего позволения могу выложить проект-шаблон целиком. Добрый день! Попытался реализовать описанный выше каркас - появились ошибки реализации интерфейсов(ITraderBuilder, ILogSource). версия библиотеки 4.1.6. Можете ли вы поделиться реализацией проекта-шаблона или подсказать в чем там были траблы?
|
|
|
|
VassilSanych
|
Дата: 21.12.2012
Смотрю, многие, в том числе и я, пользовались приведённым кодом, как основой. У многих в цитируемом тексте присутствует WriteLog :) Небольшое замечание: для подключения источника логирования не нужно реализовывать ILogSource. Достаточно унаследоваться от BaseLogReceiver<ВашКласс> и тогда можно замечательно использовать метод AddLog, и методы предоставляемые для него классом LoggingHelper: AddErrorLog, AddInfoLog и т.п. Правда для полного логирования необходимо добавить ещё Код
public override LogLevels LogLevel
{
get { return LogLevels.Debug; }
set { }
}
по вкусу :)
|
|
|
|
Геннадий Ванин (Gennady Vanin)
|
Дата: 21.12.2012
VassilSanych  Код
public override LogLevels LogLevel
{
get { return LogLevels.Debug; }
set { }
}
по вкусу :) Если этого альтруиста не забанить, то, тогда, прийдётся менять бизнес-модель с бесплатного коммерческого продукта на платный некоммерческий продукт Т.е., вместо того, чтобы пытаться продавать техподдержку и обучение того, чем нельзя пользоватьсяновичкам (и, соответственно, не находит широкого использования) на продажу небесплатного продукта с бесплатной техподдержкой-обучением-раскруткой , которым все легко пользуются и с более широким вовлечением волонтеров-разработчиков. VassilSanych - коварный и лукавый волонтёр-разработчик, который хочет бесплатно поучаствовать в развитии проекта StockSharp, поломав давно установившийся и отлаженный статус-кво!
|
|
|