初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 573

 
Andrey Koldorkin:

何か考えてみるよ。ありがとうございます(苦笑)。

どういたしまして。これは、すべてのハイスコアを配列に保存し、配列に保存されたすべてのデータをループでログに出力しているだけです。

このスクリプトは、必ずしも必要なことを正確に実行するわけではありません。単に、データが配列に格納されている様子を示しているだけです。

 
Artyom Trishkin:

そんなことはありません。単純に全高を配列に保存し、配列に保存された全データをログブックにループして出力します。

このスクリプトは、必ずしもあなたが必要とすることを正確に行うものではありません。これは、データを配列に保存する原理を示しただけです。

まさに私が求めていたものです。どうにかして、選択した期間のデータを配列に保存する必要がありました。その辺は、あなたから理解しました。

そこで質問ですが、配列に記録されたデータにアクセスし、比較するにはどうしたらよいのでしょうか?

ここで、反復して、一歩一歩、配列を書き込むことが判明しました。これはいい。しかし、今度は要素同士を比較する必要があります。

新たに反復回数を宣言して、データを取得し、何らかの方法で比較する必要があるのでしょうか。しかし、これまたどこかに結果を書き込まないといけないし・・・。が繰り返される。

大雑把に言うと、比較対象期間がローソク足5~7本なら、1本目は他の6本と比較し、2本目は...といった具合になります。そして、2つ以上のローソク足のHighが同じであれば、まず、このHighを計算し、次に、Lowが最も低いローソク足を探せばいいのです。すなわち、具体的なローソク足を最後に呼び出して、そのパラメータをすべて取得する機能です。

一般的に可能なのでしょうか?

 
Andrey Koldorkin:

というのは、まさに私が求めていたものです。どうにかして、選択中の期間のデータを配列に格納する必要がありました。そこは理解できました。

そこで質問ですが、配列に記録されたデータにアクセスし、比較するにはどうしたらよいのでしょうか?

ここで、反復して、一歩一歩、配列を書き込むことが判明しました。これはいい。しかし、今度は要素同士を比較する必要があります。

新たに反復回数を宣言して、データを取得し、何らかの方法で比較する必要があるのでしょうか。しかし、これまたどこかに結果を書き込まないといけないし・・・。が繰り返される。

大雑把に言うと、比較対象期間がローソク足5~7本なら、1本目は他の6本と比較し、2本目は...といった具合になります。そして、2つ以上のローソク足のHighが同じであれば、まず、このHighを計算し、次に、Lowが最も低いローソク足を探せばいいのです。すなわち、具体的なローソク足を最後に呼び出して、そのパラメータをすべて取得する機能です。

しかし、それは可能なのでしょうか?

ここでは、保存された配列に問い合わせ、保存されたすべてのデータをログに表示しているだけです。

for(int i=0; i<ArrayRange(mass_high,0); i++) {
   printf("Время: %s, High: %.5f",TimeToString((int)mass_high[i][1],TIME_DATE|TIME_MINUTES),mass_high[i][0]);
   }

もっと具体的にタスクを説明しよう。

保存された配列の中から......何を見つける必要があるのでしょうか?

 
Artyom Trishkin:

ここでセーブされたアレイを照会し、セーブされたデータをすべてログに記録します。

タスクを具体的に説明しよう。

保存された配列の中から......具体的に何を探すのか?

私は、設定に指定されている期間のすべての閉じたろうそく(すなわち、現在のものはカウントされません) - 高、低、オープン、クローズキャンドル(4パラメータ)のデータの配列を記録する必要があります。- である。

次に、パラメーターを比較する必要がありますね。検索期間をローソク足10本分とします。ここでは、10本のローソク足の期間のすべての高値を確認する必要があります。2つ以上のマッチングがあれば、戻るべきです。

1.フラグ 「一致しました。

1.ローソク足が同じ値を持つ高値のこと。

2.これらのローソク足の番号を参照し、安値、終値、始値のパラメータを見つけることができます。

一般的には、このやり方が多く理解されています。

明確でないのは、レベルを形成しているローソク足をどのように参照するかである。再計算の際に、反復回数(i)を記憶しておくのが理想ですが、まずログが書き込まれていることに従って再計算を行い、それを適用することができません。

そして、そのバリエーションでは、出力ログに記録されているように、これもまた要求されていない。

まずローソク足1をとって他の9本と比較し、一致するものがあれば、そのローソク足の本数とパラメータを抽出し、チェックボックスをオンにする必要があることは理解したのですが。その後、キャンドル2を他のものと一緒にチェックするなど、サンプルの真ん中あたりまで、反対側からのみ比較の重複が発生するためです。

もしローソク足の本数が決まっていたら、こんな風に書いていたと思います。だいたい5回の比較サイクルになります。しかし、それが問題なのです。どのようなサンプルサイズでも、そのような再計算を可能にするにはどうしたらいいのでしょう。

 
Andrey Koldorkin:

私は設定で指定された期間のすべての閉じたローソク(つまり、現在のものはカウントされません) - 高、低、オープン、クローズローソク(4パラメータ)のデータの配列を記述する必要があります。- である。

次に、パラメーターを比較する必要がありますね。検索期間をローソク足10本分とします。ここでは、10本のローソク足の期間のすべての高値を確認する必要があります。2つ以上一致した場合は、リターンしてください。

1.フラグ 「一致しました。

1.ローソク足が同じ値を持つ高値のこと。

2.これらのローソク足の番号を参照し、安値、終値、始値のパラメータを見つけることができます。

一般的には、このやり方が多く理解されています。

明確でないのは、レベルを形成しているローソク足をどのように参照するかである。理想的には、再計算するときに、反復回数(i)を記憶しておけばよいのですが、最初にログを書き込むことによる再計算があり、それを適用することができないのです。

そして、そのバリエーションでは、出力ログに記録されているように、これもまた要求されていない。

まずローソク足1をとって他の9本と比較し、一致するものがあれば、そのローソク足の本数とパラメータを抽出し、チェックボックスをオンにする必要があることは理解したのですが。その後、キャンドル2を他のものと一緒にチェックするなど、サンプルの真ん中あたりまで、反対側からのみ比較の重複が発生するためです。

もしローソク足の本数が決まっていたら、こんな風に書いていたと思います。だいたい5回の比較サイクルになります。しかし、それが問題なのです。どのようなサンプルサイズでも、そのような再計算を可能にするにはどうしたらいいのでしょう。

ついでに言うと、物価の値が正確に一致することは、頻繁にあることではないと思われます。ある程度のデルタを設定し、この値以上に価格が違わなければ偶然と考える必要がある。

そこで、レンジ内のローソク足ごとに一致するローソク足のリストが別途必要な場合は、構造体の配列を使ってみることにします。考えてお知らせします。
 
Andrey Koldorkin:

私は設定で指定された期間のすべての閉じたローソク(つまり、現在のものはカウントされません) - 高、低、オープン、クローズローソク(4パラメータ)のデータの配列を記述する必要があります。- である。

次に、パラメーターを比較する必要がありますね。検索期間をローソク足10本分とします。ここでは、10本のローソク足の期間のすべての高値を確認する必要があります。2つ以上のマッチングがあれば、戻るべきです。

1.フラグ 「一致しました。

1.ローソク足が同じ値を持つ高値のこと。

2.これらのローソク足の番号を参照し、安値、終値、始値のパラメータを見つけることができます。

一般的には、このやり方が多く理解されています。

明確でないのは、レベルを形成しているローソク足をどのように参照するかである。理想的には、再計算するときに、反復回数(i)を記憶しておけばよいのですが、最初にログを書き込むことによる再計算があり、それを適用することができないのです。

そして、そのバリエーションでは、出力ログに記録されているように、これもまた要求されていない。

まずローソク足1をとって他の9本と比較し、一致するものがあれば、そのローソク足の本数とパラメータを抽出し、チェックボックスをオンにする必要があることは理解したのですが。その後、キャンドル2を他のものと一緒にチェックするなど、サンプルの真ん中あたりまで、反対側からのみ比較の重複が発生するためです。

もしローソク足の本数が決まっていたら、こんな風に書いていたと思います。だいたい5回の比較サイクルになります。しかし、それが問題なのです。どのようなサンプルサイズでも、そのような再計算を可能にするにはどうしたらいいのでしょうか。

フラグ「一致」の代わりにカウンタを設定し、カウンタが最大となる値の高さで、レベル

高値は切り上げ可能で、例えば1.23456は1.2346になります。

と1.23462を切り上げたものです。

10本のローソク足のうち、2本が1.23456の高値になることはまずありえないので

を踊る

で、ローソク足の本数が決まっている場合、構造体に一定量のデータを書き込むと

すなわち、構造体に書かれたローソク足の数は、同じ反復回数である

 
Andrey Koldorkin:

私は設定で指定された期間のすべての閉じたローソク(つまり、現在のものはカウントされません) - 高、低、オープン、クローズローソク(4パラメータ)のデータの配列を記述する必要があります。- である。

次に、パラメーターを比較する必要がありますね。検索期間をローソク足10本分とします。ここでは、10本のローソク足の期間のすべての高値を確認する必要があります。2つ以上のマッチングがあれば、戻るべきです。

1.フラグ 「一致しました。

1.ローソク足が同じ値を持つ高値のこと。

2.これらのローソク足の番号を参照し、安値、終値、始値のパラメータを見つけることができます。

一般的には、このやり方が多く理解されています。

明確でないのは、レベルを形成しているローソク足をどのように参照するかである。理想的には、再計算するときに、反復回数(i)を記憶しておけばよいのですが、最初にログが書き込まれることによる再計算があり、それを適用することができません。

そして、そのバリエーションでは、出力ログに記録されているように、これもまた要求されていない。

まずローソク足1をとって他の9本と比較し、一致するものがあれば、そのローソク足の本数とパラメータを抽出し、チェックボックスをオンにする必要があることは理解したのですが。その後、キャンドル2を他のものと一緒にチェックするなど、サンプルの真ん中あたりまで、反対側からのみ比較の重複が発生するためです。

もしローソク足の本数が決まっていたら、こんな風に書いていたと思います。だいたい5回の比較サイクルになります。しかし、ここで問題なのは、どのようなサンプルサイズでもそのような再計算を可能にするにはどうしたらよいかということです。

面白い課題ですが、今のところ プログラミングの知識があまりないため、この問題の解き方に対する理解が正しくありません。

見てください、あなたが持っているのは、いくつかの引用文です。この中から、ある条件を満たした棒だけを選び出すのが、あなたの仕事です。例えば、高値が一致するバーの集合を取得したいとします。実際には、選択の条件はいくつもあり、時間の経過とともに追加していくことが可能です。 バーのコレクションがあれば、他のどのパラメータも簡単に分析することができます。

そこで、あなたの課題として、ある条件を満たす棒グラフの配列を返す関数(疑似コード)を書く必要があります。

массив_баров = ПолучитьНужныеБары(Символ(), Таймфрейм(), Период(), УсловиеОтбора);
すなわち、いくつかのデータとインデックスを記憶して反復することに、本当に問題はないのです。必要なのはバーそのもののインデックスではなく、与えられた条件を満たす特定のコレクションである。それがあれば、さまざまな問題が一挙に解決する。
 
Artyom Trishkin:
そこで、レンジ内のローソク足ごとに異なる一致するローソク足のリストが必要な場合、構造体の配列を使うようにします。考えてお知らせします。

想い。テストスクリプトを書き出しているところです。

//+------------------------------------------------------------------+
//|                                                     TestCopy.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int Search_Period=10;   // Количество копируемых свечей
int searchPeriod=(Search_Period<1)?1:Search_Period;
input int Delta=2;            // Количество пунктов допуска
int delta=(Delta<0)?0:Delta;
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;    // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];    // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей
   int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);  // копируем данные
   if(copied>0) {                                                    // если скопировали
      ArrayResize(dataCandle,copied);                                // задаём размер структуры равным числу скопированных данных
      ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре
      //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
      for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"
         dataCandle[i].reference_candle.high=array[i].high;          // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;            // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;          // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size=0;                                                 // размер массива совпадающих свечей
         ArrayResize(dataCandle[i].matched_candles,size);            // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                          // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for(int j=i+1; j<copy_bars; j++) {                          // в цикле от i+1 до copy_bars
            //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину delta*Point)
            if(NormalizeDouble(delta*Point()-fabs(array[i].high-array[j].high),Digits())>=0) {
               size++;                                               
               ArrayResize(dataCandle[i].matched_candles,size);            // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                          // запишем количество совпадений
               dataCandle[i].matched_candles[size-1].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size-1].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size-1].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   for(int i=0; i<ArraySize(dataCandle)-1; i++) {
      string refs_txt="";
      string matched_txt="";
      refs_txt="Свеча "+IntegerToString(i,2,'0')+": время "+TimeToString(dataCandle[i].reference_candle.time)+", high: "+DoubleToString(dataCandle[i].reference_candle.high,Digits())+" имеет совпадений: "+(string)dataCandle[i].number_matched+" шт. ";
      if(dataCandle[i].number_matched>0) {
         for(int j=0; j<ArraySize(dataCandle[i].matched_candles); j++) {
            matched_txt="Совпадение "+IntegerToString(j+1)+": "+TimeToString(dataCandle[i].matched_candles[j].time)+", high: "+DoubleToString(dataCandle[i].matched_candles[j].high,Digits());
            }
         }
      Print(refs_txt,matched_txt);
      }
  }
//+------------------------------------------------------------------+

すべてのステップを記述するようにした。

ループ内のすべてのマッチを埋めた後、すべてのローソク足とそのマッチしたローソク足を含む配列ができます。その後で、その中の低さを探してもよい。そして、ループの中ですぐに整理することができるのです。その方が便利だからです。

 

さて、ここでもう一つの方法として、マッチはレンジ内の各ローソク足に対して書き込まれます。以前のバージョンでは、マッチは1つのキャンドルに対してのみ書かれていました。つまり、このキャンドルとマッチするものは書かれていませんでした。

//+------------------------------------------------------------------+
//|                                                     TestCopy.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int Search_Period=10;   // Количество копируемых свечей
int searchPeriod=(Search_Period<1)?1:Search_Period;
input int Delta=2;            // Количество пунктов допуска
int delta=(Delta<0)?0:Delta;
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;    // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];    // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей
   int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);  // копируем данные
   if(copied>0) {                                                    // если скопировали
      ArrayResize(dataCandle,copied);                                // задаём размер структуры равным числу скопированных данных
      ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре
      //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
      for(int i=0; i<copy_bars; i++) {                               // цикл по скопированным данным от начала до конца
         dataCandle[i].reference_candle.high=array[i].high;          // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;            // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;          // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size=0;                                                 // размер массива совпадающих свечей
         ArrayResize(dataCandle[i].matched_candles,size);            // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                          // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for(int j=0; j<copy_bars; j++) {                            // в цикле от 0 до copy_bars
            if(j==i) continue;                                       // пропустим свечу "саму себя"
            //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину Point)
            if(NormalizeDouble(delta*Point()-fabs(array[i].high-array[j].high),Digits())>=0) {
               size++;                                               
               ArrayResize(dataCandle[i].matched_candles,size);            // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                          // запишем количество совпадений
               dataCandle[i].matched_candles[size-1].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size-1].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size-1].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   for(int i=0; i<ArraySize(dataCandle)-1; i++) {
      string refs_txt="";
      string matched_txt="";
      refs_txt="Свеча "+IntegerToString(i,2,'0')+": время "+TimeToString(dataCandle[i].reference_candle.time)+", high: "+DoubleToString(dataCandle[i].reference_candle.high,Digits())+" имеет совпадений: "+(string)dataCandle[i].number_matched+" шт. ";
      if(dataCandle[i].number_matched>0) {
         for(int j=0; j<ArraySize(dataCandle[i].matched_candles); j++) {
            matched_txt+=" Совпадение "+IntegerToString(j+1)+": "+TimeToString(dataCandle[i].matched_candles[j].time)+", high: "+DoubleToString(dataCandle[i].matched_candles[j].high,Digits());
            }
         }
      Print(refs_txt,matched_txt);
      }
  }
//+------------------------------------------------------------------+
 
買いまたはベアグリップシグナルで注文を開くという考え方ですが、売り買いの取引と注文待ちの 取引が1つずつしかないようにするには、私は取引の1ティックごとに1つずつ開いているのです。問題解決に貢献する。
ファイル:
ritfv.png  46 kb
ohs.txt  5 kb
理由: