Рисование и использование паттернов- каналов, треугольников.Кто занимался, откликнитесь, есть проблемка.

 
Сотворил эксперта, который рисует треугольнички и каналы по регрессионному принципу, по типу OmniTrader . Считаю, что инструмент полезный и можно было бы включить прорисовку линий поддержки-сопротивления в стандартный набор инструментов. Но пока этого нет, не могу решить проблему, как нарисовать на одном графике такие линии из других тайм-фреймов. Пока решаю проблему , вычисляя для каждого тайм фрейма отдельно и передавая коэффициенты регрессии через глобальные переменные. Как бы это все на 1 графике сделать ?
 
Не копирует, блин
 
Не копирует, блин

Из какой программы вообще пытаетесь копировать?
И вставляйте код в тегах [ pre ], пожалуйста.
 
Перед копированием нужно переключиться на русскую раскладку,
тогда копирует.
 
А чего за файл
#include <Func_lib.mqh >

?
Положите плиз

 
Скопировалось.
Результат - построение линий трендов по последним фракталам (не более N ), укладывающимися на прямую с допуском Norm_kv.
Еще раз проблема: такой подход работает только по своему тайм-фрейму. Для получения коэфф по остальным тайм фреймам приходится открывать отдельное окошко и оттуда уже определять глобальные переменные, которые передаются в основной эксперт. Естественно, такую систему не протестируешь (когда будет тестер). Хотелось бы все вычисления сделать на 1 графике, т.е. заставить программку вытащить данные по нужным фреймам.


//+------------------------------------------------------------------+
//|                                                   Regression.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern int  N=29;
extern int Fr_begin=3;

int x[100];
double y[100];
double b,kh,y_,otkl,quant_PeaksUP;

int init()
  {
   return(0);
  }

int deinit()
  {
   return(0);
  }



int start()
{

  string TrendLine="TrendLine";
  int i=0,k=0;
  int quant_PeaksUP=0,quant_PeaksDN=0,h1=0,h2=0;
  double SumX=0,SumY=0,SumXY=0,SumX_sq=0,otkl=0;
  double i_F=0,dt=0,Norm_kv=0.05;
  double b=0,kh=0,volat7=0;
  double f=0,f1=0,f2=0,f3=0,f4=0,f5=0,f6=0;
  double m=0,Sygma_yx=0,Sygma_yx_=0,Sygma_x=0,qrt_dx=0,qrt_dy=0,x_midd=0,y_calc=0,dy=0,dy_max=0;
  double kl=0,bl=0,Bh=0,DN=0,UP=0,L1=0,L2=0;
  double b_=0,kh_=0,y_=0;
    double a1=0,a2=0,t1=0,t2=0;
  
  // Удаляем старые трендовые линии
  ObjectDelete("TrendLineLower");ObjectDelete("TrendLineUpper");
  //определяем размерность графика
  
  dt=Period();
// назначаем допустимое отклонение для каждого фрейма  
  if (dt==1)  Norm_kv=0.01;
  if (dt==5)  Norm_kv=0.03;
  if (dt==15)  Norm_kv=0.04;
  if (dt==30)  Norm_kv=0.05;
  if (dt==60)  Norm_kv=0.075;
  if (dt==240)Norm_kv=0.28;
  if (dt==1440)  Norm_kv=0.35;


// ПОСТРОЕНИЕ ЛИНИЙ ПО ВЕРХНИМ ФРАКТАЛАМ
  //обнуляем глобальные переменые 
  b=0;kh=0;GlobalVariableSet("B",b);GlobalVariableSet("Kh",kh);   
  for (i=1;i<=N;i++) {x[i]=0;y[i]=0;} 

  //Вычислим средний за 7 баров размах баров.
  volat7=0;
  for (i=1;i<=7;i++) volat7=volat7+(High[i]-Low[i]);
  volat7=volat7/7;

  //поищем фракталы вверх
  for (k=1;k<=N;k++) 
             {
               for (i=2+x[k-1];i<=10*N;i++)
                {
                   UP=iFractals(NULL,0,MODE_UPPER,i);
                   if(UP!=0)
                    {
                      x[k]=i;y[k]=High[i];break;
                    }  
                }
             }

//***************Для найденных фракталов , начиная с Fr_begin
  for (k=Fr_begin;k<=N;k++)
   {
     SumX=0;SumY=0;SumXY=0;SumX_sq=0;qrt_dx=0;qrt_dy=0;dy_max=0;
     for (i=1;i<=k;i++)
     {SumX=SumX+x[i];SumY=SumY+y[i];SumXY=SumXY+x[i]*y[i];SumX_sq=SumX_sq+x[i]*x[i];}
  
     //Находим коэффициенты уравнения регрессии для первых К фракталов
     b=(SumX_sq*SumY-SumX*SumXY)/(k*SumX_sq-SumX*SumX );
     kh=(k*SumXY-SumX*SumY)/(k*SumX_sq-SumX*SumX);
     //максимальное абсолютное отклонение для первых К фракталов
     dy_max=0;
     for (i=1;i<=k;i++)
     {y_calc=kh*x[i]+b; dy=y[i]-y_calc;if (MathAbs(dy)>dy_max)  dy_max=MathAbs(dy);}  
     // процент отклонения
     y_=SumY/k; otkl=dy_max*100/y_;

     // сравним отклонение с допустимым и остановимся в случае превышения,определив quant_Peaks
     if (otkl<Norm_kv) {GlobalVariableSet("B",b);GlobalVariableSet("Kh",kh);} 
     if (otkl>=Norm_kv) {quant_PeaksUP=k-1;break;} 
   }


  //считываем коэффициенты
  b=GlobalVariableGet("B"); kh=GlobalVariableGet("Kh");  
  //пересчитаем отклонение
  //максимальное абсолютное отклонение для первых К фракталов
  dy_max=0;SumY=0;
  if (quant_PeaksUP>2)
  {
  for (i=1;i<=quant_PeaksUP;i++)
     {
      SumY=SumY+y[i];y_calc=kh*x[i]+b;dy=y[i]-y_calc;
      if (MathAbs(dy)>dy_max) dy_max=MathAbs(dy);
      }  
  }    

  h2=x[quant_PeaksUP];
  h1=x[1];
  b=b+1.5*dy_max;

  if (quant_PeaksUP==2 && dt<=240) b=y[1];
  if (quant_PeaksUP==2 && dt<30) b=MathMax(y[1],y[2]);
  if (quant_PeaksUP==2 && dt>=30) b=y[1];
  if (kh*h2+b<kh*h1+b && quant_PeaksUP>2)  {kh=0;b=MathMin(b,y[1]);}
  
//ObjectCreate("TrendLineUpper",OBJ_TREND,0,Time[h2],kh*h2+b,Time[h1],kh*h1+b);

//***************************************Запишем в файлы коэффициенты
//Записываем: первая (слева) точка,вторая точка(последний фрактал вверх  ),
//время первой точки,время второй точки,
//текущее значение прямой

  if (dt==1) 
  {GlobalVariableSet("bh_1",b);
   GlobalVariableSet("kh1",kh*h1+b);
   GlobalVariableSet("bh1",kh*h2+b);
   GlobalVariableSet("t1h_1",Time[h1]);
   GlobalVariableSet("t2h_1",Time[h2]);
   ObjectCreate("TrendLineUpper",OBJ_TREND,0,Time[h2],kh*h2+b,Time[h1],kh*h1+b);
   }
   
   if (dt==5) 
   {GlobalVariableSet("bh_5",b);
   GlobalVariableSet("kh5",kh*h1+b);
   GlobalVariableSet("bh5",kh*h2+b);
   GlobalVariableSet("t1h_5",Time[h1]);
   GlobalVariableSet("t2h_5",Time[h2]);
   ObjectCreate("TrendLineUpper",OBJ_TREND,0,Time[h2],kh*h2+b,Time[h1],kh*h1+b);
   }
   
   if (dt==15) 
  {GlobalVariableSet("bh_15",b);
   GlobalVariableSet("kh15",kh*h1+b);
   GlobalVariableSet("bh15",kh*h2+b);
   GlobalVariableSet("t1h_15",Time[h1]);
   GlobalVariableSet("t2h_15",Time[h2]);
   ObjectCreate("TrendLineUpper",OBJ_TREND,0,Time[h2],kh*h2+b,Time[h1],kh*h1+b);
      }
   
   if (dt==30) 
  {GlobalVariableSet("bh_30",b);
   GlobalVariableSet("kh30",kh*h1+b);
   GlobalVariableSet("bh30",kh*h2+b);
   GlobalVariableSet("t1h_30",Time[h1]);
   GlobalVariableSet("t2h_30",Time[h2]);
   ObjectCreate("TrendLineUpper",OBJ_TREND,0,Time[h2],kh*h2+b,Time[h1],kh*h1+b);
   }
   
   if (dt==60) 
  {GlobalVariableSet("bh_60",b);
   GlobalVariableSet("kh60",kh*h1+b);
   GlobalVariableSet("bh60",kh*h2+b);
   GlobalVariableSet("t1h_60",Time[h1]);
   GlobalVariableSet("t2h_60",Time[h2]);
   ObjectCreate("TrendLineUpper",OBJ_TREND,0,Time[h2],kh*h2+b,Time[h1],kh*h1+b);
   }
   
   if (dt==240) 
  {GlobalVariableSet("bh_240",b);
   GlobalVariableSet("kh240",kh*h1+b);
   GlobalVariableSet("bh240",kh*h2+b);
   GlobalVariableSet("t1h_240",Time[h1]);
   GlobalVariableSet("t2h_240",Time[h2]);

ObjectCreate("TrendLineUpper",OBJ_TREND,0,Time[h2],kh*h2+b,Time[h1],kh*h1+b);
   }

if (dt==1440) 
{GlobalVariableSet("bh_1440",b);
   GlobalVariableSet("kh1440",kh*h1+b);
   GlobalVariableSet("bh1440",kh*h2+b);
   GlobalVariableSet("t1h_1440",Time[h1]);
   GlobalVariableSet("t2h_1440",Time[h2]);

ObjectCreate("TrendLineUpper",OBJ_TREND,0,Time[h2],kh*h2+b,Time[h1],kh*h1+b);
}   


// ПОСТРОЕНИЕ ЛИНИЙ ПО НИЖНИМ ФРАКТАЛАМ
  //обнуляем глобальные переменые 
  bl=0;kl=0;GlobalVariableSet("Bl",bl);GlobalVariableSet("Kl",kl);   
  for (i=1;i<=N;i++) {x[i]=0;y[i]=0;} 

  //поищем фракталы вниз
  for (k=1;k<=N;k++) 
             {
               for (i=2+x[k-1];i<=10*N;i++)
                {
                   DN=iFractals(NULL,0,MODE_LOWER,i);
                   if(DN!=0)
                    {
                      x[k]=i;y[k]=Low[i];break;
                    }  
                }
             }

//***************Для найденных фракталов , начиная с Fr_begin
  for (k=Fr_begin;k<=N;k++)
   {
     SumX=0;SumY=0;SumXY=0;SumX_sq=0;qrt_dx=0;qrt_dy=0;dy_max=0;
     for (i=1;i<=k;i++)
     {SumX=SumX+x[i];SumY=SumY+y[i];SumXY=SumXY+x[i]*y[i];SumX_sq=SumX_sq+x[i]*x[i];}
  
     //Находим коэффициенты уравнения регрессии для первых К фракталов
     bl=(SumX_sq*SumY-SumX*SumXY)/(k*SumX_sq-SumX*SumX );
     kl=(k*SumXY-SumX*SumY)/(k*SumX_sq-SumX*SumX);

     //максимальное абсолютное отклонение для первых К фракталов
     dy_max=0;
     for (i=1;i<=k;i++)
     {y_calc=kl*x[i]+bl; dy=y_calc-y[i];if (MathAbs(dy)>dy_max)  dy_max=MathAbs(dy);}  
     // процент отклонения
     y_=SumY/k; otkl=dy_max*100/y_;

     // сравним отклонение с допустимым и остановимся в случае превышения,определив quant_Peaks
     if (otkl<Norm_kv)     
      {GlobalVariableSet("Bl",bl);GlobalVariableSet("Kl",kl);} 
     if (otkl>=Norm_kv) {quant_PeaksDN=k-1;break;} 
   }

  //считываем коэффициенты
  bl=GlobalVariableGet("Bl"); kl=GlobalVariableGet("Kl");  

  //пересчитаем отклонение
  //максимальное абсолютное отклонение для первых К фракталов
  dy_max=0;SumY=0;
  if (quant_PeaksDN>2)
  {
    for (i=1;i<=quant_PeaksDN;i++)
     {
      SumY=SumY+y[i];y_calc=kl*x[i]+bl;dy=y[i]-y_calc;
      if (MathAbs(dy)>dy_max) dy_max=MathAbs(dy);
      }  
  } 

  h2=x[quant_PeaksDN];h1=x[1];bl=bl-1.5*dy_max;
  


  if (quant_PeaksDN==2 && dt>=240) bl=y[1];
  if (quant_PeaksDN==2 && dt<30) bl=MathMin(y[1],y[2]);
  if (quant_PeaksDN==2 && dt>=30) bl=y[1];
  if (kl*h2+bl>kl*h1+bl && quant_PeaksDN>2)  {kl=0;bl=MathMax(bl,y[1]);}


//ObjectCreate("TrendLineLower",OBJ_TREND,0,Time[h2],kl*h2+bl,Time[h1],kl*h1+bl);

if (dt==1) 
{GlobalVariableSet("bl_1",bl);
   GlobalVariableSet("kl1",kl*h1+bl);
   GlobalVariableSet("bl1",kl*h2+bl);
   GlobalVariableSet("t1l_1",Time[h1]);
   GlobalVariableSet("t2l_1",Time[h2]);
ObjectCreate("TrendLineLower",OBJ_TREND,0,Time[h2],kl*h2+bl,Time[h1],kl*h1+bl);
   }

if (dt==5) 
{GlobalVariableSet("bl_5",bl);
   GlobalVariableSet("kl5",kl*h1+bl);
   GlobalVariableSet("bl5",kl*h2+bl);
   GlobalVariableSet("t1l_5",Time[h1]);
   GlobalVariableSet("t2l_5",Time[h2]);
ObjectCreate("TrendLineLower",OBJ_TREND,0,Time[h2],kl*h2+bl,Time[h1],kl*h1+bl);
   }

if (dt==15) 
{GlobalVariableSet("bl_15",bl);
   GlobalVariableSet("kl15",kl*h1+bl);
   GlobalVariableSet("bl15",kl*h2+bl);
   GlobalVariableSet("t1l_15",Time[h1]);
   GlobalVariableSet("t2l_15",Time[h2]);
   ObjectCreate("TrendLineLower",OBJ_TREND,0,Time[h2],kl*h2+bl,Time[h1],kl*h1+bl);
   }
if (dt==30) 
  {GlobalVariableSet("bl_30",bl);
   GlobalVariableSet("kl30",kl*h1+bl);
   GlobalVariableSet("bl30",kl*h2+bl);
   GlobalVariableSet("t1l_30",Time[h1]);
   GlobalVariableSet("t2l_30",Time[h2]);
ObjectCreate("TrendLineLower",OBJ_TREND,0,Time[h2],kl*h2+bl,Time[h1],kl*h1+bl);
   }

if (dt==60) 
{GlobalVariableSet("bl_60",bl);
   GlobalVariableSet("kl60",kl*h1+bl);
   GlobalVariableSet("bl60",kl*h2+bl);
   GlobalVariableSet("t1l_60",Time[h1]);
   GlobalVariableSet("t2l_60",Time[h2]);
ObjectCreate("TrendLineLower",OBJ_TREND,0,Time[h2],kl*h2+bl,Time[h1],kl*h1+bl);
   }

if (dt==240) 
{GlobalVariableSet("bl_240",bl);
   GlobalVariableSet("kl240",kl*h1+bl);
   GlobalVariableSet("bl240",kl*h2+bl);
   GlobalVariableSet("t1l_240",Time[h1]);
   GlobalVariableSet("t2l_240",Time[h2]);
ObjectCreate("TrendLineLower",OBJ_TREND,0,Time[h2],kl*h2+bl,Time[h1],kl*h1+bl);
   }

if (dt==1440) 
{GlobalVariableSet("bl_1440",bl);
   GlobalVariableSet("kl1440",kl*h1+bl);
   GlobalVariableSet("bl1440",kl*h2+bl);
   GlobalVariableSet("t1l_1440",Time[h1]);
   GlobalVariableSet("t2l_1440",Time[h2]);
ObjectCreate("TrendLineLower",OBJ_TREND,0,Time[h2],kl*h2+bl,Time[h1],kl*h1+bl);
   }

return(0);
}
 
а в чём конкретно проблема?
мне просто лень весь код перелапачивать, если ткнёшь пальцем - попробую помочь...
насколько я понимаю, вся разница - это вызывать индюки с параметрами не ( NULL, 0 .... ) a ( NULL, 240 ... ) (для Н4) и вместо Close[], High[] и т.д. использовать iClose( NULL, 240, .. ) и iHigh( NULL, 240, ... ) ....
это если я правильно понял =) если нет - поправь...
 
Компостер, пальцем не ткнешь, т.к. написано для 1 тайм фрейма. Массивы x[] и y[] - это номера баров и значения соотв. фракталов для ТЕКУЩЕЙ размерности.
Надо переписывать, чтобы на 1 графике рисовались линии регрессии с разных тайм фреймов. Просто не приходит в голову, как это организовать, а хочется использовать в тестере.
Может быть разработчики напишут что-либо подобное и включат в постаку - очень наглядный инструмент.
 
Мне кажется, komposter правильный совет дал. Можно в одном индикаторе просчитать все коэффициенты для нескольких тайм-фреймов.
Тоже не копал код. Сделай нескольк массивов и храни там данные для разных ТФ.
 
Компостер, попробую с iHigh(....), спасибо.
 
я ещё раз пробежался по тексту - у тебя там есть 2 индюка iFractals(NULL,0,MODE_UPPER,i) и есть High[] и Low[]...
берешь заменяешь на iFractals(NULL, dt ,MODE_UPPER,i) и iHigh( NULL, dt, i ) соответственно (для лоу так же).
Потом весь код берёшь в цикл
for ( int cikl = 1; cikl <= N; cikl ++ )

(N - кол-во периодов, которые будут обрисованы)
и в начале цикла пишешь примерно следующее:

 switch ( cikl )
{
case 1: dt = 1; break;
case 2: dt = 5; break;
case 3: dt = 15; break;
........
}


запускаешь, отлавливаешь баги, наслаждаешься =)

Причина обращения: