阵列超出范围,需要帮助 - 页 7

 
Valeriy Yastremskiy:

每日极值,以及你所发现的基本上是极值,低点(或高点)与当前价格 有相当长的距离。前夕132天的低点和高点之差超过12300点。价格从最近的低点2000,从高点800。

我也不明白。

对不起,我明天会试着解释,今天很累。

 
MakarFX:

澳元兑美元对我来说不是这样的

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

它复制什么并返回到哪里?

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

哪些东西被复制到了哪里,复制给了谁?

Alexei Tarabanov:

它复制到什么地方,又返回到什么地方?

来调用这个函数。

intArrayCopyRates(
MqlRates&rates_array[],// Array of MqlRates passed by reference
stringsymbol=NULL//工具
inttimeframe=0// Timeframe
)。

将指定的图表条数的数据复制到形式为double RateInfo[][6]的二维数组中,并返回被复制条数的数量。

intArrayCopyRates(
void&dest_array[][],// 数组通过引用传递
stringsymbol=NULL,// 工具
inttimeframe=0// Timeframe
)。

参数

ArrayCopyRates

当使用第二种形式的调用时,数据实际上被复制到数组dest_array[][]中,数组本身被自动重新分配以符合时间框架的大小(即使数组已经被声明为静态)。

数组的第一维包含条数。第二个维度有6个元素的值。

0 - 时间(time),
1 - 开盘价(open),
2 - 最低价(low),
3 - 最高价(high),
4 - 收盘价(close)。

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 
Dark Kchlyzov:
来调用这个函数。

intArrayCopyRates(
MqlRates&rates_array[],// Array of MqlRates passed by reference
stringsymbol=NULL//工具
inttimeframe=0// timeframe
)。

将指定的图表条数的数据复制到形式为double RateInfo[][6]的二维数组中,并返回被复制条数的数量。

intArrayCopyRates(
void&dest_array[][],// 数组通过引用传递
stringsymbol=NULL,// 工具
inttimeframe=0// timeframe
)。

参数

ArrayCopyRates

当使用第二种形式的调用时,数据实际上被复制到数组dest_array[][]中,数组本身被自动重新分配以符合时间框架的大小(即使数组已经被声明为静态)。

数组的第一维包含条数。第二个维度有6个元素的值。

0 - 时间(time),
1 - 开盘价(open),
2 - 最低价(low),
3 - 最高价(high),
4 - 收盘价(close)。

那么int-type的返回值保存在哪里?你把所有的数据都传给了这个函数,但却没有从中得到任何东西。

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

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 我要去睡觉了。

我明天会消化这一切,如果我有任何问题,我会让你知道!

非常感谢大家!!!。