Как составить код для запроса данных ч\з интервал времени?

 
Подскажите как составить код для советника что бы запрос параметров осуществлялся не каждый тик а к примеру ч\з 5 мин, 1 час, что то вроде таймера или что то похожего. А в идеале было бы супер привязать этот таймер к используемому тайм фрему.
 
int prevTimeBar;
 
//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() {
  if (prevTimeBar<Time[0]) {
    // действия
  }
  prevTimeBar=Time[0];
}
 
KimIV:
int prevTimeBar;
 
//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() {
  if (prevTimeBar<Time[0]) {
    // действия
  }
  prevTimeBar=Time[0];
}


хорошо поместил для теста в таком виде

void start()
{
if (prevTimeBar<Time[0])
{
St[0]=0;
St[1]=0;
St[2]=0;


if (iCustom(NULL,0,"stochhistogram","First Stochastic",14,3, 3,2,0)>0)
{St[0]=1;
if (iCustom(NULL,0,"stochhistogram","First Stochastic", 14, 3,3,2,1)>0)
{St[1]=1;
if (iCustom(NULL, 0,"stochhistogram", "First Stochastic", 14, 3,3,2,2)<0)
{St[2]=1;
}
}
}
if ((St[0]+St[1]+St[2])==3)
{
Print("тест");
}


//----

//----
return(0);
}
prevTimeBar=Time[0];
}
в итоге при совпадении всех условий текст - "тест" пишется в журнале от 3 до 5 раз на каждую секунду и так по 1-3сек.подряд. Почему так происходит?

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

 
itoj:
хорошо поместил для теста в таком виде

void start()
{
if (prevTimeBar<Time[0])
{
St[0]=0;
St[1]=0;
St[2]=0;


if (iCustom(NULL,0,"stochhistogram","First Stochastic",14,3, 3,2,0)>0)
{St[0]=1;
if (iCustom(NULL,0,"stochhistogram","First Stochastic", 14, 3,3,2,1)>0)
{St[1]=1;
if (iCustom(NULL, 0,"stochhistogram", "First Stochastic", 14, 3,3,2,2)<0)
{St[2]=1;
}
}
}
if ((St[0]+St[1]+St[2])==3)
{
Print("тест");
}


//----

//----
return(0);
}
prevTimeBar=Time[0];
}
в итоге при совпадении всех условий текст - "тест" пишется в журнале от 3 до 5 раз на каждую секунду и так по 1-3сек.подряд. Почему так происходит?

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


Ну во первых если функция start объявлена как void, то она ничего не возвращает, а только производит какие-то действия. А у Вас return(0);

Во вторых выход из функции по return происходит раньше, чем переменной prevTimeBar присваевается новое значение.

Ну и в третьих обязательно проверьте объявлена ли у Вас переменная prevTimeBar на глобальном уровне.

 

огромное спасибо, убрал лишнее и заработало!!!

может подскажете такой вопрос:

есть код индикатора

//+------------------------------------------------------------------+
//| Laguerre. mq4 |
//| Emerald King |
//| mailto:info@emerald-king.com |
//+------------------------------------------------------------------+
#property copyright "Emerald King"
#property link "mailto:info@emerald-king.com"

#property indicator_separate_window
#property indicator_color1 Magenta
#property indicator_level2 0.75
#property indicator_level3 0.45
#property indicator_level4 0.15
//---- input parameters
extern double gamma=0.7;
extern int CountBars=950;

double L0 = 0;
double L1 = 0;
double L2 = 0;
double L3 = 0;
double L0A = 0;
double L1A = 0;
double L2A = 0;
double L3A = 0;
double LRSI = 0;
double CU = 0;
double CD = 0;

double val1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+

int init()
{
//---- indicators
//----
SetIndexBuffer(0,val1);
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
if (CountBars>Bars) CountBars=Bars;
SetIndexDrawBegin(0,Bars-CountBars);

int i;
int counted_bars=IndicatorCounted();

//if(CountBars<=Lookback) return(0);
//---- initial zero
//if(counted_bars<1)
//{
// for(i=1;i<=Lookback;i++) val1[CountBars-i]=0.0;
//}

i=CountBars-1;
while(i>=0)
{
L0A = L0;
L1A = L1;
L2A = L2;
L3A = L3;
L0 = (1 - gamma)*Close[i] + gamma*L0A;
L1 = - gamma *L0 + L0A + gamma *L1A;
L2 = - gamma *L1 + L1A + gamma *L2A;
L3 = - gamma *L2 + L2A + gamma *L3A;

CU = 0;
CD = 0;

if (L0 >= L1) CU = L0 - L1; else CD = L1 - L0;
if (L1 >= L2) CU = CU + L1 - L2; else CD = CD + L2 - L1;
if (L2 >= L3) CU = CU + L2 - L3; else CD = CD + L3 - L2;

if (CU + CD != 0) LRSI = CU / (CU + CD);
val1[i] = LRSI;
i--;
}
return(0);
}
//+----------

строит этот индикатор кривую.

я не могу составить запрос на получение данных (значение точки построенной кривой) по определенной свече

далал так:

Lag[0]=iCustom(0,0,"laguerre",0.8,1000,2,1,1);

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

 

Уважаемый KimIV поскажите как с индикатора MACD венуть значение гистограммы, в код для расчета. С помощью MODE_MAIN не получается.

заранее спасибо!

 
itoj 03.12.2007 20:24

далал так:

Lag[0]=iCustom(0,0,"laguerre",0.8,1000,2,1,1);

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

Справка по iCustom:

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)
Расчет указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\experts\indicators.

Параметры:

symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
name - Имя пользовательского индикатора.
... - Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.
mode - Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Читайте внимательно. symbol - если текущий надо указывать как NULL , а у Вас 0. mode - индекс линии индикатора из приведенного примера видно, что там одна линия с индексом 0, а у Вас 1. И для вставки кода используйте кнопку . И по поводу iMACD в справке написано очень подробно.

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