Здравствуйте, гость ( Вход | Регистрация )

> Определение тренда, Определяем тренд по эксперту ProtoType-IX
leonid553
сообщение 6.10.2007, 12:21
Сообщение #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
сообщение 7.10.2007, 16:21
Сообщение #2





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Продолжаем....

Код
// ================   начинаем поиск пичков-донышков
   while(!SearchCompleted && curPos<Bars)
      {
      if (iWPR(StringSymbol,PeiodMinute,PeriodWPR,curPos)>=-CriteriaWPR && LastPeak<0)
         {
         FindUp=false;
         LastPeak=curPos;
         curPos++;
         continue;
         }
        
      if (iWPR(StringSymbol,PeiodMinute,PeriodWPR,curPos)<=CriteriaWPR-100 && LastPeak<0)
         {
         FindDown=false;
         LastPeak=curPos;
         curPos++;
         continue;
         }
        
      if (iWPR(StringSymbol,PeiodMinute,PeriodWPR,curPos)>=-CriteriaWPR && FindUp)
         {//искали верхушку и нашли
         newPos=curPos;
         while(iWPR(StringSymbol,PeiodMinute,PeriodWPR,curPos)>CriteriaWPR-100 && curPos<Bars)
            {// теперь нужно найти донышко, чтобы между ними найти точный пичок
            curPos++;
            }
         if (LastUpPos==0)
            {
            LastUpPos=Highest(StringSymbol,PeiodMinute,MODE_HIGH,curPos-LastPeak,LastPeak);  
            LastPeak=LastUpPos;
            }
         else
            {
            PreLastUpPos=Highest(StringSymbol,PeiodMinute,MODE_HIGH,curPos-LastPeak,LastPeak);
            LastPeak=PreLastUpPos;
            }
         curPos=newPos;
         FindUp=false;
         FindDown=true;
         curPos++;
         continue;
         }//==============

      if (iWPR(StringSymbol,PeiodMinute,PeriodWPR,curPos)<=CriteriaWPR-100 && FindDown)
         {
         newPos=curPos;
         while(iWPR(StringSymbol,PeiodMinute,PeriodWPR,curPos)<-CriteriaWPR && curPos<Bars)
            {
            curPos++;
            }
         if (LastDownPos==0)
            {
            LastDownPos=Lowest(StringSymbol,PeiodMinute,MODE_LOW,curPos-LastPeak,LastPeak);
            LastPeak=LastDownPos;
            }  
         else
            {
            PreLastDownPos=Lowest(StringSymbol,PeiodMinute,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[SymbolNumber,period_counter]=LastUpPos;  
   PreLastUpArray[SymbolNumber,period_counter]=PreLastUpPos;  
   LastDownArray[SymbolNumber,period_counter]=LastDownPos;  
   PreLastDownArray[SymbolNumber,period_counter]=PreLastDownPos;  
   if (High[LastUpPos]-High[PreLastUpPos]>=kATR*iATR(StringSymbol,PeiodMinute,ATRPeriod,LastUpPos)&&Low[LastDownPos]>Low[PreLastDownPos]) res=1;    
   if (Low[PreLastDownPos]-Low[LastDownPos]>=kATR*iATR(StringSymbol,PeiodMinute,ATRPeriod,LastDownPos)&&High[PreLastUpPos]>High[LastUpPos]) res=-1;    

   return(res);
  }


Действительно, этот алгоритм определяет наличие "пичков и донышек", перебирая последовательно бары с нулевого. Причем, ищет экстремумы в "зонах перекупленности/перепроданности", согласно показаниям индикатора WPR. Тут всё понятно...
А также, задействует, неким образом, значения индикатора ATR с периодом=40 (по умолч) и коэффициент kATR=0.5; Каким образом?, - пока не стал вникать.
Итак, мы нашли два "пичка" и два "донышка" ...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Moriarty
сообщение 7.10.2007, 17:54
Сообщение #3





Группа: Активный участник
Сообщений: 19
Регистрация: 27.9.2007
Пользователь №: 1 488
Спасибо сказали: 0 раз(а)



Цитата(leonid553 @ 7.10.2007, 20:21) *

Продолжаем....
Действительно, этот алгоритм определяет наличие "пичков и донышек", перебирая последовательно бары с нулевого. Причем, ищет экстремумы в "зонах перекупленности/перепроданности", согласно показаниям индикатора WPR. Тут всё понятно...
А также, задействует, неким образом, значения индикатора ATR с периодом=40 (по умолч) и коэффициент kATR=0.5; Каким образом?, - пока не стал вникать.
Итак, мы нашли два "пичка" и два "донышка" ...

Имхо всё черезчур усложнено. Все три последних функции можно описать всего лишь в нескольких строках.
У Роша сделаны универсальные функции, нам же они не нужны. Да и с самого начала можно
70% кода убрать, а то опять будем тестить экспов сутками. Может я конечно и ошибаюсь, но попробую
сейчас по быстрому написать код, определяющий пики/донышки по Т3 сглаженому ВПРу.
А вообще, думаю не совсем правильно использовать ВПР для определения тренда. Есть масса других,
менее затратных и более точных определений тренда...

P.S. Сейчас попробую написать определение Hi/Low ВПРа.

Цитата(leonid553 @ 7.10.2007, 21:02) *

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

P.S. Кстати, а зачем использовать чужой код (и пытаться понять его), если можно написать свой,
ничуть не хуже и полностью понимаемый ???

Сообщение отредактировал Moriarty - 7.10.2007, 17:57
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
leonid553   Определение тренда   6.10.2007, 12:21
leonid553   Прежде всего (как я уже говорил), возьмем простейш...   6.10.2007, 12:54
leonid553   С внешними параметрами и глобальными переменными м...   6.10.2007, 13:27
leonid553   Далее вне функции int start() вставляем начало фун...   6.10.2007, 18:40
Dimi   Привет! Эта переменная походу нигде не участву...   7.10.2007, 13:57
leonid553   Да действительно! Эта переменная не задействов...   7.10.2007, 14:49
leonid553   Начинаем вникать в определение тренда по индикатор...   7.10.2007, 15:29
leonid553   Продолжаем.... // ================ начинаем пои...   7.10.2007, 16:21
Moriarty   Продолжаем.... Действительно, этот алгоритм опред...   7.10.2007, 17:54
leonid553   Имхо всё черезчур усложнено. Все три последних фу...   8.10.2007, 19:19
leonid553   Далее, - отображаем найденные экстремумы на график...   7.10.2007, 17:02
leonid553   Здесь немного остановимся! Вот сейчас обнаружи...   7.10.2007, 17:58
Moriarty   Хитрый Rosh вызывает его в эксперте, как "NR...   7.10.2007, 18:07
Moriarty   Вот что у меня получилось с определением пиков/дон...   8.10.2007, 12:40
leonid553   А у Роша действительно много лишнего. Например, и...   8.10.2007, 19:33
Moriarty   Вот сейчас наблюдаю за Вашим, Moriarty, индикаторо...   9.10.2007, 21:43
leonid553   В визуальном режиме видно, что советник ProtoType...   9.10.2007, 11:59
leonid553   Ок! Вот ещё идея подошла! По граалям... Из...   10.10.2007, 6:15
Dm_35   Привет. Очень интересная тема. Чуть переделал код,...   27.10.2007, 12:22
Dimi   Привет. Очень интересная тема. Чуть переделал код...   28.10.2007, 13:55
Dm_35   Привет. В советник надо скопировать этот индикатор...   28.10.2007, 17:37
Dimi   Если я правильно понимаю код, то на каждом ТФ ищут...   28.10.2007, 19:16
Dm_35   Привет. Если поставить индикатор на М15 а потом по...   28.10.2007, 23:27
leonid553   Привет. Если поставить индикатор на М15 а потом п...   29.10.2007, 17:16
leonid553   Всем привет! У меня вот проблемы с инетом. Про...   29.10.2007, 11:02
Dm_35   Привет. Я на пред. станице выложил свою версию Ваш...   29.10.2007, 11:55
Dm_35   Привет. Это Вам спасибо за огромную работу, у меня...   29.10.2007, 23:29
Plastик   double vol_long= (iClose(NULL,0,1)- iOpen(NULL,0,1...   2.11.2007, 13:50
leonid553   Умножение как раз необходимо! Вот смотри : Что...   2.11.2007, 14:14
Plastик   Умножение как раз необходимо! Вот смотри : Чт...   2.11.2007, 14:14
leonid553   Понял. Тогда надо определиться с моментом входа. ...   2.11.2007, 14:54
Plastик   Понял. Тогда надо определиться с моментом входа. ...   2.11.2007, 19:07
leonid553   Вот вроде - то что надо. Но коэф.=10000 пока остав...   2.11.2007, 17:36
leonid553   Похоже ещё надо добавить "блокировку". Ч...   2.11.2007, 18:04
Plastик   А вот еще вариантец 2007.11.02 22:24:45 TestGenera...   2.11.2007, 19:26
leonid553   А вот еще вариантец 2007.11.02 22:24:45 TestGener...   2.11.2007, 19:55
leonid553   Ты, похоже, сам запутался! Как же я могу счита...   2.11.2007, 19:32
Plastик   Ты, похоже, сам запутался! Как же я могу счит...   2.11.2007, 22:21
leonid553   У тебя, видимо, нет котировок с разных тф на истор...   2.11.2007, 20:20
Plastик   У тебя, видимо, нет котировок с разных тф на исто...   2.11.2007, 22:55
Plastик   Символ GBPUSD (Great Britan vs US Dollar) Период ...   3.11.2007, 11:06
leonid553   Такой результат не проходит! "Ошибки рас...   3.11.2007, 15:59
leonid553   Поймать тренд .... :) B)   18.11.2007, 22:14
Dimi   Привет всем! Тут вот интересный скрипт, не пом...   24.11.2007, 16:02
Dimi   Вот мое первое творение, если можно так сказать ;...   2.12.2007, 11:32
Dimi   Привет, всем!!! Вот индикатор для МТ4 ...   6.12.2007, 18:55


Ответить в эту темуОткрыть новую тему

 



- Текстовая версия Сейчас: 13.3.2025, 14:17