![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
leonid553 |
![]()
Сообщение
#1
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
В мультивалютном советнике Rosh-a "ProtoType-IX" приведен пример определения тренда по четырем последним экстремумам. http://codebase.mql4.com/ru/1256
В аннотации указано: "Данный советник торговал без алгоритмических ошибок на чемпионате по автотрейдингу 2006 года. Требует для работы индикатор NRTR GATOR. Может являться примером мультивалютного эксперта и, надеюсь, облегчит написание такового новичкам в MQL4." Похоже пришла пора разобраться с ТРЕНДОМ, - как это делается. Хотя бы "методом тыка". Для примера можно взять любой простейший эксперт и использовать приемы определения тренда из советника "ProtoType-IX". (см. пост №2) Возьмем оттуда всё, что касается тренда и вставим в любой простейший советник. В результате получим: Function "GetSymbolString" is not referenced and will be removed from exp-file Function "PeriodNumber" is not referenced and will be removed from exp-file Function "TrendByWPR" is not referenced and will be removed from exp-file Function "SetArrow" is not referenced and will be removed from exp-file Function "SetUpArrows" is not referenced and will be removed from exp-file Function "TrendExist" is not referenced and will be removed from exp-file Мы получили шесть функций, которые вычисляются, но пока не принимают участия в торговле нашего эксперта. Поскольку, наш эксперт пусть будет НЕ МУЛЬТИВАЛЮТНЫЙ, то первая функция нам неинтересна. Вторая функция, - пожалуй, тоже, т.к. она задает таймфрейм. Но оставим пока всё как есть. Начнем с самого начала. Во внешних нашего эксперта параметрах мы добавляем: Код extern int PeriodWPR=8; extern double CriteriaWPR=25; extern int ATRPeriod=40;// период ATR для индикатора extern double kATR=0.5; extern int ZeroBar=8; // выход в безубыток через ZeroBar баров extern double MinTargetinSpread=5.0; extern double TP_SL_Criteria=2.0; extern int MaxOpenedOrders=3; extern double MaxOrderSize=5.0; Понятно что пока чего-то не хватает а что-то будет лишним. Надеюсь разберемся... Далее (после внешних параметров) задаем по аналогии глобальные переменные: Код int LastUpArray[13,7]; int PreLastUpArray[13,7]; int LastDownArray[13,7]; int PreLastDownArray[13,7]; double Complextrend[13,7];// собираем все тренды (Z,A и N тренды) в одно значение. double TPvsSL[13,7];// отношение TakeProfit к StopLoss на данном символе и таймфрейме int BestTPvsSLSymbol[20]; // лучшие символы по соотношению TP/SL int BestTPvsSLPeriod[20]; // лучшие таймфреймы по соотношению TP/SL //-------------------------------------------- string SymbolsArray[13]={"","USDCHF","GBPUSD","EURUSD","USDJPY","AUDUSD", "USDCAD","EURGBP","EURAUD","EURCHF","EURJPY","GBPJPY","GBPCHF"}; int TrendOnSymbol[13,7]; // тренд по символу и таймфрейму int MyBarsArrays[13,7];// храним количество баров по инструменту и таймфрейму int TimeNullArrays[13,7];// храним время Time[0] по инструменту и таймфрейму Не будем пока особо вникать. Посмотрим дальше... |
![]() ![]() |
leonid553 |
![]()
Сообщение
#2
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Всем привет! У меня вот проблемы с инетом. Провайдер задним числом поднял тарифы в неск (!) раз без предупреждения. И соотв. счет прислал заоблачный! Меняю сейчас оператора. И редко (окольными путями) захожу в инет.
На MQL я выкладывал "кастрированный" вариант определителя тренда. ВОТ ОН: вставляем во внеш. параметры глобальные переменные //----------------------------------------------------- extern int PeriodWPR=8; extern double CriteriaWPR=25; extern int ATRPeriod=40;// период ATR для индикатора extern double kATR=0.5; //------------------------------------- int LastUpArray[13,7]; int PreLastUpArray[13,7]; int LastDownArray[13,7]; int PreLastDownArray[13,7]; Код ------------------------------------------------------------------------------------------- Далее вне функции int start() вставляем функцию //| определение тренда по четырем последним экстремумам | //+------------------------------------------------------------------+ int TrendByWPR() { //---- int res=0; int curPos,LastUpPos,PreLastUpPos,LastDownPos,PreLastDownPos,LastPeak,newPos; bool FindUp=true,FindDown=true,SearchCompleted=false; double CurWPR=iWPR(NULL,0,PeriodWPR,0); //---- //======= определим - где мы находимся в данный момент if (CurWPR<=CriteriaWPR-100) { FindDown=false; LastPeak=0; } if (CurWPR>=-CriteriaWPR) { FindUp=false; LastPeak=0; } // ================ начианем поиск пичков-донышков while(!SearchCompleted && curPos<Bars) { if (iWPR(NULL,0,PeriodWPR,curPos)>=-CriteriaWPR && LastPeak<0) { FindUp=false; LastPeak=curPos; curPos++; continue; } if (iWPR(NULL,0,PeriodWPR,curPos)<=CriteriaWPR-100 && LastPeak<0) { FindDown=false; LastPeak=curPos; curPos++; continue; } if (iWPR(NULL,0,PeriodWPR,curPos)>=-CriteriaWPR && FindUp) {//искали верхушку и нашли newPos=curPos; while(iWPR(NULL,0,PeriodWPR,curPos)>CriteriaWPR-100 && curPos<Bars) {// теперь нужно найти донышко, чтобы между ними найти точный пичок curPos++; } if (LastUpPos==0) { LastUpPos=Highest(NULL,0,MODE_HIGH,curPos-LastPeak,LastPeak); LastPeak=LastUpPos; } else { PreLastUpPos=Highest(NULL,0,MODE_HIGH,curPos-LastPeak,LastPeak); LastPeak=PreLastUpPos; } curPos=newPos; FindUp=false; FindDown=true; curPos++; continue; }//============== if (iWPR(NULL,0,PeriodWPR,curPos)<=CriteriaWPR-100 && FindDown) { newPos=curPos; while(iWPR(NULL,0,PeriodWPR,curPos)<-CriteriaWPR && curPos<Bars) { curPos++; } if (LastDownPos==0) { LastDownPos=Lowest(NULL,0,MODE_LOW,curPos-LastPeak,LastPeak); LastPeak=LastDownPos; } else { PreLastDownPos=Lowest(NULL,0,MODE_LOW,curPos-LastPeak,LastPeak); LastPeak=PreLastDownPos; } curPos=newPos; FindDown=false; FindUp=true; curPos++; continue; } if (PreLastDownPos!=0 && PreLastUpPos!=0) SearchCompleted=true; curPos++; } /* if (Symbol()==StringSymbol && Period()==PeiodMinute) { Comment("LastUpPos=",LastUpPos," PreLastUpPos",PreLastUpPos," LastDownPos=",LastDownPos," PreLastDownPos=",PreLastDownPos, " Время ",TimeToStr(CurTime())); SetUpArrows(LastUpPos,PreLastUpPos,LastDownPos,PreLastDownPos);*/ LastUpArray[NULL,0] =LastUpPos; PreLastUpArray[NULL,0]=PreLastUpPos; LastDownArray[NULL,0]=LastDownPos; PreLastDownArray[NULL,0]=PreLastDownPos; if (High[LastUpPos]-High[PreLastUpPos]>=kATR*iATR(NULL,0,ATRPeriod,LastUpPos) &&Low[LastDownPos]>Low[PreLastDownPos]) res=1; if (Low[PreLastDownPos]-Low[LastDownPos]>=kATR*iATR(NULL,0,ATRPeriod,LastDownPos) &&High[PreLastUpPos]>High[LastUpPos]) res=-1; return(res); } ----------------------------------------------------------------------------------- Чтобы в углу на графике отображалась функция нужно внутри int start() вставить - Comment (TrendByWPR()); Тогда : TrendByWPR()=0 - нет тренда TrendByWPR()=1 -up-тренд TrendByWPR()=-1 - down-тренд Это всё расчитывается по одному тф, - на кот. мы ставим советник. Но если взять "не кастрированный" кусочек кода (с массивами), - то он расчитывает функцию сразу по нескольким тф и выдается суммарный вариант и отображается на графике в углу- по каждому тф ! Да и ещё отображает стрелками последние экстремумы. Эскизы прикрепленных изображений |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 13.3.2025, 13:44 |