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

azmir

Местный житель
Доброго времени суток многоуважаемые программисты, доработаю советник по TMA советник получает данные из индикатора через iCustom, ( вшил индикатор в советник через #resource что бы не таскать ) всё хорошо но тестится очень долго, второй день никак не могу перенести код (расчётную часть) индикатора в советник, помогите пожалуйста, покажите пример какой кусок кода перенести, это для меня будет огромный шаг вперед и буду рад как ребенок радуется новой игрушке. Заранее благодарен. Спасибо Вам за всё.
 

Вложения

  • TMA.mq4
    9,7 КБ · Просмотры: 13
Последнее редактирование:

Ugar

Гуру форума
Код:
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 - за пределами размера массива.
 

star603

Новичок форума
Не имеет значения сколько измерений в массиве. Нельзя пытаться использовать несуществующие ячейки массива.
Здесь перебор ячеек второго измерения
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);
     }
  }

Выдает:

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
 

Ugar

Гуру форума
Код:
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
И чё?
Внутри цикла
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.
 

ИванМН

Местный знаток
Доброго времени суток многоуважаемые программисты, доработаю советник по TMA советник получает данные из индикатора через iCustom, ( вшил индикатор в советник через #resource что бы не таскать ) всё хорошо но тестится очень долго, второй день никак не могу перенести код (расчётную часть) индикатора в советник, помогите пожалуйста, покажите пример какой кусок кода перенести, это для меня будет огромный шаг вперед и буду рад как ребенок радуется новой игрушке. Заранее благодарен. Спасибо Вам за всё.
Механически ("тупо") код индикатора перенести в советник не получится, надо править текст.
В чём именно у Вас проблема: в том, что Вы принципиально хотите, чтобы индикатор и советник были интегрированы в один файл? Или в том, что советник по этому индикатору медленно оптимизируется? Если первое, то уже ответил. Если второе, то такая интеграция Вам в плане скорости особо ничего не даст. Индикаторы в большинстве случаев медленно работают по двум причинам: а) анализируют слишком большое количество баров истории, б) вызываются на каждом тике (а не один раз на закрытии/открытии бара), что излишне, так как сигнал становится достоверным, только когда он фиксируется на закрытом баре. Проверьте эти два момента и, может быть, проблема отпадёт.
 

azmir

Местный житель
В чём именно у Вас проблема: в том, что Вы принципиально хотите, чтобы индикатор и советник были интегрированы в один файл? Или в том, что советник по этому индикатору медленно оптимизируется?
Советник слишком медленно оптимизировался, воспользовался Вашим советом и попробовал вызывать индикатор один раз на закрытии бара, проблема решена
Огромное СПАСИБИЩЕ
 

star603

Новичок форума
И чё?
Внутри цикла
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];
        }
     }
  }
Сейчас сработало. Или еще как-то получше можно сделать?
 

Ugar

Гуру форума
Код:
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 внутри цикла не используется?
 

star603

Новичок форума
Я бы написал что можно сделать лучше, но не знаю цели.
Здесь я вижу бесполезный цикл
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];//Цена закрытия
        }
     }
  }
 

star603

Новичок форума
Код:
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];
 

ZenFX

Почетный гражданин
Советник слишком медленно оптимизировался, воспользовался Вашим советом и попробовал вызывать индикатор один раз на закрытии бара, проблема решена
Огромное СПАСИБИЩЕ
А TMA ты не можешь сам реализовать ? Функцию свою ТМА сделать ? Вместо того чтобы внедрять в свой советник непонятно что ? В чём, где проблема ? ).
 

azmir

Местный житель
А TMA ты не можешь сам реализовать ? Функцию свою ТМА сделать ? Вместо того чтобы внедрять в свой советник непонятно что ? В чём, где проблема ? ).
Проблема в знании. Я самоучка, до этого учился методом тыка ковыряясь в коде различных советников, но сейчас уже решил отностся к этому серьезно и начал всё с нуля воспользовавшись учебников
PS. Что бы учить mql мне пришлось сначала учить русский язык, потому что уроки по mql на моем родном языке нет вообще.
 
Последнее редактирование:

Jirge

Прохожий
Hello
I don't know if I'm right. Can someone correct me here in an MQL4 script error. I would pay for that too.
Thanks in advance
 

star603

Новичок форума
Код:
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];
Странно теперь этот же код выдает критическую ошибку.
 

star603

Новичок форума
Почему сейчас не работает хотя работало.
 

Вложения

  • test.mq4
    3,7 КБ · Просмотры: 12
Верх