Ефективни алгоритми за осредняване с минимален лаг и използването им в индикатори и експертни съветници
В механичните системи за търговия, изградени на базата на индикатори, които се основават на всякакви усредняващи алгоритми, техните създатели рядко използват повече от един осредняващ алгоритъм. В много случаи, ако алгоритъмът на експертния съветник е изграден на базата на обикновени движения и индикатори, включени в стандартния набор от индикатори на терминала MetaTrader 4, въпросът се ограничава до четири стандартни алгоритъма: прост, експоненциален, изгладен и линейно претеглено осредняване. Този подход силно ограничава възможностите на експерта.
Една и съща система за търговия, използваща различни алгоритми за осредняване, може да покаже много впечатляващи разлики в ефективността на търговията. Освен това никога не е възможно да се каже предварително кой от наличните алгоритми за осредняване ще осигури максимална доходност на системата за търговия. Така че би било много по-разумно да се изгради код с възможност за използване на абсолютно различни алгоритми за осредняване в него, чийто избор може да се направи чрез промяна на стойностите на външните променливи на експерта. В крайна сметка при този подход се свежда до замяна на индикаторите, използвани от експертния съветник, с такива, написани независимо с по-гъвкави настройки за избор на алгоритми за осредняване. Следователно този подход може да бъде разделен на три етапа:
1. Работният код на експертния съветник е написан на базата на стандартните мувинги и индикатори, включени в набора от технически индикатори на клиентския терминал MetaTrader 4. 2. Персонализираните индикатори са написани според описанията на стандартните индикатори с възможност за използване на по-гъвкава замяна на алгоритми за изглаждане. 3. Извикванията към технически индикатори се заменят с извиквания към тези потребителски индикатори с изтегляне на външните променливи на тези индикатори във външниекспертни променливи.
В тази статия бих искал да засегна темата за писане на по-универсални индикатори с възможност (ако мога така да се изразя) за гореща смяна на алгоритмите за осредняване, използвани в тези индикатори. Статията е продължение на статията „Ефективни алгоритми за осредняване на минимален лаг и тяхното използване в индикатори“, така че преди да започне да я изучава, читателят трябва внимателно да прочете предишната статия от тази серия.
Универсална усредняваща функция
В предишната си статия запознах читателите с пет функции за осредняване. За да бъде наборът по-пълен, тези функции също трябва да бъдат допълнени с MASeries() с класически усредняващи алгоритми, което ще направя сега:
Сега, въз основа на тези шест функции, можем да изградим универсална функция за осредняване, която нарекох SmoothXSeries() и поставих във файла SmoothXSeries.mqh. Подобно на предишните функции, тази функция е декларирана с директивата #include:
По отношение на външните променливи, тази функция е подобна на функцията JJMASeries(), но има нова променлива за идентификатор на алгоритъма за усредняване SmoothMode:
Чрез промяна на стойността на този параметър SmoothMode от нула до осем се постига изборът на необходимия алгоритъм за осредняване:
Съвсем естествено е променливите din и Phase да се използват само за онези алгоритми за осредняване, за които са били първоначално дефинирани. Преди да използвате тази функция в кода на индикатора, трябва да инициализирате променливите на тази функция и да разпределите памет за тях. За да направите това, извикайте функцията SmoothXSeriesResize() в блока за инициализация на индикатора. Стойността на неговата външна променлива Size трябва да бъде броят на извикванията на функциятаSmoothXSeries() в кода на индикатора
Сега, разполагайки с универсален алгоритъм за осредняване SmoothXSeries(), можем да започнем да изграждаме кода на индикатора.
Универсално преместване
Всяко движение (от английското moving - движение) се получава чрез изглаждане на някои ценови таймсерии. В предишната си статия запознах читателите с функцията PriceSeries() за избор на стойностите на ценовите серии от времеви серии. Цялата задача за изграждане на движение се свежда до обработката на тези стойности на ценовата серия от функцията SmoothXSeries() и прехвърлянето им в индикаторния буфер. Ето внедряване на код:
В този индикатор алгоритъмът за осредняване се избира чрез промяна на стойността на променливата Smooth_Mode.
Универсално преместване с двойно осредняване
Ефективността на работа с такова движение може да бъде значително подобрена, ако полученият индикатор бъде допълнително изгладен с помощта на същата функция SmoothXSeries().
Разбира се, крайният индикатор ще има известно забавяне в сравнение с оригинала, но броят на фалшивите сигнали, получени от такава подвижна средна, ще бъде значително по-малък, което повече от компенсира това забавяне.
Полученият индикатор може да бъде значително подобрен чрез превръщане на непрекъснатия диапазон от стойности, които може да приеме, в квантован (дискретен). Това се прави с помощта на доста прост алгоритъм:
Променливата Step е цял външен параметър на индикатора, който определя стъпката на дискретизация за стойностите на получената подвижна средна в точки. Не е препоръчително да представяте целия код на този индикатор в текста на статията, читателят може да се запознае с него, като използва индикатора X2DigMa.mq4, приложен към статията.
Практически препоръки за оптимизиране на използването на експертни съветнициИндикатор X2DigMa.mq4
Това преместване има доста голям брой външни променливи и следователно всеки експертен съветник, направен въз основа на този индикатор, може да бъде доста добре адаптиран към всеки пазар. Въпреки това, формалната настройка на параметрите на EA далеч не е най-оптималният начин за неговото програмиране за по-нататъшна работа. Би било необходимо да се спрем малко повече на нюансите на работа с външни променливи на такава подвижна средна в експертен съветник. И така, да кажем, че имаме експертен съветник, в който всички външни променливи на X2DigMA.mq4 MA са направени външни променливи на експертния съветник.
Променливата Smooth_Mode1 приема стойност от нула до осем, но не трябва да оптимизирате стойността на тази променлива в стратегическия тестер с помощта на генетичен алгоритъм! Би било много по-добре да се направят осем независими оптимизации за всяка стойност на тази променлива. Стойността на подобна променлива за повторно изглаждане Smooth_Mode2 е по-добре да бъде фиксирана равна на нула. В този случай алгоритъмът за осредняване на JMA ще се използва като повторно изглаждане, което има най-малък лаг и като допълнително осредняване в много ситуации дава най-добри резултати.
Параметрите Phase1 и Phase2, които се използват само в средните стойности на JMA и T3, също трябва да бъдат фиксирани на стойност 100(100). Параметърът Length2 може да приема всякакви стойности, но в много ситуации и в напълно различни експертни съветници най-оптималните често се оказват същите стойности от сериите 3, 5, 7, 9, 11. Изброяването на тези стойности на параметъра Length2, като правило, е повече от достатъчно. Параметърът Step силно зависи от пазара, на който работи експертният съветник, и от периода на графиката, но често се стабилизира на същите стойности. Най-добрите стойности на параметритеInput_Price_Customs се оказват нула и девет. В резултат на това за задълбочено проучване има само един параметър Length1, чиито стойности могат да бъдат всякакви.
Универсална диаграма MACD
С помощта на функцията SmoothXSeries(), която предложих, можете да изградите всеки индикатор на класически технически анализ, например диаграмата MACD, която е графика от два индикатора. Първата е диаграма на разликата между две подвижни средни, а втората е подвижната средна на тази разлика.
Логиката на работа с такъв индикатор в експертен съветник е до голяма степен подобна на това, което написах по-горе, но само в тази ситуация би било много по-логично стойността на променливата Signal_Mode да бъде подложена на генетична оптимизация.
Заключение
Чрез извикване на функцията SmoothXSeries () можете да изградите почти всеки индикатор за технически анализ, чиито възможности често се оказват по-високи от тези на класическия му аналог. Разбира се, всичко това изисква известен опит в писането на индикатори, но резултатът все пак си заслужава усилията.