Рисование и использование паттернов- каналов, треугольников.Кто занимался, откликнитесь, есть проблемка.
Сотворил эксперта, который рисует треугольнички и каналы по регрессионному принципу, по типу OmniTrader . Считаю, что инструмент полезный и можно было бы включить прорисовку линий поддержки-сопротивления в стандартный набор инструментов. Но пока этого нет, не могу решить проблему, как нарисовать на одном графике такие линии из других тайм-фреймов. Пока решаю проблему , вычисляя для каждого тайм фрейма отдельно и передавая коэффициенты регрессии через глобальные переменные. Как бы это все на 1 графике сделать ?
- Инструменты технического анализа в MetaTrader 5
- Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ
- Канал стандартных отклонений - Каналы - Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ
Не копирует, блин
Не копирует, блин
Из какой программы вообще пытаетесь копировать?
И вставляйте код в тегах [ pre ], пожалуйста.
Перед копированием нужно переключиться на русскую раскладку,
тогда копирует.
тогда копирует.
А чего за файл
#include <Func_lib.mqh >
?
Положите плиз
Скопировалось.
Результат - построение линий трендов по последним фракталам (не более N ), укладывающимися на прямую с допуском Norm_kv.
Еще раз проблема: такой подход работает только по своему тайм-фрейму. Для получения коэфф по остальным тайм фреймам приходится открывать отдельное окошко и оттуда уже определять глобальные переменные, которые передаются в основной эксперт. Естественно, такую систему не протестируешь (когда будет тестер). Хотелось бы все вычисления сделать на 1 графике, т.е. заставить программку вытащить данные по нужным фреймам.
Результат - построение линий трендов по последним фракталам (не более 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, ... ) ....
это если я правильно понял =) если нет - поправь...
мне просто лень весь код перелапачивать, если ткнёшь пальцем - попробую помочь...
насколько я понимаю, вся разница - это вызывать индюки с параметрами не ( NULL, 0 .... ) a ( NULL, 240 ... ) (для Н4) и вместо Close[], High[] и т.д. использовать iClose( NULL, 240, .. ) и iHigh( NULL, 240, ... ) ....
это если я правильно понял =) если нет - поправь...
Компостер, пальцем не ткнешь, т.к. написано для 1 тайм фрейма. Массивы x[] и y[] - это номера баров и значения соотв. фракталов для ТЕКУЩЕЙ размерности.
Надо переписывать, чтобы на 1 графике рисовались линии регрессии с разных тайм фреймов. Просто не приходит в голову, как это организовать, а хочется использовать в тестере.
Может быть разработчики напишут что-либо подобное и включат в постаку - очень наглядный инструмент.
Надо переписывать, чтобы на 1 графике рисовались линии регрессии с разных тайм фреймов. Просто не приходит в голову, как это организовать, а хочется использовать в тестере.
Может быть разработчики напишут что-либо подобное и включат в постаку - очень наглядный инструмент.
Мне кажется, komposter правильный совет дал. Можно в одном индикаторе просчитать все коэффициенты для нескольких тайм-фреймов.
Тоже не копал код. Сделай нескольк массивов и храни там данные для разных ТФ.
Тоже не копал код. Сделай нескольк массивов и храни там данные для разных ТФ.
я ещё раз пробежался по тексту - у тебя там есть 2 индюка iFractals(NULL,0,MODE_UPPER,i) и есть High[] и Low[]...
берешь заменяешь на iFractals(NULL, dt ,MODE_UPPER,i) и iHigh( NULL, dt, i ) соответственно (для лоу так же).
Потом весь код берёшь в цикл
берешь заменяешь на 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; ........ }
запускаешь, отлавливаешь баги, наслаждаешься =)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь