Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1167

 

Buen internet y buena salud para todos.


Pregunta, ¿qué estoy haciendo mal? Las matrices (STATIC) se rellenan, pero el cálculo da 0 (cero). ¿Puede decirme qué es lo que no tengo en mi código? ¿Por qué los elementos del array no se comparan y se suman? Gracias


 double Open[60],High[60],Lo[60,Close[60]; int to_copy=60;
if(CopyOpen(NULL,PERIOD_H4,1,to_copy,Open)<to_copy)return(0);
   if(CopyHigh(NULL,PERIOD_H4,1,to_copy,High)<to_copy)return(0);
   if(CopyLow(NULL,PERIOD_H4,1,to_copy,Low)<to_copy)return(0);
   if(CopyClose(NULL,PERIOD_H4,1,to_copy,Close)<to_copy)return(0);
//----   
   //int start=to_copy*PeriodSeconds(PERIOD_H4)/PeriodSeconds(_Period);
   int start=to_copy;
   
   if(Tf==true)
     {
      if(prev_calculated==0)
         for(int j=1; j<=start; j++)
           {
            if(Open[j]>Close[j])
               candle+=Open[j]-Close[j];
            if(Close[j]>Open[j])
               candle+=Close[j]-Open[j];
            candleHL+=High[j]-Low[j];
            br+=1;
           } //for 
Comment(High[10],". ",candle);
candle дает результат 0 ноль
 
kopeyka2:

Buen internet y buena salud para todos.


Pregunta, ¿qué estoy haciendo mal? Las matrices (STATIC) se rellenan, pero el cálculo da 0 (cero). ¿Puede decirme qué es lo que no tengo en mi código? ¿Por qué los elementos del array no se comparan y se suman? Gracias


1) El bucle va más allá del array - si el tamaño del buffer es 60, el último índice es 59, porque el primer índice es 0

2) El código no está completo - por ejemplo, ¿cómo se define Tf y con qué se inicializó la vela?


* Cuando se copian los precios, la indexación se desplaza en uno, porque se copian 60 elementos empezando por el primer índice, es decir, los precios de la primera barra cerrada ya estarán bajo el índice 0

 

Cómo funciona la función

IsStopped();

... ¿y qué lista de tareas realiza?


En la ayuda está escrito - "Comprueba la terminación forzada del programa mql5". Es decir, ¿se "mira" algún número de líneas de código por delante y se comprueba si algo es correcto? ¿Cómo se establece su área de responsabilidad (por ejemplo, por línea o 10 líneas)?


Pensaba que sólo evita que el bucle vaya más allá de la matriz, pero lo he visto en el código FAMA antes de copiar los precios máximos y mínimos

 
Alexandr Sokolov:

Cómo funciona la función

... ¿y qué lista de tareas realiza?


En la ayuda está escrito - "Comprueba la terminación forzada del programa mql5". Es decir, ¿se "mira" algún número de líneas de código por delante y se comprueba si algo es correcto? ¿Cómo se establece su área de responsabilidad (por ejemplo, por línea o 10 líneas)?


Pensaba que sólo evita que el bucle vaya más allá del array, pero lo he visto todavía en el código FAMA antes de copiar los precios High y Low

No se ve en ninguna parte... Está claramente escrito ahí. Comprueba la bandera... Vuelve a leerlo.

Документация по MQL5: Проверка состояния / IsStopped
Документация по MQL5: Проверка состояния / IsStopped
  • www.mql5.com
Возвращает true, если в системной переменной _StopFlag содержится значение, отличное от 0. Ненулевое значение записывается в переменную _StopFlag, если поступила команда завершить...
 
Alexandr Sokolov:

Cómo funciona la función

... ¿y qué lista de tareas realiza?


En la ayuda está escrito - "Comprueba la terminación forzada del programa mql5". Es decir, ¿se "mira" algún número de líneas de código por delante y se comprueba si algo es correcto? ¿Cómo se establece su área de responsabilidad (por ejemplo, por línea o 10 líneas)?


Pensaba que sólo evita que el bucle vaya más allá del array, pero lo he visto en el código de FAMA antes de copiar los precios de Alta y Baja

si se produce una parada de un programa MQL, el _StopFlag se establecerá, y se puede comprobar ya sea utilizando una variable predefinida o la función IsStopped() - lo que sea conveniente, utilícelo de esa manera.

después de establecer _StopFlag , el programa MQL tiene un poco de tiempo para detenerse, y luego la terminal lo descarga forzosamente

el uso más extendido son los guiones en bucle, no

while(true)
{
...
}

es mejor escribirlo así:

while(!IsStopped())
{
...
}

bueno, a veces en los cálculos de costes o en los ciclos grandes utilizan

for(int i=0; i<1 e6 && !IsStopped(); i++)
{

}
 

Hola a todos.

¿Me pueden decir si es posible hacer un bucle a través de las variables con nombres: L1, L2, L3 ... Ln para escribir en un array bidimensional

extern string L1       = "1.15110;1.14105;1.13240;1.12370;1.11640;1.11170;1.10655;1.09895;1.08850;1.07850;1.06475;";
extern string L2       = "1.32130;1.31030;1.29860;1.29042;1.27985;1.25605;1.24725;1.23565;1.22505;1.20815;1.20115;1.18850;1.16690;1.14465;"; 
extern string L3       = "0.94947;0.93222;0.91472;0.90077;0.89075;0.88658;0.86814;0.84687;0.82795;0.81132;0.79022;0.75976;"; 

...

extern string Ln      = " ... ";    
 
Alexandr Sokolov:

1) El bucle tiene un desbordamiento del array - si el tamaño del buffer es 60, entonces el último índice será 59, ya que el primer índice es 0

2) El código no está completo - por ejemplo, ¿cómo se define Tf y con qué se inicializó la vela?


* al copiar los precios la indexación se desplaza en uno, ya que se copian 60 elementos empezando por el primer índice, es decir, los precios de la primera barra cerrada ya estarán bajo el índice 0

GRACIAS por su respuesta. Código completo. Aumenta el tamaño estático del array. Se ha eliminado la entrada de control cero en los operadores. Un "tonto" común. Todavía estoy tratando de averiguar por qué no está añadiendo. ¿Qué no hay en mi código ahora? Gracias por los consejos. Todavía no he trabajado con arrays estáticos en mql5.....

HE ACTUALIZADO EL CÓDIGO. La pregunta es la misma...

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, "
//---- номер версии индикатора
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
//----
input int       nBars = 20;
//----
int    limit=0,br=0,to_copy=nBars;
double corrHL,corrOC;
double averpips,averpipsH;
double candle,candleHL;
double opn,hgh,lw,cls;
double Open[65],High[65],Low[65],Close[65];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
   Comment("");
  }
//+------------------------------------------------------------------+
//| 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(CopyOpen(NULL,PERIOD_H4,0,to_copy,Open)<to_copy)
      return(0);
   if(CopyHigh(NULL,PERIOD_H4,0,to_copy,High)<to_copy)
      return(0);
   if(CopyLow(NULL,PERIOD_H4,0,to_copy,Low)<to_copy)
      return(0);
   if(CopyClose(NULL,PERIOD_H4,0,to_copy,Close)<to_copy)
      return(0);
     int indexmass=ArraySize(Open);
//----
   if(Tf==true)
     {
      if(prev_calculated==0)
         for(int j=1; j<=to_copy; j++) // поменять на ноль?????
           {
            opn=Open[j];
            hgh=High[j];
            lw=Low[j];
            cls=Close[j];
            if(opn>cls)
               candle+=opn-cls;
            if(cls>opn)
               candle+=cls-opn;
            candleHL+=hgh-lw;
            br+=1;
           } //for j
      if(br>0)
        {
         averpips=candle/br;
         averpips=NormalizeDouble(averpips,_Digits);
         averpipsHL=candleHL/br;
         averpipsHL=NormalizeDouble(averpipsHL,_Digits);
        }
      }
   Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpipsHL ",averpipsHL);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpips ",averpips);
Los valores de los elementos del array son mayores que cero. En los cálculos, el cero
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
stepystr:

Hola a todos.

¿Me pueden decir si es posible hacer un bucle a través de las variables con nombres: L1, L2, L3 ... Ln para escribir en una matriz bidimensional

borrado el mensaje - usted sabe acerca de las matrices

pero todavía no es posible

como opción para escribir una macro de sustitución, escriba un ejemplo específico - tal vez alguien escriba una macro para su tarea, soy malo escribiendo macros.

 

¡¡¡Gente!!! (Pista... )))

Código completo. Aumento del tamaño de la matriz estática. Eliminado el control de escritura cero en los operadores... Un "tonto" común. Todavía quiero entender por qué no cuenta la adición. ¿Qué no hay en mi código ahora? Gracias por los consejos. Todavía no he trabajado conarrays estáticos en mql5.....

HE ACTUALIZADO EL CÓDIGO. La pregunta es la misma...

Los valores de los elementos del array son mayores que cero. En los cálculos, el cero
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

GRACIAS por la respuesta. Código completo. Aumento del tamaño de la matriz estática. Eliminada la entrada de control cero en los operadores... Un "tonto" común. Todavía estoy tratando de averiguar por qué no está añadiendo. ¿Qué falta ahora en mi código? Gracias por los consejos. Todavía no he trabajado con arrays estáticos en mql5.....

HE ACTUALIZADO EL CÓDIGO. La pregunta es la misma...

No estoy familiarizado con los indicadores, pero es innecesario. Ya lo tengo ))))

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(CopyOpen(NULL,PERIOD_H4,0,to_copy,Open)<to_copy)
      return(0);
   if(CopyHigh(NULL,PERIOD_H4,0,to_copy,High)<to_copy)
      return(0);
   if(CopyLow(NULL,PERIOD_H4,0,to_copy,Low)<to_copy)
      return(0);
   if(CopyClose(NULL,PERIOD_H4,0,to_copy,Close)<to_copy)
      return(0);
     int indexmass=ArraySize(Open);
Razón de la queja: