Первая минута торгов
Atom Ответить
12.06.2012


Заинтересовался вопросом:
Тестирую стратегию на EmulationTrader. Таймфрейм, допустим, 10 мин. Не хочу, чтобы стратегия торговала в первую минуту торгов. Известные мне варианты:
1. Самый простой - поставить условие, чтобы выбрасывать первую свечку. Не самый лучший вариант по многим причинам. Сложность вижу, чтобы заставить правила тоже не работать в первую свечку.
Кроме того, видимо, что WorkingTime не дружит с EmulationTrader.
Создал производный класс от WorkingTime и поставил внутри него метки с выводом их в лог – ни разу к WorkingTime.Times никто не обратился
2. Смастерить "костыль". Например, подписаться на получение минутных свечей, из которых уже мастерить десятиминутные (а первую свечу дня - девятиминутную). Та же проблема: заставить правила тоже не работать в первую, выкинутую, минуту.

Кто-нить знаем более адекватные способы решения этой проблемы? Или же есть встроенные методы?

Ежели их нет, то предложение авторам библиотеки предусмотреть такую фичу




Спасибо:




7 Ответов
Memory

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


вот такое условие в правилах должно работать
Код
if(Strategy.Trader.MarketTime.TimeOfDay < TimeForOpen.TimeOfDay) return;
. TimeForOpen должно быть равным тому времени когда Вам нужно начинать торговлю
Ну а что касается правил, у меня правила вызываются всегда, просто они ничего не делают т.к. позиция не открыта. Помоему проще неукда. А позиция открывается только при Вренмени открытия свачи > TimeForOpen.
Спасибо: Кот Матроскин

OvcharenkoVI

Фотография
Автор статей
Дата: 12.06.2012
Ответить


Я тоже примерно так делаю, чтобы закрывался за минуту до клиринга, закрывал позы и открывался после. Но я через DateTime сам ввожу требуемое время и в region исполнения сигналов ставлю флаг, что текущее время входит в заданные мною промежутки

Примерно так:

Код
using System;
using System.Collections.Generic;
using Ecng.Collections;
using StockSharp.Algo.Logging;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;

namespace TradeSystem
{
    public class StrategyRTS : Strategy
    {
        #region Время остановки / старта

        private DateTime stopTime1;
        private DateTime stopTime2;
        private DateTime stopTime3;

        private DateTime startTime1;
        private DateTime startTime2;
        private DateTime startTime3;

        #endregion

        public StrategyRTS()
        {
            startTime1 = DateTime.Today.AddHours(10).AddMinutes(0);
            stopTime1 = DateTime.Today.AddHours(13).AddMinutes(59);

            startTime2 = DateTime.Today.AddHours(14).AddMinutes(03);
            stopTime2 = DateTime.Today.AddHours(18).AddMinutes(44);

            startTime3 = DateTime.Today.AddHours(19).AddMinutes(00);
            stopTime3 = DateTime.Today.AddHours(23).AddMinutes(49);
        }

        protected override void OnStarting()
        {
            Trader.RegisterQuotes(Security);

            this
                .When(Security.MarketDepthChanged())
                .Do(Calculate);

            base.OnStarting();
        }

        protected override void OnStopped()
        {
            Trader.UnRegisterQuotes(Security);

            base.OnStopped();
        }

        private void Calculate()
        {
            bool isTradingTime =

                (Trader.MarketTime >= startTime1 &&
                Trader.MarketTime < stopTime1) ||
                (Trader.MarketTime >= startTime2 &&
                Trader.MarketTime < stopTime2) ||
                (Trader.MarketTime >= startTime3 &&
                Trader.MarketTime < stopTime3);

            if (isTradingTime)
            {
                #region Исполнение сигналов

                

                #endregion
            }
            else
            {
                if (isClosed == false)
                {
                    this.AddInfoLog("Отменяю ордера, закрываю позиции");

                    Position pos = Trader.GetPosition(Portfolio, Security);

                    Trader.CancelOrders(null, Portfolio, null, null, Security);

                    if (pos != null)
                    {
                        if (pos.CurrentValue != 0)
                        {
                            ClosePositions(pos.CurrentValue);
                        }
                    }
                }
            }
        }
    }

}
Спасибо: Кот Матроскин Axell

Кот Матроскин

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


Memory Перейти
Ну а что касается правил, у меня правила вызываются всегда, просто они ничего не делают т.к. позиция не открыта.

При торговле интрадей все относительно просто. Но если я переношу позицию через ночь, а утром гэп против моей позиции, то EmulationTrader закроется по стопу в первые секунды торгов. В реальности, по этой цене не закрыться.
Опять же, если в правилах стоит Once(), а внутрь засуну условие
Код
if(Strategy.Trader.MarketTime.TimeOfDay < TimeForOpen.TimeOfDay) return;

то больше оно не сработает. А не ставить Once() - получу целый поток сделок, который трудно проконтролировать
Автор топика
Спасибо:

Memory

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


Кот Матроскин Перейти
Memory Перейти
Ну а что касается правил, у меня правила вызываются всегда, просто они ничего не делают т.к. позиция не открыта.

При торговле интрадей все относительно просто. Но если я переношу позицию через ночь, а утром гэп против моей позиции, то EmulationTrader закроется по стопу в первые секунды торгов. В реальности, по этой цене не закрыться.
Опять же, если в правилась стоит Once(), а внутрь засуну условие
Код
if(Strategy.Trader.MarketTime.TimeOfDay < TimeForOpen.TimeOfDay) return;

то больше оно не сработает. А не ставить Once() - получу целый поток сделок, который трудно проконтролировать


Ага. Получается что EmulationTrader работает не совсем так как работает площадка? Но, тогда это другой вопрос об изменении работы EmulationTrader.
Что касается правил то - да надо ловить все сделки. Есть еще вариант, если от Once() не хотим отказыватся. Ловить Trader.MarketTimeChanged и в нем вешать или снимать правила при наступлении и прекращен времени для торговли.
Спасибо:

Кот Матроскин

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


Memory Перейти
Получается что EmulationTrader работает не совсем так как работает площадка? Но, тогда это другой вопрос об изменении работы EmulationTrader.

Теоретически, он работает вроде как правильно, но на практике, по лимитнику не закрыться, т.к. цена слишком быстро проскочит через заявку, и которая не успеет сработать. А по маркету закрываться - окажешься последним пассажиром в уходящем поезде. Это из собственных наблюдений. Поэтому предпочитаю в тестах (раньше тестировал в самодельном тестере) выбрасывать первую минуту дня.
Memory Перейти
Ловить Trader.MarketTimeChanged и в нем вешать или снимать правила при наступлении и прекращен времени для торговли.

Не хочется ради одной минуты в день нагружать стратегию лишним правилом - скорости это не прибавляет
Автор топика
Спасибо:

Memory

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


Цитата:
Не хочется ради одной минуты в день нагружать стратегию лишним правилом - скорости это не прибавляет.
Так это и является правилом стратегии - не торговать в первую минуту торгов. В любом случае где-то проверка этого условия будет выполнятся постоянно и также отнимать время. И разработчики, я думаю, так-же будут вешать включение/выключение выполнения правил стратегии в событии изменения времени. Вот насколько долог путь прохождения события из трейдера в стратегию - вопрос занятный.
На сейчас, других вариантов похоже нет. Можно, конечно тригерком сделать.
1. В Trader.MarketTimeChanged включить правило, выключить обработку MarketTimeChanged.
2. В обработчике поступления свечей (ближе к концу торгов) снова включить MarketTimeChanged. Можно, тупо, в полночь, например.
Спасибо: Кот Матроскин

Кот Матроскин

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


Memory Перейти
Цитата:
Не хочется ради одной минуты в день нагружать стратегию лишним правилом - скорости это не прибавляет.
Так это и является правилом стратегии - не торговать в первую минуту торгов. В любом случае где-то проверка этого условия будет выполнятся постоянно и также отнимать время. И разработчики, я думаю, так-же будут вешать включение/выключение выполнения правил стратегии в событии изменения времени. Вот насколько долог путь прохождения события из трейдера в стратегию - вопрос занятный.
На сейчас, других вариантов похоже нет. Можно, конечно тригерком сделать.
1. В Trader.MarketTimeChanged включить правило, выключить обработку MarketTimeChanged.
2. В обработчике поступления свечей (ближе к концу торгов) снова включить MarketTimeChanged. Можно, тупо, в полночь, например.

Т.е., если концептуально, то:
- подписаться на правило, например, WhenTimeCome со временем срабатывания в 18:44 и 10:01.
- в момент срабатывания WhenTimeCome со временем 18:44 приостанавливаем все торговые правила.
- в момент срабатывания WhenTimeCome со временем 10:01 возобновляем ранее приостановленные торговые правила.
Автор топика
Спасибо:


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

loading
clippy