Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1290

 
Vitaly Muzichenko:

---

P.S. Em geral, há muito de errado com o mesmo conjunto, por exemplo.

Obrigado pela ajuda e pela dica!!! É assim que se compila

//+------------------------------------------------------------------+
//|                                                        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, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Ajustou-o um pouco, quase funciona como necessário, antes de 51,20 ele cai ali com um erro

Matriz divertida (BRN, W1) fora de alcance

//+------------------------------------------------------------------+
//|                                                        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]);
        }
     }
  }
//+------------------------------------------------------------------+
O que pode ser?
 
Kira27:
Ajustou-o um pouco, quase funciona quando necessário, até 51,20 aí ele cai com um erro

Matriz divertida (BRN, W1) fora do intervalo permitido

O que pode ser?

Tente desta forma, não definiu a dimensionalidade da matriz

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]);
        }
     }
  }

Em geral, esta não é uma boa solução

 
Kira27:
Ajustou-o um pouco, quase funciona conforme necessário, antes de 51,20 cair com um erro

Matriz divertida (BRN, W1) fora de alcance

O que pode ser?

A linha que resolveu o acidente.

 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]);
        }
     }
  }
//+------------------------------------------------------------------+

Corrigir agora? Corrigir se não se importa.

 
Kira27:
Ajustou-o um pouco, está quase a funcionar como deveria, até 51,20 aí cai com um erro.

Matriz divertida (BRN, W1) fora do intervalo permitido

O que pode ser?

Ao mesmo tempo, copia-se um certo número de elementos para a matriz HandleFractalUP_W1, mas não se controla exactamente quantos.

Em seguida, faça um loop through int i=Bars(Símbolo(),período); //Número de barras no gráfico W1

Como resultado, terá novamente uma saída fora da matriz, mas nomanípulo[n]

Trabalhe um pouco da lógica de enchimento, leve o seu tempo.

----

Kira27:

A linha que resolveu o acidente.

Corrija-o se não se importa.

É tão complicado, mas vai acertar.

 
Kira27:

A linha que resolveu o problema do acidente

Corrija-o se não se importa.

Excepto que há menos fractais do que barras na janela do gráfico semanal, e ao preencher a matriz com valores de preços de fractais, apenas 90 células são preenchidas, e o resto do layout da memória é redundante Então, deve primeiro calcular o número de fractais, e só depois aplicar o ArrayResize para reserva de memória?

 
Vitaly Muzichenko:

Ao mesmo tempo, copia-se um certo número de elementos para a matriz HandleFractalUP_W1, mas não se controla exactamente quantos.

Em seguida, faça um loop through int i=Bars(Símbolo(),período); //Número de barras no gráfico W1

Como resultado, terá novamente uma saída fora da matriz, mas nomanípulo[n]

Trabalhe um pouco da lógica de enchimento, leve o seu tempo.

----

É tão complicado, mas vai acertar.

Obrigado!!!

 

Boa tarde a todos. Por favor, ajude-me a compreender porque não consigo obter o histórico do volume. Tentou fazê-lo de 2 maneiras.

Primeira via:

MqlRates mrate5[];

if(CopyRates(_Symbol,PERIOD_M5,1,bars_used,mrate5)<0)

{

Alerta("Erro na cópia de dados históricos para M5 - erro:",GetLastError(),"!");

regressar;

}

para (int i=0;i<barras_utilizadas;i++) {

Imprimir(mrate5[i].real_volume)

}

Segunda via:

volumes longos5[];

if(CopyRealVolume(_Símbolo,PERÍODO_M5,1,barras_utilizadas,volumes5)<0)

{

Alerta("Copy volumes error for M5 - erro:",GetLastError(),"!"!);

regressar;

}

para (int i=0;i<barras_utilizadas;i++) {

Imprimir(volumes5[i])

}

Em ambos os casos, o conjunto de volumes contém sempre apenas zeros. Só não se consegue obter qualquer informação significativa...


 
seleand:

Boa tarde a todos. Por favor, ajude-me a compreender porque não consigo obter o histórico do volume. Tentou fazê-lo de 2 maneiras.

Primeira via:

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)
}

A segunda via:

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])
}

Em ambos os casos, a matriz de volume contém sempre apenas zeros. Só não consigo obter qualquer informação significativa...


  1. Aprenda a inserir código.
  2. Em forex, não há volumes reais.
 

Obrigado. Compreendo correctamente que existe um volume de carraça?

Quando descarreguei o histórico de cotações para o site finam, havia vol, além de aberto, alto, baixo, fechado. Não disse exactamente que volume era. Isto é um volume de carrapato?