Страница обновлена 23.06.2009г (поправлен текст рабочего варианта МТС в конце раздела).
             
Механическая Торговая Система "Альфа-тренд" (с) на новых индикаторах.

              
   Вниманию публики, торгующей на ФР, представляется новая Механическая Торговая Система (далее ТС) с открытым кодом советника и тестирующей системы, на основе индикаторов, разработанных автором этой статьи. Советник и индикаторы ТС носят общее название "Альфа-тренд" (с), что означает "основной или преобладающий" тренд.
  Данные оригинальные индикаторы явились результатом поиска прибыльного торгового алгоритма, в процессе длительной торговой практики на ФР РФ.
  В этой статье приводится описание ТС с использованием фьючерса на индекс РТС, но использовать данную ТС можно с любым другим торгуемым активом (далее ЦБ), имеющим только два основных параметра: цену и количество (объем). Фьючерс удобен тем, что у него низкие комиссионные издержки, что важно для активной торговли, а также важно то, что на фьючерсах можно одинаково легко занять, как лонговую, так и шортовую позицию. Немаловажно и то, что фьючерс дает возможность использовать большой размер плеча, т.е. позволяет получить более высокий доход, чем например на акциях. Но эту ТС конечно можно применять не только для торговли фьючерсами, но и для торговли акциями и другими активами. Представленный ниже торговый алгоритм действует на основе анализа ценового движения ЦБ с учетом объема торгов и волатильности.

  Кратко, основные достоинства этой торговой системы:
                     
  1) Создание неисчезающих торговых BuySell-сигналов (далее BS-сигналы).
              
  2) Система практически не имеет замедления при выработке BS-сигналов, в отличие, например, от систем на основе скользящих средних, и даже может генерировать подтвержденные BS-сигналы на еще не завершенных барах.
              
  3) Учет, при выработке BS-сигнала, не только величины изменения цены, но и количества лотов (объема) торгуемого актива, которое сопровождает это изменение цены. (хотя, как известно, количество купленных ЦБ в любой момент времени всегда равно количеству проданных ЦБ, но количество ЦБ, сопровождающее любое ценовое движение, очень важный показатель силы (истинности) этого ценового движения.
              
  4) Наличие защиты от ложных ценовых движений при высокой волатильности цены торгуемого актива.
              
  5) Хорошая кореляция вырабатываемых BS-сигналов с ценовым трендом, т.е. хорошая способность ТС следовать за трендом.
              
  6) Система хорошо переносит длительные боковики. Но для неё очень опасна пила на рынке, от которой нужно использовать какую-нибудь защиту. В этой ТС очень желательно использовать СТОПЫ. Пример ТС с использованием стопов приведен ниже. Стопы выставляются автоматически после создания заданной позиции в портфеле и после срабатывания могут возобновляться в начале тренда при новых сигналах того же направления.Теперь просадка ТС жестко ограничивается, что дает возможность более уверенно работать с системой "Альфа-тренд" на любой бумаге и рынке.
              
  7) Система, в целом, не является предсказывающей, а следует за ценовым трендом торгуемой ЦБ.

Используя эту систему на реальном счете я смог за месяц увеличить свой счет с 34 тысяч до 77 тысяч рублей, торгуя автоматически всего двумя фьючерсными контрактами на индекс РТС (количество контрактов определялось по ММ-формуле Келли).
                    

Приведу полный текст рабочего варианта Советника для Метастока, с формулами для Покупки и Продажи, и комментариями к ним.
(эти формулы легко переносятся и в другие программы технического анализа):

{формулы на Покупку, для Buy-строки Советника. Сигнал генерируется только на уже сформированных барах, т.е. NumBarRight  должен быть всегда >0}
{задаем значения параметров ТС полученные из тестирующей системы для часового тайм-фрейма инструмента RTSI-9.08}
FPer1:=22;  {22 кол-во баров 1-го периода  - opt2 }
FPer2:=22*3;  {66 кол-во баров 2-го периода -  opt2 * opt3 }
KOpt:=1.5;  { opt1 - параметр силы ценового движения, т.е. величина превышения объема на текущем баре над средним объемом в целом за период на FPer1 кол-ве баров. Если объем на текущем баре больше в 1.5 раза среднего объема за период, то будет сгенерирован сигнал Buy}
KoefV:=0.9; { opt4 - параметр ограничения волатильности для отстройки от ложных ценовых выбросов т.е. допустимая величина ATR(1) на текущем баре по сравнению с максимальной величиной ATR(1) на FPer2 кол-ве баров не должна быть более 90% от максимальной величины ATR(1) за период}

NumBarRight:=LastValue(1);
{далее введены переменные для сокращения общего размера формул, чтобы длинные повторяющиеся части формул заменить более короткими}
RL:=Ref(L,-1);
RH:=Ref(H,-1);
RMP:=Ref(MP(),-1);
RFCL:=Ref(C,-1);

FVlt:=((ATR(1)<=(HHV(ATR(1),FPer2)+HHV( If(ATR(1)=HHV(ATR(1),FPer2),0,ATR(1)),FPer2))/2
*KoefV) {проверка ограничения по волатильности}
OR (VOLUME>=HHV(VOLUME,FPer2)
AND (((C-RFCL)>=Mov((C-RFCL),FPer2,S)
AND (MP()-RMP)>=Mov((MP()-RMP),FPer2,S))
OR ((RFCL-C)>=Mov((RFCL-C),FPer2,S)
AND (RMP-MP())>=Mov((RMP-MP()),FPer2,S)))))
AND Mod(Minute(),5)=0;  {контроль что текущий бар не сбойный, т.е. у него минуты кратны без остатка выбранному 5-минутному тайм-фрейму}
KVol:=Mov(VOLUME,FPer2,S)*KOpt/VOLUME;
FInd:=VOLUME > Mov(VOLUME,FPer1,S)*KOpt
AND VOLUME > Mov(VOLUME,FPer2,S);
FCLCL:=(C-RFCL)>Mov(Abs(C-RFCL),FPer2,S)*KVol;
FLCL:=(L-RFCL)>Mov(Abs(L-RFCL),FPer2,S)*KVol;
FLL:=(L-RL)>Mov(Abs(L-RL),FPer2,S)*KVol;
FMPMP:=(MP()-RMP)>Mov(Abs(MP()-RMP),FPer2,S)*KVol;
FHH:=H-RH>Mov(Abs(H-RH),FPer2,S)*KVol;

{формула определения Buy-сигнала на текущем баре}
BuyBar:=((FCLCL AND (FLCL OR FLL OR FMPMP OR FHH))
OR (FMPMP AND (FLCL OR FLL OR FCLCL OR FHH)))
AND FInd
AND RMP<MP()
AND FVlt;

{формула определения Sell-сигнала на текущем баре}
SellBar:=(((RFCL-C)>Mov(Abs(RFCL-C),FPer2,S)*KVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FPer2,S)*KVol
OR (RH-H)>Mov(Abs(RH-H),FPer2,S)*KVol
OR (RMP-MP())>Mov(Abs(RMP-MP()),FPer2,S)*KVol
OR RL-L>Mov(Abs(RL-L),FPer2,S)*KVol))
OR ((RMP-MP())>Mov(Abs(RMP-MP()),FPer2,S)*KVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FPer2,S)*KVol
OR (RH-H)>Mov(Abs(RH-H),FPer2,S)*KVol
OR (RFCL-C)>Mov(Abs(RFCL-C),FPer2,S)*KVol
OR RL-L>Mov(Abs(RL-L),FPer2,S)*KVol)))
AND FInd
AND RMP>MP()
AND FVlt;

{далее определяем параметры простого Simple-стопа для Buy-позиции в портфеле}
LastSTrendBar:=LastValue(BarsSince(SellBar));  {кол-во баров до последнего Sell-сигнала}
LastSTrendBar:=LastValue( If(LastSTrendBar>0 AND IsDefined(LastSTrendBar),LastSTrendBar+1,1));   {контроль корректности кол-ва баров}
StartBTrendL:=LLV( If(BuyBar, L, LastValue(L)), LastSTrendBar);   {определяем наименьшую Low-цену в начале Buy-тренда}
LVC:=LastValue(C);
FStop:=If(StartBTrendL>L, LVC-L, LVC-StartBTrendL);  {определяем разность между найденной наименьшей Low и последним значением Close-цены}
FStop:=FStop/LVC*100;   {определяем процент размещения стопа от последней Close-цены}
FStop:=If(FStop>0,FStop,0.25);  {если из-за какого-либо сбоя величина размещения стопа получится нулевая, то задаем ее равной 0.25%}
FStop:=LastValue(If(FStop>3.5,3.5,FStop));  {если величина стопа из-за какого-либо сбоя получится >3,5%, то делаем ее равной 3,5%}

FPos:=LastValue(If(Hour()>17,-1,-2));  {здесь заданы торгуемые доли для дневной и вечерней сессий (после 17часов)}

{наконец делаем итоговое определение наличия Buy-сигнала на текущем баре}
BuyBar:=((BuyBar AND SellBar=False))   {контроль того, что на текущем баре с Buy-сигналом нет встречного Sell-сигнала}
AND Ref(Mod(Minute(),5),1)=0;  {контроль что следующий за текущим бар не сбойный, т.е. у него минуты кратны без остатка выбранному 5-минутному тайм-фрейму}
BuyOrder:=BuyBar AND Ref(SellBar,1)=False;

FNull:=If(BuyOrder   {если на текущем баре определен Buy-сигнал, то вызываем внешний модуль для передачи Buy-заявки в АД-терминал}
{OR Cum(1)=LastValue(Cum(1))},  {это условие нужно, если применяется авто-перемещение стопов по тренду, если нет, то отключаем}
ExtFml("Borisoff.MoveFORTS","12345-000",FPos,0.25,B,FStop,Simple,0,BuyOrder,NumBarRight),False);  {тут описаны параметры вызова внешнего модуля для передачи Buy-сигнала в АД-терминал, если на текущем баре определен Buy-сигнал}

FLastBar:=Cum(1)=LastValue(Cum(1));
FNull:=If(FLastBar,  {выводим портфель в кэш в заданное время в конце дня}
ExtFml("Borisoff.MoveFORTS","12345-000",0,0.45,Cash,23,Simple,40,FLastBar,0),False);  {тут описаны параметры вызова внешнего модуля для вывода ПОРТФЕЛЯ в КЭШ после наступления серверного времени равного 23 часа 40 минут}

FNull:=If(FLastBar,  {фиксируем внутридневной профит по ПОРТФЕЛЮ после превышения им заданного уровня в +0.55%}
ExtFml("Borisoff.MoveFORTS","12345-000",0,0.45,IntraDayEquityUp,0,Simple,0.55,False,0),False);  {тут описаны параметры вызова внешнего модуля для вывода ПОРТФЕЛЯ в КЭШ после превышения ВНУТРИ-ДНЕВНЫМ профитом величины в +0.55%}
FNull:=If(FLastBar,  {фиксируем внутридневной убыток по ПОРТФЕЛЮ после снижения П/У ниже заданного уровня в -0.25%}
ExtFml("Borisoff.MoveFORTS","12345-000",0,0.45,IntraDay
EquityDown,0,Simple,-0.25,False,0),False);  {тут описаны параметры вызова внешнего модуля для вывода ПОРТФЕЛЯ в КЭШ после снижения ВНУТРИ-ДНЕВНОЙ П/У ниже величины в -0.25%}

BuyBar;  {эта строка рисует на графике торгуемого инструмента Buy-сигнал, если он есть}

{формулы на Продажу, для Sell-строки Советника. Сигнал генерируется только на уже сформированных барах, т.е. NumBarRigh должен быть всегда >0}
{задаем значения параметров ТС полученные из тестирующей системы для часового тайм-фрейма инструмента RTSI-9.08}
FPer1:=22;  {22 кол-во баров 1-го периода  - opt2 }
FPer2:=22*3;  {66 кол-во баров 2-го периода - opt2 * opt3 }
KOpt:=1.5;  { opt1 - параметр силы ценового движения, т.е. величина превышения объема на текущем баре над средним объемом в целом за период на FPer1 кол-ве баров. Если объем на текущем баре больше в 1.5 раза среднего объема за период, то будет сгенерирован сигнал Buy}
KoefV:=0.9; { opt4 - параметр ограничения волатильности для отстройки от ложных ценовых выбросов т.е. допустимая величина ATR(1) на текущем баре по сравнению с максимальной величиной ATR(1) на FPer2 кол-ве баров не должна быть более 90% от максимальной величины ATR(1) за период}

NumBarRight:=LastValue(1);
{далее введены переменные для сокращения общего размера формул, чтобы длинные повторяющиеся части формул заменить более короткими}
RL:=Ref(L,-1);
RH:=Ref(H,-1);
RMP:=Ref(MP(),-1);
RFCL:=Ref(C,-1);

FVlt:=((ATR(1)<=(HHV(ATR(1),FPer2)+HHV( If(ATR(1)=HHV(ATR(1),FPer2),0,ATR(1)),FPer2))/2
*KoefV)   {проверка ограничения по волатильности}
OR (VOLUME>=HHV(VOLUME,FPer2)
AND (((C-RFCL)>=Mov((C-RFCL),FPer2,S)
AND (MP()-RMP)>=Mov((MP()-RMP),FPer2,S))
OR ((RFCL-C)>=Mov((RFCL-C),FPer2,S)
AND (RMP-MP())>=Mov((RMP-MP()),FPer2,S)))))
AND Mod(Minute(),5)=0; {контроль что текущий бар не сбойный, т.е. у него минуты кратны без остатка выбранному 5-минутному тайм-фрейму}
KVol:=Mov(VOLUME,FPer2,S)*KOpt/VOLUME;
FInd:=VOLUME > Mov(VOLUME,FPer1,S)*KOpt
AND VOLUME > Mov(VOLUME,FPer2,S);
FCLCL:=(C-RFCL)>Mov(Abs(C-RFCL),FPer2,S)*KVol;
FLCL:=(L-RFCL)>Mov(Abs(L-RFCL),FPer2,S)*KVol;
FLL:=(L-RL)>Mov(Abs(L-RL),FPer2,S)*KVol;
FMPMP:=(MP()-RMP)>Mov(Abs(MP()-RMP),FPer2,S)*KVol;
FHH:=H-RH>Mov(Abs(H-RH),FPer2,S)*KVol;

{формула определения Buy-сигнала на текущем баре}
BuyBar:=((FCLCL AND (FLCL OR FLL OR FMPMP OR FHH))
OR (FMPMP AND (FLCL OR FLL OR FCLCL OR FHH)))
AND FInd
AND RMP<MP()
AND FVlt;

{формула определения Sell-сигнала на текущем баре}
SellBar:=(((RFCL-C)>Mov(Abs(RFCL-C),FPer2,S)*KVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FPer2,S)*KVol
OR (RH-H)>Mov(Abs(RH-H),FPer2,S)*KVol
OR (RMP-MP())>Mov(Abs(RMP-MP()),FPer2,S)*KVol
OR RL-L>Mov(Abs(RL-L),FPer2,S)*KVol))
OR ((RMP-MP())>Mov(Abs(RMP-MP()),FPer2,S)*KVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FPer2,S)*KVol
OR (RH-H)>Mov(Abs(RH-H),FPer2,S)*KVol
OR (RFCL-C)>Mov(Abs(RFCL-C),FPer2,S)*KVol
OR RL-L>Mov(Abs(RL-L),FPer2,S)*KVol)))
AND FInd
AND RMP>MP()
AND FVlt;

{далее определяем параметры простого Simple-стопа для Sell-позиции в портфеле}
LastBTrendBar:=LastValue(BarsSince(BuyBar));  {кол-во баров до последнего Buy-сигнала}
LastBTrendBar:=LastValue( If(LastBTrendBar>0 AND IsDefined(LastBTrendBar),LastBTrendBar+1,1));  {контроль корректности кол-ва баров}
StartSTrendH:=HHV( If(SellBar,H,LastValue(H)), LastBTrendBar);  {определяем наибольшую High-цену в начале Sell-тренда}
LVC:=LastValue(C);
FStop:=If(StartSTrendH<H, H-LVC, StartSTrendH-LVC);{определяем разность между найденной наибольшей High и последним значением Close-цены}
FStop:=FStop/LVC*100;  {определяем процент размещения стопа от последней Close-цены}
FStop:=If(FStop>0,FStop,0.25);  {если из-за какого-либо сбоя величина размещения стопа получится нулевая, то задаем ее равной 0.25%}
FStop:=LastValue(If(FStop>3.5,3.5,FStop));  {если величина стопа из-за какого-либо сбоя получится >3,5%, то делаем ее равной 3,5%}

FPos:=LastValue(If(Hour()>17,-1,-2));  {здесь заданы торгуемые доли для дневной и вечерней сессий (после 17часов)}

{наконец делаем итоговое определение наличия Sell-сигнала на текущем баре}
SellBar:=((SellBar AND BuyBar=False))   {контроль того, что на текущем баре с Sell-сигналом нет встречного Buy-сигнала}
AND Ref(Mod(Minute(),5),1)=0;  {контроль что следующий за текущим бар не сбойный, т.е. у него минуты кратны без остатка выбранному 5-минутному тайм-фрейму}
SellOrder:=SellBar AND Ref(BuyBar,1)=False;

FNull:=If(SellOrder {если на текущем баре определен Sell-сигнал, то вызываем внешний модуль для передачи Sell-заявки в АД-терминал}
{OR Cum(1)=LastValue(Cum(1))},  {это условие нужно нужно, если применяется авто-перемещение стопов по тренду, если нет, то отключаем}
ExtFml("Borisoff.MoveFORTS","12345-000",FPos,0.25,S,FStop,Simple,0,SellOrder,NumBarRight),False);  {тут описаны параметры вызова внешнего модуля для передачи Sell-сигнала в АД-терминал, если на текущем баре определен Sell-сигнал}

FLastBar:=Cum(1)=LastValue(Cum(1));
FNull:=If(FLastBar,  {выводим портфель в кэш в заданное время в конце дня}
ExtFml("Borisoff.MoveFORTS","12345-000",0,0.45,Cash,23,Simple,40,FLastBar,0),False);  {тут описаны параметры вызова внешнего модуля для вывода ПОРТФЕЛЯ в КЭШ после наступления серверного времени равного 23 часа 40 минут}

SellBar;  {эта строка рисует на графике торгуемого инструмента Sell-сигнал, если он есть}


Перед дальнейшим изложением я приведу описание процесса создания в Метастоке Советника для автотрейдинга.

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

AlfaTrendOption.GIF (20727 bytes).

Далее приведен полный текст Тестирующей Системы __Borisoff_AlfaTrend_Analitic для Метастока.
Используются только EnterLong и EnterShort приказы.
(эти формулы легко переносятся и в другие программы технического анализа и автотрейдинга Амиброкер, Метатрейдер, и др.):


{Enter Long}
FOpt:=opt3*opt2;
FVol:=Mov(VOLUME,FOpt,S)*opt1/VOLUME;
FInd:=VOLUME > Mov(VOLUME,opt2,S)*opt1
AND VOLUME > Mov(VOLUME,FOpt,S);
FCL:=Mov(C,1,S);
RFCL:=Ref(FCL,-1);
FBuy:=(((FCL-RFCL)>Mov(Abs(FCL-RFCL),FOpt,S)*FVol
AND ((L-RFCL)>Mov(Abs(L-RFCL),FOpt,S)*FVol
OR (L-Ref(L,-1))>Mov(Abs(L-Ref(L,-1)),FOpt,S)*FVol
OR (MP()-Ref(MP(),-1))>Mov(Abs(MP()-Ref(MP(),-1)),FOpt,S)*FVol
OR (H-Ref(H,-1))>Mov(Abs(H-Ref(H,-1)),FOpt,S)*FVol))
OR ((MP()-Ref(MP(),-1))>Mov(Abs(MP()-Ref(MP(),-1)),FOpt,S)*FVol
AND ((L-RFCL)>Mov(Abs(L-RFCL),FOpt,S)*FVol
OR (L-Ref(L,-1))>Mov(Abs(L-Ref(L,-1)),FOpt,S)*FVol
OR (FCL-RFCL)>Mov(Abs(FCL-RFCL),FOpt,S)*FVol
OR (H-Ref(H,-1))>Mov(Abs(H-Ref(H,-1)),FOpt,S)*FVol)))
AND FInd AND Ref(MP(),-1)<MP() AND C>=MP()
AND (ATR(1)<=(HHV(ATR(1),FOpt)+HHV(If(ATR(1)=HHV(ATR(1),FOpt),0,ATR(1)),FOpt))/2*opt4
OR (VOLUME>=HHV(VOLUME,FOpt)
AND (C-Ref(C,-1))>=Mov(C-Ref(C,-1),FOpt,S)
AND (MP()-Ref(MP(),-1))>=Mov(MP()-Ref(MP(),-1),FOpt,S)));
FBuy;

{EnterShort}
FOpt:=opt3*opt2;
FVol:=Mov(VOLUME,FOpt,S)*opt1/VOLUME;
FInd:=VOLUME > Mov(VOLUME,opt2,S)*opt1
AND VOLUME > Mov(VOLUME,FOpt,S);
FCL:=Mov(C,1,S);
RFCL:=Ref(FCL,-1);
FSell:=(((RFCL-FCL)>Mov(Abs(RFCL-FCL),FOpt,S)*FVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FOpt,S)*FVol
OR (Ref(H,-1)-H)>Mov(Abs(Ref(H,-1)-H),FOpt,S)*FVol
OR (Ref(MP(),-1)-MP())>Mov(Abs(Ref(MP(),-1)-MP()),FOpt,S)*FVol
OR (Ref(L,-1)-L)>Mov(Abs(Ref(L,-1)-L),FOpt,S)*FVol))
OR ((Ref(MP(),-1)-MP())>Mov(Abs(Ref(MP(),-1)-MP()),FOpt,S)*FVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FOpt,S)*FVol
OR (Ref(H,-1)-H)>Mov(Abs(Ref(H,-1)-H),FOpt,S)*FVol
OR (RFCL-FCL)>Mov(Abs(RFCL-FCL),FOpt,S)*FVol
OR (Ref(L,-1)-L)>Mov(Abs(Ref(L,-1)-L),FOpt,S)*FVol)))
AND FInd AND Ref(MP(),-1)>MP()  AND C<=MP()
AND (ATR(1)<=(HHV(ATR(1),FOpt)+HHV(If(ATR(1)=HHV(ATR(1),FOpt),0,ATR(1)),FOpt))/2*opt4
OR (VOLUME>=HHV(VOLUME,FOpt)
AND (Ref(C,-1)-C)>=Mov(Ref(C,-1)-C,FOpt.S)
AND (Ref(MP(),-1)-MP())>=Mov(Ref(MP(),-1)-MP(),FOpt,S)));
FSell;
                      
Диапазоны оптимизационных переменных тестирующей системы:
opt1:  1.1 - 2.0, шаг 0.1
opt2:     2 - 30,  шаг 1
opt3:     1 - 7,   шаг 1
opt4:  0.5 - 1.0, шаг 0.1).


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

Далее в эти формулы вместо имеющихся значений параметров нужно подставить наилучшие на ваш взгляд значения оптимизационных переменных из отчета, выданного тестером __Borisoff_AlfaTrend_Analitic. Оптимизационные значения для лонга и шорта могут быть не равны друг другу. 
AlfaTrendExpertCondition.GIF

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

По результатам тестирования и оптимизации нужно выбрать наилучшие с вашей точки зрения параметры для авто-торговли. По своему опыту дам совет, что лучше выбирать параметры, не только показавшие максимальную доходность (поскольку эта доходность в дальнейшей торговле может очень сильно!  колебаться), но также имеющие большое количество сделок в тесте (большое кол-во сделок позволяет более достоверно определить математическое ожидание системы, и как правило, увеличение кол-ва сделок в 4 раза увеличивает точность определения мат.ожидания в 2 раза, см. Булашев С.В."Статистика для трейдеров"). Исходя из этого, ниже на рисунке, я выбрал не первый, а 4-й в списке набор параметров:
          
AlfaTrendTests.GIF (17457 bytes)

особенно важны также параметры дающие наиболее низкие просадки:
AlfaTrendResultTest.GIF (29451 bytes)

После тестирования нужно посмотреть в целом графики эквити разных тестов и проверить насколько хорошо расположены BuySell-сигналы на графике:
AlfaTrendTestRTSI_908.GIF (55259 bytes)

   Как видно на графике, не на каждой торговой сессии даже хорошая система дает прибыль, бывают и серьезные убытки, но в итоге ТС с хорошо подобранными параметрами обязательно даст прибыль. При торговле очень желательно вести статистику нескольких наборов параметров, чтобы придерживаться наиболее оптимального набора и наблюдать за поведением ТС, но не нужно параметры часто менять, а тем более в ходе торговой сессии. Это может принести больше вреда чем пользы. Кроме прибыльных наборов также нужно изучать наборы параметров, дающие самые большие просадки и убытки, для того чтобы выяснить какие значения параметров являются наиболее "плохими".
              
   Еще одно замечание относительно выбираемого тайм-фрейма: я его выбираю исходя из результатов тестирования на нескольких тайм-фреймах с учетом соотношения Наилучшего и Наихудшего результата по тайм-фрейму показанного в тестах. Т.е. не рекомендую выбирать тайм-фрейм, даже показавший наибольший доход, но имеющий в тоже время тесты с наибольшими минусами, т.к. это означает и более высокий риск получения убытка на этом тайм-фрейме. Лучше выбирать тайм-фрейм где соотношение наиболее прибыльного теста к наиболее убыточному самое большое.


 Только такая комплексная оценка поможет выбрать параметры, наиболее доходные на всем периоде жизни фьючерса или другого автоматически торгуемого инструмента.

  Еще хотел бы сказать о важности контроля волатильности в системах работающих с объемом. Дело в том, что во время торгов нередко бывают резкие и сильные изменения цены, т.е. в начале формирования нового бара происходит очень сильное и резкое движение цены в одну сторону, а затем достаточно быстро цена возвращается обратно, при этом и объем на этом баре очень сильно возрастает. Я считаю, что такие движения организуются чаще всего крупными игроками: такое движение вначале вызывает срабатывание большого числа стопов, позволяя крупному игроку очень быстро набрать большую позицию по бумаге, но в направлении противоположном состоявшемуся движению. Для автоматических систем, работающих с объемом, очень важно не попадать в ловушку этого движения, чтобы не становится в позицию противоположную последующему сильному движению. Поэтому в моей системе применяется ограничение по волатильности, позволяющее распознать, насколько это возможно для механического алгоритма, такие спекулятивные выбросы и остаться в верной позиции, которая в дальнейшем принесет прибыль.
                     
Несколько важных замечаний о МаниМенеджменте и Управлении Рисками при использовании механических торговых систем.
          
  При торговле с большим плечом очень остро встает вопрос определения оптимального размера позиции по торгуемому активу. Большое плечо создает очень высокий риск потери всего счета в результате всего нескольких сильных движений рынка. Чтобы выжить на рынке, или максимально долго продержаться и что-то заработать на нем очень важно расчитывать величину торгуемой позиции по активу с помощью какой-либо системы или формулы мани-менеджмента. Я использую для этого формулу Келли. Она проста и несмотря на все недостатки позволяет достаточно эффективно определять наилучший размер позиции, используемой для торговли.
  Кстати, Ральф Винс в своей третьей книге посвященной все тому же "оптимальному f" ("Тhe Nеw Monеy Mаnagеment" "Новый подход к управлению капиталом" русское издание 2003 года), указывает, что этот вариант формулы Келли может использоваться в качестве расчета оптимального 'f' и что такая формула используется при любых соотношениях проигрыша и выигрыша, которые могут быть как равными так и неравными друг другу. Смысл "оптимального f" в том, что торговля долей портфеля больше "оптимального f" может привести к разорению даже при работе с прибыльной торговой системой, согласно формуле: 100% + 100% + 100% -100% = 0%
!!!. А торговля долей меньше "оптимального f" приводит к недополучению прибыли.
                     
  Формула Келли:

                     
ВеличинаРиска = ( (СД + 1) * ВВ - 1 ) / СД *100%;  т.е. это максимальный процент от счета на который допустимо приобретать активы или ГО
                     
где  ВероятностьВыигрыша = Выигрышей / ВсегоСделок;
        ВсегоСделок = Выигрышей + Проигрышей; 
      СредняяДоходность = СреднийВыигрыш / СреднийПроигрыш;   величины СВ и СП   берутся из отчета System Tester'а (по модулю)                     

кстати, в этой формуле числитель соответствует МатематическомуОжиданию = ( (СД + 1) * ВВ - 1 ) Торговой Системы, * 100%.

Например, для часового тайм-фрейма по RTSI-9.08 тестер выдал по выбранному набору параметров, отчет со следующими значениями формулы Келли:

Расчет риска по формуле Келли для RTSI-9.08  и параметров 1.5 / 22*3 / 0.9 
Выигрышей 29
Проигрышей 24
Всего Сделок: 53
Вероятность Выигрыша: 0,547169811
Средний Выигрыш: 4504
Средний Проигрыш: 1358
Средняя Доходность: 3,316642121
Величина Риска % (оптимальное f) : 41,06
Математическое ожидание ТС: 1,38*100%

и если у нас на счете находилось бы 50 тыс.рублей, то для этой суммы и полученных параметров торгового АльфаТренд-советника, по формуле Келли было бы разрешено использовать для торговли фьючерсом на индекс РТС всего: 50000 / 100% * 41.06% / 8700 = 2,36  т.е. всего два контракта, исходя из величины гарантийного обеспечения 8700 руб на один контракт. Очень важно не пренебрегать этой величиной риска, т.к. она позволит вам долго и прибыльно торговать выбранным активом.
  Желательно пересчитывать величину оптимального f после каждого торгового дня, чтобы адаптировать ее к текущим изменениям величины торгового счета. Тем самым, если ТС попадает в полосу нескольких подряд убыточных сделок, то величина риска (оптимальное f) также будет автоматически снижаться, а при увеличении счета - увеличиваться, при этом также будет уменьшаться/увеличиваться и размер торгуемой доли. Это позволяет ограничивать убытки, но в то же время позволяет прибыли неограниченно расти.
  Можно также использовать дополнительное уточнение размера оптимального f с помощью соотнесения его с размером максимального дродауна:
   new %opt_F = (1 - %MaxLoss / %opt_F ) *100%;
             
  Вышеупомянутый Ральф Винс в своей книге указывает, что при несоблюдении правил МаниМенеджмента можно разориться и с исключительно прибыльной системой согласно правила: 100% + 100% + 100% - 100% = 0%
  На рынке возможны резкие изменения ситуации вкупе с изменением величины ГО и, чтобы не получить маржин-кол и не слить счет, лучше использовать ММ-формулы для правильного определения величины торгуемой позиции, а не выбирать ее на "авось". Конечно Вы можете применять не только формулу Келли, но и другие ММ-формулы. (см.http://www.tsresearchgroup.ru/ru/articles/public_20020402010706.php)
  Желательно по итогам каждой торговой сессии проводить расчет допустимого риска и соответственно корректировать величину своей торговой позиции.

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

  Как я уже говорил выше, я использовал всего два фьючерсных контракта на индекс РТС для автоматической торговли, хотя мог бы торговать и гораздо большим количеством. Но "живучесть" в торговле гораздо важнее быстрых больших прибылей, ведь, если вы выживете на рынке, то сможете в итоге заработать намного больше, чем, если после нескольких удачных сделок сольете депозит.

  Успехов!
 (с) Дмитрий Борисов. 23.08.2008г             



ПРИЛОЖЕНИЕ:
полный текст моего рабочего варианта МТС 'Альфа-тренд' с использованием нескольких наборов параметров, с реагированием на рыночную ситуацию также и на формирующемся нулевом баре, с авто-перемещаемыми по тренду стопами, с примерами заявок на выход в кэш в конце дня или при достижении внутридневной прибыли в +0.55%, с помощью которой я торгую фьючерсом на индекс РТС.

1.Вначале создаем несколько индикаторов в разделе Indicator Builder Метастока в количестве, равном кол-ву одновременно используемых наборов параметров:
       
IndicatorBuilder.GIF (9193 bytes)

{ "Auto_FRTSI_5min_1" }

FPer1:=13; {opt2}
FPer2:=13*6; {opt2*opt3}
KOpt:=1.5; {opt1}
RL:=Ref(L,-1);
RH:=Ref(H,-1);
RMP:=Ref(MP(),-1);
RFCL:=Ref(C,-1);
FVlt:=((ATR(1)<={HHV(ATR(1),FPer2)}
(HHV(ATR(1),FPer2)+HHV(If(ATR(1)=HHV(ATR(1),FPer2),0,ATR(1)),FPer2))/2*0.5) {opt4}
OR (VOLUME>=HHV(VOLUME,FPer2)
AND (((C-RFCL)>=Mov((C-RFCL),FPer2,S)
AND (MP()-RMP)>=Mov((MP()-RMP),FPer2,S))
NullBarSell.GIF (2525 bytes)   {пример необходимости реагирования ТС на еще не сформированном "нулевом" баре, чтобы не пропустить большое движение}
OR ((RFCL-C)>=Mov((RFCL-C),FPer2,S)
AND (RMP-MP())>=Mov((RMP-MP()),FPer2,S)))));  
KVol:=Mov(VOLUME,FPer2,S)*KOpt/VOLUME;
FInd:=VOLUME > Mov(VOLUME,FPer1,S)*KOpt
AND VOLUME > Mov(VOLUME,FPer2,S);
FCLCL:=(C-RFCL)>Mov(Abs(C-RFCL),FPer2,S)*KVol;
FLCL:=(L-RFCL)>Mov(Abs(L-RFCL),FPer2,S)*KVol;
FLL:=(L-RL)>Mov(Abs(L-RL),FPer2,S)*KVol;
FMPMP:=(MP()-RMP)>Mov(Abs(MP()-RMP),FPer2,S)*KVol;
FHH:=H-RH>Mov(Abs(H-RH),FPer2,S)*KVol;
BuyBar:=((FCLCL AND (FLCL OR FLL OR FMPMP OR FHH))
OR (FMPMP AND (FLCL OR FLL OR FCLCL OR FHH)))
AND FInd AND C>=MP()
AND FVlt;
SellBar:=(((RFCL-C)>Mov(Abs(RFCL-C),FPer2,S)*KVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FPer2,S)*KVol
OR (RH-H)>Mov(Abs(RH-H),FPer2,S)*KVol
OR (RMP-MP())>Mov(Abs(RMP-MP()),FPer2,S)*KVol
OR RL-L>Mov(Abs(RL-L),FPer2,S)*KVol))
OR ((RMP-MP())>Mov(Abs(RMP-MP()),FPer2,S)*KVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FPer2,S)*KVol
OR (RH-H)>Mov(Abs(RH-H),FPer2,S)*KVol
OR (RFCL-C)>Mov(Abs(RFCL-C),FPer2,S)*KVol
OR RL-L>Mov(Abs(RL-L),FPer2,S)*KVol)))
AND FInd AND C<=MP()
AND FVlt;

{ "Auto_FRTSI_5min_2" }
FPer1:=18; {opt2}
FPer2:=18*4; {opt2*opt3}
KOpt:=1.8; {opt1}
RL:=Ref(L,-1);
RH:=Ref(H,-1);
RMP:=Ref(MP(),-1);
RFCL:=Ref(C,-1);
FVlt:=((ATR(1)<={HHV(ATR(1),FPer2)}
(HHV(ATR(1),FPer2)+HHV(If(ATR(1)=HHV(ATR(1),FPer2),0,ATR(1)),FPer2))/2*0.7) {opt4}
OR (VOLUME>=HHV(VOLUME,FPer2)
AND (((C-RFCL)>=Mov((C-RFCL),FPer2,S)
AND (MP()-RMP)>=Mov((MP()-RMP),FPer2,S))
NullBarBuy2.GIF (4259 bytes) {пример необходимости реагирования ТС на еще не сформированном "нулевом" баре, чтобы не пропустить большое движение}
OR ((RFCL-C)>=Mov((RFCL-C),FPer2,S)
AND (RMP-MP())>=Mov((RMP-MP()),FPer2,S))))); 
KVol:=Mov(VOLUME,FPer2,S)*KOpt/VOLUME;
FInd:=VOLUME > Mov(VOLUME,FPer1,S)*KOpt
AND VOLUME > Mov(VOLUME,FPer2,S);
FCLCL:=(C-RFCL)>Mov(Abs(C-RFCL),FPer2,S)*KVol;
FLCL:=(L-RFCL)>Mov(Abs(L-RFCL),FPer2,S)*KVol;
FLL:=(L-RL)>Mov(Abs(L-RL),FPer2,S)*KVol;
FMPMP:=(MP()-RMP)>Mov(Abs(MP()-RMP),FPer2,S)*KVol;
FHH:=H-RH>Mov(Abs(H-RH),FPer2,S)*KVol;
BuyBar:=((FCLCL AND (FLCL OR FLL OR FMPMP OR FHH))
OR (FMPMP AND (FLCL OR FLL OR FCLCL OR FHH)))
AND FInd AND C>=MP()
AND FVlt;
SellBar:=(((RFCL-C)>Mov(Abs(RFCL-C),FPer2,S)*KVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FPer2,S)*KVol
OR (RH-H)>Mov(Abs(RH-H),FPer2,S)*KVol
OR (RMP-MP())>Mov(Abs(RMP-MP()),FPer2,S)*KVol
OR RL-L>Mov(Abs(RL-L),FPer2,S)*KVol))
OR ((RMP-MP())>Mov(Abs(RMP-MP()),FPer2,S)*KVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FPer2,S)*KVol
OR (RH-H)>Mov(Abs(RH-H),FPer2,S)*KVol
OR (RFCL-C)>Mov(Abs(RFCL-C),FPer2,S)*KVol
OR RL-L>Mov(Abs(RL-L),FPer2,S)*KVol)))
AND FInd AND C<=MP()
AND FVlt;

{ "Auto_FRTSI_5min_3" }
FPer1:=28; {opt2}
FPer2:=28*5;  {opt2*opt3}
KOpt:=1.5;  {opt1}
RL:=Ref(L,-1);
RH:=Ref(H,-1);
RMP:=Ref(MP(),-1);
RFCL:=Ref(C,-1);
FVlt:=((ATR(1)<={HHV(ATR(1),FPer2)}
(HHV(ATR(1),FPer2)+HHV(If(ATR(1)=HHV(ATR(1),FPer2),0,ATR(1)),FPer2))/2*0.5) {opt4}
OR (VOLUME>=HHV(VOLUME,FPer2)
AND (((C-RFCL)>=Mov((C-RFCL),FPer2,S)
AND (MP()-RMP)>=Mov((MP()-RMP),FPer2,S))
OR ((RFCL-C)>=Mov((RFCL-C),FPer2,S)
AND (RMP-MP())>=Mov((RMP-MP()),FPer2,S)))));
KVol:=Mov(VOLUME,FPer2,S)*KOpt/VOLUME;
FInd:=VOLUME > Mov(VOLUME,FPer1,S)*KOpt
AND VOLUME > Mov(VOLUME,FPer2,S);
FCLCL:=(C-RFCL)>Mov(Abs(C-RFCL),FPer2,S)*KVol;
FLCL:=(L-RFCL)>Mov(Abs(L-RFCL),FPer2,S)*KVol;
FLL:=(L-RL)>Mov(Abs(L-RL),FPer2,S)*KVol;
FMPMP:=(MP()-RMP)>Mov(Abs(MP()-RMP),FPer2,S)*KVol;
FHH:=H-RH>Mov(Abs(H-RH),FPer2,S)*KVol;
BuyBar:=((FCLCL AND (FLCL OR FLL OR FMPMP OR FHH))
OR (FMPMP AND (FLCL OR FLL OR FCLCL OR FHH)))
AND FInd AND C>=MP()
AND FVlt;
SellBar:=(((RFCL-C)>Mov(Abs(RFCL-C),FPer2,S)*KVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FPer2,S)*KVol
OR (RH-H)>Mov(Abs(RH-H),FPer2,S)*KVol
OR (RMP-MP())>Mov(Abs(RMP-MP()),FPer2,S)*KVol
OR RL-L>Mov(Abs(RL-L),FPer2,S)*KVol))
OR ((RMP-MP())>Mov(Abs(RMP-MP()),FPer2,S)*KVol
AND ((RFCL-H)>Mov(Abs(RFCL-H),FPer2,S)*KVol
OR (RH-H)>Mov(Abs(RH-H),FPer2,S)*KVol
OR (RFCL-C)>Mov(Abs(RFCL-C),FPer2,S)*KVol
OR RL-L>Mov(Abs(RL-L),FPer2,S)*KVol)))
AND FInd AND C<=MP()
AND FVlt;

2.Затем создаем нового советника например с названием "AutoTrading_FRTSI_5min" в разделе Expert Advisor, в этом советнике на вкладке 'Symbols' создаем 4 новых строки в таком же порядке как показано на рисунке:
             
SymbolsExpert.GIF (6172 bytes)
                
и пишем в этих строках следующие тексты:
{ Sell на сформированном баре}
NumBarRight:=LastValue(1);
BuyBar0:=(FmlVar("
Auto_FRTSI_5min_1","BuyBar")  
OR FmlVar("
Auto_FRTSI_5min_2","BuyBar")
OR FmlVar("
Auto_FRTSI_5min_3","BuyBar"));
SellBar0:=(FmlVar("
Auto_FRTSI_5min_1","SellBar")
OR FmlVar("
Auto_FRTSI_5min_2","SellBar")
OR FmlVar("
Auto_FRTSI_5min_3","SellBar"));
FLast:=LastValue(Cum(1))-Cum(1)<=NumBarRight;
LVC:=LastValue(C); 
{ищем High в начале Sell-тренда}
{LastBTrendBar:=LastValue(BarsSince(BuyBar0));
LastBTrendBar:=LastValue(If(LastBTrendBar>0
AND IsDefined(LastBTrendBar),LastBTrendBar,1));
StartSTrendH:=HHV(If(SellBar0,H,LastValue(H)),LastBTrendBar);
FStop:=If(StartSTrendH<H,H-LVC,StartSTrendH-LVC);
FStop:=FStop/LVC*100.0025;
FStop:=If(FStop>0,FStop,0.25);
FStop:=LastValue(If(FStop>3.5,3.5,FStop));}

FStop:=(LastValue(Max(Max(Ref(H,-2),Ref(H,-1)),LVC))-LVC)/LVC*100+0.1;
FStop:=LastValue(If(FStop<0.1,0.1,FStop));
FPos:=LastValue(If(Hour()>17,-1,-2));

SellBar:=(SellBar0 AND BuyBar0=False AND Ref(MP(),-1)>MP());
SellOrder:=SellBar AND Ref(BuyBar0,1)=False;
FNull:=If(SellOrder OR FLast,
ExtFml("Borisoff.MoveFORTS","1234-000",FPos,0.35,S,FStop,ASimple,0.01,SellOrder,NumBarRight),False);
SellBar;


{ Sell0 на еще формирующемся баре}

NumBarRight:=LastValue(0);
BuyBar:=(FmlVar("Auto_FRTSI_5min_1","BuyBar")
OR FmlVar("
Auto_FRTSI_5min_2","BuyBar")
OR FmlVar("
Auto_FRTSI_5min_3","BuyBar"));
SellBar:=(FmlVar("
Auto_FRTSI_5min_1","SellBar")
OR FmlVar("
Auto_FRTSI_5min_2","SellBar")
OR FmlVar("
Auto_FRTSI_5min_3","SellBar"));
FLast:=LastValue(Cum(1))-Cum(1)<=NumBarRight;
LVC:=LastValue(C);
{ищем High в начале Sell-тренда}
{LastBTrendBar:=LastValue(BarsSince(BuyBar));
LastBTrendBar:=LastValue(If(LastBTrendBar>0
AND IsDefined(LastBTrendBar),LastBTrendBar,1));
StartSTrendH:=HHV(If(SellBar,H,LastValue(H)),LastBTrendBar);
FStop:=If(StartSTrendH<H,H-C,StartSTrendH-C);
FStop:=FStop/LVC*100.0025;
FStop:=If(FStop>0,FStop,0.25);
FStop:=LastValue(If(FStop>3.5,3.5,FStop));}

FStop:=(LastValue(Max(Max(Ref(H,-2),Ref(H,-1)),LVC))-LVC)/LVC*100+0.1;
FStop:=LastValue(If(FStop<0.1,0.1,FStop));
FPos:=LastValue(If(Hour()>17,-1,-2));

SellBar0:=SellBar AND C<MP() AND FLast;
FNull:=If(SellBar0 OR FLast,
ExtFml("Borisoff.MoveFORTS","1234-000",FPos,0.65,S,FStop,ASimple,0.01,SellBar0,NumBarRight),False);
SellBar0;

{***ниже черным цветом приведены другие варианты заявок***}
FNull:=If(FLastBar, 
ExtFml("Borisoff.MoveFORTS","12345-000",0,0.45,Cash,23,Simple,40,FLastBar,0),False);  {тут описаны параметры вызова внешнего модуля для вывода ПОРТФЕЛЯ в КЭШ после наступления серверного времени равного 23 часа 40 минут}
FNull:=If(FLastBar, 
ExtFml("Borisoff.MoveFORTS","12345-000",0,0.45,IntraDayEquityUp,0,Simple,0.55,False,0),False);  {тут описаны параметры вызова внешнего модуля для вывода ПОРТФЕЛЯ в КЭШ после превышения внутридневным профитом величины в   +0.55%. Достаточно прописать эти строки только в одном из 4-х правил, чтобы IntraDayEquityUp-заявка управляла всем портфелем}
FNull:=If(FLastBar,  {фиксируем внутридневной убыток по ПОРТФЕЛЮ после снижения П/У ниже заданного уровня в -0.25%}
ExtFml("Borisoff.MoveFORTS","12345-000",0,0.45,IntraDayEquityDown,0,Simple,-0.25,False,0),False);  {тут описаны параметры вызова внешнего модуля для вывода ПОРТФЕЛЯ в КЭШ после снижения ВНУТРИ-ДНЕВНОЙ П/У ниже величины в -0.25%}
                
      
{ Buy  на сформированном баре}
NumBarRight:=LastValue(1);
BuyBar0:=(FmlVar("Auto_FRTSI_5min_1","BuyBar")
OR FmlVar("
Auto_FRTSI_5min_2","BuyBar")
OR FmlVar("
Auto_FRTSI_5min_3","BuyBar"));
SellBar0:=(FmlVar("
Auto_FRTSI_5min_1","SellBar")
OR FmlVar("
Auto_FRTSI_5min_2","SellBar")
OR FmlVar("
Auto_FRTSI_5min_3","SellBar"));
FLast:=LastValue(Cum(1))-Cum(1)<=NumBarRight;
LVC:=LastValue(C);
{ищем Low в начале Buy-тренда}
{LastSTrendBar:=LastValue(BarsSince(SellBar0));
LastSTrendBar:=LastValue(If(LastSTrendBar>0
AND IsDefined(LastSTrendBar),LastSTrendBar,1));
StartBTrendL:=LLV(If(BuyBar0,L,LastValue(L)),LastSTrendBar);
FStop:=If(StartBTrendL>L,RC-L,RC-StartBTrendL);
FStop:=FStop/LastValue(C)*100.0025;
FStop:=If(FStop>0,FStop,0.25);
FStop:=LastValue(If(FStop>3.5,3.5,FStop));}
FStop:=(LVC-LastValue(Min(Min(Ref(L,-2),Ref(L,-1)),LVC)))/LVC*100+0.1;
FStop:=LastValue(If(FStop<0.1,0.1,FStop));
FPos:=LastValue(If(Hour()>17,-1,-2));
BuyBar:=(BuyBar0 AND (SellBar0=False) AND Ref(MP(),-1)<MP());
BuyOrder:=BuyBar AND Ref(SellBar0,1)=False;
FNull:=If(BuyOrder OR FLast,
ExtFml("Borisoff.MoveFORTS","1234-000",FPos,0.35,B,FStop,ASimple,0.01,BuyOrder,NumBarRight),False);
BuyBar;


{ Buy0  на еще формирующемся баре}
NumBarRight:=LastValue(0);
BuyBar:=(FmlVar("Auto_FRTSI_5min_1","BuyBar")
OR FmlVar("
Auto_FRTSI_5min_2","BuyBar")
OR FmlVar("
Auto_FRTSI_5min_3","BuyBar"));
SellBar:=(FmlVar("
Auto_FRTSI_5min_1","SellBar")
OR FmlVar("
Auto_FRTSI_5min_2","SellBar")
OR FmlVar("
Auto_FRTSI_5min_3
","SellBar"));
FLast:=LastValue(Cum(1))-Cum(1)<=NumBarRight;
LVC:=LastValue(C);
{ищем Low в начале Buy-тренда}
{LastSTrendBar:=LastValue(BarsSince(SellBar));
LastSTrendBar:=LastValue(If(LastSTrendBar>0
AND IsDefined(LastSTrendBar),LastSTrendBar,1));
StartBTrendL:=LLV(If(BuyBar,L,LastValue(L)),LastSTrendBar);
FStop:=If(StartBTrendL>L,C-L,C-StartBTrendL);
FStop:=FStop/LVC*100.0025;
FStop:=If(FStop>0,FStop,0.25);
FStop:=LastValue(If(FStop>3.5,3.5,FStop));}
FStop:=(LVC-LastValue(Min(Min(Ref(L,-2),Ref(L,-1)),LVC)))/LVC*100+0.1;
FStop:=LastValue(If(FStop<0.1,0.1,FStop));
FPos:=LastValue(If(Hour()>17,-1,-2));

BuyBar0:=BuyBar AND C>MP() AND FLast;
FNull:=If(BuyBar0 OR FLast,
ExtFml("Borisoff.MoveFORTS","1234-000",FPos,0.65,B,FStop,ASimple,0.01,BuyBar0,NumBarRight),False);
BuyBar0;

{***ниже черным цветом приведены другие варианты заявок***}
FNull:=If(FLastBar, 
ExtFml("Borisoff.MoveFORTS","12345-000",0,0.45,Cash,23,Simple,40,FLastBar,0),False);  {тут описаны параметры вызова внешнего модуля для вывода ПОРТФЕЛЯ в КЭШ после наступления серверного времени равного 23 часа 40 минут}


  В этом примере используется три набора параметров, но вы можете использовать своё количество наборов. Важно только, чтобы при тестировании на исторических данных эквити группы из выбранных наборов параметров получалось больше, чем эквити любого отдельного набора параметров из группы, полученных с помощью тестируюшей системы "_Borisoff_AlfaTrend_Analitic", и в том числе больше самого большего эквити из этого теста.
  Цель использования сразу целой группы наборов параметров вместо одного - получить эквити большей величины, чем максимальный эквити отдельных наборов и улучшить качество самой кривой эквити, т.е. сделать ее более плавно-растущей, уменьшить просадки, получить более результативные BuySell сигналы на графике и т.п.
  В вышеописанной торговой системе эквити на истории каждого в отдельности набора параметров
"Auto_FRTSI_5min_1", "Auto_FRTSI_5min_2", "Auto_FRTSI_5min_3" также меньше, чем эквити при применении сразу всей группы из этих трех наборов параметров.
        
Для теста группы из трех наборов параметров следует создать дополнительную тестирующую систему с этими тремя наборами параметров, например с названием
"_Borisoff_AlfaTrend_GroupAnalitic", содержащую всего несколько следующих строк:

EnterLong:
(FmlVar("Auto_FRTSI_5min_1","BuyBar")
OR FmlVar("Auto_FRTSI_5min_2","BuyBar")
OR FmlVar("Auto_FRTSI_5min_3","BuyBar"));


EnterShort:
(FmlVar("Auto_FRTSI_5min_1","SellBar")
OR FmlVar("Auto_FRTSI_5min_2","SellBar")
OR FmlVar("Auto_FRTSI_5min_3","SellBar"));

и в параметры этих индикаторов в разделе 'Indicator Builder' нужно вручную подставить значения, полученные с помощью тестируюшей системы "_Borisoff_AlfaTrend_Analitic" и снова тестировать на истории, пока общий эквити группы не получится больше, чем эквити любого отдельного набора параметров из группы. Если эквити группы получается меньше, чем эквити хотя бы одного набора параметров из этой группы, то нужно подбирать в группу другой набор параметров и т.д., пока эквити в тесте группы в целом, не станет больше эквити любого отдельного набора параметров из группы. Обычно первым в группу включается набор параметров, показавший максимальный эквити в тесте "_Borisoff_AlfaTrend_Analitic" и к нему затем добавляются остальные.
  Хотя процесс описан витиевато и кажется на первый взгляд трудоемким, на самом деле он занимает не больше получаса. Т.е. вначале бумага тестируется системой "_Borisoff_AlfaTrend_Analitic", затем из этого теста берется набор параметров показавший лучший результат и к нему добавляется еще пара наборов из этого же теста. Параметры этих наборов прописываются в индикаторах и проводится тестирование полученной группы параметров системой "_Borisoff_AlfaTrend_GroupAnalitic". Если результат группы хуже, чем результат в тесте "_Borisoff_AlfaTrend_Analitic" хотя бы одного набора их группы, то состав группы меняется, пока не будет составлена группа с эквити больше эквити любого отдельного ее набора параметров. Кол-во наборов в группе не обязательно должно быть равно трем, оно может быть и меньше и больше, но тогда нужно будет скорректировать кол-во используемых наборов и в текстах Sell,Sell0,Buy,Buy0 условий Советника. Но нужно учитывать что большое кол-во наборов при данном способе использования их в советнике особого выигрыша не принесет.
(!)Можно конечно и просто выбрать, без тестрования в группе, любые три понравившихся вам набора параметров.
  Мне также задавали вопрос про большое количество OR-условий в алгоритме. Моя идея была в том, чтобы для выработки сигнала применять не одно условие, а обязательно как минимум два, чтобы тем самым повысить определение более вероятного направления движения цены. Поэтому например из трех исходных условий можно сделать по три парных комбинации, из четырех исходных условий я делал шесть попарных их комбинаций. Т.е. большое кол-во попарных комбинаций и приводит к большому числу OR-условий по сравнению с количеством исходных.

  Ну вот, практически все секреты моей ТС "Альфа-тренд" раскрыты в этом материале, только тайм-фрейм и значения параметров здесь приведены другие, а не те, с которыми я работаю сейчас. Мой тайм-фрейм 3 минуты, используются три набора: 1.8/22*3/0.5; 2.0/12*6/0.5; 2.0/18*4/0.5. (интрадейные тайм-фреймы, отличающиеся от стандартных, можно задавать выбирая Periodicity-Intraday-Other и далее задать в поле нужное значение). Еще хочу добавить о тайм-фреймах. C середины октября очень хорошие результаты показывали тесты на часовиках, но этот тайм-фрейм может также и легко ломаться, т.е становится мало-прибыльным, особенно на боковиках с большой амплитудой ATR() и на графиках такие места имеются. Мне кажется короткие тайм-фреймы, от 15 минут и меньше, более устойчивы к разным негативным рыночным влияниям и более доходны.

Hosted by uCoz