//+------------------------------------------------------------------+//| Adding an element to the end of the array |//| Добавление элемента в конец массива |//+------------------------------------------------------------------+bool CArrayInt::Add(constint element)
{
//--- check/reserve elements of array//--- проверка / резерв элементов массиваif(!Reserve(1))
return(false);
//--- add
m_data[m_data_total++]=element;
m_sort_mode=-1;
//--- successful//--- успешныйreturn(true);
}
Этот класс находятся в файле "CDynamicArray.mqh" приложения. Файл должен располагаться в каталоге "MQL5\Include" каталога данных терминала.
class CDynamicArray
{
private:
int m_ChunkSize; // Размер блокаint m_ReservedSize; // Реальный размер массиваint m_Size; // Количество занятых элементов массиваpublic:
double Element[]; // Собственно массив. Находится в секции public, // чтобы в случае необходимости работать с ним напрямую//+------------------------------------------------------------------+//| Конструктор |//+------------------------------------------------------------------+void CDynamicArray(int ChunkSize=1024)
{
m_Size=0; // Количество занятых элементов
m_ChunkSize=ChunkSize; // Размер блока
m_ReservedSize=ChunkSize; // Реальный размер массиваArrayResize(Element,m_ReservedSize); // Подготовка массива
}
//+------------------------------------------------------------------+//| Функция добавления в конец массива |//+------------------------------------------------------------------+void AddValue(double Value)
{
m_Size++; // Увеличение количества занятых элементовif(m_Size>m_ReservedSize)
{ // Требуемое количество больше реального размера массива
m_ReservedSize+=m_ChunkSize; // Рассчитываем новый размер массиваArrayResize(Element,m_ReservedSize); // Увеличиваем реальный размер массива
}
Element[m_Size-1]=Value; // Добавляем значение
}
//+------------------------------------------------------------------+//| Функция получения количества занятых элементов массива |//+------------------------------------------------------------------+int Size()
{
return(m_Size);
}
};
Этот класс находятся в файле "CDynamicArray.mqh" приложения. Файл должен располагаться в каталоге "MQL5\Include" каталога данных терминала.
Сравним быстродействие при последовательном увеличении массива на 1 и при увеличении размера массива блоками:
int n=50000;
double ar[];
CDynamicArray da;
//--- Вариант 1 (увеличение размера по 1-му элементу)long st=GetTickCount(); // Запомним время начала ArrayResize(ar,0); // Установка нулевого размера массива for(int i=0;i<n;i++)
{
ArrayResize(ar,i+1); // Последовательное изменение размера массива
ar[i]=i;
}
Alert("Вариант 1: "+IntegerToString(GetTickCount()-st)+" мс"); // Сообщение о времени, затраченном на первый вариант//--- Вариант 2 (увеличение размера блоками)
st=GetTickCount(); // Запомним время начала for(int i=0;i<n;i++)
{
da.AddValue(i); // Добавляем элемент
}
Alert("Вариант 2: "+IntegerToString(GetTickCount()-st)+" мс"); // Сообщение о времени, затраченном на второй вариант
}
在我看来,有没有一种更快更有效的算法来向位置结构添加一个新的位置(及其6个属性)?在我这里,它是这样工作的--我使用蛮力来确保位置确实是新的,得到所需参数的值,将数组增加1,然后写一个新的元素。我在文章中看到,放大和写入可以而且应该以不同方式进行。我在我的终端中没有找到那里指定的函数,我不知道如何填充它。
在我看来,有没有一种更快更有效的算法来向位置结构添加一个新的位置(及其6个属性)?在我这里,它是这样工作的--我使用蛮力来确保位置确实是新的,得到所需参数的值,将数组增加1,然后写一个新的元素。我在文章中看到,放大和写入可以而且应该以不同方式进行。我在我的终端中没有找到那里指定的函数,我不知道如何填充它。
不要试图通过搜索职位来确定 "该职位确实是新的"。找到另一种方法。例如,在OnTradeTransaction 中。并尝试使用ArrayRemove函数来代替数组的溢出
不要为了确定 "该职位真的是新的 "而尝试很多职位。找到另一种方法。例如,在OnTradeTransaction 中。 并尝试使用ArrayRemove函数来代替数组的溢出
尊重,感谢你的及时支持和有益的建议,我将开始工作。如何将数据添加到数组的尾部而不+1到大小,公式从现成的类终端扔过来?好了,现在是一般的发展,为了不在我的脑子里留下空白,请问?
而如何将数据添加到数组的尾部而不+1到大小,公式从现成的类终端抛出?好了,现在是一般的发展,为了不在我的脑子里留下空隙,请问?
我自己找到了方法,但如何附加,我不明白,没有足够的经验。当你甚至不知道一门外语的存在时,就很难掌握它。这是个题外话。
我怎样才能把它拧上呢?你把你想种的什么阵列放在哪里?如果数组是一个结构呢?
尊重,感谢你的及时支持和有益的建议,我将开始工作。如何将数据添加到数组的尾部而不+1到大小,公式从现成的类终端扔过来?好了,现在是一般的发展,为了不在我的脑子里留下空白,请问?
我找到了方法本身,但我不知道如何应用它,因为我没有足够的经验。当你甚至不知道一门外语的存在时,就很难掌握它。这是个题外话。
那么,我怎样才能把它拧上呢?
对你的结构阵列--没门。
我找到了方法本身,但我不知道如何应用它,因为我没有足够的经验。当你甚至不知道一门外语的存在时,就很难掌握它。这是个题外话。
那么,我怎样才能把它拧上呢?
而这,如果我理解正确的话,更多的是针对OOP对象数组。
不是 "更多",而是来自那里。
我尽量不使用现成的课程。我只用 CTrade 来创建交易面板。我懒得为自己的需要重写 CTrade,而面板对我来说太复杂了,我不愿意去理解它们。这就是为什么我确信+1到数组并填充结构元素与三个循环相比并没有那么大的延迟。
这个想法很清楚,不清楚为什么我们不应该使用现成的算法,但关于 "三个循环"--非常好理解,谢谢。 当你得到高质量的简单解决方案时,我总是在想为什么我自己没有想出来,因为它是如此明显。谢谢你。
不是 "更多",而是从这里开始。
请告诉我,文章https://www.mql5.com/ru/articles/567,有以下代码并提到了
但我在标准包装中找不到它。是没仔细看,还是文章过时了?