На главную страницу

Описание балансовых стопов:

             
  Балансовые, т.е.'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-сигналом. Рассмотрим график:
Zaziklivanie.GIF (2738 bytes)
  На рисунке показан 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" строкам в Советникее.

Hosted by uCoz