БИРЖА ИДЕЙ - страница 9

 
FION:
Эксперты могут работать одновременно - каждый со своим магиком, при этом распознавание состояния рынка и соответственно перенастройка должна быть в каждом эксперте, если это условие не выполнить, то при смене состояния рынка неизбежны потери , ведь цели и соответственно стопы должны быть различны во флете и тренде. К тому же надо учитывать промежуточные состояния - малый флет, или "сползание" при низкой активности. В принципе савокупность прибыльных экспертов должна показывать лучшие результаты, за счет локирования убыточных позиций экспертов.

Практически у каждого есть своя реализация. Но у многих нет работы над ошибками. У меня точно нетю Я просто стараюсь, что бы их не было. Если делать что-то стандартное, то это надо предусматривать. Я бы еще к магигу добавил симбол(), Хотя это может быть и лишним. Теоретически ордер с одним тикетом не может повторяться , хотя все может быть.
 

Да, конечно. Именно так я и сделал в коде. Во внешних параметрах ещё задаем Magic _n, и каждая версия со своим магиком будет работать по своему алгоритму.

 

По определению тренда. В советнике ProtoType-IV приведен пример для мультивалютного эксперта по определению тренда по четырем последним экстремумам. Я скрупулезно вник и "с грехом пополам" выделил этот кусочек кода и теперь его можно вставить в любой эксперт. При необходимисти. Если задать во внешних параметрах

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 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);
  }

На графике в углу отображается функция=0,, или =1, или=-1

 
На мой взгляд , определять тренд удобней по линейной регрессии, отлично подходит скриптик линейной регрессии из стандартного комплекта МТ-4, хотелось бы на его базе сделать индикатор , может кто-нибудь знает где взять исходник? Все известные реализации  плохо работают в динамике изменения цен. А нужен канал  задаваемой длины от 1 до N бара с пересчетом при появлении нового бара и возможностью вывода в буфер его ширины в пипсах и наклона в пипсах на длину. И такой же канал стандартного отклонения с задаваемой девиацией было бы неплохо сделать.  Можно начать крапать с "нуля " , но если у кого-нибудь есть исходник от МТ было бы намного проще.
 

Я, впрочем, код выложил не только для определения тренда. Другая идея вот подошла...(чуть позже изложу)

А индикатор мож вот этот для начала подойдет:

На графике iPeriod=20, MASoot=20

Я не вникал в его работу. Но в визуальном режиме оч. хор видно, - как он отрабатывает...

Файлы:
 
Спасибо Леонид , но он некорректно работает при разворотах, я давно его опробовал.  Вот хороший индикатор, но он работает по хау -лоу, идея та-же но на основе линейной регрессии.
Файлы:
 
FION:
На мой взгляд , определять тренд удобней по линейной регрессии, отлично подходит скриптик линейной регрессии из стандартного комплекта МТ-4, хотелось бы на его базе сделать индикатор , может кто-нибудь знает где взять исходник? Все известные реализации плохо работают в динамике изменения цен. А нужен канал задаваемой длины от 1 до N бара с пересчетом при появлении нового бара и возможностью вывода в буфер его ширины в пипсах и наклона в пипсах на длину. И такой же канал стандартного отклонения с задаваемой девиацией было бы неплохо сделать. Можно начать крапать с "нуля " , но если у кого-нибудь есть исходник от МТ было бы намного проще.


Я его уже где-то выкладывал. Могу новую версию выложить. Одна ошибка исправлена.

А вот и итндикатор.

На экран выводится количество баров.Выводится 3 сигмы. И если цена находится внутри одно СКО, то перерасчета не прноизводится, так как все в допустимых пределах. При пробитии, будет перерасчет.

Файлы:
 

Vinin , Ваш канал очень приличный и корректно настраивается. Спасибо. Поделюсь одной задумкой насчет фильтра для флета. Все мы помним ув. Решетова с его перцептронами. В принципе перцептрон - это линейный фильтр. Хочу попытаться отфильтровать флет перцептроном. Подать на вход ширину и наклон 2 каналов линейной регрессии разной длины , ширину Болинжера и скорость изменения цены. Вот думаю что взять за критерий оптимизации. Возможно отбойку от границ Болинжера внутрь - с целью 75 проц. ширины.

 
FION:

Vinin , Ваш канал очень приличный и корректно настраивается. Спасибо. Поделюсь одной задумкой насчет фильтра для флета. Все мы помним ув. Решетова с его перцептронами. В принципе перцептрон - это линейный фильтр. Хочу попытаться отфильтровать флет перцептроном. Подать на вход ширину и наклон 2 каналов линейной регрессии разной длины , ширину Болинжера и скорость изменения цены. Вот думаю что взять за критерий оптимизации. Возможно отбойку от границ Болинжера внутрь - с целью 75 проц. ширины.


Решетовский перцептрон не подойдет. Надо слой Кохонена делать хотя бы из 4-5 неройронов. Но проблема будет только одна - все значения должны быть одного порядка.
 
Хочу новую тему создать, Нейронный анализ свечей. Выложу все свои наработки, Одному с задачей не справиться. Тем более большую часть ошибок (своих) я уже знаю.