Вопрос по MQL4 - страница 2

 
Ситуация - надо написать эксперт, в котором бы использовались нестандартные таймфреймы с индикаторами на них. Показывать их необязательно. Все что нужно можно посмотреть на тех же офлайновых графиках. Надо просто эксперт который все это будет делать. То есть - мы имеем некий Н3 график виртуально со всеми значениями.

Автомату не надо визуальное отображение.

Технология MetaQuotes предполагает прикрепление эксперта к графику. Независимо от того, будете вы смотреть на этот график или нет. С чем это связано вы, наверное, догадываетесь. Если вам такая технология не нравится, что ж, создайте свою.
То есть - мы имеем некий Н3 график виртуально со всеми значениями.

Если повесить на этот график эксперт - то как обратиться к другому нестандартному фрейму? Например Н12. Поэтому и надо универсальное решение. Теперь я достаточно ясно задал вопрос?

Да, вполне. Если бы вы с самого начала задали его именно так, я бы вам сразу сказал:
Уважаемый, не мучайте себя понапрасну. Делается это элементарно, без привлечения всех тех ужасов, о которых вы и я упоминали. Пишете эксперт для Н1, предусматриваете в нем массивы-таймсерии для всех тех данных, с которыми вы работаете, и тех нестандартных таймфреймов, которые вы хотите иметь. Устанавливаете для них ArraySetAsSeries. А потом пополняете их из данных Н1, каждый в свое время. Для Н3 получится 1 раз в 3 часа, для Н12 - 1 раз в 12 часов. И в файл ничего сохранять не надо. Все эти ваши нестандартные таймсерии проще реконструировать по Н1 истории каждый раз, когда вы запускаете эксперта, чем возиться с файлами. Всего-то делов.
 
Да, именно так я и думаю - так конечно же проще чем использовать конверченное хистори.
ArraySetAsSeries использует как я понял из справки только один массив. Либо time[], либо open[] и т.д.
Не совсем понятно как это использовать. И я еще спрашивал про последний бар. Он же постоянно меняется и меняется количество баров. Получается что его каждый раз надо переиндексировать. То есть появляется новое значение на Н3, оно должно стать нулевым. Но в момент появления оно как бы -1. Очень хочется пример использования.
 
ArraySetAsSeries использует как я понял из справки только один массив. Либо time[], либо open[] и т.д.
Не совсем понятно как это использовать.

ArraySetAsSeries устанавливает обратный порядок элементов в массиве. Применяется один раз.
Если у вас есть массив, то после применения к нему ArraySetAsSeries его 0-й элемент станет последним, а последний станет 0-м. Соответственно и вся нумерация изменит свой порядок на противоположный. Восстановить прежний порядок можно с помощью того же ArraySetAsSeries, но с другим параметром.
И я еще спрашивал про последний бар. Он же постоянно меняется и меняется количество баров.

Конечно, только буферы в индикаторах и стандартные таймсерии автоматически меняют свою размерность и добавляют последний бар в начало. В экспертах для того, что вы делаете своими руками, все эти вещи надо своими же руками и решать. :-) Но это не сложная задача. Вам она по силам, надо только немного подумать.
А для увеличения числа элементов в массиве используйте ArrayResize.
 
ArraySetAsSeries использует как я понял из справки только один массив. Либо time[], либо open[] и т.д.
Не совсем понятно как это использовать.

ArraySetAsSeries устанавливает обратный порядок элементов в массиве. Применяется один раз.
Если у вас есть массив, то после применения к нему ArraySetAsSeries его 0-й элемент станет последним, а последний станет 0-м. Соответственно и вся нумерация изменит свой порядок на противоположный. Восстановить прежний порядок можно с помощью того же ArraySetAsSeries, но с другим параметром.
И я еще спрашивал про последний бар. Он же постоянно меняется и меняется количество баров.

Конечно, только буферы в индикаторах и стандартные таймсерии автоматически меняют свою размерность и добавляют последний бар в начало. В экспертах для того, что вы делаете своими руками, все эти вещи надо своими же руками и решать. :-) Но это не сложная задача. Вам она по силам, надо только немного подумать.
А для увеличения числа элементов в массиве используйте ArrayResize.


Спасибо. Немного стало яснее. Наверно дальше сам уже разберусь.
Кстати ArraySetAsSeries устанавливает порядок в зависимости от второго параметра либо прямой либо обратный. Вы не знали? =)
 
Кстати ArraySetAsSeries устанавливает порядок в зависимости от второго параметра либо прямой либо обратный. Вы не знали? =)

Повторяю еще раз. Для любознательных.
Восстановить прежний порядок можно с помощью того же ArraySetAsSeries, но с другим параметром.
 
Ну то есть я так понял что это вполне возможно написать без всяких внешних дллок?
 
Ну то есть я так понял что это вполне возможно написать без всяких внешних дллок?

Да
 
Я вот тут написал функцию для конвертации Н3 в массивы.
Это правильно или есть ошибки?
/////////// Создание массивов для Н3
void h3tf()
{
   j=iBars(Val,PERIOD_H1);
   k=0;
   TimeH3[k]=TimeDay(iTime(Val,PERIOD_H1,j))+TimeHour(iTime(Val,PERIOD_H1,j))/3*3;
   OpenH3[k]=iOpen(Val,PERIOD_H1,j);
   HighH3[k]=iHigh(Val,PERIOD_H1,j);
   LowH3[k]=iLow(Val,PERIOD_H1,j);
   CloseH3[k]=iClose(Val,PERIOD_H1,j);
   for (j=iBars(Val,PERIOD_H1)-1;j>0;j--)
   {
      if (TimeDay(iTime(Val,PERIOD_H1,j))==TimeDay(iTime(Val,PERIOD_H1,j+1)) &&
            TimeHour(iTime(Val,PERIOD_H1,j))/3==TimeHour(iTime(Val,PERIOD_H1,j+1))/3)
      {
         HighH3[k]=MathMax(iHigh(Val,PERIOD_H1,j),iHigh(Val,PERIOD_H1,j+1));
         LowH3[k]=MathMin(iLow(Val,PERIOD_H1,j),iLow(Val,PERIOD_H1,j+1));
         CloseH3[k]=iClose(Val,PERIOD_H1,j);
      }
      if (TimeDay(iTime(Val,PERIOD_H1,j))==TimeDay(iTime(Val,PERIOD_H1,j+1)) ||
            TimeHour(iTime(Val,PERIOD_H1,j))/3==TimeHour(iTime(Val,PERIOD_H1,j+1))/3)
      {
         k++;
         TimeH3[k]=TimeDay(iTime(Val,PERIOD_H1,j))+TimeHour(iTime(Val,PERIOD_H1,j))/3*3;
         OpenH3[k]=iOpen(Val,PERIOD_H1,j);
         HighH3[k]=MathMax(iHigh(Val,PERIOD_H1,j),iHigh(Val,PERIOD_H1,j+1));
         LowH3[k]=MathMin(iLow(Val,PERIOD_H1,j),iLow(Val,PERIOD_H1,j+1));
         CloseH3[k]=iClose(Val,PERIOD_H1,j);
      }
   }
   ArraySetAsSeries(TimeH3,true);
   ArraySetAsSeries(OpenH3,true);
   ArraySetAsSeries(HighH3,true);
   ArraySetAsSeries(LowH3,true);
   ArraySetAsSeries(CloseH3,true);
}


ЗЫ: Ошибки где-то есть стопудова.

 
Я вот тут написал функцию для конвертации Н3 в массивы.
Это правильно или есть ошибки?

Не знаю. Потестируйте, сделайте вывод массивов в файл, сравните с тем, что должно быть. Тогда и узнаете.

Могу порекомендовать также поработать со скриптом период_конвертер. Там уже все есть !
Осознайте это. Ваша задача просто заменить вывод в файл выводом в массив.
И вставить этот кусок в эксперт.
 
Я вот тут написал функцию для конвертации Н3 в массивы.
Это правильно или есть ошибки?

Не знаю. Потестируйте, сделайте вывод массивов в файл, сравните с тем, что должно быть. Тогда и узнаете.

Могу порекомендовать также поработать со скриптом период_конвертер. Там уже все есть !
Осознайте это. Ваша задача просто заменить вывод в файл выводом в массив.
И вставить этот кусок в эксперт.

Скрипт весьма глючный. Сама метода создания баров такая. Из-за этого постоянные глюки. То бары пропадают то удваиваются все бары. Если бросить на дневку то включаются выходные. Вобщем не подходит.
Одну ошибку нашел - время вообще неправильно считалось.