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

 

por qué este bucle no termina cuando ... (He añadido la segunda condición para i < 2000 cuando me he dado cuenta de que el bucle es infinito) MQL4

cv * tvp * (double)stop < ml


double tvp  = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE_PROFIT),
          vm   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
          vs   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP),
          ml   = AccountEquity() * (risk / 100.0),
          cv   = -1.0;
   
   for(int i = 0; cv * tvp * (double)stop < ml && i < 2000; i++)
     {
      if( (vm + vs * (double)i) * tvp * (double)stop < ml ) { cv = vm + vs * (double)i; Print(i," ",cv,"/",ml); };
     };


 
Alexandr Sokolov:

por qué este bucle no termina cuando ... (He añadido la segunda condición para i < 2000 cuando me he dado cuenta de que el bucle es infinito)



El bucle no terminará hasta que

cv * tvp * (double)stop < ml

Para que el bucle termine cuando se cumpla esta condición, podemos escribir lo siguiente en el cuerpo del bucle

for(int i = 0; i < 2000; i++)
{
  if(cv * tvp * (double)stop < ml)
    break
  ...
}

o

for(int i = 0; cv * tvp * (double)stop >= ml; i++)
{
  if(i >= 2000)
    break;
  ...
}
 
Mihail Matkovskij:

En MQL4 sólo de esta manera:

Resultado:


Gracias de nuevo por su ayuda. Les agradecería mucho que me dijeran también cómo hacer lo siguiente...
Qué función o construcción del lenguaje se puede utilizar para calcular el valor del índice de un elemento del array que tenía el índice antes de la ordenación.

Aquí tengo el array A[] antes de la ordenación (la línea superior) y el mismo array después de la ordenación. Un elemento con valor 5 antes de la ordenación estaba en el índice 9
, y un elemento con valor 5 después de la ordenación está en el índice 3.

Encuentro una celda con valor 5 en el array ordenado y la función guarda el número de índice de esta celda en el array ordenado en W, que es igual al índice 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

PREGUNTA: Después de ArrayBsearch(), ¿cómo se puede almacenar el valor del índice de una celda con valor 5 en una variable que tiene un array sin ordenar?

Es decir, guardar el valor de 9.
Gracias por su ayuda.

 
 

Hola a todos. ¿Quién sabe cómo establecer un valor negativo en un indicador personalizado y hacer que funcione? Es decir, "Desplazar el indicador en relación con el gráfico de precios".

Ejemplo: Si se pone un valor de -4 en el indicador de Media Móvil, éste se desplaza respecto al gráfico hacia la izquierda - y funciona.

Pero si se pone este valor en el código del indicador - entonces el indicador deja de funcionar. y muestra todos los valores TF en rojo.

Archivos adjuntos:
 
ANDREY:

Gracias de nuevo por su ayuda. Les agradecería mucho que me dijeran también cómo hacer lo siguiente...
Qué función o construcción del lenguaje se puede utilizar para calcular el valor del índice de un elemento de la matriz, que este elemento tenía antes de la ordenación.

Aquí tengo el array A[] antes de la ordenación (la línea superior) y el mismo array después de la ordenación. Un elemento con valor 5 antes de la ordenación estaba en el índice 9
, y un elemento con valor 5 después de la ordenación está en el índice 3.

Encuentro una celda con valor 5 en el array ordenado y la función guarda el número de índice de esta celda en el array ordenado en W, que es igual al índice 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

PREGUNTA: Después de ArrayBsearch(), ¿cómo se puede almacenar el valor del índice de una celda con valor 5 en una variable que tiene un array sin ordenar?

Es decir, guardar el valor de 9.
Gracias por su ayuda.

pero no clasificar los datos al azar y sin ningún propósito global.

Del proyecto actual: toma un array (corto), la salida serán los índices de los elementos en el orden correcto:

void BubleSortIndex5(double &data[5],int &index[5])
{
   for(int i=0;i<5;i++)
      index[i]=i;
   for(int i=0;i<4;i++) {
      for(int j=1;j<5;j++) {
         if (data[index[i]]>data[index[j]]) {
            int tmp=index[i];
            index[i]=index[j];
            index[j]=tmp;
         }
      }
   }
}


para arrays más grandes necesitamos cambiar el algoritmo de ordenación (el burbujeo no funciona para arrays más grandes) - cámbialo.

El mensaje principal es: no tocar los datos de origen. Operar con referencias o, mejor aún, con índices de matrices. De lo contrario, se pierde información, que será muy necesaria más adelante.

 
ANDREY:

Gracias de nuevo por su ayuda. Les agradecería mucho que me dijeran también cómo hacer lo siguiente...
Qué función o construcción del lenguaje se puede utilizar para calcular el valor del índice de un elemento de la matriz, que este elemento tenía antes de la ordenación.

Aquí tengo el array A[] antes de la ordenación (la línea superior) y el mismo array después de la ordenación. Un elemento con valor 5 antes de la ordenación estaba en el índice 9
, y un elemento con valor 5 después de la ordenación está en el índice 3.

Encuentro una celda con valor 5 en el array ordenado y la función guarda el número de índice de esta celda en el array ordenado en W, que es igual al índice 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

PREGUNTA: Después de ArrayBsearch(), ¿cómo se puede almacenar el valor del índice de una celda con valor 5 en una variable que tiene un array sin ordenar?

Esto es para guardar el valor de 9.
Gracias por su ayuda.

Para ello tienes que responder a dos preguntas:qué harás si:

1. Habrá múltiples valores de 5, en diferentes celdas del array.

2. No habrá ningún valor 5 en la matriz.

Porque la funciónArrayBsearch (para datos ordenados), en el primer caso, dará el primer índice encontrado donde el valor de la celda sea 5, en el segundo caso, dará un elemento cercano al valor 5. No me queda claro cómo quieres tratar un array sin ordenar.

 
sla100:

Hola a todos. ¿Quién sabe cómo establecer un valor negativo en un indicador personalizado y hacer que funcione? Es decir, "Desplazar el indicador en relación con el gráfico de precios".

Ejemplo: Si se pone un valor de -4 en el indicador de Media Móvil, éste se desplaza respecto al gráfico hacia la izquierda - y funciona.

Pero si se pone este valor en el código del indicador, el indicador deja de funcionar. y muestra valores rojos para todos los TFs.

SetIndexShift.

El turno también se especifica en iMA:

iMA

Devuelve el valordel indicadortécnico Media Móvil.

dobleiMA(
símbolo de cadena,// nombre del símbolo
inttimeframe,// marco temporal
intma_period,// período
intma_shift,// Desplazamiento de la media
intma_method,// método de promediación
intapplied_price,//tipo de precio
intdesplazamiento // desplazamiento
);

Parámetros

símbolo

[in] Nombre del símbolo cuyos datos se utilizarán para calcular el indicador.NULL significa símbolo actual.

marco temporal

[en] Período. Puede ser uno de los valores de la enumeraciónENUM_TIMEFRAMES. 0 significa el período del gráfico actual.

ma_period

[en] Período de promediación para el cálculo del indicador.

ma_shift

[in] Desplazamiento del indicador en relación con el gráfico de precios.

ma_method

[en] Método de promediación. Puede ser cualquiera de los valores de la enumeraciónENUM_MA_METHOD.

precio_aplicado

[en] Precio aplicado. Puede ser cualquier valor de la enumeraciónENUM_APPLIED_PRICE.

turno

[in] Índice del valor obtenido del buffer del indicador (desplazamiento relativo a la barra actual por un número especificado de períodos hacia atrás).

Valor devuelto

Valordel indicador técnico Moving Average.

Ejemplo:

AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);

https://docs.mql4.com/ru/indicators/ima

Aquí hay un ejemplo ya hecho, pero en MQL5: https://www.mql5.com/ru/docs/indicators/ima ,

que puede traducirse fácilmente a MQL4.

SetIndexShift - Пользовательские индикаторы - Справочник MQL4
SetIndexShift - Пользовательские индикаторы - Справочник MQL4
  • docs.mql4.com
При положительном значении изображение линии смещается вправо, при отрицательном - влево. Значение, рассчитанное на текущем баре, рисуется с указанным смещением относительно текущего бара.
 

No hay ningún cambio en la configuración de los indicadores. Entré en el código y puse shift -4 en el código y el indicador dejó de funcionar - muestra todos los TFs en rojo. Estoy sentado aquí preguntándome por qué.

Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Среди программ для автоматического трейдинга можно выделить две большие категории: торговые роботы и индикаторы. Первые предназначены для совершения торговых операций на рынках, а вторые — для анализа котировок и выявления закономерностей в их изменении. При этом индикаторы могут использоваться непосредственно в роботах, образуя полноценную...
 
Mihail Matkovskij:

Para ello, debe responder a dos preguntas:¿Qué hará si

1. Habrá varios valores de 5, en diferentes celdas del array.

2. El valor 5 no estará en el array.

Porque la funciónArrayBsearch (para datos ordenados), en el primer caso, dará el primer índice encontrado donde el valor de la celda sea 5, en el segundo caso, dará un elemento cercano al valor 5. No me queda claro cómo querrías tratar un array sin ordenar.

Muchas gracias por su rápida respuesta. En mi caso, cada valor de un elemento del array es único y existe en una única instancia. Es decir, el valor 5, al igual que otros valores, no se repite.

En mi caso el valor 5 puede no existir en un array no ordenado. Esto significa que algunas celdas de la matriz sin clasificar pueden estar vacías.
Pero si el valor 5 no está en la matriz sin clasificar, entonces no puedo especificar el valor 5 como segundo parámetro en la función ArrayBsearch(). Sólo los valores que existen necesariamente en la matriz sin clasificar entran en esta función.
Gracias por su ayuda