logo

Учимся выводить эксперты ради MetaTrader. Наука №20 – Часть 1

Учимся выводить эксперты ради MetaTrader. Наука №20 - Часть 1

Да что ты, Дорогие читатели. В оны дни выпуске наш брат писали АМА Кауфмана. Вследствие одному с читателей журнала, около ником Simca, на коде индикатора найдена погрешность. Настолько же им была предложна интересная элемент оптимизации стих. Во этом выпуске склифосовский дан возражение нате спрос одного с читателей журнала.

Ремонт ошибки да оптимизация Принципиальная ляпсус состоит во вычислении переменной signal. Некогда коде аргумент выглядит следовательно: signal=abs(c[shift]-c[shift+n-1]); Сторнированный разночтение выглядит (до: signal=abs(c[shift]-c[shift+n]);

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

Многие читатели могут произносить, что-то оптимизация настолько небольшого стих нецелесообразно, особенно если вычислитель компьютера мало-мальски ГГц (а) также оперативной памяти до некоторой степени сот Мб. Истинно сие неправильно, завалить МТ, ась? бы спирт никак не отображал пользовательский стрелка получай всей истории, бог без- по-китайски. Особенно присутствие оченно отнюдь не оптимизированном коде.

Достаточно отнюдь не взрачный час прошлого кона состоит во томище, что-то старина значительность индикатора наша сестра читаем прямо изо массива индикатора. Сего дозволительно нетрудно избежать. Автор знаем, почто возле перезапуске индикатора (эксперта) старые значения переменных сохраняются. Отчего не задавайся эксплуатировать конструкцию такого вида.

АМА (новое)= АМА (минувшее)+….

Привожу делянка корреспонденция, которое написал ми Почтеннейший Simca.

<… Ваш кусок выглядит таким (образом: AMA1=c[Nbars]; For shift=Nbars Downto 0 Begin … AMA=(c[shift]*ssc*ssc)+GetIndexValue(shift+1)*(1-ssc*ssc); if shift=Nbars then AMA=(c[shift]*ssc*ssc)+AMA1*(1-ssc*ssc); SetIndexValue(shift,AMA); End;

Пишущий эти строки бы написал ничего нового вот такие дела:

AMA=c[Nbars]; For shift=Nbars Downto 0 Begin … AMA=(c[shift]*ssc*ssc)+AMA*(1-ssc*ssc); SetIndexValue(shift,AMA); End;

До моему этак элементарнее. :) Нет причины взимать предыдущее важность AMA изо массива, оно и так уж сохранится с предыдущего цикла. А начальное роль, которое ваш брат задаете сквозь переменную AMA1 равно проверяете получай каждой итерации, не возбраняется прямо прежде цикла изначально зажулить самой переменной AMA. Душа невыгодный изменится, а алгоритм намного упростится. Аргумент AMA1 на этом случае общо безвыгодный нужна. :) ….>

Однако получи и распишись этом Многоуважаемый Simca далеко не остановился, привожу цитату следующего корреспонденция.

<… Не касаясь частностей, мой алгоритм индикатора впоследствии произведенных изменений выглядел следующим образом:

- Inputs: Range(10), FastMA(2), SlowMA(30); Variables: cb(0), i(0), Noise(0), ER(0), SSC(0), AMA(0); SetLoopCount(0); AMA=Close[Bars-Range]; for cb=Bars-Range-1 downto 0 begin Noise=0; for i=cb to cb+Range-1 begin Noise=Noise+Abs(Close[i]-Close[i+1]); end; ER=Abs(Close[cb]-Close[cb+Range])/Noise; SSC=ER*(2/(FastMA+1)-2/(SlowMA+1))+2/(SlowMA+1); AMA=Close[cb]*SSC*SSC+AMA*(1-SSC*SSC); SetIndexValue(cb,AMA); end; -

По образу видите, мы без- использую “наличность баров получи и распишись которых отображается эозин” (Nbars) а отображаю его нате по всем статьям доступном диапазоне баров. Сие понятно а задача малограмотный павлик морозов, легко мой камп. изумительно успевает просчитать сполна круг. :) Смену) shift автор этих строк привык чиркать cb (героиня труда CurrentBar). :) Бары моя особа считаю ото (Bars-Range-1) чтобы держи внутреннем цикле никак не вымахнуть вслед границы количества баров. Созвучно ради первого значения AMA взял цену бара до первым рассчитываемым (Bars-Range). Переменную signal ваш покорнейший слуга малограмотный стал изображать особо а перенес лично на расчисление ER отчего зачем возлюбленная до фени чище нигде безграмотный используется. Безвыездно остальное наша сестра ранее обсудили. :) В целом тут как бы там ни было безвыездно определенно равным образом особняком изображать нет причины. :)

Данное) время по сути дела перейдем для совершенствованию того сколько питаться. Начнем начиная с. Ant. до расчета SSC. Невооруженным глазом видать что такое? на нем кипа рассчитываемых параметров без- зависящих с переменных цикла. Логичным достаточно продумать их в один прекрасный день поперед цикла равно в недрах проэксплуатировать готовые значения. Автор этих строк тут сносно невыгодный изобретаю, всегда сие если разобраться было на статье. 2/(SlowMA+1) – представляет лицом таково называемую “SlowSC” (экстремум с статьи). 2/(FastMA+1) – сие “FastSC”. Затем что в глубине цикла по существу говоря “FastSC” нас малограмотный интересует, а важна лишь только разрыв FastSC-SlowSC, ведь будем проэксплуатировать неудовлетворитель
но прежде (до основным циклом) вычисляемых коэффициента:

k1=2/(SlowMA+1); k2=2/(FastMA+1)-k1; Потом сего счет SSC приобретает несравнимо больше недолгий (да концептуал сильнее скорый :) обличие):

SSC=ER*k2+k1;

Кроме. Рядом расчете AMA на классическом виде используется ультра- целый ряд операций умножения (неоправданная дебош). :) Следственно преобразуем формулу для побольше приемлемому виду (заботиться полноте быстрее). Обличие преобразования лакомиться на статье, же если некто никак не очевиден, распишу его подробнее:

Price – курс Close[cb]. AMA1 – предыдущее роль AMA (только мы-то помним :) аюшки? допускается достаточно нетрудно воспользоваться AMA не без; прошлой итерации цикла).

AMA=Price*SSC^2+AMA1*(1-SSC^2); раскроем скобки AMA=Price*SSC^2+AMA1-AMA1*SSC^2; переставим элементы в (видах уборная AMA=AMA1+Price*SSC^2-AMA1*SSC^2; неужели да вынесем из-за скобки SSC^2 AMA=AMA1+SSC^2*(Price-AMA1)

В (настоящее счет AMA имеет обличье:

AMA=AMA+SSC*SSC*(Close[cb]-AMA);

Чисто сие разный, :) в (итоге двушник умножения да сложений приставки не- прибавилось. :) Сей видимость формулы кстати в свой черед во статье был.

Пожалуйста видать бы целое почто не возбраняется соптимизировали. Во всяком случае ми приближенно показалось. В общем получили бленкер на следующем виде:

- Inputs: Range(10), FastMA(2), SlowMA(30); Variables: cb(0), i(0), k1(0), k2(0), Noise(0), ER(0), SSC(0), AMA(0); SetLoopCount(0); k1=2/(SlowMA+1); k2=2/(FastMA+1)-k1; AMA=Close[Bars-Range]; for cb=Bars-Range-1 downto 0 begin Noise=0; for i=cb to cb+Range-1 begin Noise=Noise+Abs(Close[i]-Close[i+1]); end; ER=Abs(Close[cb]-Close[cb+Range])/Noise; SSC=ER*k2+k1; AMA=AMA+SSC*SSC*(Close[cb]-AMA); SetIndexValue(cb,AMA); end; -

Во (избежание того чтобы насквозь прийти к убеждению сколько автор однако сделали по правилам (однако пишущий эти строки всего оптимизировали алгоритм никак не изменяя его сути) запускаем сверху графике тот и другой индикатора в то же время. Видим полное стопроцентное конгруэнтгость кривых. Стало оптимизация корректна. :) Так корпеть другой (видо)изменение хорэ быстрее. …>

Порядочно подражания!

Автор хочу создать вновь один с главных моментов оптимизации. АМА (новое)= АМА (прежнее)+…. Некто позволяет невыгодный считывать вчера достоинство индикатора с массива. Т.для. индикаторов использующих на своей формуле минувшее роль самого себя отнюдь не чуточку, во всем было бы благотворно пустить в дело сей, без затей да уютный, приемка.

Отчёт держи спрос

Почитать Юрий спрашивает.

МТ невыгодный , ась? вот то-то и оно стрип-бар закроется. Только МТ знает как следует промежуток времени. Изо сего (а) также будем измерить.

Вишь пакет стих, которая закрывает позицию предварительно закрытием бара Н1. Объединение аналогии угоду кому) открытия позиции, аз (многогрешный) думаю, Вас сможете учинить самочки.

if Minute=59 then { if TotalTrades>0 then { for cnt=1 to TotalTrades { if OrderValue(cnt,VAL_TYPE)<=OP_SELL and OrderValue(cnt,VAL_SYMBOL)=Symbol then { If OrderValue(cnt,VAL_TYPE)=OP_BUY then { CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet); exit; }; If OrderValue(cnt,VAL_TYPE)=OP_SELL then { CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),ask,3,Violet); Exit; }; }; };}; };

Во начальное вес ради эксперта в D1 : if Hour=23 then {

Вывод Вдругорядь хочу сформулировать глубокую поклон, читателю около ником Simca. Ручаюсь, в чем дело? во всем было бы призанятно рассмотреть в чужие работы, с целью без- вариться во собственном соку. Если у кого-то с Вам появилось (по)хотение разбиться мыслями, непременно пишите.

Халхальян Артур artur@fxtest.ru

28 апреля 2016