Array out of range in Need of help - ページ 7

 
Valeriy Yastremskiy:

日足の極値、そしてあなたが見つけたものは、本質的に極値であり、安値(または高値)は現在の価格から かなり長い距離を持っているのです。euの132日の安値と高値の差は12300pips以上です。直近の安値2000から、高値800からの価格。

私もよくわかりません。

すみません、今日疲れた明日に説明しようと思います。

 
MakarFX:

AUDUSDは、私にとってそのようなものではありません。

ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров

何をコピーしてどこに戻すのか?

 
Алексей Тарабанов:

どこに、誰に、何をコピーしているのか?

Alexei Tarabanov:

何に写って、何に戻るのか?

この機能を呼び出す 方法は2種類あります。

intArrayCopyRates(
MqlRates&rates_array[],// 参照で渡された MqlRates の配列
stringsymbol=NULL,// ツール
inttimeframe=0// timeframe
);

指定されたチャートバーのデータを double RateInfo[][6] 形式の二次元配列にコピーし、コピーされたバーの数を返す。

intArrayCopyRates(
void&dest_array[][],// 参照で渡された配列
stringsymbol=NULL,// ツール
inttimeframe=0// timeframe
);

パラメータ

配列コピー率

2番目の呼び出し方法を使用する場合、データは実際に配列 dest_array[][] にコピーされ、配列自体は自動的にタイムフレームサイズに合わせて再割り当てされます(配列が静的と宣言されている場合でも同様です)。

配列の 1 次元目には,バーの本数が格納される.2次元目は6つの要素で構成され、その値は以下の通りです。

0 - 時間(time)、
1 - 始値(open)、
2 - 安値(low)、
3 - 高値(high)、
4 - 終値(close)です。

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 
Dark Kchlyzov:
この機能を呼び出す 方法は2種類あります。

intArrayCopyRates(
MqlRates&rates_array[],// 参照で渡された MqlRates の配列
stringsymbol=NULL,// ツール
inttimeframe=0// timeframe
);

指定されたチャートバーのデータを double RateInfo[][6] 形式の二次元配列にコピーし、コピーされたバーの数を返す。

intArrayCopyRates(
void&dest_array[][],// 参照で渡された配列
stringsymbol=NULL,// ツール
inttimeframe=0// timeframe
);

パラメータ

配列コピー率

2番目の呼び出し方法を使用する場合、データは実際に配列 dest_array[][] にコピーされ、配列自体は自動的にタイムフレームサイズに合わせて再割り当てされます(配列が静的と宣言されている場合でも同様です)。

配列の 1 次元目には,バーの本数が格納される.2次元目は6つの要素で構成され、その値は以下の通りです。

0 - 時間(time)、
1 - 始値(open)、
2 - 安値(low)、
3 - 高値(high)、
4 - 終値(close)です。

また、int型の戻り値はどこに保存されるのでしょうか?あなたは関数にすべてのデータを渡しましたが、関数から何も得ていません。

 
Алексей Тарабанов:

int型の戻り値はどこに保存されていますか?あなたはすべてのデータを関数に渡しましたが、関数から何も得ていません。

Min_D_Level = iLow(_Symbol,PERIOD_D1,i); break;

ここに格納されるようです

double Min_D_Level ; //最短のDレベル

それとも、私が何か理解していないのでしょうか?

また、int型の 戻り値はどこに保存されるのでしょうか?

???

本当に脳天気なんです。

もっとシンプルな方法でできないか。

あなた(あなた)はここで間違えた、正しいやり方はこのコード例だ、などというように。

 

しばらくここに座っていた。

#property version   "1.00"
#property strict

//символ и таймфрейм текущего графика
string symbol;
ENUM_TIMEFRAMES frame;
datetime time;
   

struct BarData
   {
   struct Elem
      {
      int      number;     //порядковый номер периода (дня, месяца или года)
      double   high;       //максимум периода
      double   low;        //минимум периода
      datetime time_high;  //время максимума
      datetime time_low;   //время минимума
      } Arr[];             //массив периода
   int index;              //текущий индекс массива
   double   max;           //последнее максимальное значение периода
   double   min;           //последнее минимальное значение периода
   datetime time_max;      //время максимума
   datetime time_min;      //время минимума

   //при создании структуры указываем, что массив пустой
   BarData(){index=-1;}    
   
   //функция записывает текущие экстремумы
   void WriteBar(int eNumber, string eSymbol, ENUM_TIMEFRAMES eFrame, datetime eTime)
      {
      int eShift=iBarShift(eSymbol,eFrame,eTime);
      double eHigh=iHigh(eSymbol,eFrame,eShift);
      double eLow=iLow(eSymbol,eFrame,eShift);
      //если элементов ещё нет или период сменился
      if(index<0 || eNumber!=Arr[index].number)
         {
         ArrayResize(Arr,++index+1);
         Arr[index].number=eNumber;
         Arr[index].high=eHigh;
         Arr[index].low=eLow;
         Arr[index].time_high=eTime;
         Arr[index].time_low=eTime;
         }
      //если произошло обновление текущего максимума
      if(eHigh-Arr[index].high>0)
         {
         Arr[index].high=eHigh;
         Arr[index].time_high=eTime;
         }
      //если произошло обновление текущего минимума
      if(Arr[index].low-eLow>0)
         {
         Arr[index].low=eLow;
         Arr[index].time_low=eTime;
         }
      //если произошло обновление предыдущего максимума
      if(eHigh-max>0)
         {
         for(int i=index+1; i>=0; i--)
            {
            if(Arr[index].high-eHigh>0)
               {
               max=Arr[index].high;
               time_max=Arr[index].time_high;
               break;
               }
            }
         }
      //если произошло обновление предыдущего минимума
      if(min-eLow>0)
         {
         for(int i=index+1; i>=0; i--)
            {
            if(eLow-Arr[index].low>0)
               {
               min=Arr[index].low;
               time_min=Arr[index].time_low;
               break;
               }
            }
         }
      }
   } day, month, year;

int OnInit()
   {
   symbol=Symbol();
   frame=(ENUM_TIMEFRAMES)Period();
   return(INIT_SUCCEEDED);
   }

void OnTick()
   {
   //текущее время закрытого бара
   time=iTime(symbol,frame,1);
   
   MqlDateTime date; 
   TimeToStruct(time,date);
   
   //делаем записи каждого периода
   day.WriteBar(date.day,symbol,frame,time);
   month.WriteBar(date.mon,symbol,frame,time);
   year.WriteBar(date.year,symbol,frame,time);
   
   //теперь имеем значения   
   Comment(TimeToString(day.time_max)+" : "+DoubleToString(day.max)+" : "+DoubleToString(day.Arr[day.index].high)+"\n"+TimeToString(day.time_min)+" : "+DoubleToString(day.Arr[day.index].low)+" : "+DoubleToString(day.min));
   }
無駄な循環を避けるようにしなければなりません。たくさんの見積もりが入ってくるので、その場で正しい入力をする必要があり、履歴を掘り下げてコンピュータのリソースを無駄にすることがありません。
 
Dark Kchlyzov:

こんな感じ

double Min_D_Level ; //最短のDレベル

それとも、何か見落としているのでしょうか?

そう、あなたは何かを理解していないのです。このようになるはずです。

Количество_баров=ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров

そして...

 
Алексей Тарабанов:

そう、あなたが理解していないことがあるのです。そうでなければならないのです。

そして...

ありがとうございました。

 
Dark Kchlyzov:

こちらもありがとうございました!!!

どういたしまして。

 

3.47 もう寝ます。

明日、すべてを消化して、何か質問があれば、お知らせします !

皆さん、どうもありがとうございました!