← Voltar

2.6 ActionStrategyConditionHelper работает ?

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

  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 , при этом данные по свечкам ок

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

batch.ChildStrategies.AddRange(trades.Select

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

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

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

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

Este tópico foi útil?

Compartilhar tópico

Comentários (16)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

Mikhail Sukhov
Mikhail Sukhov
  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());
  3. б. Хм, логично. Надо проверять.
ustas
ustas
ustas Autor

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
Mikhail Sukhov

ustas:

Mikhail Sukhov:

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

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

ustas
ustas Autor

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

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

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

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

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

Mikhail Sukhov
Mikhail Sukhov

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
ustas Autor

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

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

Mikhail Sukhov
Mikhail Sukhov

ustas:

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

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

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

ustas
ustas Autor

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

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

Mikhail Sukhov
Mikhail Sukhov

ustas:

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

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

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

ustas
ustas Autor

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:<mark>False </mark>02.12.2010 17:31:08? <mark>False </mark>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:<mark>True </mark>02.12.2010 17:46:12? <mark>True </mark>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

Mikhail Sukhov
Mikhail Sukhov

ustas:

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

А у меня нет :(

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

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

_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
ustas Autor

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
Mikhail Sukhov

ustas: Жду решения!

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

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

ustas
ustas Autor

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

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

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

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

base.ChildStrategies.Add(batch);

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

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

Mikhail Sukhov
Mikhail Sukhov

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

base.ChildStrategies.Add(batch);

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

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

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

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

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

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