错误、漏洞、问题 - 页 269

 
AndrNuda:
你们太慢了 :)瀑布不是假的,但一切都很好。你找错地方了。))))有一个正确的功能。
聪明?
 
BoraBo:

我想弄清楚为什么ArrayIsSeries(High)总是假的。

这个函数的帮助说(https://www.mql5.com/ru/docs/array/arrayisseries)

返回值

如果被检查的数组是一个时间序列数组,返回真,否则返回假。作为参数传递给OnCalculate() 的数组应该检查数组元素被ArrayGetAsSeries() 访问的顺序。

你声明的数组不是一个时间序列,在任何情况下都不能成为一个时间序列。时间序列是运行时间定义的数组,例如,在OnCalculate() 函数中。

int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time
                 const double& open[],       // Open
                 const double& high[],       // High
                 const double& low[],        // Low
                 const double& close[],      // Close
                 const long& tick_volume[],  // Tick Volume
                 const long& volume[],       // Real Volume
                 const int& spread[]         // Spread
   )
Документация по MQL5: Операции с массивами / ArrayIsSeries
Документация по MQL5: Операции с массивами / ArrayIsSeries
  • www.mql5.com
Операции с массивами / ArrayIsSeries - Документация по MQL5
 
Rosh:

这个函数的帮助说(https://www.mql5.com/ru/docs/array/arrayisseries)

你声明的数组不是一个时间序列,在任何情况下都不能成为一个时间序列。时间序列是运行时预定义的数组,例如在OnCalculate() 函数中。

ArrayGetAsSeries不能按预期工作。
 
AlexSTAL:
ArrayGetAsSeries不能按预期工作。
ArrayGetAsSeries 函数只改变了索引方向,但没有把数组变成一个时间序列。你想用这个函数得到什么?
 
Rosh:
时间序列是运行时预定义的数组,例如在OnCalculate() 中。
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time
                 const double& open[],       // Open
                 const double& high[],       // High
                 const double& low[],        // Low
                 const double& close[],      // Close
                 const long& tick_volume[],  // Tick Volume
                 const long& volume[],       // Real Volume
                 const int& spread[]         // Spread
   )


这一点在帮助中写明了什么。

Примечание

Для проверки массива на принадлежность к таймсерии следует применять функцию ArrayIsSeries(). Массивы ценовых данных, переданных в качестве входных параметров в функцию OnCalculate(), не обязательно имеют направление индексации как у таймсерий. Нужное направление индексации можно установить функцией ArraySetAsSeries().

 
joo:

这一点在帮助中写明了什么。


运行这样一个指标,你就会看到自己的情况。

//+------------------------------------------------------------------+
//|                                           CheckArrayIsSeries.mq5 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void checkArray(const double & array[])
  {
   if(ArrayGetAsSeries(array))
     {
      Print("array can use as timeseria");
     }
     else
     {
      Print("array can not use as timeseria!!!");
     }
     
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(ArrayIsSeries(open))
     {
      Print("open[] is timeseria");
      checkArray(open);
     }
   else
     {
        {
         Print("open[] is timeseria!!!");
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Rosh:
ArrayGetAsSeries 函数只是改变了索引方向,但并没有把数组变成一个时间序列。你想用这个函数得到什么?

这个函数检查的是 方向,而不是变化。

1) 没有初始化

double Buf[];
void OnStart()
  {
   ArrayResize(Buf, 3);

   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf));             // ArrayGetAsSeries(Buf): false
   
   // Меняем направление на обратный порядок
   Print("Установка в true прошла: ", ArraySetAsSeries(Buf, true));     // Установка в true прошла: true
   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf));             // ArrayGetAsSeries(Buf): false
   
   // Меняем направление на прямой порядок
   Print("Установка в false прошла: ", ArraySetAsSeries(Buf, false));   // Установка в false прошла: true
   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf));             // ArrayGetAsSeries(Buf): false
  }

2) 有了初始化

double Buf[];
void OnStart()
  {
   ArrayResize(Buf, 3);
   Buf[0] = 0; Buf[1] = 1; Buf[2] = 2;

   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf));             // ArrayGetAsSeries(Buf): false
   
   // Меняем направление на обратный порядок
   Print("Установка в true прошла: ", ArraySetAsSeries(Buf, true));     // Установка в true прошла: true
   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf), " [", Buf[0], ",", Buf[1], ",", Buf[2], "]"); // ArrayGetAsSeries(Buf): true [2,1,0]
   
   // Меняем направление на прямой порядок
   Print("Установка в false прошла: ", ArraySetAsSeries(Buf, false));   // Установка в false прошла: true
   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf), " [", Buf[0], ",", Buf[1], ",", Buf[2], "]"); // ArrayGetAsSeries(Buf): false [0,1,2]
  }

3) 上面的代码,只是用ArrayGetAsSeries 函数获得数组的索引方向

double High[];
#include <Indicators\TimeSeries.mqh>
void OnStart()
  {
   Print("ArrayGetAsSeries(High) ",ArrayGetAsSeries(High));                   // ArrayGetAsSeries(High) false

   CiHigh z;

   int count=3;
   if(z.Create(_Symbol,_Period)==true)
     {
      if(z.GetData(0,count,High)==count)
        {
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
         Print("ArraySetAsSeries(High,true) ",ArraySetAsSeries(High,true));   // ArraySetAsSeries(High,true) true
         Print("ArrayGetAsSeries(High) true = ",ArrayGetAsSeries(High));      // ArrayGetAsSeries(High) true = false
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
         Print("ArraySetAsSeries(High,false) ",ArraySetAsSeries(High,false)); // ArraySetAsSeries(High,false) true
         Print("ArrayGetAsSeries(High) false = ",ArrayGetAsSeries(High));     // ArrayGetAsSeries(High) false = false
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
        }
      else
         Print("Не удалось получить ",count," данных таймсерии.");
     }
   else Print("Ошибка создания таймсерии.");
   Print("ArrayGetAsSeries(High) ",ArrayGetAsSeries(High));                   // ArrayGetAsSeries(High) false
   Print("GetLastError() ",GetLastError());
  }
在服务台,我弄错了功能名称,只是


 
Rosh:

运行这样一个指标,你就会看到自己的情况。

这是可以理解的。我的问题不是关于错误,一切都按帮助中写的那样工作。

Примечание

Для проверки массива на принадлежность к таймсерии следует применять функцию ArrayIsSeries(). Массивы ценовых данных, переданных в качестве входных параметров в функцию OnCalculate(), не обязательно имеют направление индексации как у таймсерий. Нужное направление индексации можно установить функцией ArraySetAsSeries().


这个问题的出现是因为帮助中强调的颜色和黑体与你所说的不一致。

罗什
时间序列是运行时预定义的数组,例如在OnCalculate() 中。

这就是为什么我在OnCalculate()中这样做。

    //--------------------------------------
    if (ArrayGetAsSeries(time)!=true)
      ArraySetAsSeries(time,true);
    if (ArrayGetAsSeries(open)!=true)
      ArraySetAsSeries(open,true);
    if (ArrayGetAsSeries(high)!=true)
      ArraySetAsSeries(high,true);
    if (ArrayGetAsSeries(low)!=true)
      ArraySetAsSeries(low,true);
    if (ArrayGetAsSeries(close)!=true)
      ArraySetAsSeries(close,true);
    //--------------------------------------
 
Rosh:

这个函数的帮助说(https://www.mql5.com/ru/docs/array/arrayisseries)

你声明的数组不是一个时间序列,在任何情况下都不能成为一个时间序列。时间序列是预定义的数组,例如在OnCalculate() 函数中。

该检查在指标中也不起作用。

//+------------------------------------------------------------------+
//|                                                    ind_proba.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int count=3;
   int i=0;
   int limit;
//   bool printCom;

   if(prev_calculated>0)
     {
      limit=1;
     }
   else
     {
      Print("rates_total  ",rates_total,"  prev_calculated  ",prev_calculated);
      for(i=0; i<count; i++) Print(i,"=",open[i]);
      Print("ArraySetAsSeries(open,true) ",ArraySetAsSeries(open,true));
      Print("ArrayIsSeries(open) true = ",ArrayIsSeries(open));
      Print("ArrayGetAsSeries(open) true = ",ArrayGetAsSeries(open));
      for(i=0; i<count; i++) Print(i,"=",open[i]);
      Print("ArraySetAsSeries(open,false) ",ArraySetAsSeries(open,false));
      Print("ArrayIsSeries(open) false = ",ArrayIsSeries(open));
      Print("ArrayGetAsSeries(open) false = ",ArrayGetAsSeries(open));
      for(i=0; i<count; i++) Print(i,"=",open[i]);
     }
   Print("GetLastError() ",GetLastError());
//--- return value of prev_calculated for next call

   return(rates_total);
  }
//+------------------------------------------------------------------+

另外,prev_calculated 不再起作用了,它始终是0。

 

是的,我认为有了这些功能,他们已经把自己整理好了。


但作为一个愿望,这样我就不会忘记--在编辑器中,当提示输入三个或多少个字符后,当你点击向上站在列表的第一行是不会从列表中删除。只是以前已经像在工作室一样,我想如果不以工作室的方式做,很多人会 "恼火"。IMHO。