オープンポジションをグループ分けする - ページ 7

 

私の意見ですが、新しいポジション(とその6つのプロパティ)をポジション構造に追加するための、より高速で効率的なアルゴリズムはないでしょうか?私の場合は、ブルートフォースで本当に新しい位置であることを確認し、必要なパラメータの値を取得し、配列を1つ増やして新しい要素を書き込む、というような動作をしています。拡大表示と書き込みは、別のやり方でもいいし、そうするべきだと記事で読んだことがあります。そこで指定された関数が端末に見当たらず、どのように埋めればいいのかわかりません。

 
Sergey Voytsekhovsky:

私の意見ですが、新しいポジション(とその6つのプロパティ)をポジション構造に追加するための、より高速で効率的なアルゴリズムはないでしょうか?私の場合は、ブルートフォースで本当に新しい位置であることを確認し、必要なパラメータの値を取得し、配列を1つ増やして新しい要素を書き込む、というような動作をしています。拡大表示と書き込みは、別のやり方でもいいし、そうするべきだと記事で読んだことがあります。そこで指定された関数が端末に見当たらず、どのように埋めればいいのかわかりません。

本当に新しいポジションかどうか」を判断するために、ポジションを探そうとしないでください。別の方法を探す。例えば、OnTradeTransactionの 中で。また、配列のオーバーフローではなく、ArrayRemove関数を使用してみてください。

 
Alexey Viktorov:

本当に新しいポジションかどうか」を判断するために、ポジションを探そうとしないでください。別の方法を探す。例えば、OnTradeTransactionの 中で。 また、配列のオーバーフローではなく、ArrayRemove関数を使用してみてください。

リスペクトさん、早速のサポートと親切なアドバイスありがとうございます!さっそく始めてみます。とどのようにサイズに+1せずに配列のデータの末尾に追加するには、既製のクラス端子から式が上に投げるのですか?では、次に大まかな展開を、私の頭の中に隙間ができないように、お願いします。

 
Sergey Voytsekhovsky:

そして、どのようにサイズに+1せずに配列のデータの末尾に追加するには、既製のクラスの端末から式が投げる?では次に、私の頭の中に隙間ができないように、全体的な展開をお願いします。

自分で方法を見つけたのですが、どのように取り付けるのか、経験不足で思いつきません。外国語の存在すら知らないのに、その言語をマスターするのは難しい。これは余談です。

//+------------------------------------------------------------------+
//| Adding an element to the end of the array                        |
//| Добавление элемента в конец массива                              |
//+------------------------------------------------------------------+
bool CArrayInt::Add(const int 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);
  }

どのようにねじ込めばいいのですか?どんなアレイを育てたいのか、どこに置くのか。配列が構造体である場合は?

 
Sergey Voytsekhovsky:

リスペクトさん、早速のサポートと親切なアドバイスありがとうございます!さっそく始めてみます。とどのようにサイズに+1せずに配列のデータの末尾に追加するには、既製のクラス端子から式が上に投げるのですか?では、次に大まかな展開を、私の頭の中に隙間ができないように、お願いします。

既成のクラスは使わないようにしています。CTradeは、トレーディングパネルの作成にしか使っていません。CTradeを自分用に書き換えるのは億劫だし、パネルは自分には複雑で理解する気も起きない。だから、配列への+1や構造体要素の充填は、3つのループに比べれば、そんなに遅れないと思うのです。
 
Sergey Voytsekhovsky:

方法自体はわかったのですが、経験が浅いため、どう応用すればいいのかがわからないのです。外国語の存在すら知らないのに、その言語をマスターするのは難しい。これは余談です。

では、どうやって取り付けるのか?

構造体の配列に......まさか。

 
Sergey Voytsekhovsky:

方法自体はわかったのですが、経験が浅いため、どう応用すればいいのかがわからないのです。外国語の存在すら知らないのに、その言語をマスターするのは難しい。これは余談です。

では、どうやって取り付けるのか?

そしてこれは、私の理解が正しければ、むしろOOPオブジェクトの配列のためのものです。
 
Alexey Viktorov:
そしてこれは、私の理解が正しければ、むしろOOPオブジェクトの配列のためのものです。

もっと」ではなく、「そこから」です。

 
Alexey Viktorov:
既成のクラスは使わないようにしています。CTradeは、トレーディングパネルの作成にのみ使用しています。CTradeを自分のニーズに合わせて書き換えるのは億劫だし、かといってパネルは複雑すぎて理解するのに抵抗がある。だから、配列に+1して構造体の要素を埋めるのは、3つのループに比べたらそんなに遅れないと思うんだけど。

しかし、「3つのループ」については、非常に理解しやすかったですし、ありがとうございます。 質の高いシンプルなソリューションが得られると、いつも「なぜ自分で気づかなかったのだろう」と思うほど、当たり前のことなのです。ありがとうございます。

 
Artyom Trishkin:

もっと」ではなく、「ここから」です。

教えてください!記事https://www.mql5.com/ru/articles/567 には、以下のようなコードと記載があります。

Этот класс находятся в файле "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)+" мс"); // Сообщение о времени, затраченном на второй вариант

  }

しかし、標準パッケージでは見つけられませんでした。よく見ていないのか、記事が古いのか?