![background](/img/knowledge-1.jpg)
Tradematic Support Center
Guides, articles, videos and links for Tradematic users and developers.
Исполнение сигналов внутри бара (по касанию/по пробою)
183240СТАТЬЯ РЕДАКТОР КОДА ПРОБОЙ КАСАНИЕ ВНУТРИ БАРА BUYATSTOP SELLATLIMIT ЗАПУСК КАЖДЫЕКакие существуют виды исполнения сигналов в трейдматике?
В трейдматике существует два разных вида исполнения сигналов – по закрытию бара и внутри бара.
При выборе варианта исполнения ”по закрытию бара” сигнал будет исполнен после закрытия того бара, на котором он сформировался. Этот вариант мы настоятельно рекомендуем применять всем начинающим и не только пользователям.
При выборе варианта исполнения ”внутри бара” сигнал будет исполняться в тот же момент, когда он сформировался.
Это дает преимущество в скорости реакции на события на рынке, но также повышает вероятность исполнения ложного сигнала. Кроме того, часто цены закрытия бара в итоге оказываются даже более выгодными, чем цены в момент прихода сигнала.
Этот вариант исполнения мы рекомендуем использовать только опытным пользователям, которые разобрались во всех нюансах его использования (см. ниже), обладают навыками программирования и готовы идти на определенные риски.
Пример стратегии по закрытию
Для примера мы создадим стратегию по простым скользящим средним – входим, если High находится выше средней SMA с периодом 18, выходим — если Low ниже средней SMA с периодом 18.
Получился следующий код:
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using TradeMatic; using TradeMatic.Indicators; namespace ScriptNamespace { class MyScript : Script { private StrategyParameter parameter0; public MyScript() { parameter0 = CreateParameter("Период SMA", 18, 0, 1000, 1); } public override void Execute() { // Вывод индикаторов на график PlotSeries(PricePane, SMA.Series(Close, parameter0.ValueInt), Color.Red, LineStyle.Solid, 1); // Инициализация // Основной цикл for (int bar = 18; bar < Symbol.Count; bar++) { if (MarketPosition == 1) { // Выход из длинной позиции if ((Low[bar] < SMA.Value(bar, Close, parameter0.ValueInt))) { SellAtClose(bar, LastPosition, ""); } } else { // Вход в длинную позицию if ((High[bar] > SMA.Value(bar, Close, parameter0.ValueInt))) { BuyAtClose(bar, ""); } } } } } }Сохраним стратегию, запустим ее тестирование и внимательно посмотрим на график с ценами исполнения сигналов:
![](https://tradematic.com/wp-content/uploads/2011/12/sma-9-11.png)
Цены входов помечены крупными красными стрелками сбоку от баров. Как мы видим, в большинстве случаев мы входили в позицию по значительно большей цене (по цене закрытия бара), чем могли бы, если бы заходили сразу в момент пересечения со скользящей средней.
Аналогично и выходы по более низким ценам.
Конвертирование стратегии по закрытию в стратегию с исполнением внутри бара.
Давайте переделаем эту стратегию для исполнения внутри бара и посмотрим на результаты. Для этого нужно будет немного изменить исходный код стратегии в Редакторе кода.
Преобразование включает несколько этапов.
1. Замена всех цен Close на High либо Low.
Для чего это нужно делать? Для этого нужно понять, как трейдматик реализует исполнение внутри бара. Фактически вместо запуска стратегии только один раз на закрытии бара стратегия запускается несколько раз (параметр “Запуск каждые…”) внутри основного таймфрема стратегии (параметр “Таймфрейм”).
Таким образом, при каждом таком запуске цена Close последнего (текущего) бара будет ценой последней сделки на момент запуска и может отличаться от итоговой цены закрытия этого бара. А это уже повлияет на то, что если вход «рассосался” (т.е., в нашем примере, например, цена Сlose в итоге закрылась ниже SMA(9), хотя внутри бара и была в какой-то момент выше SMA(9)), то стратегия в дальнейшем будет считать, что позиция не открыта, хотя фактически сигнал был исполнен и на вашем счету будет куплена позиция.
Т.е. замена Close на High либо Low не обязательна, но крайне желательна, чтобы избежать описанной выше проблемы. В нашем примере мы не используем цены Close, поэтому ничего менять не будем.
2. Замена функций открытия и закрытия позиций по ценам закрытия на функции по ценам пересечения.
Меняем BuyAtClose на BuyAtStop и SellAtClose на SellAtLimit. В этих функциях нужно указывать цены, не ниже которых и не выше которых соотв. мы готовы совершить сделку.
Вообще, команда вида BuyAtStop состоит из двух частей:
1. Направление и тип позиции:
Buy — открытие длинной позиции
Sell — закрытие длинной позиции
Short — открытие короткой позиции
Cover — закрытие короткой позиции
2. Цена, по которой пройдет команда:
AtClose — по цене закрытия бара
AtMarket — по цене открытия бара
AtLimit — по указанной цене, если она больше или равна Low бара
AtStop — по указанной цене, если она меньше или равна High бара
В нашем случае это SMA.Value().
Итоговый код стратегии по касанию получился следующий:
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using TradeMatic; using TradeMatic.Indicators; namespace ScriptNamespace { class MyScript : Script { private StrategyParameter parameter0; public MyScript() { parameter0 = CreateParameter("Период SMA", 18, 0, 1000, 1); } public override void Execute() { // Вывод индикаторов на график PlotSeries(PricePane, SMA.Series(Close, parameter0.ValueInt), Color.Red, LineStyle.Solid, 1); // Инициализация // Основной цикл for (int bar = 18; bar < Symbol.Count; bar++) { if (MarketPosition == 1) { // Выход из длинной позиции if ((Low[bar] < SMA.Value(bar, Close, parameter0.ValueInt))) { SellAtStop(bar, SMA.Value(bar, Close, parameter0.ValueInt), LastPosition, ""); } } else { // Вход в длинную позицию if ((High[bar] > SMA.Value(bar, Close, parameter0.ValueInt))) { BuyAtLimit(bar, SMA.Value(bar, Close, parameter0.ValueInt), ""); } } } } } }
Сравним результаты сделок:
Стратегия по закрытию:
Стратегия по касанию:
Как видно по ценам входов и выходов, стратегия по касанию действительно оказалась более эффективной.
Что будет, если несколько раз сработает сигнал на вход в позицию в одном баре?
В трейдматике установлена защита от исполнения повторных сигналов в одном направлении на одном баре, поэтому, если вам пришло несколько таких сигналов на одном баре, исполнен будет только первый из них.
Как запустить стратегию с исполнением внутри бара?
После преобразования стратегии и ее тестирования нужно:
1) Разблокировать возможность выбора параметра “запуск каждые…”. Для этого зайдите в настройки программы, выберите вкладку Стратегии, установите галочку напротив параметра “Разрешить исполнение сигналов внутри бара”
2) Откройте свойства стратегии, на вкладке Базовые параметры установите параметр Запуск каждые. Не забывайте, что этот параметр должен быть не больше основного таймфрейма по стратегии. Если параметры Запуск каждые и Таймфрейм равны друг другу, это фактически означает исполнение по закрытию бара.
Как использовать управление риском (стоп-лосс, тэйк-профит) внутри бара?
Стандартные стоп-лосс и тэйк-профит (которые есть в Конструкторе стратегий) используют цены закрытия, поэтому нам не подходят (см. выше).
Зато благодаря указанию в функциях SellAtLimit и SellAtStop цены исполнения сигнала, добавление контроля риска займет всего две строчки:
if (MarketPosition == 1) { // Выход из длинной позиции // Тэйк-профит - если цена входа увеличилась на 5% SellAtLimit(bar,LastPosition.EntryPrice*1.05, LastPosition, "TP (LX)"); // Стоп-лосс - если цена входа уменьшилась на 3% SellAtStop(bar,LastPosition.EntryPrice*0.97, LastPosition, "SL (LX)"); // остальные условия на выход ...Мы добавили тэйк-профит при росте цены на 5%, и стоп-лосс при падении на 3%. Эти строчки нужно добавлять в блок выхода из позиции.