Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1290

 
Vitaly Muzichenko:

---

P.S. In generale, c'è molto di sbagliato nello stesso array, per esempio.

Grazie per l'aiuto e per il suggerimento!!! Ecco come si 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, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Tweaked un po', funziona quasi come necessario, prima della 51.20 si blocca lì con un errore

Array Funct (BRN, W1) fuori portata

//+------------------------------------------------------------------+
//|                                                        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]);
        }
     }
  }
//+------------------------------------------------------------------+
Cosa può essere?
 
Kira27:
Modificato un po', funziona quasi come necessario, fino alla 51.20 lì si blocca con un errore

Array Funct (BRN, W1) fuori dall'intervallo consentito

Cosa può essere?

Provate in questo modo, non avete impostato la dimensionalità dell'array

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

In generale, questa non è una buona soluzione

 
Kira27:
Modificato un po', funziona quasi come necessario, prima della 51.20 si blocca con un errore

Array Funct (BRN, W1) fuori portata

Cosa può essere?

La linea che ha risolto l'incidente.

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

Corretto ora? Corretto se non ti dispiace.

 
Kira27:
L'ho modificato un po', funziona quasi come dovrebbe, fino alla 51.20 lì si blocca con un errore.

Array Funct (BRN, W1) fuori dall'intervallo consentito

Cosa può essere?

Allo stesso tempo, si copia un certo numero di elementi nell'array HandleFractalUP_W1, ma non si controlla esattamente quanti.

Poi fare il loop int i=Bars(Symbol(),period); //Numero di barre sul grafico W1

Come risultato, otterrete di nuovo un' uscita fuori dall'array, ma inhandle[n]

Lavora un po' sulla logica di riempimento, prenditi il tuo tempo.

----

Kira27:

La linea che ha risolto l'incidente.

È corretto ora? Correggetelo se non vi dispiace.

È così complicato, ma ci riuscirai.

 
Kira27:

La linea che ha risolto il problema del crash

Correggetelo se non vi dispiace.

Tranne che ci sono meno frattali che barre nella finestra del grafico settimanale, e quando si riempie l'array con i valori di prezzo dei frattali, solo 90 celle sono riempite, e il resto del layout di memoria è ridondante Questo significa che il numero di frattali dovrebbe essere calcolato prima, e solo allora ArrayResize dovrebbe essere applicato per la prenotazione della memoria?

 
Vitaly Muzichenko:

Allo stesso tempo, si copia un certo numero di elementi nell'array HandleFractalUP_W1, ma non si controlla esattamente quanti.

Poi fare il loop int i=Bars(Symbol(),period); //Numero di barre sul grafico W1

Come risultato, otterrete di nuovo un' uscita fuori dall'array, ma inhandle[n]

Lavora un po' sulla logica di riempimento, prenditi il tuo tempo.

----

È così complicato, ma ci riuscirai.

Grazie!!!

 

Buon pomeriggio a tutti. Per favore, aiutatemi a capire perché non posso ottenere la cronologia del volume. Ho provato a farlo in 2 modi.

Primo modo:

MqlRates mrate5[];

se(CopyRates(_Symbol,PERIOD_M5,1,barre_usate,mrate5)<0)

{

Alert("Error in copying historical data for M5 - error:",GetLastError(),"!!!");

ritorno;

}

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

Stampa(mrate5[i].real_volume)

}

Secondo modo:

volumi lunghi5[];

if(CopyRealVolume(_Symbol,PERIOD_M5,1,bars_used,volumes5)<0)

{

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

ritorno;

}

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

Stampa(volumi5[i])

}

In entrambi i casi, l'array di volumi contiene sempre e solo zeri. Non è possibile ottenere alcuna informazione significativa...


 
seleand:

Buon pomeriggio a tutti. Per favore, aiutatemi a capire perché non posso ottenere la cronologia del volume. Ho provato a farlo in 2 modi.

Primo modo:

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

Il secondo modo:

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

In entrambi i casi, l'array di volumi contiene sempre e solo zeri. Non riesco a ottenere nessuna informazione significativa...


  1. Impara come inserire il codice.
  2. Nel forex, non ci sono affatto volumi reali.
 

Grazie. Ho capito bene che c'è un volume di tick?

Quando ho scaricato la cronologia delle quotazioni per il forex dal sito finam, c'era vol oltre a open, high, low, close. Non hai detto esattamente che volume era. Questo è un volume di tick?

Motivazione: