Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пополняй свой счет с помощью банковских карт через Gate2Shop
Олег
379
Олег 2015.03.19 21:03 
Доброго настроения.

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

Прогаю на мкл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
Модератор
46048
Vladimir Karputov 2015.03.20 04:28  
elisseev2000:

Пожалуйста, при вставке кода, руководствуйтесь: Правильно вставляем код на форуме
Ответы новичкам в картинках
Ответы новичкам в картинках
  • www.mql5.com
Как наложить (прикрепить) индикатор на график. - - Категория: общее обсуждение
transcendreamer
3284
transcendreamer 2015.03.20 13:02  
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...");

      }

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

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

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