- Обсуждение статьи "Пошаговое руководство по написанию советников в MQL5 для начинающих"
- Ошибки, баги, вопросы
- временной интервал работы советника
int prevTimeBar; //+----------------------------------------------------------------------------+ //| expert start function | //+----------------------------------------------------------------------------+ void start() { if (prevTimeBar<Time[0]) { // действия } prevTimeBar=Time[0]; }
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сек.подряд. Почему так происходит?
на счет кода не будте очень критичны, я только начал заниматься программированием.
хорошо поместил для теста в таком виде
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);
предполагаю что не правильно указываю буфер данных к которуму нужно обратится.
далал так:
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) |
symbol | - | Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ. |
timeframe | - | Период. Может быть одним из периодов графика. 0 означает период текущего графика. |
name | - | Имя пользовательского индикатора. |
... | - | Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора. |
mode | - | Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer. |
shift | - | Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). |
Читайте внимательно. symbol - если текущий надо указывать как NULL , а у Вас 0. mode - индекс линии индикатора из приведенного примера видно, что там одна линия с индексом 0, а у Вас 1. И для вставки кода используйте кнопку . И по поводу iMACD в справке написано очень подробно.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования