griz
Активный участник
Ты на ютубе какой-нибудь курс по программированию на MQL4 смотрел?Почему то с одномерным массивом все хорошо. А с двумерным не прокатывает.
Ты на ютубе какой-нибудь курс по программированию на MQL4 смотрел?Почему то с одномерным массивом все хорошо. А с двумерным не прокатывает.
даТы на ютубе какой-нибудь курс по программированию на MQL4 смотрел?
Не имеет значения сколько измерений в массиве. Нельзя пытаться использовать несуществующие ячейки массива.Код:double indi[2]; /******************************************************************** void OnTick() { st1(fl(),sw(),ST(),PT()); } /******************************************************************** void uk(double &gh2[2]) { //для использования в дальнейших функциях gh2[0] = High[5];//Максимальная цена gh2[1] = Low[5];//Минимальная цена } /******************************************************************** void st1(double Flot,string swop,double sl,double pt) { uk(indi); Comment(indi[1]); }
Почему то с одномерным массивом все хорошо. А с двумерным не прокатывает.
Не имеет значения сколько измерений в массиве. Нельзя пытаться использовать несуществующие ячейки массива.
Здесь перебор ячеек второго измерения
for(int i = 0; i < ArrayRange(gh1, 1); i++)
Максимальное значение i это последнее значение которое можно использовать.
gh1[10] =NormalizeDouble(gh1[4]+gh1[4][i+1],Digits);
i+1 - за пределами размера массива.
void OnTick()
{
int temp;
for(int i=0;i<4;i++)
{
//--- получим размер i-ого измерения
temp=ArrayRange(indikator,i);
//--- распечатаем
PrintFormat("dim = %d, range = %d",i,temp);
}
}
И чё?Код:void OnTick() { int temp; for(int i=0;i<4;i++) { //--- получим размер i-ого измерения temp=ArrayRange(indikator,i); //--- распечатаем PrintFormat("dim = %d, range = %d",i,temp); } }
Выдает:
2023.02.20 19:49:10.967 2004.01.02 03:52:27 Lavina 3 GBPCHF,Daily: dim = 3, range = 0
2023.02.20 19:49:10.967 2004.01.02 03:52:27 Lavina 3 GBPCHF,Daily: dim = 2, range = 0
2023.02.20 19:49:10.967 2004.01.02 03:52:27 Lavina 3 GBPCHF,Daily: dim = 1, range = 31
2023.02.20 19:49:10.967 2004.01.02 03:52:27 Lavina 3 GBPCHF,Daily: dim = 0, range = 4
Механически ("тупо") код индикатора перенести в советник не получится, надо править текст.Доброго времени суток многоуважаемые программисты, доработаю советник по TMA советник получает данные из индикатора через iCustom, ( вшил индикатор в советник через #resource что бы не таскать ) всё хорошо но тестится очень долго, второй день никак не могу перенести код (расчётную часть) индикатора в советник, помогите пожалуйста, покажите пример какой кусок кода перенести, это для меня будет огромный шаг вперед и буду рад как ребенок радуется новой игрушке. Заранее благодарен. Спасибо Вам за всё.
Советник слишком медленно оптимизировался, воспользовался Вашим советом и попробовал вызывать индикатор один раз на закрытии бара, проблема решенаВ чём именно у Вас проблема: в том, что Вы принципиально хотите, чтобы индикатор и советник были интегрированы в один файл? Или в том, что советник по этому индикатору медленно оптимизируется?
И чё?
Внутри цикла
for(int i = 0; i < ArrayRange(gh1, 1); i++)
Во втором измерении нельзя использовать значения больше чем i нет там ячеек дальше, а i+1 больше i то есть обращение к несуществующим ячейкам.
Что бы можно было использовать i+1 надо цикл изменить, например на
for(int i = 0; i < ArrayRange(gh1, 1)-1; i++)
Или просто не использовать i+1.
double idiktor[4][31];
//+------------------------------------------------------------------+
void OnTick()
{
uy(idiktor);
Comment(idiktor[3][25]);
}
//+------------------------------------------------------------------+
void uy(double &gh1[4][31])
{
for(int i = 0; i < ArrayRange(gh1,1); i++)
{
for(int j =0; j<ArrayRange(gh1,1); j++)
{
gh1[0][j]= High[j];
gh1[1][j]= Low[j];
gh1[2][j]= Close[j];
gh1[3][j]= Open[j];
}
}
}
Я бы написал что можно сделать лучше, но не знаю цели.Сейчас сработало. Или еще как-то получше можно сделать?Код:double idiktor[4][31]; //+------------------------------------------------------------------+ void OnTick() { uy(idiktor); Comment(idiktor[3][25]); } //+------------------------------------------------------------------+ void uy(double &gh1[4][31]) { for(int i = 0; i < ArrayRange(gh1,1); i++) { for(int j =0; j<ArrayRange(gh1,1); j++) { gh1[0][j]= High[j]; gh1[1][j]= Low[j]; gh1[2][j]= Close[j]; gh1[3][j]= Open[j]; } } }
Я бы написал что можно сделать лучше, но не знаю цели.
Здесь я вижу бесполезный цикл
for(int i = 0; i < ArrayRange(gh1,1); i++)
Зачем он нужен если i внутри цикла не используется?
void uo(double &gh1[4][31])
{
for(int i = 0; i < ArrayRange(gh1, 1); i++)
{
for(int j =0; j<ArrayRange(gh1,1); j++)
{
gh1[i][j] =High[j];//Максимальная цена
gh1[i][j] =Low[j];//Минимальная цена
gh1[i][j] =Open[j];//Цена открытия
gh1[i][j] =Close[j];//Цена закрытия
}
}
}
Код:void uo(double &gh1[4][31]) { for(int i = 0; i < ArrayRange(gh1, 1); i++) { for(int j =0; j<ArrayRange(gh1,1); j++) { gh1[i][j] =High[j];//Максимальная цена gh1[i][j] =Low[j];//Минимальная цена gh1[i][j] =Open[j];//Цена открытия gh1[i][j] =Close[j];//Цена закрытия } } }
void OnTick()
{
st1(fl(),sw(),ST(),PT());
}
/**************************************************************
void st1(double Flot,string swop,double sl,double pt)
{
uo(indikator);
Comment(indikator[4][4]);
}
indikator[5][2]=Open[2]-Close[2];
А TMA ты не можешь сам реализовать ? Функцию свою ТМА сделать ? Вместо того чтобы внедрять в свой советник непонятно что ? В чём, где проблема ? ).Советник слишком медленно оптимизировался, воспользовался Вашим советом и попробовал вызывать индикатор один раз на закрытии бара, проблема решена
Огромное СПАСИБИЩЕ
Проблема в знании. Я самоучка, до этого учился методом тыка ковыряясь в коде различных советников, но сейчас уже решил отностся к этому серьезно и начал всё с нуля воспользовавшись учебниковА TMA ты не можешь сам реализовать ? Функцию свою ТМА сделать ? Вместо того чтобы внедрять в свой советник непонятно что ? В чём, где проблема ? ).
Странно теперь этот же код выдает критическую ошибку.Код:void OnTick() { st1(fl(),sw(),ST(),PT()); } /************************************************************** void st1(double Flot,string swop,double sl,double pt) { uo(indikator); Comment(indikator[4][4]); }
Это работает. Сейчас не могу понять как дальше реализовать скажем значение
Код:indikator[5][2]=Open[2]-Close[2];
А ты сравни код в котором работало, с кодом в котором не работает.Почему сейчас не работает хотя работало.