Советы по трендследящей МТС

  • Автор темы HiTrader
  • Дата начала

HiTrader

New member
да это же просто эквити системы :)
Вот и я склонялся к эквити, поэтому изначально и спрашивал какой параметр эквити лучше всего рассматривать как постоянный для оптимизируемого параметра opt1: P/L, CAR/MDD, Recovery Factor?
 

Jaguar

New member
Но конечно использование ЕМА - не панацея. Просто если и использовать МА, то скорее всего именно ЕМА.

JMA, конечно тоже вещь, но как много трейдеров смотрит на динамику объемов?? К тому же значительные объемы сразу же отражаются НА ЦЕНЕ, так что ИМХО на объемы можно забить.
Я слышал, что у JMA чуть ли не секретный какой-то патентованный алгоритм (хи-хи).
Если там берутся в расчёт объёмы, то я их не очень жалую. Объём трудно интерпретировать, имхо. И, как и со "спасибо", "в карман" не положишь :))

Аргументы насчёт ЕМА продолжаю обдумывать... У меня фактор времени почти не используется в классическом понимании, но интересно.
 

Jaguar

New member
Поэтому я ищу такой глобальный параметр рынка, который описывает текущую фазу, требует очень редкой настройки и более робастен по отношению к параметру opt1.
Подумав, скажу так: может быть такой подход имеет смысл. Углубился в размышления.
 

Бганга

New member
Я слышал, что у JMA чуть ли не секретный какой-то патентованный алгоритм (хи-хи).
Если там берутся в расчёт объёмы, то я их не очень жалую. Объём трудно интерпретировать, имхо. И, как и со "спасибо", "в карман" не положишь :))
Не, объемов в JMA нет, там используется многократное сглаживание. Алгоритм конечно секретный, патентованный и очень дорогой. Именно поэтому я его на всякий случай скачал в свое время :) Но у меня он для Матлаба... Кстати, братья-программисты, сколько примерно может стоить перевести код JMA с Матлабовского языка на VBA, чтобы он в Екселе заработал?
 

HiTrader

New member
Не, объемов в JMA нет, там используется многократное сглаживание. Алгоритм конечно секретный, патентованный и очень дорогой. Именно поэтому я его на всякий случай скачал в свое время :) Но у меня он для Матлаба... Кстати, братья-программисты, сколько примерно может стоить перевести код JMA с Матлабовского языка на VBA, чтобы он в Екселе заработал?
Смотреть нужно код, сколько строк в нем, есть ли комментарии к коду, сложность кода, далее понять алгоритм и преобразовать.
 

Anchorit

New member
Но у меня он для Матлаба... Кстати, братья-программисты, сколько примерно может стоить перевести код JMA с Матлабовского языка на VBA, чтобы он в Екселе заработал?
Боюсь что дофига так как матлабовский алгоритм JMA наверняка сылается не на одну матлабовскую функцию. Как бы не пришлось половину библиотеки матлабовской переводить.

Проще скомпилировать эту функцию в экзешник или dll и потом уже как-то прицепить к торговой системе. По-моему начиная с 5го матлаба есть возможность компилировать
m-файлы или делать из них C-шные библиотеки (с расширением ".h")
 

Бганга

New member
Смотреть нужно код, сколько строк в нем, есть ли комментарии к коду, сложность кода, далее понять алгоритм и преобразовать.
Боюсь что дофига так как матлабовский алгоритм JMA наверняка сылается не на одну матлабовскую функцию. Как бы не пришлось половину библиотеки матлабовской переводить.

Проще скомпилировать эту функцию в экзешник или dll и потом уже как-то прицепить к торговой системе. По-моему начиная с 5го матлаба есть возможность компилировать
m-файлы или делать из них C-шные библиотеки (с расширением ".h")
Вот, может быть пригодится кому. Это проверенный код, у меня работал, файл называется JJMA.m:
Код:
function Result=JJMA(Series, Len, Phase)
%JJMA
%Created by Starlight ([email protected])

disp('JJMA');
[row,col]=size(Series);
BarCount=row;
msg1=sprintf('Lines=%d',BarCount);
disp(msg1);

list=zeros(128,1);
ring=zeros(128,1);
ring2=zeros(11,1);
buffer=zeros(62,1);

v=0; v1=0; v2=0; v3=0; v4=0; s8=0; s10=0; s18=0; s20=0;
v5=0; v6=0; s28=0; s30=0; s38=0; s40=0; s48=0; s50=0; s58=0; s60=0; s68=0; s70=0;
f8=0; f10=0; f18=0; f20=0; f28=0; f30=0; f38=0; f40=0; f48=0; f50=0; f58=0; f60=0; f68=0; 
f70=0; f78=0; f80=0; f88=0; f90=0; f98=0; fA0=0; fA8=0; fB0=0; fB8=0; fC0=0; fC8=0; fD0=0;
f0=0; fD8=0; fE0=0; fE8=0; fF0=0; fF8=0;
s28 = 63;
s30 = 64;

for i = 1:s28
    list(1+i) = -1000000;
end;

for i = s30:127
    list(1+i) = 1000000;
end;
f0 = 1;
if (Len <= 1) 
    f80 = 1.0e-10;
else 
    f80 = (Len - 1) / 2;
end;
  
if (Phase < -100) 
    f10 = 0.5;
else 
    if (Phase > 100) 
        f10 = 2.5;
    else 
        f10 = Phase / 100 + 1.5;
    end;
end;

v1 = log10(sqrt(f80));
v2 = v1;
    
if (v1 / log10(2.0) + 2 < 0) 
    v3 = 0;
else 
    v3 = v2 / log10(2.0) + 2;
end;
f98 = v3;
if (0.5 <= f98 - 2) 
    f88 = f98 - 2;
else 
    f88 = 0.5;
end;
        
f78 = sqrt(f80) * f98;
f90 = f78 / (f78 + 1);
f80 = f80 * 0.9;
f50 = f80 / (f80 + 2);
    
for bar = 0:(BarCount-1)
    if (fF0 < 61) 
        fF0 = fF0 + 1;
        buffer(1+fF0) = Series(1+bar,1);
    end;
    if (fF0 > 30) 
        if (f0 ~= 0) 
            f0 = 0;
            v5 = 0;
            for i = 1:29
                if (buffer(1+i+1) ~= buffer(1+i))
                    v5 = 1;
                end;
            end;
            fD8 = v5*30;
            if (fD8 == 0) 
                f38 = Series(1+bar,1);
            else 
                f38 = buffer(1+1);
            end;
            f18 = f38;
            if (fD8 > 29) 
                fD8 = 29;
            end;
        else
            fD8 = 0;
        end;

        for i = fD8:-1:0
            if (i == 0) 
                f8 = Series(1+bar,1);
            else 
                f8 = buffer(1+31-i);
            end;
            f28 = f8 - f18;
            f48 = f8 - f38;     
            if (abs(f28) > abs(f48)) 
                v2 = abs(f28);
            else 
                v2 = abs(f48);
            end;
            fA0 = v2;
            v = fA0 + 1.0e-10;
            if (s48 <= 1) 
                s48 = 127;
            else 
                s48 = s48 - 1;
            end;
            if (s50 <= 1) 
                s50 = 10;
            else 
                s50 = s50 - 1;
            end;
            if (s70 < 128) 
                s70 = s70 + 1;
            end;
            s8 = s8 + v - ring2(1+s50);
            ring2(1+s50) = v;
            if (s70 > 10) 
                s20 = s8 / 10;
            else 
                s20 = s8 / s70;
            end;

            if (s70 > 127) 
                s10 = ring(1+s48);
                ring(1+s48) = s20;
                s68 = 64;
                s58 = s68;
                while (s68 > 1)
                    if (list(1+s58) < s10) 
                        s68 = s68 / 2;
                        s58 = s58 + s68;
                    else
                        if (list(1+s58) <= s10) 
                            s68 = 1;
                        else 
                            s68 = s68 / 2;
                            s58 = s58 - s68;
                        end;
                    end;
                end;    
            else 
                ring(1+s48) = s20;
                if (s28 + s30 > 127) 
                    s30 = s30 - 1;
                    s58 = s30;
                else 
                    s28 = s28 + 1;
                    s58 = s28;
                end;
                if (s28 > 96) 
                    s38 = 96;
                else 
                    s38 = s28;
                end;
                if (s30 < 32) 
                    s40 = 32;
                else 
                   s40 = s30;
                end;
                s68 = 64;
                s60 = s68;
            end;    
    
            while (s68 > 1)
                if (list(1+s60) >= s20) 
                    if (list(1+s60 - 1) <= s20) 
                        s68 = 1;
                    else 
                        s68 = s68 / 2;
                        s60 = s60 - s68;
                    end;
                else 
                    s68 = s68 / 2;
                    s60 = s60 + s68;
                end;
                if ((s60 == 127) & (s20 > list(1+127))) 
                    s60 = 128;
                end;
            end;
        
            if (s70 > 127) 
                if (s58 >= s60) 
                    if ((s38 + 1 > s60) & (s40 - 1 < s60)) 
                        s18 = s18 + s20;
                    else
                        if ((s40 > s60) & (s40 - 1 < s58)) 
                            s18 = s18 + list(1+s40 - 1);
                        end;
                    end;
                else
                    if (s40 >= s60) 
                        if ((s38 + 1 < s60) & (s38 + 1 > s58)) 
                            s18 = s18 + list(1+s38 + 1);
                        end;
                    else
                        if (s38 + 2 > s60) 
                            s18 = s18 + s20;
                        else
                            if ((s38 + 1 < s60) & (s38 + 1 > s58)) 
                                s18 = s18 + list(1+s38 + 1);
                            end;
                        end;
                    end;
                end;
                if (s58 > s60) 
                    if ((s40 - 1 < s58) & (s38 + 1 > s58)) 
                        s18 = s18 - list(1+s58);
                    else
                        if ((s38 < s58) & (s38 + 1 > s60)) 
                            s18 = s18 - list(1+s38);
                        end;
                    end;
                else 
                    if ((s38 + 1 > s58) & (s40 - 1 < s58)) 
                        s18 = s18 - list(1+s58);
                    else
                        if ((s40 > s58) & (s40 < s60)) 
                            s18 = s18 - list(1+s40);
                        end;
                    end;
                end;
            end;
        
            if (s58 <= s60) 
                if (s58 >= s60) 
                    list(1+s60) = s20;
                else 
                    for i = s58+1:(s60-1)
                        list(1+i-1) = list(1+i);
                    end;
                    list(1+s60-1) = s20;
                end;
            else 
                for i = (s58-1):-1:s60
                    list(1+i + 1) = list(1+i);
                end;
                list(1+s60) = s20;
            end;
        
            if (s70 <= 127) 
                s18 = 0;
                for i = s40:s38
                    s18 = s18 + list(1+i);
                end;
            end;
            
            f60 = s18 / (s38 - s40 + 1);
            
            if (fF8 + 1 > 31) 
                fF8 = 31;
            else 
                fF8 = fF8 + 1;
            end;
        
            if (fF8 <= 30) 
                if (f28 > 0) 
                    f18 = f8;
                else 
                    f18 = f8 - f28 * f90;
                end;
                if (f48 < 0) 
                    f38 = f8;
                else 
                    f38 = f8 - f48 * f90;
                end;                    
                fB8 = Series(1+bar,1);
                if (fF8 ~= 30) 
                    continue;
                end;        
                fC0 = Series(1+bar,1);
                if (jceil(f78) >= 1) 
                    v4 = jceil(f78);
                else 
                    v4 = 1;
                end;     
                fE8 = fix(v4);
          
                if (jfloor(f78) >= 1) 
                    v2 = jfloor(f78); 
                else 
                    v2 = 1;
                end;                      
                fE0 = fix(v2);
    
                if (fE8 == fE0) 
                    f68 = 1;
                else 
                    v4 = fE8 - fE0;
                    f68 = (f78 - fE0) / v4;
                end;
                                        
                if (fE0 <= 29) 
                    v5 = fE0; 
                else 
                    v5 = 29;
                end;
                if (fE8 <= 29) 
                    v6 = fE8;
                else 
                    v6 = 29;
                end;
                fA8 = (  Series(1+bar) - buffer(1+fF0-v5) ) * (1 - f68) / fE0+( Series(1+bar)-buffer(1+fF0-v6) ) * f68 / fE8;
            else 
                if (f98 >= power(fA0/f60, f88)) 
                    v1 = power(fA0/f60, f88);
                else 
                    v1 = f98;
                end;                                        
                if (v1 < 1) 
                    v2 = 1.0;
                else 
                    if (f98 >= power(fA0/f60, f88)) 
                        v3 = power(fA0/f60, f88);
                    else 
                        v3 = f98;
                    end;                
                    v2 = v3;
                end;
                
                f58 = v2;
                f70 = power(f90, sqrt(f58));
    
                if (f28 > 0) 
                    f18 = f8;
                else 
                    f18 = f8 - f28 * f70;
                end;
            
                if (f48 < 0) 
                    f38 = f8;
                else 
                    f38 = f8 - f48 * f70;
                end;
            end;
        end;    
        if (fF8 > 30) 
            f30 = power(f50, f58);
            fC0 = (1 - f30) * Series(1+bar,1) + f30 * fC0;
            fC8 = ( Series(1+bar,1) - fC0) * (1 - f50) + f50 * fC8;
            fD0 = f10 * fC8 + fC0;
            f20 = f30 * -2;
            f40 = f30 * f30;
            fB0 = f20 + f40 + 1;
            fA8 = (fD0 - fB8) * fB0 + f40 * fA8;
            fB8 = fB8 + fA8;
        end;
        Result(bar+1,1)=fB8;
    end;
end;
disp('End JJMA');

function ret1 = jfloor(value)
if (value == fix(value)) 
    ret1 = fix(value);
else
    if (value > 0) 
        ret1 = fix(value);
    else 
        ret1 = fix(value)-1;
    end;
end;

function ret1=jceil(value)
if (value == fix(value)) 
    ret1 = fix(value);
else
    if (value > 0) 
        ret1 = fix(value)+1;
    else 
        ret1 = fix(value);
    end;
end;
 

Anchorit

New member
Очень понравилась статья на эту тему М.Королюка "Будь в фазе" http://www.0-forex.ru/books/infaze.pdf
Статейка действительно знатная.

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

N приходится подбирать к сожалению, но иногда результат превосходит ожидания :).
 

Jaguar

New member
Кстати, как вариант в качестве критерия выбора стратегии можно использовать оптимальное f за N последних сделок.
N приходится подбирать к сожалению, но иногда результат превосходит ожидания :).
А ты прям по оптимальному Ф торгуешь? Там ведь обычно очень офигенный сайз получается. Умом понятно, что он хорош, но очо-то играет всё-таки :)
 

Anchorit

New member
А ты прям по оптимальному Ф торгуешь? Там ведь обычно очень офигенный сайз получается.
Нет, по нему я только стратегию определяю которая лучше всего работает. Методом проб и ошибок получилось что так что для моих стратегий лучшие результаты получаются.

А так конечно - на той же мамбе плечей столько не дадут, чтобы по оптимальному Ф торговать.

И вообще, зачем ум, если есть работающая система? Это лишний фильтр :)
 

HiTrader

New member
Вопрос системщикам. Учитываете ли вы проскальзывание при тестировании МТС и каким образом?
Приведу пример на ГП. Система пробития локальных экстремумов.
Вход в позу осуществляется лимитными стоп-приказами. Цена срабатывания стопа отличается от цены входа на 10 копеек или 0,1 руб.
Например, текущая цена - 170 руб, проскальзывание соответственно будет - 0,1/170 * 100% = 0,06%.
Прибавляем комиссию брокера 0,04% и комиссию биржи 0,01%. В итоге затраты на сделку составляют 0,11%. Эту итоговую цифру забиваю в амиброкер и тестирую.
Величину проскальзывания в 10 копеек я взял специально завышенной, с запасом. На практике в большинстве случаев получалось входить и на меньшем проскальзывании. Сначала использовал его в 5 копеек, затем остановился на 7.
Приведу результаты внутридневной трендследящей МТС с различным проскальзыванием. Период 21.08.2007 - 31.12.2009. ТФ - 5М.

slippage = 0,05/170 * 100% = 0,03%
expenses = 0,04+0,01+0,03 = 0,08%
Profit = 487,28%
MDD = -20,72%
CAR/MDD = 5.37
winners = 447 (43,48%)
losers = 581 (56,52%)

slippage = 0,06/170 * 100% = 0,035%
expenses = 0,04+0,01+0,035 = 0,085%
Profit = 430,31%
MDD = -22,49%
CAR/MDD = 4.55
winners = 444 (43,19%)
losers = 584 (56,81%)

slippage = 0,07/170 * 100% = 0,041%
expenses = 0,04+0,01+0,041 = 0,091%
Profit = 368,95%
MDD = -24,59%
CAR/MDD = 3.74
winners = 440 (42,80%)
losers = 588 (57,20%)
.....
.....

slippage = 0,10/170 * 100% = 0,06%
expenses = 0,04+0,01+0,06 = 0,11%
Profit = 217,61%
MDD = -30,90%
CAR/MDD = 2.04
winners = 427 (41,54%)
losers = 601 (58,46%)

Из результатов видно как проскальзывание съедает прибыль. Теперь вопросы. Как можно бороться с проскальзыванием? Выставлять всегда лимитированные стоп-приказы с определенным проскальзыванием, например в 7 копеек? Или кидать рыночные заявки? Или поставить его с запасом и довольствоваться скромными результатами тестирования, ведь проскальзывание может быть и в мою пользу? Хочу попробывать и потестировать еще такой метод, без проскальзывания на вход - при пробитии хая предыдущей свечи на 1 тик (1 копейку) кидаю заявку с определенной ценой - high+0,01, полагаясь на то, что цена в большинстве случаев заденет эту цену, если цена безвозвратно рванет вверх, то пропускаем сделку. Что думаете по этому поводу и вообще хочу услышать ваши мнения насчет проскальзывания.
 

Tim

New member
Я бы выяснил в реале в какие периоды внутри дня получается 10 пунктов, а в какие меньше.
Система интрадейная или позиции переносятся?

Если определятся временные промежутки, когда нужны именно 10 пунктов, то в остальное время я бы ставил 7 пунктов.

Просто увеличение MDD в 1,5 раза, а снижение прибыли в 2,5 раза при 10 пунктах как-то совсем не прельщает.
Может проверишь 8 и 9 пунктов?
 

DQ_Still

New member
Вопрос системщикам. Учитываете ли вы проскальзывание при тестировании МТС и каким образом?
...
в расчетах принимаю проскальзывание на операцию 0.2% (на сделку 0.4) - это собственно проскальзывание и комиссия брокера в одном флаконе. Просто вычитаю этот процент из результата сделки.
 
Your email address will not be publicly visible. We will only use it to contact you to confirm your post.
Сверху