Подскажите про массивы - страница 4

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
PetrDr
460
PetrDr  
Alexey Viktorov:

А вместо предположений проверить было трудно? Или мама не разрешила?

Результат

Тип datetime как и int занимают 4 байта памяти. Итого 4000000 байт или 4000000/1024=3906,25 килобайт или 3,8 мегабайт.

Это экзамен? Я должен был выложить готовый полный код или просто дать направление мысли?

Если тут всё просто зачем задавать вопросы?

Надо наверно еще зарезервировать большее место под массив в вашем методе, иначе ArrayResize тратит время. Копирование туда сюда со сдвигом ~15 массивов + минимальный расчет занимает 250мкс.

Alexey Viktorov
27618
Alexey Viktorov  
Petr Doroshenko:

Надо наверно еще зарезервировать большее место под массив в вашем методе, иначе ArrayResize тратит время. Копирование туда сюда со сдвигом ~15 массивов + минимальный расчет занимает 250мкс.

А где в моём коде ArrayResize можете показать???

И внимательно прочтите выделенный вопрос.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Подскажите про массивы

Alexey Viktorov, 2017.12.07 09:25

А вместо предположений проверить было трудно? Или мама не разрешила?

/********************Script program start function*******************/
void OnStart()
{
 srand(GetTickCount());
 ulong st = GetMicrosecondCount();
 int arr[1000000];
 for(int i = 0; i < 1e6; i++)
  arr[i] = rand();
  Print("Заполнение массива ", GetMicrosecondCount()-st, " микросекунд");
  ulong st1 = GetMicrosecondCount();
  ArrayCopy(arr, arr, 0, 1);
  Print("Копирование массива ", GetMicrosecondCount()-st1, " микросекунд");
  Print("Общее время ", GetMicrosecondCount()-st, " микросекунд");
}/*******************************************************************/

Результат

2017.12.07 11:13:53.385 Test_ArrayCopy (EURJPY,H1)      Заполнение массива 1917 микросекунд
2017.12.07 11:13:53.395 Test_ArrayCopy (EURJPY,H1)      Копирование массива 696 микросекунд
2017.12.07 11:13:53.395 Test_ArrayCopy (EURJPY,H1)      Общее время 2653 микросекунд

Тип datetime как и int занимают 4 байта памяти. Итого 4000000 байт или 4000000/1024=3906,25 килобайт или 3,8 мегабайт.

Это экзамен? Я должен был выложить готовый полный код или просто дать направление мысли?

Если тут всё просто зачем задавать вопросы?


PetrDr
460
PetrDr  
Alexey Viktorov:

А где в моём коде ArrayResize можете показать???

И внимательно прочтите выделенный вопрос.

1) Нет, не интересно.

2) Я просто дал существенное дополнение к направлению мысли.

Прошу прощения, был безмерно туп и не включил еще одно Ваше сообщение в свой ответ. Ваше сообщение:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Подскажите про массивы

Alexey Viktorov, 2017.12.06 08:16

Если массив не многомерный и не статический, вот ещё вариант сдвига.

bool asSeries = ArrayGetAsSeries(arr);
ArraySetAsSeries(arr, (asSeries, ? false : true));
ArrayResize(arr, ArraySize(arr)-1);
ArraySetAsSeries(arr, asSeries);
Таким образом, нулевой индекс массива станет последним, затем убавим размерность, в этот момент последний элемент массива будет удалён, вернём направление индексации в прежнее состояние. Теперь последний элемент массива(который совсем недавно был предпоследним, а до этого первым) станет нулевым.


НО!!! Прежде чем говорить о скорости выполнения ArrayCopy надо-бы проверить несколько раз.

Код написан "на коленке" так-что если есть ошибки, не обессудьте... не проверял.

Всем мира.
Dmitiry Ananiev
9724
Dmitiry Ananiev  

для 10 элементов нужно применять прямой перебор и смещение внутри массива. 

что-то типа 

double x[10] = {1.0,3.0,4.0,6.0,7.5,8}
for (int i =9; i>=1;i--)
{
 x[i-1] = x[i]; 
}
x[9] = 10.2;

А если элементов к примеру 10000 и более, то быстрее будет работать кольцевой буфер. 

 А вот копировать массивы туда сюда - самый неудачный вариант.
PetrDr
460
PetrDr  
Dmitiry Ananiev:

для 10 элементов нужно применять прямой перебор и смещение внутри массива. 

что-то типа 

А если элементов к примеру 10000 и более, то быстрее будет работать кольцевой буфер. 

 А вот копировать массивы туда сюда - самый неудачный вариант.

Кольцевой буфер(в виде освященных статей) - реализуется(дублируется) индексация массива через самый высокий(самый медленный) уровень, который предоставила среда mql своим языком программирования(mql).

Копирование(работа с) массивов средствами mql - задействуется индексация массива внутренними средствами среды mql, которые быстрее ее языка программирования(mql).

Если кто желает более медленной реализацией дублировать существующую более быструю индексацию внутренними средствами среды mql - личный выбор/хочуха.

Vasiliy Sokolov
35112
Vasiliy Sokolov  

Ребята, вы какой-то бестолковщиной маетесь. Задача решается для неограниченного количества комбинаций, за линейной время, без перестроения массива и всяких там копирований.

ovak77
214
ovak77  

Вдогонку. Поизучал загрузку массивов из файла в индикаторные буферы и в справке, кажется в FileWriteDouble наткнулся на структуру загрузки данных в буфер, цикл жутко долгий, поэкспериментировал, из FileReadArray на тысяче индексов норм, для индикатора потянет, но на миллионе не фонтан. Беда в том, что запись данных через FileWriteArray и FileSeek может быть не по порядку, например, случайно можно записать данные из тестера, а у него rates_total не совпадает с rates_total из терминала. Практическое применение у подобного невелико, может быть для MqlTick, (я экспериментировал с вычислением реального спреда, причем я был немало удивлен разбросом между заявленным и реальным, OnCalculate выдает одну цифру, а индикатор показал совсем иные), но вдруг в будущем пригодится. Идеальным был бы вариант произвести синхронизацию в OnInit, прогнать цикл в нем, но нет способа из OnInit узнать rates_total, пробовал привязку ко времени при записи, пробовал записывать rates_total, как индекс, но они с терминальным различаются, проблема синхронизации является актуальной проблемой

 if(handle1!=INVALID_HANDLE)
     {
      for(int i=rates_total-1; i>0; i--)
        {
         static int size_l;
         if(size_l==size_f) break;
         if(time[i]==arr[size_l].time_str)
           {
            ExtVolumesBufferU[i]=arr[size_l].max_str;
            ExtColorsBufferU[i]=arr[size_l].color_str;
            size_l++;
            i=rates_total-1;
            continue;
           }
        }
      ArrayFree(arr);
      handle1=INVALID_HANDLE;
     }
ovak77
214
ovak77  
Alexey Viktorov:

Кривыми руками ничего делать нельзя.

Проверяйте прежде чем такое говорить.

Можете в отладчике посмотреть значения, а можете добавить распечатку или комментарий графика.


А мне
ArrayCopy(arr, arr, 0, 1);

идеально подошел для суммирования десятка последних баров, больше и не надо, спс

Konstantin Seredkin
610
Konstantin Seredkin  

Ребята помогите и мне пожалуйста, со стаканом не работал ранее, нашел код что бы чисто по эксперементировать

Есть код работы со стаканом

void OnBookEvent(const string &symbol)
{
MqlBookInfo GlassArray[];
if (MarketBookGet(MySymbol,GlassArray) && CreateTwoArrays(GlassArray))    //прочитали стакан и успешно разбили на 2
   {
    // тут торговые условия по вызову функции установки ордеров
   }
}

Сама функция 

bool CreateTwoArrays(MqlBookInfo &glassArray[])
{
   int size=ArraySize(glassArray);
   int NBuysStart=0;
   
   for(int i=0;i<size;i++)                      //определим покупки и продажи
   {
     if (glassArray[i].type == BOOK_TYPE_BUY && i>0)
     {
        NBuysStart = i;
        break;
     }
   if(i==size-1)return 0;
   }
//---------   
   for(int i=0;i<NBuysStart;i++)                //создаем массив оферов в стакане
   {
      Offers[i]=glassArray[NBuysStart-1-i];
      
   }
//---------
   for(int i=0;i<size-NBuysStart;i++)           //создаем массив бидов в стакане
   {
      Bids[i]=glassArray[NBuysStart+i];
     
   }
   return 1;
}

Вот в ней происходит выход за пределы массива и робот слетает

Ругается на строки кода в которой находится переменная NBuysStart

Offers[i]=glassArray[NBuysStart-1-i];
Bids[i]=glassArray[NBuysStart+i];

Rafil Nurmukhametov
1854
Rafil Nurmukhametov  
Konstantin Seredkin:

Ребята помогите и мне пожалуйста, со стаканом не работал ранее, нашел код что бы чисто по эксперементировать

Есть код работы со стаканом

Сама функция 

Вот в ней происходит выход за пределы массива и робот слетает

Ругается на строки кода в которой находится переменная NBuysStart


размер массивов Offers и Bids укажите

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий