Errores, fallos, preguntas - página 2930

 

Traducir un indicador de mt4 a mt5

El problema está en el tamaño deDRAW_HISTOGRAM

Cuando pongo "1" o "2" el tamaño cambia, pero "3" o "4" = el tamaño sigue siendo "2".


¿Por qué todo funciona en MT4, pero hay tal problema con MT5?

#property indicator_separate_window
#property indicator_plots   4
#property indicator_buffers 4
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrDodgerBlue
#property indicator_color3 clrLimeGreen
#property indicator_color4 clrFireBrick
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 3

Resultado en mt4


Resultado en mt5, muestra sólo "2" de espesor, aunque tengo "3" en la configuración



Además, establecer la propiedad en OnInit() no ayuda

PlotIndexSetInteger(0,PLOT_LINE_WIDTH, 3);

 

Error crítico durante la depuración:

struct sA
  {
   int               i;
   string            s;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cA
  {
public:
   sA                my_array[];
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   cA *ca;
   ca=new cA();
   ArrayResize(ca.my_array,1);
   ZeroMemory(ca.my_array);
   ArrayPrint(ca.my_array);
  }

Resultado:

2020.12.27 17:04:26.966 1 (EURUSD,M1)   Access violation at 0x000001FE5AF10199 read to 0xFFFFFFFFFFFFFFFF in 'D:\Alpari MT5\MQL5\Scripts\Test\1.ex5'
2020.12.27 17:04:26.967 1 (EURUSD,M1)      crash -->  000001FE5AF10199 8B4318            mov        eax, [rbx+0x18]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF1019C 4089442420        mov        [rsp+0x20], eax
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A1 41B910000000      mov        r9d, 0x10
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A7 49B8B807F15AFE01  mov        r8, 0x1fe5af107b8
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B1 488D17            lea        rdx, [rdi]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B4 48B998D45F5FFE01  mov        rcx, 0x1fe5f5fd498
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101BE 49FF96A8120000    call       qword near [r14+0x12a8]  ; #11378 (terminal64.exe)
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
2020.12.27 17:04:26.967 1 (EURUSD,M1)   00: 0x000001FE5AF10199
2020.12.27 17:04:26.967 1 (EURUSD,M1)   01: 0x000001FE633F0010
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
La última versión beta por el momento
Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Ошибки выполнения - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
¿Alguien ha encontrado una manera de conseguir que un indicador muestre una propiedad en la ventana principal o en la subventana? Me refiero a los indicadores arbitrarios de terceros que se crean usando IndicatorCreate y que luego podrían añadirse al gráfico usandoChartIndicatorAdd a petición del usuario.
 
Stanislav Korotky:
¿Alguien ha encontrado una manera de conseguir que el indicador se muestre en la ventana principal o en la subventana? Me refiero a los indicadores personalizados que se crean con IndicatorCreate y luego se pueden añadir al gráfico con ChartIndicatorAdd.

Probablemente podría meter el indicador en OBJ_CHART y ver dónde se encuentra.

 
Stanislav Korotky:
¿Alguien ha encontrado una manera de obtener una propiedad de visualización de un indicador en la ventana principal o subventana? Me refiero a los indicadores personalizados que se crean con IndicatorCreate y luego se pueden añadir al gráfico con ChartIndicatorAdd a petición del usuario.

hizo algo similar.
Aquí hay uno que encontré. No recuerdo si funciona o no. Por favor, compruébalo.

bool FindIndicatorByHandle(long handle, string &symbol, ENUM_TIMEFRAMES &timeframe, long &ChartId, int &sub_win, string &Name) {
   long chart_id =ChartFirst();
   while (chart_id!=-1) {
      int total_sub = (int)ChartGetInteger(chart_id,CHART_WINDOWS_TOTAL);
      int total_ind; 
      for(int i=0; i<total_sub; i++) {
         total_ind = ChartIndicatorsTotal(chart_id,i);
         for (int j=0; j<total_ind; j++) {
            string name = ChartIndicatorName(chart_id,i,j);
            if (ChartIndicatorGet(chart_id,i,name)== handle) {
               ChartId=chart_id;
               symbol= ChartSymbol(chart_id);
               timeframe=ChartPeriod(chart_id);
               sub_win=i;
               Name=name;
               return true;
            }
         }
      }
      chart_id=ChartNext(chart_id);
   }
   return false;
}
El código busca en todos los gráficos abiertos un indicador por su mango. Devuelve el símbolo, el marco temporal, el identificador del gráfico, la subventana y el nombre del indicador.
 
fxsaber:

Supongo que podrías poner el indicador en OBJ_CHART y ver dónde se encuentra.

Lo probaré, de momento he tenido que hacer la opción de especificarlo por el usuario.

 
Nikolai Semko:

hizo algo similar.
Aquí hay uno que encontré. No recuerdo si funciona o no. Por favor, compruébalo.

A juzgar por el código, busca en todos los gráficos abiertos un indicador por su mango. Devuelve el símbolo, el marco temporal, el identificador del gráfico, la subventana y el nombre del indicador.

No se ajusta a su pregunta: los indicadores creados por IndicatorCreate no se colocan en ninguna ventana, sino que se "asientan" dentro de ella, y la tarea consiste en colocar dicho indicador por su asa en la ventana. Ahora, MQL5 permite añadir un manejador arbitrario a la ventana principal o a la subventana utilizando la función ChartIndicatorAdd, independientemente de las "propiedades" del indicador (¡sin errores!), y el resultado se ve muy extraño cuando la adición no se realiza como se pretende.

 

Hay un problema mayor con los indicadores.

Algunos de ellos implementan el manejador OnCalculate según la versión simplificada con un array de entrada, y para ellos se puede seleccionar el tipo de precio para el cálculo. ¿Cómo sabe el programa MQL5 de terceros que el indicador espera este tipo de precio, que debe pasarse después de todos los parámetros durante la creación del indicador? Parece que no hay manera. Y si no lo hace, el indicador es dibujado por la #propiedad indicator_applied_price a la que no se puede acceder desde el exterior. Aquí hay un simple Asesor Experto que añade el indicador/AMA al gráfico de forma programada:

int OnInit()
{
  const int h = iCustom(NULL, 0, "Examples/AMA");
  if(h == INVALID_HANDLE)
  {
    Print("iCustom failed: ", _LastError);
    return INIT_FAILED;
  }

  if(!ChartIndicatorAdd(0, 0, h))
  {
    Print("ChartIndicatorAdd failed: ", _LastError);
    return INIT_FAILED;
  }
  ChartRedraw();
  
  return INIT_SUCCEEDED;
}

Si después cambiamos el timeframe del gráfico, obtenemos 2 indicadores AMA: uno a precio de cierre (creado programáticamente) y el segundo a precio de apertura (generado debido al cambio de timeframe y a la #propiedad indicator_applied_price PRICE_OPEN; tampoco está claro por qué esta propiedad no se recoge en iCustom).

 

Para seguir con el tema de los indicadores, adjunto el Expert Advisor que utilicé para descubrir y evitar el problema con los parámetros MqlParam.

La tarea del Asesor Experto es añadir el indicador "Examples/Price_Channel" al gráfico, si aún no está allí, con los mismos parámetros.

Para ello, creamos una instancia mediante iCustom/IndicatorCreate, obtenemos un array de sus parámetros a través de IndicatorParameters, y luego llamamos en el bucle IndicatorParameters a los indicadores que ya existen en el gráfico: si no hay coincidencia de los parámetros del array, el indicador se añade al gráfico, si hay coincidencia, el nuevo manejador simplemente se destruye.

El problema es que la igualdad de parámetros no siempre funciona como se espera. En particular, existe un caso de prueba de seguridad. Colocamos el Asesor Experto en cualquier gráfico vacío y hacemos clic - se crea la primera instancia del indicador. A continuación, cambiamos a cualquier otro marco temporal del gráfico (el antiguo indicador permanece) y hacemos clic de nuevo. Extrañamente, se crea la segunda instancia del indicador.

Del análisis de la ejecución y del registro se desprende que esto se debe a la equiparación errónea de las cadenas del nombre del indicador en los parámetros. Las cadenas tienen 260 caracteres, pero el terminal 0 se encuentra mucho antes. Después hay información de servicio o basura. Así que la comparación de cadenas "==" o StringCompare tiene en cuenta esta "basura" y obtenemos la desigualdad de las cadenas.

Si convertimos las cadenas en una matriz de caracteres, las matrices se convierten en una coincidencia completa. Si conviertes a una matriz corta, obtienes basura. En definitiva, un comportamiento poco coherente que no se describe en la documentación.

Window N: 1
   0, Price Channel(22), 12
    [type] [integer_value] [double_value]                                                                                                                                                                                                                                                         [string_value]
[0]     14               0          0.000 "Indicators\Examples/Price_Channel"                                                                                                                                                                                                                                   
[1]      7              22          0.000 null                                                                                                                                                                                                                                                                  
ind1: 'Indicators\Examples/Price_Channel
ind2: 'Indicators\Examples/Price_Channel
260 0 / 260 0
Char arrays 34 34
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
Short arrays 260 260
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0     0     0     0     0     0     0     0     0     0
[ 48]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 72]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 96]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[120]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0    13  3328 58074    86 13696    54     0     0 35120  3210     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     0     0     0     0 61841 38184 17648 16370     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[240]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0    32    32    77    32    65    32    82    32    75
[ 48]    32    83     0    32    99   111   109   109    97    32   115   101   112    97   114    97   116   101   100    32   108   105   115   116
[ 72]    41     0    32   112   114   111   116   111   116   121   112   101   115    41     0     0   115     0     0     0     0     0     0     0
[ 96]   528     0     0     0     0    45     0     0     3     0     0     0   512     0     0     0  1160    45     0     0  7256 30655     0     0
[120]     0     0     0     0   512     0     0     0     0 65535  2272     0 29648    45     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     3     0     0     0 26341 16284     1     0  1308    16     0     0 49814 30635     0     0     0     0     0     0 32016    37     0     0
[240]     2     0     0     0 50336 16481     1     0     2     0     0     0     3     0     0     0 45520    37     0     0
1 0

No estoy seguro de cuál es el error exactamente, si está en el principio del procesamiento de cadenas en MQL o en otra cosa.

Si alguien conoce los matices, por favor que me dé una pista.

Archivos adjuntos:
 
Stanislav Korotky:

Si alguien conoce los matices, por favor, que me dé un consejo.

Este es el tipo de característica que, aunque la conozcas, tienes que volver a plantear toda la capa en tu cabeza.

Aquí se hizo la definición de autodisponibilidad. Parece que funciona al cambiar de TF.

Init_Sync
Init_Sync
  • www.mql5.com
Библиотека делает синхронизированными Init/Deinit индикаторов