//+------------------------------------------------------------------+//| 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して構造体の要素を埋めるのは、3つのループに比べたらそんなに遅れないと思うんだけど。
しかし、「3つのループ」については、非常に理解しやすかったですし、ありがとうございます。 質の高いシンプルなソリューションが得られると、いつも「なぜ自分で気づかなかったのだろう」と思うほど、当たり前のことなのです。ありがとうございます。
もっと」ではなく、「ここから」です。
教えてください!記事https://www.mql5.com/ru/articles/567 には、以下のようなコードと記載があります。
しかし、標準パッケージでは見つけられませんでした。よく見ていないのか、記事が古いのか?