MetaTrader <sup>®</sup> 4 build 157 - страница 5

 
Slawa, если возможно ответьте еще на несколько вопросов
по работе с массивами. Я их поставил в другую тему, но там
они висят без ответа.

Как MT4 работает с массивами ?

Насколько я понимаю при переходе на следующий бар в начало массива
добавляется новый элемент, а все бывшие сдвигаются на единицу вперед.

Это происходит со всеми объявленными массивами или только с
какими-то конкретными ?

Такой сдвиг - очень удобный инструмент. Могу ли я такой сдвиг делать
в моем вспомогательном массиве не при переходе на новый бар, а по
другому событию. Например по приходу новой котировки ?

Можно ли ограничить длину массива так, чтобы при таком сдвиге самый
старый элемент терялся и число элементов в массиве не менялось ?
 
2 Slawa
avm, мы ещё раз пересмотрим наши функции и у некоторых из них (в том числе ArraySort) уберём параметры по умолчанию.

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

Никаких сдвигов - данные добавляются в конец. Двигать массивы ради вставки в начало - чистое сумашествие.
 
2 Slawa
avm, мы ещё раз пересмотрим наши функции и у некоторых из них (в том числе ArraySort) уберём параметры по умолчанию.

Вообще-то я обращал Ваше внимание на порядок "следования" параметров в ArraySort. А что касается умолчальных значений, то как раз в ArraySort они нужны, т.к. работа с массивом в подавляющем большинстве случаев происходит со всем массивом данных.

Мы уже видели неправильное использование этой функции. Если люди делают такие ошибки, то надо сделать так, чтобы таких ошибок вообще небыло. То есть - убрать умолчания чтобы компилятор требовал явного указания параметров.
 
Вот такая беда с Историей счета.
В пятницу сбросил каталог MT на флэшку, перетащил домой. в понедельник, вторник потрудился. Во вторник вечером опять все сбросил на флэшку. Сегодня с флэшки скинул все в каталог MT. Запустил прогу, подключился к счету. посмотрел, что с открытыми ордерами, перешел на историю, глядь а ее нет. Сказал показать всю-Нет и не как нет (вчера все было). Думал может это сервер Алпари чего-то не того, подключился к вашему серваку (другой счет), и тут истории нет. ЧТО БЫ ЭТО ЗНАЧИЛО?
 
Насколько я понимаю при переходе на следующий бар в начало массива
добавляется новый элемент, а все бывшие сдвигаются на единицу вперед.

Никаких сдвигов - данные добавляются в конец. Двигать массивы ради вставки в начало - чистое сумашествие.


Renat,
Ну значит нумерация элементов в массиве с конца в начало. Так ?
Ведь текущий, то есть последний бар на графике идет с номером 0.
И во всех массивах типа Close[] или в массивах индикаторов
нулевой элемент соответствует последнему бару.
 
Yurixx, именно так. разница между простым массивом и таймсерией заключается всего лишь в способе нумерации элементов массива. посмотрите описания функций ArrayGetAsSeries, ArraySetAsSeries
 
Вот такая беда с Историей счета.


ВСЕ ПОНЯЛ. Дата на компе перескачила на 2004 год
 
Yurixx, именно так. разница между простым массивом и таймсерией заключается всего лишь в способе нумерации элементов массива. посмотрите описания функций ArrayGetAsSeries, ArraySetAsSeries


Спасибо, посмотрел. Но понял не все.

В примерах разных индикаторов, приложенных к MT4, часто используются
массивы. Причем, длина у таких массивов не объявлена и периодически происходит добавление нового элемента и переиндексация, так, что этот
новый элемент всегда идет под номером 0.

1. Есть единственное событие при котором это происходит - переход на новый бар. Так ?

2. С какими массивами это происходит, а с какими нет ? Ведь не может быть, чтобы это происходило со всеми массивами.

Извините за такое количество вопросов. Если бы MQL4 и работа системы были
описаны по-человечески, а не так скупо, то их бы было поменьше.
 
Новая "фича".
Как то ругались тут, что в циклах счетчик объявляется неявно.
   for(int i=0; i<limit; i++)
      {
      MomBuffer[i]=Close[i]-Close[i+PeriodTDI];
      MomAbsBuffer[i]=MathAbs(MomBuffer[i]);
      }


То есть, строки int i; не требовалось. Renat тогда сказал, что пусть это будет "фича" mql-4. Потом пришли к выводу, что нужно от нее избавиться. Видимо избавились.
Теперь другая штука:

   for(int i=0; i<limit; i++)
      {
      MomBuffer[i]=Close[i]-Close[i+PeriodTDI];
      MomAbsBuffer[i]=MathAbs(MomBuffer[i]);
      }
   for(int k=0; k<limit; k++)
      {
      MomSumBuffer[k]=iMAOnArray(MomBuffer,0,PeriodTDI,0,MODE_SMA,k)*PeriodTDI;
      MomSumAbsBuffer[k]=MathAbs(MomSumBuffer[k]);
      }

   for(int l=0; l<limit; l++)
      {
      MomAbsSumBuffer[l]=iMAOnArray(MomAbsBuffer,0,PeriodTDI,0,MODE_SMA,l)*PeriodTDI;
      MomAbsSum2Buffer[l]=iMAOnArray(MomAbsBuffer,0,2*PeriodTDI,0,MODE_SMA,l)*2*PeriodTDI;
      TDI_Buffer[l]=MomAbsSumBuffer[l]-MomAbsSum2Buffer[l];
      }



Тут три цикла, и на каждый цикл новый счетчик. Сами счетчики i,k,l в явном виде не объявляются, компилятор это проглатывает норамльно. Но почему же три разных счетчика, когда можно было бы обойтись одним - спросите вы? А вы попробуйте сами.... :)

Причина обращения: