Ваши вопросы по языку MQL4

Ugar

Гуру форума
Поделитесь кодом для обновления индикатора, который действует так, как при обновлении настроек, и только на этот индикатор, а не как AutoRefresh, когда всё что на графике - перезапускается. Прошу пример в mq4. Еще раз обращаю внимание - без смены таймфрейма конечно же.
При применении настроек происходит инициализация индикатора. Выполняется функция OnInit(). Инициализируй там любые переменные объявленные на глобальном уровне.
Скорее всего значение prev_calculated, при применении входных параметров, то же должно обнулиться. Значит если применён экономный алгоритм вычисления, индикатор должен пересчитаться полностью.
 

Артмен

Новичок форума
Добрый день уважаемые программисты! Помогите пожалуйста исправить ошибку в тестере - Array out of range "(295,10)";
тестер говорит что ошибка в вот этом месте:
if(t3period!=period)
{
t3period=period;
b2 = b*b;
b3 = b2*b;

c1 = -b3;
c2 = (3*(b2+b3));
c3 = -3*(2*b2+b+b3);
c4 = (1+3*b+b3+3*b2);

w1 = 2 / (2 + 0.5*(MathMax(1,period)-1));
w2 = 1 - w1;
}
for(int i=limit; i>=0; i--)
{
double price=iMA(NULL,0,1,0,MODE_SMA,priceType,i);
e1 = w1*price + w2*ae1[i+1];
e2 = w1*e1 + w2*ae2[i+1];
e3 = w1*e2 + w2*ae3[i+1];
e4 = w1*e3 + w2*ae4[i+1];
e5 = w1*e4 + w2*ae5[i+1];
e6 = w1*e5 + w2*ae6[i+1];
t3_buffer=c1*e6+c2*e5+c3*e4+c4*e3;
ae1 = e1;
ae2 = e2;
ae3 = e3;
ae4 = e4;
ae5 = e5;
ae6 = e6;
}
}
 

vladradon

Программист
Добрый день уважаемые программисты! Помогите пожалуйста исправить ошибку в тестере - Array out of range "(295,10)";
тестер говорит что ошибка в вот этом месте:
Пока заметил 2 некорректности: в цикле если идет обратный отсчет до 0, то обычно начальное значение уменьшают на 1 - for(int i=limit-1;... и переменная price должна быть инициирована один раз, а она инициируется в каждом проходе цикла - нужно вынести double price=0; и поставить либо перед циклом, либо вообще в начале сова, где прописываются все глобальные переменные. Еще, если массивы ae* не индексные, то им нужно задавать объем и инициализировать каким-то значением все ячейки - короче мне нужно еще знать, как они прописаны в начале кода. Но ошибка выдается из-за того, что i выходит за рамки допустимого в массиве - возможно когда i=limit и индексация идет i+1.
 
Последнее редактирование:

Артмен

Новичок форума
Пока заметил 2 некорректности: в цикле если идет обратный отсчет до 0, то обычно начальное значение уменьшают на 1 - for(int i=limit-1;... и переменная price должна быть инициирована один раз, а она инициируется в каждом проходе цикла - нужно вынести double price=0; и поставить либо перед циклом, либо вообще в начале сова, где прописываются все глобальные переменные. Еще, если массивы ae* не индексные, то им нужно задавать объем и инициализировать каким-то значением все ячейки - короче мне нужно еще знать, как они прописаны в начале кода. Но ошибка выдается из-за того, что i выходит за рамки допустимого в массиве - возможно когда i=limit и индексация идет i+1.

Спасибо вам большое , Vladradon, я пересмотрел весь код переменные ae* инициализированы в начале сова без значения, а дальше с ними больше ничего не делается(только в этой функции которую я выложил и больше нигде);)
 

vladradon

Программист
Спасибо вам большое , Vladradon, я пересмотрел весь код переменные ae* инициализированы в начале сова без значения, а дальше с ними больше ничего не делается(только в этой функции которую я выложил и больше нигде)
Нужно вставить строки для каждого массива перед циклом:
PHP:
ArrayResize(ae1,limit+1,0);
ArrayInitialize(ae1,0.0);
...
и цикл запускать с limit-1.
 

Артмен

Новичок форума
Большое вам спасибо!(Извините вчера не было времени заглянуть на форум)
 

Артмен

Новичок форума
Нужно вставить строки для каждого массива перед циклом:
PHP:
ArrayResize(ae1,limit+1,0);
ArrayInitialize(ae1,0.0);
...
и цикл запускать с limit-1.

Я попробовал - и всё тоже самое(опять та же ошибка что и раньше).
Может я сделал что-то не правильно? :dont-know: :question:
for(int i=limit; i>=0; i--)
{
price=iMA(NULL,0,1,0,MODE_SMA,priceType,i);
ArrayResize(ae1,limit+1,0);
ArrayInitialize(ae1,0.0);
ArrayResize(ae2,limit+1,0);
ArrayInitialize(ae2,0.0);
ArrayResize(ae3,limit+1,0);
ArrayInitialize(ae3,0.0);
ArrayResize(ae4,limit+1,0);
ArrayInitialize(ae4,0.0);
ArrayResize(ae5,limit+1,0);
ArrayInitialize(ae5,0.0);
ArrayResize(ae6,limit+1,0);
ArrayInitialize(ae6,0.0);

e1 = w1*price + w2*ae1[i+1];
e2 = w1*e1 + w2*ae2[i+1];
e3 = w1*e2 + w2*ae3[i+1];
e4 = w1*e3 + w2*ae4[i+1];
e5 = w1*e4 + w2*ae5[i+1];
e6 = w1*e5 + w2*ae6[i+1];
t3_buffer=c1*e6+c2*e5+c3*e4+c4*e3;
ae1 = e1;
ae2 = e2;
ae3 = e3;
ae4 = e4;
ae5 = e5;
ae6 = e6;
}
 

vladradon

Программист
Я попробовал - и всё тоже самое(опять та же ошибка что и раньше).
Я писал, что цикл должен стартовать с limit-1: for(int i=limit-1; i>=0; i--), а строки нужно не в тело цикла вставить а перед ним - перед for(int i=limit-1; i>=0; i--), чтобы в цикле уже подготовленные массивы использовались.
 
Последнее редактирование:

Артмен

Новичок форума
Вот!
double ae1[];
double ae2[];
double ae3[];
double ae4[];
double ae5[];
double ae6[];
 

vladradon

Программист
это я из совы копировал
Я не знаю, как ты там пробовал, но у меня все работает. Я чирканул индюка для проверки цикла, убрав все лишнее и то, что не знал (переменные). Конечные резы выводятся алертами и никаких ошибок с массивами нет. Код прилагаю.
 

Вложения

  • test.mq4
    2,8 КБ · Просмотры: 27

Артмен

Новичок форума
Я не знаю, как ты там пробовал, но у меня все работает. Я чирканул индюка для проверки цикла, убрав все лишнее и то, что не знал (переменные). Конечные резы выводятся алертами и никаких ошибок с массивами нет. Код прилагаю.

Спасибо вам ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!!!!:);)
 

Golandec

Прохожий
Привет!Уважаемые знатоки подскажите пожалуйса как сделать так,чтобы в советнике открывался ордер на третьем(там на картинке надеюсь доступно и понятно),а не на первом(белом).или с третьего и все последующие не суть,главно не с первого.помогите !
uBFhzQ-PRau1WtxjXExP3w.png
 

eevviill2

Местный знаток
Привет!Уважаемые знатоки подскажите пожалуйса как сделать так,чтобы в советнике открывался ордер на третьем(там на картинке надеюсь доступно и понятно),а не на первом(белом).или с третьего и все последующие не суть,главно не с первого.помогите !
uBFhzQ-PRau1WtxjXExP3w.png
PHP:
double up=iCustom(bla bla,1);
double up2=iCustom(bla bla,2);
double down=iCustom(bla bla,1);
double down2=iCustom(bla bla,2);
bool up_ok=false;

if(up>up2)
{
for(for int i=2;i<Bars-20;i++)
{
down=iCustom(bla bla,i);
if(down!=EMPTY_VALUE) break;
up=iCustom(bla bla,i);
up2=iCustom(bla bla,i+1);
if(up>up2) {up_ok=true;break;}
}
}
 
Верх