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

 
Aleksandr Slavskii #:

"Find the maximum value in the ticks array"-the maximum value of what are we finding?

度数[度数-1].bid、度数[度数-1].flags。

冗談です))))


ーCopyTicksとーCopyRatesとーCopyTicksとーCopyRatesとーCopyTicksとーCopyTicksとーCopyTicksとーCopyTicksとーCopyTicksとーCopyRatesとーCopyTicksのーCopyTicksのーCopyTicksのーCopyTicksのー、ーCopyTicksのーCopyRates。

double PrevClose = rates[copied-1].close;

あなたのコードには余分な行がある

CopyTicksとー CopyRates ー コピー時にー配列のーサイズをー。

ヒントをありがとう。知りませんでした。念のためこの行を挿入しておきます。

、ー レートではではではークではークする場合、ークではークする場合、ークするバーをークをークする場合、ークするバーのークをークするバークをークする場合、ークをークするバークをークをークするバークをークをークするバークをークをークするバークをークーだからータはータはータはータはーターCopyRatesのー私のー同様のー同様のー同様のー計算式ーーでーCopyRatesのー変数ーーにー時間間隔のー最大値ーーulong型ーーでーこの問題も解決できませんでした。

 
maxvoronin74 #:

情報をありがとう。知らなかったよ。念のため、この行を挿入しておくよ。

レートはすべての価格が平均化され、バーを考慮するが、ティックは考慮しないという冗談を正しく理解していますか?だから私はティックをバー価格ではなく、任意の時間間隔を使用するように取った。私の似たような計算式のCopyRatesは、コピーされた変数に時間間隔のulong型の最大値を入れました。この問題も解決できなかった。

すべてが間違っている。

MqlRatesは 構造体であり、それを変数として扱っている。

MqlTickも 構造体です。

あなたは温故知新を組み合わせようとしているので、コンパイラーはあなたを理解できない。

私もそうだ))))

何か役に立つことを提案できるかもしれないが、あなたのコードからは何を見つけようとしているのかがわからない。

 
Aleksandr Slavskii #:

すべて間違っている。

MqlRatesは 構造体であり、あなたはそれを変数として扱っている。

MqlTickも 構造体である。

あなたはウォームとソフトを組み合わせようとしているので、コンパイラはあなたを理解できない。

私もそうだ)))

何か役に立つことを提案できるかもしれませんが、あなたのコードからは何を見つけようとしているのかがわかりません。

課題は、WPR (Williams Percent Range)を修正し、バーに関係なく、任意の期間のWPR値の差を取得することです。
 
maxvoronin74 #:
WPR(ウィリアムズ・パーセンテージ・レンジ)を修正し、小節に関係なく、任意の期間のWPR値の差を得るようにすることです。

これがあなたが得たかったものである可能性があります(しかし、確実ではありません)。

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double bid[];
   for(int i = 0; i < copied; i++)
      bid[i] = ticks[i].bid;
   double PrevClose = bid[copied - 1]; // Получаем последний элемент массива как значение PrevClose
   double highestHigh = ArrayMaximum(bid, 0, copied); // Находим максимальное значение в массиве ticks
   double lowestLow = ArrayMinimum(bid, 0, copied); // Находим минимальное значение в массиве ticks
 
Aleksandr Slavskii #:
double lowestLow =ArrayMinimum(bid,0, copied);

ありがとうございます。私がレッスンを正しく理解していれば、私が得たものは次のとおりです:

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
double ask_arr[];
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
double highestBid = ArrayMaximum(bid_arr, 0, copied-1);
double lowestBid = ArrayMinimum(bid_arr, 0, copied-1);
double highestAsk = ArrayMaximum(ask_arr, 0, copied-1);
double lowestAsk = ArrayMinimum(ask_arr, 0, copied-1);
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR
しかし、残念ながら、bid_arr[i] = ticks[i].bid; の行で、Expert Advisor は 'namemyexpert.mq5' (204,12) の範囲外の配列のためにチャートから外れてしまいました。
 
maxvoronin74 #:

ありがとう。教訓を生かした結果がこれだ:

どうせすべての目盛りをループしているのだから、このループでコピーすることはできない。

ちなみに、コピーするのであれば、コピーする配列のサイズを最初に設定しておくといいでしょう。コピー先の配列のサイズを変更するのは CopyTicksRange だけです。

 
JRandomTrader #:

とにかくすべてのティックを循環させるので、このサイクルでコピーすることはできないが、最大-最小を一度に探すことはできる。

ちなみに、コピーするのであれば、最初にコピー先の配列のサイズを設定しておくとよい。CopyTicksRange だけがコピー先の配列のサイズを変更します。

私は完璧主義者で、構造体の配列の別々の要素をソートするのは、発泡スチロールでガラスをたたくようなものだ。
未割り当ての配列については、ちゃんとした理由がある。夜中の1時に妻が耳元で「寝る時間よ、寝る時間よ」と言っているのだ。)
 
Aleksandr Slavskii #:
私は完璧主義者で、構造体の配列の個々の要素を並べ替えるのは、発泡スチロールでガラスを叩くようなものだ。
配列が分散していないことについては、それなりの理由がある。時刻は午前1時、妻が耳元で「寝る時間よ、寝る時間よ」と言う。)
なんだ、夜か朝かイチジクか)。
そう、一度に最大限のものを探すというのは正しい。今朝はちょっと頭が悪い。
 
JRandomTrader #:

とにかくすべてのティックを循環させるので、このサイクルでコピーすることはできないが、最大-最小を一度に探すことはできる。

ちなみに、コピーするのであれば、最初にコピー先の配列のサイズを設定しておくとよい。コピー先の配列のサイズを変更するのは CopyTicksRange だけです。

すみません。不注意でした。修正しました。ありがとう。ArrayMaximumの値が価格ではなくインデックスであることを忘れていました。でもこれで直りました。

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
ArrayResize(bid_arr,copied,100000);
double ask_arr[];
ArrayResize(ask_arr,copied,100000);
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
int IndMaxBid = ArrayMaximum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с максимальной ценой
double highestBid = bid_arr[IndMaxBid]; // Самая высокая цена bid за период
int IndMinBid = ArrayMinimum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с минимальной ценой
double lowestBid = bid_arr[IndMinBid]; // Самая низкая цена bid за период
int IndMaxAsk = ArrayMaximum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с максимальной ценой
double highestAsk = ask_arr[IndMaxAsk]; // Самая высокая цена ask за период
int IndMinAsk = ArrayMinimum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с минимальной ценой
double lowestAsk = ask_arr[IndMinAsk]; // Самая низкая цена ask за период
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR

ArrayMaximumはticks配列では機能しなかったので、ループ内のifを使った代替計算を試してみました。なぜその方が良いのでしょうか?

 
maxvoronin74 #:

なぜそれが良いのか?

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double highestHigh = 0, lowestLow = DBL_MAX;
   for(int i = 0; i < copied; i++)
     {
      if(highestHigh < ticks[i].ask) // Находим максимальное значение в массиве ticks
         highestHigh = ticks[i].ask;
      if(lowestLow > ticks[i].bid) // Находим минимальное значение в массиве ticks
         lowestLow = ticks[i].bid;
     }
理由: