Моя торговая система на "быстром" ZigZag'е. (обновлено 26.05.2009г )

Предупреждение
: материалы на этой странице рекомедуется использовать только как учебные, Не РЕКОМЕНДУЮ использовать быстрый зиг-заг в реальной торговле, несмотря на супер-замечательные итоги тестов на истории. В реале это убыточная система!

(В этом материале я опишу в общих чертах системы на быстром ЗигЗаге и тренд-несущей, поделюсь опытом тестирования своих систем и некоторыми своими секретами)

  Быстрый ZigZag появился как продолжение развития моих предыдущих торговых систем в направлении повышения скорости формирования сигналов на покупку/продажу. Все мои прежние системы страдали большим замедлением в формировании торговых сигналов, новая же система позволила формировать сигналы практически без задержек, и даже, в некотором смысле, слишком торопливо :). Так что пришлось даже принимать специальные меры к понижению этой "торопливости". Но об этом я расскажу ниже.

  В результате исследования поведения ZigZag'а на графиках, я нашел формулы, позволившие получить "быстрый" ZigZag. Этот зигзаг теперь носит   название  'Зигзаг Борисова'. Вот основные формулы "быстрого" ZigZag'а  для покупки и продажи:

Pr:=opt1; {% процент зигзага можно задать любой, или выбрать с помощью оптимизационной переменной opt1 из тестирующей системы}
Fm:=C; {зигзаг можно построить на любом выражении, например, на Close-цене, или на MP()-цене, или на скольз.средней цены Mov(C,3,VOL) и т.д.};
{
!!!использование параметров Pr и Fm удобно тем что не нужно исправлять все формулы при изменениях этих параметров, достаточно изменить значения только этих параметров!!!};
Buy
:=(Fm=Zig(Fm,Pr,%)
AND Peak(1,Fm,Pr)<>Zig(C,Pr,%)
AND Cum(1)<>LastValue(Cum(1)));

Pr:=opt1; {% процент зигзага можно задать любой, или выбрать с помощью оптимизационной переменной opt1 из тестирующей системы}

Fm:=C; {зигзаг можно построить на любом выражении, например, на Close-цене, или на MP()-цене, или на скольз.средней цены Mov(C,3,VOL) и т.д.};
{
!!!использование параметров Pr и Fm удобно тем что не нужно исправлять все формулы при изменениях этих параметров, достаточно изменить значения только этих параметров!!!};
Sell:=(Fm=Zig(Fm,Pr,%)
AND Trough(1,Fm,Pr)<>Zig(Fm,Pr,%)
AND Cum(1)<>LastValue(Cum(1)));

  Рабочие же формулы могут дополнятся некоторыми условиями, чтобы отфильтровать неверные сигналы и уже выглядят так (например 0.75%-ный ZigZag):

Pr:=0.75;
Fm:=C;
Buy
:=(Fm=Zig(Fm,Pr,%)
AND Peak(1,Fm,Pr)<>Zig(Fm,Pr,%)
AND Fm=Zig(Fm,0.1,%)                            {эти три строчки с 0.1%-ным ZigZag'ом }
AND Peak(1,Fm,0.1)<>Zig(Fm,0.1,%)         {дополнительно фильтруют неверные сигналы}
AND Trough(1,Fm,0.1)=Zig(Fm,0.1,%)        {и подтверждают основной сигнал }
AND Cum(1)<>LastValue(Cum(1)));

Pr:=0.75;

Fm:=C;
Sell:=(Fm=Zig(Fm,Pr,%)
AND Trough(1,Fm,Pr)<>Zig(Fm,Pr,%)
AND Fm=Zig(Fm,0.1,%)                            {эти три строчки с 0.1%-ным ZigZag'ом }
AND Trough(1,Fm,0.1)<>Zig(Fm,0.1,%)     {дополнительно фильтруют неверные сигналы}
AND Peak(1,Fm,0.1)=Zig(Fm,0.1,%)          {и подтверждают основной сигнал }
AND Cum(1)<>LastValue(Cum(1)));


  Отсюда можно скачать архив _Borisoff_FastZigZag.rar c моим советником, работающим на "быстром" ZigZag'е и примером тестирующей системы.
Инструкция по установке советника в Метасток:  скачайте самораспаковывающийся файл '_Borisoff_FastZigZag.rar' в какую-либо папку на своем компьютере измените его расширение на ".exe" и запустите его на выполнение. Архив автоматически создаст папку '_Borisoff_FastZigZag' в том же каталоге, из которого он будет запущен, и затем распакует в эту папку содержимое архива, в котором находятся советник и тестирующая система. Затем нужно загрузить Метасток и нажать на панели кнопку 'Expert Advisor'. Далее в появившейся форме нужно нажать кнопку 'Organizer...', затем выбрать пункт 'Import formula files' и нажать 'Далее>'. В появившейся затем форме нажмите кнопку 'Browse...' и найдите папку, извлеченную из архива, выделите ее и нажмите кнопку 'Ok'. Далее нажмите кнопку 'Готово' и советник будет импортирован в Метасток. Он появится вверху списка 'Expert Advisor' Метастока под названием '_Borisoff_Advisor_FastZigZag'. Для использования этого советника, его нужно прикрепить к соответствующему графику. Для этого, после открытия графика, нужно выбрать этого советника в списке Expert Advisor и нажать кнопки 'Attach' и затем 'Close'. Сразу после 'прикрепления' советник начнет выдавать на график сигналы. Также в этом архиве находится тестирующая система на быстром ZigZag'е, после импорта в Метасток она появится в списке 'System Tester' под названием "_Borisoff_FastZigZag_Analitic".
      
Если Тестирующая Система "_Borisoff_FastZigZag_Analitic" не импортируется в Метасток, то можно ввести нижеследующие тексты её формул вручную:
          
{Buy}
Fm:=C; {или MP(), Mov(C,3,VOL) и т.д.};
Pr:=opt1; {%ZigZag}
FBuy:=(Fm=Zig(Fm,Pr,%)
AND Peak(1,Fm,Pr)<>Zig(Fm,Pr,%)
AND Fm=Zig(Fm,0.1,%)
AND Peak(1,Fm,0.1)<>Zig(Fm,0.1,%)
AND Trough(1,Fm,0.1)=Zig(Fm,0.1,%)
AND LastValue(Cum(1))<>Cum(1));
FBuy;
       
{
Sell}
Fm:=C; {или MP(), Mov(C,3,VOL) и т.д.};
Pr:=opt2; {%ZigZag}
FSell:=(Fm=Zig(Fm,Pr,%)
AND Trough(1,Fm,Pr)<>Zig(Fm,Pr,%)
AND Fm=Zig(Fm,0.1,%)
AND Trough(1,Fm,0.1)<>Zig(Fm,0.1,%)
AND Peak(1,Fm,0.1)=Zig(Fm,0.1,%)
AND LastValue(Cum(1))<>Cum(1));
FSell;

  Перед дальнейшим изложением я сначала приведу описание процесса создания простейшего Советника для автотрейдинга, а затем опишу свой опыт использования быстрого ZigZag'а в автоматической торговой системе на основе Метастока и АльфаДиректа.

Для использования быстрого ZigZag'а для автотрейдинга сначала нужно протестировать график интересующей бумаги System Tetster'ом, сделанным на основе быстрого ZigZag'а, например тестером _Borisoff_FastZigZag_Analitic с примерными опциями:

TestZigZagOption.GIF (20866 bytes).

  Затем кнопкой 'New' нужно создать нового советника в 'Expert Advisor', затем создать на его вкладке 'Symbols', также кнопкой 'New', два новых условия, для Sell и Buy приказов соответственно, и ввести в поля 'Condition' этих условий вышеуказанные рабочие формулы быстрого ZigZag'а для этих приказов.
ExpertEditor.GIF (9798 bytes)

Далее в эти формулы вместо значения 0.75% нужно подставить наилучшие на ваш взгляд значения оптимизационных переменных из отчета, выданного тестером _Borisoff_FastZigZag_Analitic. Оптимизационные значения для лонга и шорта могут быть не равны друг другу. Затем в поля 'Condition'  Buy и Sell приказов нужно добавить условия "FNull:=IF(FBuy, ExtFml("Borisoff.MoveMice_SHR", ... " с вызовом функции MoveMICEX_SHR() с нужными параметрами торговых заявок.
ExpertEditorCondition.GIF (14929 bytes)

  Теперь рабочие формулы в полях 'Condition' у Buy- и Sell-приказов будут выглядеть примерно так:

{***формулы для лонга***}
Pr:=0.75;
Fm:=C; {Mov(C,5,VOL)}
Buy
:=(Fm=Zig(Fm,0.75,%)
AND Peak(1,Fm,Pr)<>Zig(Fm,Pr,%)
AND Fm=Zig(Fm,0.1,%)                            {эти три строчки с 0.1%-ным ZigZag'ом }
AND Peak(1,Fm,0.1)<>Zig(Fm,0.1,%)         {дополнительно фильтруют неверные сигналы}
AND Trough(1,Fm,0.1)=Zig(Fm,0.1,%)        {и подтверждают основной сигнал }
AND Cum(1)<>LastValue(Cum(1)));
FNull:=If(Buy, ExtFml("Borisoff.MoveMICEX_SHR","хххх-ххх",x,x,B,x,Simple,x,Buy,x), False);   {формирование Buy-заявки в АД при}
Buy;                                                                                                                     {появлении сигнала Buy =True}

{***формулы для шорта***}
Pr:=0.75;

Fm:=C; {Mov(C,5,VOL)}
Sell:=(Fm=Zig(Fm,Pr,%)
AND Trough(1,Fm,Pr)<>Zig(Fm,Pr,%)
AND Fm=Zig(Fm,0.1,%)                            {эти три строчки с 0.1%-ным ZigZag'ом }
AND Trough(1,Fm,0.1)<>Zig(Fm,0.1,%)     {дополнительно фильтруют неверные сигналы}
AND Peak(1,Fm,0.1)=Zig(Fm,0.1,%)          {и подтверждают основной сигнал }
AND Cum(1)<>LastValue(Cum(1)));
FNull:=If(Sell, ExtFml("Borisoff.MoveMICEX_SHR","хххх-ххх",x,x,S,x,Simple,x,Sell,x), False);   {формирование Sell-заявки в АД при}
Sell
;                                                                                                                     {появлении сигнала Sell =True}

  И, наконец, на вкладке 'Graphic' в этих приказах нужно выбрать свои графические изображения Buy и Sell сигналов, которые будут рисоваться на графике ЦБ. После прикрепления (кнопкой 'Attach') этого советника к графику инструмента, выбранного для автоматической торговли, на этом графике появятся Buy и Sell сигналы. При использовании ЗигЗага в функции MoveMICEX_SHR номер бара справа не следует задавать равным нулю или единице, т.к. при нуле ЗигЗаг никогда не выдает сигнала на покупку/продажу, а при единице вершина или дно ЗигЗага остаются еще не до конца сформированными.

  Для автотрейдинга я всегда использую интрадейные тайм-фреймы, потому что, как видно из графиков, даже для Daily тайм-фреймов наилучшие позиции на покупку/продажу всегда возникают внутри дня.

  Мой быстрый ЗигЗаг замечателен тем, что формирует сигналы на покупку/продажу не только гораздо раньше, например, систем основанных на пересечениях скользящих средних, но и сразу показывает значение "силы разворота" (цифры возле букв S и B):
EESR_AutoTrading_Advisor_Daily.GIF (59176 bytes)

Но у моего ЗигЗага в процессе тестирования выявились и два серьезных недостатка:
Первый, это раннее формирование B/S сигналов против тренда, даже на небольших  пиках и впадинах. 
Поясню это рисунками:
SBERP_testZigZag_1.GIF (10598 bytes) 
А теперь посмотрите тот же график, но дополненный 4-мя торговыми днями:
SBERP_testZigZag_2.GIF (18492 bytes)

  На рисунках черными неровными кружками обведены места, где в ходе торгов сначала возникали сигналы на продажу, но затем эти сигналы исчезли, т.к цена ушла выше. И даже если для автотрейдинга мы возьмем большой процент для пика/впадины, например 4% вместо 0.75%, то все равно от этого 1-го недостатка мы не избавимся.

  Я использовал много разных способов, чтобы устранить или уменьшить 1-ый недостаток, например наложением ЗигЗага на график не самой цены, а на график ее сглаженной скользящей средней. Или например использовал сверку с линией тренда (тренд-несущей) из ЗигЗага с гораздо большим процентом, который на этой вершине не давал перелома и шел выше. Использовал и замедление в реагировании на сигнал покупки/продажи, т.е. реагируя не сразу, а спустя, например, три-четыре бара, за время формирования которых прежний сигнал мог исчезнуть или наоборот сильнее подтвердиться, а также другие способы.

  Основной проблемой был даже не преждевременный сигнал в обратном тренду направлении, а то, что после этого сигнала, у ЗигЗага с большим процентом, ОБЫЧНО НЕ ПОЯВЛЯЛСЯ сигнала для разворота позиции обратно, вслед за растущим или падающим трендом. А если задавать ЗигЗагу более мелкий процент, чтобы "ловить" колебание цены в любом направлении, то проблема преждевременных разворотов на больших движениях цены обострялась еще больше! То есть, то что после исчезновения основного сигнала не формировался обратный сигнал, было 2-ым большим недостатком.

  Пришлось начать использовать простые стопы. Но ограничив убытки стопами я продолжал упускать хороший профит от противоположного движения цены. И вот тут мне на помощь пришли реверсивные стопы. Поначалу они показались мне хорошим решением проблемы возврата обратно на тренд. Но практика оказалась не столь хороша. Трудно было рассчитать правильную величину таких стопов, большие стопы не устраивали потенциально большими убытками до своего срабатывания, а расчет на авось, как правило приводил к тому, что стопы оказывались маловаты и часто после их срабатывания цена шла в обратном направлении еще больше увеличивая убытки :)

  В общем, все способы возврата на тренд с помощью стопов создавали очень большие издержки и я даже решил совсем от них отказаться (ну кроме может быть форс-мажорных стопов в 5% или 10% на случай обрыва связи).

  Конечно на практике при тестировании возникали и другие проблемы, например, отстройка от проблем при гэпах или при неожиданных резких сбойных скачках котировок, но всего этого я пока не буду касаться. 

  В общем, наверное, самой прибыльной системой на ЗигЗаге получилась система с тренд-несущей. Вот ее основные рабочие формулы и график, объясняющий принцип ее работы:

График:
На рисунке черная линия - 4%-ный тренд-несущий ЗигЗаг, лиловая - 0.75%-ный рабочий ЗигЗаг по которому выдаются BuySell-приказы. При растущей тренд-несущей разрешены только лонги, открывающиеся на переломах вверх (дне) лилового ЗигЗага и закрывающиеся на переломах вниз (пике) лилового ЗигЗага. А при падающей тренд-несущей разрешены только шорты, открывающиеся на переломах вниз (пике) лилового ЗигЗага и закрывающиеся на локальных переломах вверх (дне) лилового ЗигЗага. При совпадениях вершин/донышков черного и лилового ЗигЗагов открываются позиции соответственно перелому ЗигЗагов, для дна - лонг, для вершины - шорт, с простыми стопами. На графике участки лонгов подчеркнуты светло-зелеными линиями, а шортов - оранжевыми.
EESR_DemonstrationZigZag.GIF (57282 bytes)

Формулы:
{*** формула ИНДИКАТОРА тренд-несущей "TrendCarrier" на основе Close-цены. Этот индикатор нужно создать в 'Indicator Builder'е ***}
pt2:=8; {Period - эначение подбирается через оптимизационную переменную с помощью дополнительной тестирующей системы для тренд-несущей} 
pt1:=4; {Buy  - эначение подбирается через оптимизационную переменную с помощью дополнительной тестирующей системы для тренд-несущей}
pt3:=7; {Sell  - эначение подбирается через оптимизационную переменную с помощью дополнительной тестирующей системы для тренд-несущей}
{правильный подбор параметров - важен, т.к.при одних и тех же формулах, но с разными параметрами, система может быть как убыточной, так и прибыльной!}
FBuy:=False;
FBuy:=(Mov(C,pt2,S)=Zig(Mov(C,pt2,S),pt1,%)
AND Peak(1,Mov(C,pt2,S),pt1)<>Zig(Mov(C,pt2,S),pt1,%)
AND Mov(C,pt2,S)=Zig(Mov(C,pt2,S),0.1,%)
AND Peak(1,Mov(C,pt2,S),0.1)<>Zig(Mov(C,pt2,S),0.1,%)
AND Trough(1,Mov(C,pt2,S),0.1)=Zig(Mov(C,pt2,S),0.1,%)
AND Cum(1)<>LastValue(Cum(1)));
FSell:=False;
FSell:=(Mov(C,pt2,S)=Zig(Mov(C,pt2,S),pt3,%)
AND Trough(1,Mov(C,pt2,S),pt3)<>Zig(Mov(C,pt2,S),pt3,%)
AND Mov(C,pt2,S)=Zig(Mov(C,pt2,S),0.1,%)
AND Trough(1,Mov(C,pt2,S),0.1)<>Zig(Mov(C,pt2,S),0.1,%)
AND Peak(1,Mov(C,pt2,S),0.1)=Zig(Mov(C,pt2,S),0.1,%)
AND Cum(1)<>LastValue(Cum(1)));
FBuy OR FSell;

{***формулы для лонг-условия Советника***}

Buy
:=(C=Zig(C,0.75,%)                               {0.75%-ный ЗигЗаг формирующий сигналы на покупку}
AND Peak(1,C,0.75)<>Zig(C,0.75,%)
AND C=Zig(C,0.1,%)                                 {эти три строчки с 0.1%-ным ZigZag'ом }
AND Peak(1,C,0.1)<>Zig(С,0.1,%)         {дополнительно фильтруют неверные сигналы}
AND Trough(1,C,0.1)=Zig(C,0.1,%)        {и подтверждают основной сигнал }
AND Cum(1)<>LastValue(Cum(1)));
{определение РАСТУЩЕГО тренда для самой правой (текущей) позиции на графике с использованием вышеописанного Индикатора тренд-несущей}
BuyTrend:=If( ValueWhen(1,Fml("TrendCarrier"),C) - ValueWhen(2,Fml("TrendCarrier"),C) > 0,False,True);
{формирование Buy-заявки в АД с простыми 1%-ными стопами при появлении сигнала Buy=True, а также при наличии РАСТУЩЕЙ тренд-несущей}
FNull:=If(Buy AND BuyTrend=True, ExtFml("Borisoff.MoveMICEX_SHR","хххх-ххх",x,x,B,1,Simple,x,Buy,x), False); 

{либо формирование Buy-заявки с позицией нулевого размера в портфеле, т.е. закрытие имеющегося шорта в АД на локальном минимуме}
{без открытия лонга}
FNull1:=If(Buy AND BuyTrend<>True, ExtFml("Borisoff.MoveMICEX_SHR","хххх-ххх", 0, x,S,0,Simple,x,Buy,x), False);             
Buy;       {рисуем Buy-сигнал на графике}

{***формулы для шорт-условия Советника***}
Sell:=(C=Zig(C,0.75,%)                              {0.75%-ный ЗигЗаг формирующий сигналы на продажу}
AND Trough(1,C,0.75)<>Zig(C,0.75,%)
AND С=Zig(C,0.1,%)                                {эти три строчки с 0.1%-ным ZigZag'ом }
AND Trough(1,C,0.1)<>Zig(C,0.1,%)     {дополнительно фильтруют неверные сигналы}
AND Peak(1,C,0.1)=Zig(C,0.1,%)          {и подтверждают основной сигнал }
AND Cum(1)<>LastValue(Cum(1)));
{определение ПАДАЮЩЕГО тренда для самой правой (текущей) позиции на графике с использованием вышеописанного Индикатора тренд-несущей}
SellTrend:=If( ValueWhen(1,Fml("TrendCarrier"),C) - ValueWhen(2,Fml("TrendCarrier"),C) > 0,True,False);
{формирование Sell-заявки в АД с простыми 1%-ными стопами при появлении сигнала Sell=True, а также при наличии ПАДАЮЩЕЙ тренд-несущей}
FNull:=If(Sell AND SellTrend=True, ExtFml("Borisoff.MoveMICEX_SHR","хххх-ххх",x,x,S,1,Simple,x,Sell,x), False); 
{либо формирование Sell-заявки с позицией нулевого размера в портфеле, т.е. закрытие имеющегося лонга в АД на локальном максимуме}
{без открытия шорта}

FNull1:=If(Sell AND SellTrend<>True, ExtFml("Borisoff.MoveMICEX_SHR","хххх-ххх", 0, x,B,0,Simple,x,Sell,x), False):       
Sell;      {рисуем Sell-сигнал на графике}


  Тренд-несущую можно создавать не только на Close-цене, но и на выражениях с High-, Low- или Close-значениями или каких-либо индикаторах. Также настоятельно рекомендую добавить в рабочие формулы отстройку от зацикливания между Buy- и Sell-сигналами.

  После всех своих тестирований я пришел к выводу, что ЛЮБЫЕ торговые системы, на ЗигЗаге ли, на пересечениях ли скользящих средних, и на любых других методах, всегда имеют первый недостаток, в большей или меньшей степени, то есть, при шортовом сигнале на историческом максимуме цена может уйти еще выше, а при открытии лонга на историческом минимуме, цена может уйти еще ниже. И что без стопов все же не обойтись. Но стопы уже перестали привлекать меня, потому что....

  ....я придумал новый способ автотрейдинга без стопов - с помощью считывания и сравнения текущей биржевой цены с балансовой (учетной) ценой инструмента в портфеле. То есть торговля с постоянным обратной связью с позицией, имеющейся в портфеле. Для этого я дополнил существующие свои библиотеки и модули новым функционалом, считывающим на каждом тике позиции по бумагам в портфеле, и теперь, если текущая цена уходит ниже балансовой (учетной) стоимости инструмента в портфеле (при лонге), или выше балансовой цены (при шорте), то происходит автоматический разворот позиции! То есть теперь моя система постоянно держит "руку на пульсе" текущего тренда и текущей цены. Эта система подобна реверсивным стопам, но без выставления заранее самих стоп-заявок!. Пока об этой новой системе я не буду распространяться. Появление этой системы и вызвало публикацию этого материала и раскрытие некоторых моих секретов :)

  В заключение хочу сказать несколько слов начинающим трейдерам - если вы хотите сэкономить свое время, сберечь свои нервы :), быстро не проиграть свои деньги, научиться бесстрастно относиться к колебаниям цен на рынке, не зависеть ни от чьего мнения, то делайте свою МТС, хотя это и не просто :)
  Успехов!
 (с) Дмитрий Борисов.  14.01.2007г             



Текст тренд-несущей автоматической ТС на 1.0%-ЗигЗаге c авто-перестановкой стопов, которую можно использовать для проверки работоспособности настройки вашей авто-трейдинговой системы (!) но не рекомендуется использовать в реальной торговле):

                  
{для Sell - заявки}
FLast:=LastValue(Cum(1))-Cum(1)<100;
Par:=CLOSE;
Pr1:=1.0; {%}  {здесь можно менять процент зигзага}

FBuy:=(Par=Zig(Par,Pr1,%)
AND Peak(1,Par,Pr1)<>Zig(Par,Pr1,%)
AND Par=Zig(Par,0.05,%)
AND Peak(1,Par,0.05)<>Zig(Par,0.05,%)
AND Trough(1,Par,0.05)=Zig(Par,0.05,%)
AND Cum(1)<>LastValue(Cum(1)));

FSell:=(Par=Zig(Par,Pr1,%)
AND Trough(1,Par,Pr1)<>Zig(Par,Pr1,%)
AND Par=Zig(Par,0.05,%)
AND Trough(1,Par,0.05)<>Zig(Par,0.05,%)
AND Peak(1,Par,0.05)=Zig(Par,0.05,%)
AND Cum(1)<>LastValue(Cum(1)));

Buy:=(Par=Zig(Par,0.1,%)
AND Peak(1,Par,0.1)<>Zig(Par,0.1,%)
AND Trough(1,Par,0.1)=Zig(Par,0.1,%)
AND Cum(1)<>LastValue(Cum(1)));

Sell:=(Par=Zig(Par,0.1,%)
AND Trough(1,Par,0.1)<>Zig(Par,0.1,%)
AND Peak(1,Par,0.1)=Zig(Par,0.1,%)
AND Cum(1)<>LastValue(Cum(1)));

BuyTrend:=BarsSince(FBuy) < BarsSince(FSell);
SellTrend:=BarsSince(FBuy) > BarsSince(FSell);

SellOrder:=(FSell OR (SellTrend AND Sell))
AND FLast;

LVC:=LastValue(C);
FStop:=(LastValue(Max(Ref(H,-1),LVC))-LVC)/LVC*100;
FStop:=LastValue(If(FStop<0.01,0.01,FStop));

FNull:=If(SellOrder OR LastValue(Cum(1))=Cum(1),
ExtFml("Borisoff.MoveFORTS","12345-000",-1,0.45,S, {для рынка ММВБ поменяйте 'FORTS' на 'MICEX_CHR' и вместо '12345-000' пропишите ваш портфель}
FStop,ASimple,0.01,SellOrder,2), False);
SellOrder;

{для Buy - заявки}
FLast:=LastValue(Cum(1))-Cum(1)<100;
Par:=CLOSE;
Pr1:=1.0; {%}

FBuy:=(Par=Zig(Par,Pr1,%)
AND Peak(1,Par,Pr1)<>Zig(Par,Pr1,%)
AND Par=Zig(Par,0.05,%)
AND Peak(1,Par,0.05)<>Zig(Par,0.05,%)
AND Trough(1,Par,0.05)=Zig(Par,0.05,%)
AND Cum(1)<>LastValue(Cum(1)));

FSell:=(Par=Zig(Par,Pr1,%)
AND Trough(1,Par,Pr1)<>Zig(Par,Pr1,%)
AND Par=Zig(Par,0.05,%)
AND Trough(1,Par,0.05)<>Zig(Par,0.05,%)
AND Peak(1,Par,0.05)=Zig(Par,0.05,%)
AND Cum(1)<>LastValue(Cum(1)));

Buy:=(Par=Zig(Par,0.1,%)
AND Peak(1,Par,0.1)<>Zig(Par,0.1,%)
AND Cum(1)<>LastValue(Cum(1)));

Sell:=(Par=Zig(Par,0.1,%)
AND Trough(1,Par,0.1)<>Zig(Par,0.1,%)
AND Cum(1)<>LastValue(Cum(1)));

BuyTrend:=BarsSince(FBuy) < BarsSince(FSell);
SellTrend:=BarsSince(FBuy) > BarsSince(FSell);

BuyOrder:=(FBuy OR (BuyTrend AND Buy))
AND FLast;

LVC:=LastValue(C);
FStop:=(LVC-LastValue(Min(Ref(L,-1),LVC)))/LVC*100;
FStop:=LastValue(If(FStop<0.01,0.01,FStop));

FNull:=If(BuyOrder OR LastValue(Cum(1))=Cum(1),
ExtFml("Borisoff.MoveFORTS","12345-000",-1,0.45,B,  {для рынка ММВБ поменяйте 'FORTS' на 'MICEX_CHR' и вместо '12345-000' пропишите ваш портфель}
FStop,ASimple,0.01,BuyOrder,2), False);
BuyOrder;

Hosted by uCoz