2.6 ActionStrategyConditionHelper работает ?
Atom Ответить
30.11.2010


Приветствую уважаемых Михаила и всех коллег.

1. После перехода на 2.6 у меня перестало срабатывать ActionStrategyConditionHelper например CurrentCandleTotalVolumeMore
в 2.5.2 работало. Или у меня одного так и больше никто ничего подобного не заметил?

Делаю так

Код
public static Func<bool> ctv;
...
_candleManager.CandlesChanged += (token, candles) =>
{
ctv= ActionStrategyConditionHelper.CurrentCandleTotalVolumeMore(token, 1);
DrawCandles(candles);
};

В DrawCandles вывожу ctv(), которое всегда false , при этом данные по свечкам ок

2. Пример в документации "Тейк профит и стоп лосс" пункт 2.
а) не компилируется предложение
Код

batch.ChildStrategies.AddRange(trades.Select


AddRange не определён в ChildStrategies и непонятно откуда тут берётся trades или должно быть myTrades ?

и хотелось бы увидеть пример _takeProfit(t); и _stopLoss(t);

б) И еще последний вопрос про логику обработки NewMyTrades в этом же примере. Когда сработают защитные заявки разве не произойдет опять же событие NewMyTrades и выставятся защитные заявки на защитные же.

Спасибо и с уважением!

Теги:


Спасибо:




16 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 30.11.2010
Ответить


1. Посмотрите, изменяется ли текущая свечка через CandleManager.CandlesChanged. Кстати, ctv= ActionStrategyConditionHelper.CurrentCandleTotalVolumeMore(token, 1); -> или короче, ctv= token.CurrentCandleTotalVolumeMore(1); Почитайте про extension methods в C#
2. а. using Ecng.Collections; (те же extension methods). Да, trades. Опечатка. _takeProfit - это делегаты. Тело обычное - new TakeProfitStrategy(trades, new Unit());
2. б. Хм, логично. Надо проверять.
Спасибо: ustas

ustas

Фотография
Дата: 30.11.2010
Ответить


Mikhail Sukhov
1. Посмотрите, изменяется ли текущая свечка через CandleManager.CandlesChanged.

да свечка меняется , я её вывожу там же в DrawCandles. (как я уже написал "при этом данные по свечкам ок")
Mikhail Sukhov

Кстати, ctv= ActionStrategyConditionHelper.CurrentCandleTotalVolumeMore(token, 1); -> или короче, ctv= token.CurrentCandleTotalVolumeMore(1); Почитайте про extension methods в C#

Спасибо.
Mikhail Sukhov

2. а. using Ecng.Collections; (те же extension methods). Да, trades. Опечатка. _takeProfit - это делегаты. Тело обычное - new TakeProfitStrategy(trades, new Unit());

Понятно, спасибо.


Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 30.11.2010
Ответить


ustas
Mikhail Sukhov
1. Посмотрите, изменяется ли текущая свечка через CandleManager.CandlesChanged.

да свечка меняется , я её вывожу там же в DrawCandles. (как я уже написал "при этом данные по свечкам ок")


Посмотрите в обработчике, что выдает token.Manager.GetCurrentTimeFrameCandle(token.Security, timeFrame); и чему у такой свечки равен TotalVolume.
Спасибо:

ustas

Фотография
Дата: 30.11.2010
Ответить


Mikhail Sukhov

Посмотрите в обработчике, что выдает token.Manager.GetCurrentTimeFrameCandle(token.Security, timeFrame); и чему у такой свечки равен TotalVolume.


а вот token.Manager.GetCurrentTimeFrameCandle(token.Security, timeFrame); выдаёт всё врема null почему то :(
хотя свечки рисуются, правда рисую я их по candles

В 2.5.2 работало 100 пудов, я ничего не менял :)

Вы вот тут что то правили, не могли задеть?

Спасибо и с уважением!
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 30.11.2010
Ответить


ustas
Mikhail Sukhov

Посмотрите в обработчике, что выдает token.Manager.GetCurrentTimeFrameCandle(token.Security, timeFrame); и чему у такой свечки равен TotalVolume.


а вот token.Manager.GetCurrentTimeFrameCandle(token.Security, timeFrame); выдаёт всё врема null почему то :(
хотя свечки рисуются, правда рисую я их по candles

В 2.5.2 работало 100 пудов, я ничего не менял :)

Вы вот тут что то правили, не могли задеть?

Спасибо и с уважением!


ITrader.MarketTime все корректно возвращает? Если копнуть еще поглубже, CandleManager.GetTimeFrameCandle для необходимо времени так же null возвращает?
Спасибо:

ustas

Фотография
Дата: 01.12.2010
Ответить


Mikhail Sukhov


ITrader.MarketTime все корректно возвращает? Если копнуть еще поглубже, CandleManager.GetTimeFrameCandle для необходимо времени так же null возвращает?


Извиняюсь за паузу. Отъезжал.
Да ITrader.MarketTime - верный , а вот CandleManager.GetTimeFrameCandle всё время даёт null :(
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.12.2010
Ответить


ustas
Mikhail Sukhov


ITrader.MarketTime все корректно возвращает? Если копнуть еще поглубже, CandleManager.GetTimeFrameCandle для необходимо времени так же null возвращает?


Извиняюсь за паузу. Отъезжал.
Да ITrader.MarketTime - верный , а вот CandleManager.GetTimeFrameCandle всё время даёт null :(


А свечки то вообще формируются? NewCandles CandlesChanged?
Спасибо:

ustas

Фотография
Дата: 01.12.2010
Ответить


Mikhail Sukhov


А свечки то вообще формируются? NewCandles CandlesChanged?


ну да, как я говорил, я же их рисую в DrawCandles по candles из событий NewCandles и CandlesChanged
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 02.12.2010
Ответить


ustas
Mikhail Sukhov


А свечки то вообще формируются? NewCandles CandlesChanged?


ну да, как я говорил, я же их рисую в DrawCandles по candles из событий NewCandles и CandlesChanged


У меня по тестам свечка выдается. Попробуйте все таки точно определить, то ли время передается в CandleManager и есть ли на тот момент свечка (получив их через GetTimeFrameCandles и сравнив, имеет ли необходимая среди нет).
Спасибо:

ustas

Фотография
Дата: 02.12.2010
Ответить


Mikhail Sukhov

У меня по тестам свечка выдается. Попробуйте все таки точно определить, то ли время передается в CandleManager и есть ли на тот момент свечка (получив их через GetTimeFrameCandles и сравнив, имеет ли необходимая среди нет).


А у меня нет :(

Ну вот полностью код примера c выводом
Код
namespace testHelper
{
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 Portfolio _port;
private static Security _sec;
private static QuikTrader _trader;
private static Func<bool> ctv;
private static CandleManager _candleManager;
private static readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(1.0 / 6.0);


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();
}
}
};


_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.TradesTable });


_trader.Connected += () =>
{

Console.WriteLine("Connected");
waitHandle.Set();


};

if (_sec != null)
{
_candleManager = new CandleManager(_trader);
_candleManager.RegisterTimeFrameCandles(_sec, _timeFrame);


_candleManager.NewCandles += (token, candles) =>
{

var _nextTime = _timeFrame.GetCandleBounds(_trader).Max;
var candle = _candleManager.GetTimeFrameCandle(_sec, _timeFrame, _nextTime - _timeFrame);
ctv = ActionStrategyConditionHelper.CurrentCandleTotalVolumeMore(token, 1);

if (candle != null)
{
ctv = ActionStrategyConditionHelper.CurrentCandleTotalVolumeMore(token,1);
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("new candle time:{0} TotalVolume:{1} ctv:{2}",candle.Time, candle.TotalVolume, ctv());
Console.ForegroundColor = ConsoleColor.Gray;
}

DrawCandles(candles);
};


_candleManager.CandlesChanged += (token, candles) =>
{
// _strat.Dispose();
ctv = ActionStrategyConditionHelper.CurrentCandleTotalVolumeMore(token, 1);
DrawCandles(candles);
};
}


waitHandle.WaitOne();



Console.WriteLine("Чтобы закончить, нажмите любую кнопку...");
Console.Read();

}

}

private static void DrawCandles(IEnumerable<Candle> candles)
{
foreach (var candle in candles)
{
if (_trader != null && candle.Time >= _timeFrame.GetCandleBounds(_trader).Min)
{
string str = _trader.MarketTime + "? " + ctv() + " " + candle.Security.Code + " " + candle.Time.TimeOfDay + " "
+ _trader.MarketTime.TimeOfDay + " " + candle.ClosePrice + " " + candle.TotalVolume
;
Console.WriteLine(str);
}
}
}



}
}


вывод

Цитата:
Портфель ..... появился.
SRZ0 появился
Чтобы закончить, нажмите любую кнопку...
new candle time:02.12.2010 17:31:00 TotalVolume:238 ctv:False
02.12.2010 17:31:08? False SRZ0 17:31:00 17:31:08.0237782 10273 238
02.12.2010 17:31:08? False SRZ0 17:31:00 17:31:08.3317958 10275 261
02.12.2010 17:31:08? False SRZ0 17:31:00 17:31:08.6288128 10275 311
new candle time:02.12.2010 17:31:10 TotalVolume:86 ctv:False
02.12.2010 17:31:10? False SRZ0 17:31:10 17:31:10.8129377 10275 86
02.12.2010 17:31:12? False SRZ0 17:31:10 17:31:12.3740270 10275 146
02.12.2010 17:31:12? False SRZ0 17:31:10 17:31:12.6860449 10279 222
02.12.2010 17:31:13? False SRZ0 17:31:10 17:31:13.3090805 10274 292
02.12.2010 17:31:13? False SRZ0 17:31:10 17:31:13.6220984 10275 293
02.12.2010 17:31:15? False SRZ0 17:31:10 17:31:15.1811876 10275 301
02.12.2010 17:31:15? False SRZ0 17:31:10 17:31:15.4932054 10273 313
02.12.2010 17:31:16? False SRZ0 17:31:10 17:31:16.1172411 10275 314
02.12.2010 17:31:16? False SRZ0 17:31:10 17:31:16.7412768 10276 317
02.12.2010 17:31:19? False SRZ0 17:31:10 17:31:19.2364195 10277 318
new candle time:02.12.2010 17:31:20 TotalVolume:13 ctv:False
02.12.2010 17:31:20? False SRZ0 17:31:20 17:31:20.1734731 10276 13
02.12.2010 17:31:21? False SRZ0 17:31:20 17:31:21.1115268 10276 16
02.12.2010 17:31:21? False SRZ0 17:31:20 17:31:21.7375626 10275 20
02.12.2010 17:31:22? False SRZ0 17:31:20 17:31:22.6776164 10276 32
02.12.2010 17:31:23? False SRZ0 17:31:20 17:31:23.6056694 10276 44
02.12.2010 17:31:24? False SRZ0 17:31:20 17:31:24.5407229 10276 49
02.12.2010 17:31:25? False SRZ0 17:31:20 17:31:25.7947947 10276 52
new candle time:02.12.2010 17:31:30 TotalVolume:113 ctv:False
02.12.2010 17:31:30? False SRZ0 17:31:30 17:31:30.1570442 10278 113
02.12.2010 17:31:30? False SRZ0 17:31:30 17:31:30.4770625 10276 122
02.12.2010 17:31:30? False SRZ0 17:31:30 17:31:30.7930805 10276 126
02.12.2010 17:31:31? False SRZ0 17:31:30 17:31:31.4191163 10276 128
02.12.2010 17:31:31? False SRZ0 17:31:30 17:31:31.7171334 10277 131
02.12.2010 17:31:32? False SRZ0 17:31:30 17:31:32.3411691 10279 139
02.12.2010 17:31:32? False SRZ0 17:31:30 17:31:32.9672049 10278 140
02.12.2010 17:31:33? False SRZ0 17:31:30 17:31:33.2772226 10277 143
02.12.2010 17:31:33? False SRZ0 17:31:30 17:31:33.5892405 10277 146
02.12.2010 17:31:34? False SRZ0 17:31:30 17:31:34.2122761 10280 363
02.12.2010 17:31:34? False SRZ0 17:31:30 17:31:34.5252940 10282 749
02.12.2010 17:31:34? False SRZ0 17:31:30 17:31:34.8363118 10284 755
02.12.2010 17:31:35? False SRZ0 17:31:30 17:31:35.1483296 10281 758
02.12.2010 17:31:35? False SRZ0 17:31:30 17:31:35.4783485 10280 777
02.12.2010 17:31:36? False SRZ0 17:31:30 17:31:36.7114191 10279 784
02.12.2010 17:31:37? False SRZ0 17:31:30 17:31:37.0234369 10279 792
02.12.2010 17:31:38? False SRZ0 17:31:30 17:31:38.5825261 10278 952
new candle time:02.12.2010 17:31:40 TotalVolume:135 ctv:False
02.12.2010 17:31:40? False SRZ0 17:31:40 17:31:40.1446154 10281 135
02.12.2010 17:31:40? False SRZ0 17:31:40 17:31:40.4646337 10281 339
02.12.2010 17:31:42? False SRZ0 17:31:40 17:31:42.0157224 10282 343
02.12.2010 17:31:42? False SRZ0 17:31:40 17:31:42.9687770 10283 344
02.12.2010 17:31:45? False SRZ0 17:31:40 17:31:45.4449186 10281 346
02.12.2010 17:31:46? False SRZ0 17:31:40 17:31:46.0709544 10280 372
02.12.2010 17:31:48? False SRZ0 17:31:40 17:31:48.5650970 10279 382




Видим что Helper всё время false
Что же я всё таки делаю не так? В 2.5.2 это работало

Спасибо и с уважением!

(Update)
только что собрал этот же пример не поменяв ни строчки на 2.5.2
вот вывод

Цитата:
Портфель ...... появился.
SRZ0 появился
Чтобы закончить, нажмите любую кнопку...
new candle time:02.12.2010 17:46:10 TotalVolume:4 ctv:True
02.12.2010 17:46:12? True SRZ0 17:46:10 17:46:12.0266640 10315 4
02.12.2010 17:46:14? True SRZ0 17:46:10 17:46:14.1737868 10316 16
new candle time:02.12.2010 17:46:20 TotalVolume:251 ctv:True
02.12.2010 17:46:21? True SRZ0 17:46:20 17:46:21.9742329 10316 251
02.12.2010 17:46:23? True SRZ0 17:46:20 17:46:23.5333221 10320 281
new candle time:02.12.2010 17:46:30 TotalVolume:32 ctv:True
02.12.2010 17:46:30? True SRZ0 17:46:30 17:46:30.3977147 10316 32
02.12.2010 17:46:31? True SRZ0 17:46:30 17:46:31.6497863 10317 39
02.12.2010 17:46:35? True SRZ0 17:46:30 17:46:35.0769824 10316 40
02.12.2010 17:46:38? True SRZ0 17:46:30 17:46:38.1981609 10315 55
02.12.2010 17:46:39? True SRZ0 17:46:30 17:46:39.1352145 10313 193
new candle time:02.12.2010 17:46:30 TotalVolume:193 ctv:True
02.12.2010 17:46:39? True SRZ0 17:46:40 17:46:39.7612503 10312 1
02.12.2010 17:46:40? True SRZ0 17:46:40 17:46:40.3812858 10314 21
Автор топика
Спасибо:

ustas

Фотография
Дата: 02.12.2010
Ответить


Вообщем жду резолюции. Видно что на 2.5.2 работало иначе.

А тем временем, пока роботы курят ... (не из-за новой версии, можно продолжать работать на 2.5.2, а просто курят)
РОССИЯ 2018!
Ура!
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 02.12.2010
Ответить


ustas
Mikhail Sukhov

У меня по тестам свечка выдается. Попробуйте все таки точно определить, то ли время передается в CandleManager и есть ли на тот момент свечка (получив их через GetTimeFrameCandles и сравнив, имеет ли необходимая среди нет).


А у меня нет :(

Ну вот полностью код примера c выводом


Две новости, хорошая и плохая. Плохая - пока не знаю почему код не так работает. Хорошая, нашел в Вашем коде ошибкуBigGrin Вы создаете просто нереальное количество условий. Создавайте один раз. Вместо:

Код
_candleManager.RegisterTimeFrameCandles(_sec, _timeFrame);

_candleManager.CandlesChanged += (token, candles) =>
{
ctv = ActionStrategyConditionHelper.CurrentCandleTotalVolumeMore(token, 1);
DrawCandles(candles);
};


Надо писать:

Код
var tfToken = _candleManager.RegisterTimeFrameCandles(_sec, _timeFrame);

// или по вашему ctv = ActionStrategyConditionHelper.CurrentCandleTotalVolumeMore(tfToken, 1);
ctv = tfToken.CurrentCandleTotalVolumeMore(1);

_candleManager.CandlesChanged += (token, candles) =>
{
// Console(ctv());
DrawCandles(candles);
};
Спасибо:

ustas

Фотография
Дата: 02.12.2010
Ответить


Mikhail Sukhov



Надо писать:

Код
var tfToken = _candleManager.RegisterTimeFrameCandles(_sec, _timeFrame);

// или по вашему ctv = ActionStrategyConditionHelper.CurrentCandleTotalVolumeMore(tfToken, 1);
ctv = tfToken.CurrentCandleTotalVolumeMore(1);

_candleManager.CandlesChanged += (token, candles) =>
{
// Console(ctv());
DrawCandles(candles);
};


О! Спасибо! Об этом тоже хотел спросить меняется ли ActionStrategyConditionHelper динамически. Как до этого догадаться самому не знал.
Условия думал не плодятся, так как переменная статическая. Делал присваивание при каждом изменении типа для уверенности. :)

Жду решения!

Спасибо и с уважением!
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 03.12.2010
Ответить


ustas

Жду решения!

Спасибо и с уважением!


Ошибку нашел. К след. неделе выложу фикс 2.6.1.
Спасибо: ustas

ustas

Фотография
Дата: 06.12.2010
Ответить


Mikhail Sukhov
[
Ошибку нашел. К след. неделе выложу фикс 2.6.1.


Супер! Фикс 2.6.1 работает подтверждаю. :) Спасибо!

Единственно небольшая помарочка. В документации в том же примере "Тейк-профит и стоп-лосс ".

Вы добавили фильтрацию по TargetOrder. Отлично! Но в конце

base.ChildStrategies.Add(batch);

будет выполняться всегда независимо от от того создалась дочерняя стратегия по или нет. И может возникнуть ошибка что "дочерняя стратегия не найдена".

Спасибо и с уважением!
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 07.12.2010
Ответить


ustas
Вы добавили фильтрацию по TargetOrder. Отлично! Но в конце

base.ChildStrategies.Add(batch);

будет выполняться всегда независимо от от того создалась дочерняя стратегия по или нет. И может возникнуть ошибка что "дочерняя стратегия не найдена".

Спасибо и с уважением!


Да, надо поставить проверку:

Код
// если не найдена ни одна сделка для заявки TargetOrder
if (trades.Count() == 0)
    return;
Спасибо: ustas


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

loading
clippy