Первая минута торгов

Первая минута торгов


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

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

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




Thanks:


Memory

Avatar
Date: 6/12/2012
Reply


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

OvcharenkoVI

Avatar
Date: 6/12/2012
Reply


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

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

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

}
Thanks: Кот Матроскин Axell

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

Avatar
Date: 6/12/2012
Reply


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

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

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

Memory

Avatar
Date: 6/12/2012
Reply


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

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

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


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

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

Avatar
Date: 6/12/2012
Reply


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

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

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

Memory

Avatar
Date: 6/12/2012
Reply


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

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

Avatar
Date: 6/12/2012
Reply


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

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


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy