Скачать MetaTrader 5

запоминание старых показаний индикатора

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Олег
378
Олег  
Доброго настроения.

Помощь уж очень нужна. Уже достаточно время туплю не могу написать.

Прогаю на мкл4 недавно. проблема следующая.

Написал индикатор все ок. Но еще захотел, чтобы он рисовал еще и старые линии. Индикатор на часовом промежутке. Мне интересно , чтобы он еще отображал и старые линии . Интересно сравнивать, чтобы в голове не держать.

Пишу примерно так. через счетчик

int hh=1; //начало счетчика
int start()
{
if (Minute()>=0 && Minute()<=5) // Ограничение по работе
{
int k;
double arr1[150][4]; // описание двумерного массива
double vall[150]; // искомый столбец
functionW1(vall); // далее цепь функций которые работают
double vall1[150];
functionD1(vall1);
double vall2[150];
functionH4(vall2);
double vall3[150];
functionH1(vall3);



if (TimeFrame==PERIOD_H1) // работаем только на часе
{
for ( k=1;k<=145;k++) // цикл для рисования линии по уже вычесленному массиву vall3
{
Buffer13[146-k]=vall3[k];


arr1[k][hh]=vall3[k]; // пытаюсь создать двумерный массив
}
}
hh=hh+1; // конец счетчика

if (TimeFrame==PERIOD_H1)
{
for ( k=1;k<=145;k++)
{
Buffer18[146-k]=arr1[k][2]; //тут пытаюсь забрать нужный мне массив и нарисовать старую линию
}
}

return(0);
}


Ничего не получается. Помогите пожалуйста. Чувствую проблема в логике программирования.

С Уважением Олег

Заранеее спасибо
Vladimir Karputov
Модератор
68483
Vladimir Karputov  
elisseev2000:

Пожалуйста, при вставке кода, руководствуйтесь: Правильно вставляем код на форуме
Ответы новичкам в картинках
Ответы новичкам в картинках
  • www.mql5.com
Как наложить (прикрепить) индикатор на график. - - Категория: общее обсуждение
transcendreamer
3630
transcendreamer  
elisseev2000:
Доброго настроения.

Помощь уж очень нужна. Уже достаточно время туплю не могу написать.

Прогаю на мкл4 недавно. проблема следующая.

Написал индикатор все ок. Но еще захотел, чтобы он рисовал еще и старые линии. Индикатор на часовом промежутке. Мне интересно , чтобы он еще отображал и старые линии . Интересно сравнивать, чтобы в голове не держать.

Пишу примерно так. через счетчик

int hh=1; //начало счетчика
int start()
{
if (Minute()>=0 && Minute()<=5) // Ограничение по работе
{
int k;
double arr1[150][4]; // описание двумерного массива
double vall[150]; // искомый столбец
functionW1(vall); // далее цепь функций которые работают
double vall1[150];
functionD1(vall1);
double vall2[150];
functionH4(vall2);
double vall3[150];
functionH1(vall3);



if (TimeFrame==PERIOD_H1) // работаем только на часе
{
for ( k=1;k<=145;k++) // цикл для рисования линии по уже вычесленному массиву vall3
{
Buffer13[146-k]=vall3[k];


arr1[k][hh]=vall3[k]; // пытаюсь создать двумерный массив
}
}
hh=hh+1; // конец счетчика

if (TimeFrame==PERIOD_H1)
{
for ( k=1;k<=145;k++)
{
Buffer18[146-k]=arr1[k][2]; //тут пытаюсь забрать нужный мне массив и нарисовать старую линию
}
}

return(0);
}


Ничего не получается. Помогите пожалуйста. Чувствую проблема в логике программирования.

С Уважением Олег

Заранеее спасибо

 

приветствую!

у меня была аналогичная задача - мне нужно было запомнить состояние индикатора в прошлом и воспроизвести его

к сожалению из Вашего описания я не совсем понял что именно Вы делаете, поэтому я просто опишу свой опыт, возможно это будет полезно

сразу скажу я не проф.программист, но тем не менее у меня получилось сделать чтобы индикатор как бы "воссоздавал прошлое"

мой индикатор перерисовываемый, поэтому нужно было четко привязаться к начальным условиям, которые бы однозначно гарантировали вид индикатора

сначала я хотел записывать входные параметры индикатора в файл, но потом отказался от этого

в моем случае вид индикатора определяется выбором начального и конечного бара расчета

поэтому я стал записывать две переменные типа datetime в global variables терминала

а потом вообще стал рисовать две вертикальные линии на графике которые соответствуют барам начала и конца расчета

тогда еще появилась возможность двигая эти линии воспроизводить индикатор на любом отрезке времени

вот как это выглядит

   current_time=0; stop_time=0;

   int objects=ObjectsTotal();

   for(int i=objects; i>=0; i--)

      {

      string name=ObjectName(i);

      if(ObjectFind(name)!=window) continue;

      if(ObjectType(name)!=OBJ_VLINE) continue;

      bool test1=(StringFind(name,"Start-Line-")!=-1);

      bool test2=(StringFind(name,"Finish-Line-")!=-1);

      if(!test1 && !test2) continue;

      if(test1) current_time=(datetime)ObjectGet(name,OBJPROP_TIME1);

      if(test2) stop_time=(datetime)ObjectGet(name,OBJPROP_TIME1);

      }

   if(current_time==0 || stop_time==0)

      {

      current_time=iTime(Symbol(),timeframe,dynamic_bars-1);

      stop_time=iTime(Symbol(),timeframe,0);

      PlaceVertical("Start-Line-"+portfolio_id,current_time,Red,STYLE_DOT,true);

      PlaceVertical("Finish-Line-"+portfolio_id,stop_time,Red,STYLE_DOT,true);

      Print("Indicator period reset...");

      }

этот код защищает также от любой реинициализации индикатора например при перезагрузке терминала будет восстановлено именно то состояние которое было до перезагрузки

возможно я сумбурно описал но в принципе в коде видно что делается 

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий