На
главную страницу
Описание
балансовых стопов:
Балансовые, т.е.'Balance' стопы - это стопы-невидимки.
Они подобны реверсивным стопам, но в отличие от
них могут открывать позицию точно равную доле в
портфеле, заданной для Buy или Sell заявок, и кроме
того, работают постоянно, пока есть
какая-либо позиция в портфеле, а не
одноразово, как все другие виды стопов, и кроме
того они не выставляются в очереди заявок
АД-терминала! Балансовые стопы, это не
стоп-заявки в обычном понимании, просто при
каждом обновлении данных графика происходит
считывание текущей балансовой (учетной) цены
инструмента в портфеле и сравнение ее с текущей
биржевой ценой. Для балансовых стопов в
параметре Stop% задается значение
наибольшего %отклонения текущей биржевой цены от
балансовой (учетной) стоимости инструмента в
портфеле, при превышении которого происходит
разворот позиций в противоположную сторону.
Разворот лонговых позиции в шорт (т.е. подача
Sell-заявки для переворота позиций) происходит,
когда текущая биржевая Close-цена падает ниже
балансовой цены лонг-позиции по инструменту на
заданный %, а разворот шортовых позиций в
лонговые происходит когда текущая биржевая
Close-цена начинает превышать текущую балансовую
цену по шорт-позиции инструмента в портфеле. Так
как эти стопы никогда не появляются в очереди
заявок АД-терминала, поэтому они и называются стопами-невидимками.
'BalanceOut' это также стоп-невидимка. Он
почти аналогичен Balance-стопу, но не является
реверсивным, т.е. при его срабатывании позиция в
портфеле просто закрывается, а не
переворачивается.
Для 'Balance'-стопа и 'BalanceOut'-стопа
через формулы в Метастоке можно сделать защиту
от срабатывания при гэпах любого
размера и при резких скачках цен! Такая защита
возможна только для этого вида стопов, потому что
эти стопы не выставляются в очереди заявок
АД-терминала. Такая же защита работает и для
комбинированных 'BalanceARev' и 'BalanceASim'
стопов, но только если в очереди
АД-терминала нет активных стоп-заявок
по бумаге. Для всех других видов стопов защиты
от гэпов нет!
Базовые формулы защиты от гэпа:
//определение наличия ГЭПА вниз
FGapDown:=If(ATR(1)>(H-L) AND Ref(L,-1)>H,True,False);
//определение наличия ГЭПА вверх
FGapUp:=If(ATR(1)>(H-L) AND Ref(H,-1)<L,True,False);
//если есть гэп вверх, то увеличиваем процент
стопа, чтобы стоп не сработал при гэпе
FGapStop:=if (FGapUp, 50, Stop%);
//если есть гэп вниз, то увеличиваем процент
стопа, чтобы стоп не сработал при гэпе
FGapStop:=if (FGapDown, 50, Stop%);
//далее полученный размер стопа подставляется в
параметр функции
FNull:=IF(FBuy, ExtFml("Borisoff.MoveMICEX_SHR","5678-000",50,1,B,LastValue(FGapStop),Simple,0,FBuy,2), False);
FNull:=IF(FBuy, ExtFml("Borisoff.MoveMICEX_SHR","5678-000",50,1,S,LastValue(FGapStop),Simple,0,FSell,2), False);
Т.е. для защиты от гэпа в параметр Stop%
функции MoveMICEX_SHR() будет подставляться размер
стопа равный 50% и тогда стоп просто не сработает,
если же гэпа нет, то для стопа будет
использоваться первоначально-заданная %величина
стопа. Конечно эти базовые формулы каждый может
дополнительно модифицировать, как ему
необходимо.
Нужно также знать, что в советнике Метастока при
каждом обновлении данных происходит
проверка как Buy- так и Sell-условия (и вообще всех
условий, задаваемых на вкладке 'Symbols') и
соответственно происходит срабатывание функций
MoveMICEX_SHR, как в Buy-, так и в Sell-условиях! Но из
этих проверок, то условие сформирует
соответствующую Buy- или Sell-заявку, которое выявит
наличие Buy- или Sell-сигнала. Балансовые стопы
проверяются на срабатывание при каждом
обновлении данных и в Buy- и в Sell-условии. Если при
проверке балансового стопа в Buy-условии, на
графике имеется Buy-сигнал, и аналогично, при
проверке в Sell-условии на графике будет Sell-сигнал,
то эти сигналы приостановят на этом баре работу
балансовых стопов (т.е.заявки будут
формироваться не по стопу, а по сигналу на
графике) и в лог-файл запишется номер бара, на
котором возник Buy- или Sell- сигнал.
Чтобы работали все виды балансовых стопов
нужно чтобы функция MoveMICEX_SHR с балансовыми
стопами вызывалась не только при наличии
сигнала на графике, но и на последнем (нулевом)
баре, который отображает текущую последнюю
биржевую Close-цену, т.е. с дополнительным условием
в Buy/Sell-формулах : OR Cum(1)=LastValue(Cum(1)), чтобы
балансовые стопы нормально работали
не только при наличии сигнала на графике, но и при
любом обновлении данных в Метастоке!
"FNull:=If((FBuy OR Cum(1)=LastValue(Cum(1))....".
При этом нужно использовать отстройку от
соседних противоположных BuySell-сигналов, чтобы не
было зацикливания BuySell-сигналов из формул
Советника в Метастоке c балансовым стопом.
Замечу, что отстройка от зацикливания между
BuySell-сигналом и балансовыми стопами отличается
от отстройки от зацикливания между самими Buy- и
Sell-сигналами. Поясню, что такое зацикливание
между балансовым стопом и BuySell-сигналом.
Рассмотрим график:
На рисунке показан Sell-сигнал на втором баре
от правого края. Если по сигналу на 2-ом баре
произойдет продажа по текущей биржевой Close-цене
(т.е. по цене имеющейся на нулевом баре), а потом на
нулевом длинном баре Close-цена уйдет выше
балансовой цены только что проданной бумаги на
заданный, для балансового стопа, процент, то
произойдет разворот позиции в лонг (покупка). Но
поскольку сигнал на продажу на том же баре все
еще остается, то при очередном обновлении данных
графика снова произойдет продажа и т.д. Это
зацикливание произойдет между
Sell-сигналом на продажу из Sell-формулы
советника и срабатыванием Balance-стопа из Buy-формулы
Советника! Отстроится от таких зацикливаний
можно либо с помощью формул, проверяющих, чтобы
не было встречного сигнала справа и слева
от балансового стопа, либо заданием большого
процента срабатывания для балансового стопа.
(пример отстройки от зацикливания через формулу
смотрите ниже). Отстройка от зацикливания
помогает также отстраиваться и от ложных
сигналов при сбойных котировках.
(пример простого балансового стопа: FNull:=If(FAlert,
ExtFml("Borisoff.MoveMICEX_SHR","хххх-ххх",х,х,х,0.75,Balance,0,FAlert,1),
False);
^
|
уровень срабатывания балансового
стопа в % задается здесь! );
Примеры моих рабочих формул в эксперте
для заявок с балансовыми 0.5% стопами и
срабатыванием BuySell-сигналов на NumBarRight=3 баре
с отстройкой от зацикливания на 1-м,2-м и 3-м барах
от правого края (в примере иcпользованы названия
моих BuySell-индикаторов для EESR) :
- для применения 0.5% балансовых стопов на
покупку нужно использовать следущие
формулы на вкладке 'Symbols' в эксперте:
FBuy:=Fml("_Borisoff_Buy_EESR"); {для примера
советник работает на графике EESR}
FSell:=Fml("_Borisoff_Sell_EESR");
FNull:=If((FBuy OR Cum(1)=LastValue(Cum(1)))
AND Ref(FSell,-1)=False {отстраиваемся от
зацикливания с Sell-сигналом слева}
AND Ref(FSell,-2)=False
AND Ref(FSell,-3)=False
AND Ref(FSell,1)=False {отстраиваемся от
зацикливания с Sell-сигналом справа}
AND Ref(FSell,2)=False
AND Ref(FSell,3)=False,
ExtFml("Borisoff.MoveMICEX_SHR","xxxx-xxx",25,1.0,B,0.5,Balance,0,FBuy,3),
False);
FBuy; {в принципе при NumBarRight=3
достаточно отстроится от зацикливания только на
3-м баре}
( т.е. балансовый стоп на покупку
сработает только на текущем (нулевом) баре и при
отсутствии сигналов на продажу на
NumBarRight=3 и меньших номерах баров графика);
- для применения 0.5% балансовых стопов на
продажу нужно использовать следущие
формулы на вкладке 'Symbols' в эксперте:
FSell:=Fml("_Borisoff_Sell_EESR"); {для примера
советник работает на графике EESR}
FBuy:=Fml("_Borisoff_Buy_EESR");
FNull:=If((FSell OR Cum(1)=LastValue(Cum(1)))
AND Ref(FBuy,-1)=False {отстраиваемся от
зацикливания с Buy-сигналом слева}
AND Ref(FBuy,-2)=False
AND Ref(FBuy,-3)=False
AND Ref(FBuy,1)=False {отстраиваемся от
зацикливания с Buy-сигналом справа}
AND Ref(FBuy,2)=False
AND
Ref(FBuy,3)=False, ExtFml("Borisoff.MoveMICEX_SHR","xxxx-xxx",25,1.0,S,0.5,Balance,0,FSell,3),
False);
FSell; {в принципе при NumBarRight=3
достаточно отстроится от зацикливания только на
3-м баре}
(т.е. балансовый стоп на продажу
сработает только на текущем (нулевом) баре и при
отсутствии сигналов на покупку на
NumBarRight=3 и меньших номерах баров графика);
Вот еще одно разъяснение:
>Вопрос: Дим, хотел у тебя спросить,
как работают BalanceOut стопы?
>Ответ: Вначале немного поясню один
момент: функция Borisoff.MoveMICEX_SHR может вызываться в
двух случаях: при BuySell сигнале на NumBarRight-баре
графика и без такого сигнала. Библиотека в момент
обновления данных на графике проверяет, есть ли
на заданном баре указанный сигнал, если сигнал
есть, то вызывается модуль MoveOrderADirect3.exe для
посылки соответствующей заявки в АД-терминал
(при этом в параметре NumBarRight прописан номер бара,
на котором есть BuySell-сигнал). Если BuySell-сигнала
нет, то библиотека все равно вызывает модуль
MoveOrderADirect3.exe, но теперь уже только для обработки
балансовых или авто-стопов (при этом в параметре
NumBarRight передается уже значение '-1', означающее что
вызов модуля MoveOrderAdirect3.exe произведен не
по BuySell-сигналу).
Чтобы функция Borisoff.MoveMICEX_SHR для работы с
балансовыми или авто-стопами вызывалась без BuySell
сигнала, строку вызова нужно записывать так:
FNull:=If(FBuy Or Cum(1)=LastValue(Cum(1)),
ExtFml("Borisoff.MoveMICEX_SHR", "1234-000", LastValue(Long),
LastValue(Slip), B,LastValue(Stop),Simple,0,FBuy,1), False);
^........................^
При ЛЮБОМ вызове модуля MoveOrderAdirect3.exe в него
ВСЕГДА передается также значение Close-цены
последнего бара(!), которое и используется при
работе с балансовыми и авто-стопами, в том числе и
с BalanceOut-стопами, т.к. все проверки условий
срабатывания/несрабатывания стопов делаются с
использованием именно текущего (реал-тайм)
значения Close-цены последнего бара.
В частности, для BalanceOut-стопа текущая
учетная(балансовая) цена по инструменту в
портфеле сравнивается с текущей(реал-тайм)
Close-ценой последнего бара графика. Если они
отличаются друг от друга на заданный в параметре
'Stop%' процент, и при этом Close-цена ниже учетной цены
Long-позиции или Close-цена выше учетной цены
Short-позиции, то модуль MoveOrderAdirect3.exe формирует
заявку в АД-терминал на закрытие текущей позиции
в портфеле.
Т.е. получается, что стоп срабатывает, как и
положено стопу, но при этом стоп-заявка не
находится заранее в очереди заявок АД-терминала,
а формируется только в момент, после проверки
выполнения заданного условия на срабатывание
BalanceOut-стопа, когда это условие становится 'True'.
>Вопрос: Не ... на самом деле у
сформировавшегося бара есть Low и Close, они могут
отличаться очень сильно. Но когда бар
формируется в какой-то момент Close будет равна
тому Low и твой стоп сработает, чего делать не
следует, то есть он у тебя будет работать как
простой Лимитный стоп и не фильтровать
мгновенные скачки.
>Ответ: Фильтровать мгновенные скачки
можно уровнем стопа (по вышеописанной технологии
защиты от гепа), например, сделать так:
Stop:=LastValue( if( (С-L) /(H-L) *100 > 0.25, Stop*2, Stop) );
т.е. cтоп, на формирующемся последнем баре, не
сработает, если Close-цена бара будет выше
Low-цены не более чем на 25% от общей (High-Low)
высоты бара, поскольку размер стопа будет
увеличен вдвое и BalanceOut не сработает. Если же,
Close-цена бара будет выше Low-цены более чем на 25% от
общей (High-Low) высоты бара, то стоп будет равен
заданной величине.
Работа балансового стопа не зависит от
наличия/отсутствия сигнала на графике. Этот стоп
может прописывается дополнительной строкой в
Советнике и работает всегда пока идет обновление
данных в Метастоке, а его срабатывание зависит
только от наличия позиции в портфеле и от
значения учетной цены. Если текущая рыночная
цена пересекает значение учетной цены и есть
позиция в портфеле по бумаге, то стоп-сработает.
Его можно прописать дополнительно к другим
"FNull:=IF(FSell, ExtFml("Borisoff.MoveMICEX_SHR" строкам в
Советникее.