初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1290

 
Vitaly Muzichenko:

---

P.S.一般来说,同一阵列有很多问题,比如说。

谢谢你的帮助和提示!!这就是它的编译方式

//+------------------------------------------------------------------+
//|                                                        Funct.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int UP; //Глобальная переменная

//_____________________________________Массивы для Handleлов____________________________________
double HandleFractalDown_W1[],HandleFractalUP_W1[];    // одномерный динамический массив

//_____________________________________Массивы для фракталов____________________________________
double FractalDown_W1[],FractalUP_W1[];    // одномерный динамический массив

//-----------------------------------------------------------------------------------------------
int  Fractal_W1=iFractals(Symbol(),PERIOD_W1); //Хендл индикатора

//----------------------------------------------------------------------
void OnStart()
  {
   CopyBuffer(Fractal_W1,0,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalUP_W1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_W1,1,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalDown_W1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

  Search_Fractal(PERIOD_W1, HandleFractalUP_W1, FractalUP_W1); //Пользовательская функция заполнения массива FractalUP_W1 значениями
                                                               //верхних фракталов  

  }
//+------------------------------------------------------------------+

//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике
   
   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
        }
     }
  }
//+------------------------------------------------------------------+
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • 2021.02.13
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
调整了一下,几乎可以按需要工作了,在51.20之前,它在那里崩溃了,出现了一个错误

函数阵列(BRN, W1)超出范围

//+------------------------------------------------------------------+
//|                                                        Funct.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int UP; //Глобальная переменная

//_____________________________________Массивы для Handleлов____________________________________
double HandleFractalDown_W1[],HandleFractalUP_W1[];    // одномерный динамический массив

//_____________________________________Массивы для фракталов____________________________________
double FractalDown_W1[],FractalUP_W1[];    // одномерный динамический массив

//-----------------------------------------------------------------------------------------------
int  Fractal_W1=iFractals(Symbol(),PERIOD_W1); //Хендл индикатора

//----------------------------------------------------------------------
void OnStart()
  {
   CopyBuffer(Fractal_W1,0,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalUP_W1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_W1,1,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalDown_W1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(HandleFractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(HandleFractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

  Search_Fractal(PERIOD_W1, HandleFractalUP_W1, FractalUP_W1); //Пользовательская функция заполнения массива FractalUP_W1 значениями
                                                               //верхних фракталов  
  }
//+------------------------------------------------------------------+



//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике

   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert("Frakt= ",fract_mass[UP]);
        }
     }
  }
//+------------------------------------------------------------------+
会是什么呢?
 
Kira27:
调整了一下,几乎可以按需要工作,但到了51.20就会出错崩溃。

函数阵列(BRN, W1)超出允许范围

会是什么呢?

这样试一下,你没有设置数组的维度

void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике
   ArrayResize(fract_mass,i+1);
   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert("Frakt= ",fract_mass[UP]);
        }
     }
  }

一般来说,这不是一个好的解决方案

 
Kira27:
调整了一下,几乎可以按需要工作了,在51.20之前,有一个错误崩溃了。

函数阵列(BRN, W1)超出范围

会是什么呢?

解决了崩溃的那条线。

 ArrayResize(handle,i,0);//*------Строчка решившая проблему
//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике

//***************************
   ArrayResize(handle,i,0);//*------Строчка решившая проблему
//***************************

   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert("Frakt= ",fract_mass[UP]);
        }
     }
  }
//+------------------------------------------------------------------+

现在正确了吗? 如果你不介意的话,正确了。

 
Kira27:
稍微调整了一下,几乎可以正常工作了,但到了51.20就出错崩溃了。

函数阵列(BRN, W1)超出允许范围

会是什么呢?

同时,你将一定数量的元素复制到HandleFractalUP_W1 数组中,但你并不控制到底有多少。

然后循环浏览int i=Bars(Symbol(),period); //W1图表上的条数

结果,你将再次得到一个在数组之外的 出口,但在handle[n] 中。

琢磨一些填充逻辑,慢慢来。

----

Kira27:

解决了崩溃的那条线。

现在正确了吗? 如果你不介意的话,请改正。

它是如此复杂,但你会得到它的权利。

 
Kira27:

解决了崩溃问题的那条线

现在是这样吗? 如果你不介意的话,请纠正它。

唯一的问题是,在周线图窗口中,分形的数量比条形少,当用分形的价格值填充数组时,只有90个单元格被填充,其余的内存布局是多余的 所以,你应该先计算分形的数量,然后才应用ArrayResize来保留内存?

 
Vitaly Muzichenko:

同时,你将一定数量的元素复制到HandleFractalUP_W1 数组中,但你并不控制到底有多少。

然后循环浏览int i=Bars(Symbol(),period); //W1图表上的条数

结果,你将再次得到一个在数组之外的 出口,但在handle[n] 中。

琢磨一些填充逻辑,慢慢来。

----

它是如此复杂,但你会得到它的权利。

谢谢你!!!。

 

大家下午好。请帮助我理解为什么我不能得到音量历史。试图用2种方式来做。

第一条路。

MqlRates mrate5[];

如果(CopyRates(_Symbol,PERIOD_M5,1,bar_used,mrate5)<0)

{

Alert("复制 M5的历史数据 时出错--错误:",GetLastError(),"!")。

返回。

}

for (int i=0;i<bars_used;i++) {

Print(mrate5[i].real_volume)

}

第二种方式。

long volumes5[]。

如果(CopyRealVolume(_Symbol,PERIOD_M5,1,bar_used, volumes5)<0)

{

Alert("Copy volumes error for M5 - error:",GetLastError(),"!")。

返回。

}

for (int i=0;i<bars_used;i++) {

打印(卷5[i])

}

在这两种情况下,卷的阵列总是只包含零。你就是无法得到任何有意义的信息......。


 
seleand:

大家下午好。请帮助我理解为什么我不能得到音量历史。试图用2种方式来做。

第一条路。

MqlRates mrate5[];
      if(CopyRates(_Symbol,PERIOD_M5,1,bars_used,mrate5)<0)
        {
            Alert("Ошибка копирования исторических данных для М5 - ошибка:",GetLastError(),"!!");
            return;
        }
for (int i=0;i<bars_used;i++) {
Print(mrate5[i].real_volume)
}

第二种方式。

long volumes5[];
      if(CopyRealVolume(_Symbol,PERIOD_M5,1,bars_used,volumes5)<0)
        {
            Alert("Ошибка копирования объемов для М5 - ошибка:",GetLastError(),"!!");
            return;
        }
for (int i=0;i<bars_used;i++) {
Print(volumes5[i])
}

在这两种情况下,卷数组总是只包含零。我只是无法得到任何有意义的信息......


  1. 学习如何插入代码
  2. 在外汇中,根本不存在真正的量。
 

谢谢你。我是否正确地理解为有一个勾股量

当我从FINAM网站下载外汇的报价历史时,除了开盘价、最高价、最低价、收盘价外,还有波动。你没有说到底是什么量。这是一个刻度量?

原因: