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

 
Northwest:

1. Vuelve a poner todo en su sitio, no tortures el ordenador .

Lo siento, pero no puedes hacer eso, el indicador tiene que contar de izquierda a derecha.

No lo estoy molestando, lo estoy usando para su propósito.

2.iBandsOnArray, iStdDevOnArray calculados con los datos almacenados en la matriz

Sí, se calculan utilizando los datos de la matriz bbMacd[], ¿y ahora qué?

3.El array se llena en un bucle.

¿En una o en la primera?

¿Estás diciendo que para llenar un array, necesitas un bucle personal, en el que se llene este array

se llena y no se puede realizar ninguna otra operación?


Es importante para mí averiguar por qué el indicador se ralentiza y cómo calcular los lugares en los que ocurre.

Tengo más preguntas pero no respuestas.

Por desgracia, no ha ofrecido ninguna pista.

Si algo se construye utilizando un array, debería construirse utilizando un array ya existente. Este es un ciclo de preparación de la matriz y el segundo ciclo de dibujo de un indicador por esta matriz. Este es un caso general. Hay algunos casos más específicos, pero deben ser considerados por separado - por ejemplo, podemos crear funciones, que devuelven los valores de una sola barra calculada:

//+------------------------------------------------------------------+
//| BandsOnArray                                                     |
//+------------------------------------------------------------------+
double BandsOnArray(const int rates_total,const int index,const int period,const double deviation_bb,const double &array[],const int line,const bool as_series=true)
  {
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
   //--- calculate StdDev
   double dev=StdDevOnArray(rates_total,index,period,array);
   //--- base line
   double mid=0;              
   for(int i=0; i<period; i++)
      mid+=array[index+i];    
   mid/=period;               
   //--- upper line
   double top=mid+dev*deviation_bb;
   //--- lower line
   double btm=mid-dev*deviation_bb;
   return(line==UPPER_BAND ? top : line==LOWER_BAND ? btm : mid);
  }  
//+------------------------------------------------------------------+
//| StdDevOnArray                                                    |
//+------------------------------------------------------------------+
double StdDevOnArray(const int rates_total,const int index,const int period,const double &array[],const bool as_series=true)
  {
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
//--- calculate value
   double avg=0;              
   for(int i=0; i<period; i++)
      avg+=array[index+i];    
   avg/=period;               
   double sd=0;
   for(int i=0; i<period; i++)
      sd+=(avg-array[index+i])*(avg-array[index+i]);
   return(sqrt(sd/period));
  }  
//+------------------------------------------------------------------+

Pero también requieren una matriz de datos ya preparada como entrada, porque StdDevOnArray y BandsOnArray utilizan el suavizado simple para el que se necesitan los datos rellenados iguales al valor del suavizado del periodo.

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Cualquier pregunta para los novatos en MQL4, ayuda y discusión sobre algoritmos y códigos

Artyom Trishkin, 2018.11.18 20:21

PlotIndexSetInteger(0,PLOT_ARROW,140);

Pero hay que crear un número de buffers igual al número de semanas. Y para cada tope hay que dar un código de flecha del 140 al 149 - 1,2,3,4,5,6,7,8,9,10 - ¿son suficientes diez semanas para un año? Son sólo 70 días. ¿O cómo lo querías?


¿Es posible anular SetIndexArrow a través de case?

¿O al menos mostrar los números en un histograma?


Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Cualquier pregunta para principiantes de MQL4, ayuda y discusión sobre algoritmos y códigos

Artyom Trishkin, 2018.11.18 20:02

El búfer se llena con el valor de una hora. Y si la hora es cero, el histograma no se dibujará. Por lo tanto, debemos comprobar si la hora es igual a cero (lo hemos configurado para buscar la hora cero en los ajustes), y si es igual a cero, debemos introducir 0,1 en lugar del valor de la hora (cero) en el buffer - para mostrar la columna del histograma. Esto mostrará un valor de 0 en lugar de 0,1 en la ventana de datos, ya que el indicador Dígitos está puesto a cero.


Ahora lo veo, gracias.

 
psyman:

¿Puede SetIndexArrow ser sobrescrito por un caso?

¿O al menos mostrar las cifras en un gráfico de barras?



Ahora lo veo, gracias.

Actúa sobre todo el búfer a la vez.

Tienes que poner un icono de un número de semana en la barra encontrada, y ahí debería estar el número de semanas de un año. Las flechas numéricas faltan claramente en Wingdings.

Es posible salir con textos-objeto y marcar las barras con el valor del número de la semana, pero poner el icono del buffer a 32 - un carácter vacío. El valor estará en la barra, pero no se mostrará. Entonces el valor puede ser el número de la semana del año, y en el objeto escriba lo que quiera y el objeto se mostrará en la barra encontrada.

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Cualquier pregunta para principiantes sobre MQL4, ayuda y discusión sobre algoritmos y códigos

Artyom Trishkin, 2018.11.19 10:50 am

Actúa sobre todo el búfer a la vez.

Tienes que poner un icono con el número de la semana en la barra encontrada, y ahí debería estar el número de semanas de un año. Las flechas numéricas faltan claramente en Wingdings.

Usted puede salir mediante el uso de objetos-textos, y marcar las barras con los valores del número de la semana, pero el icono de la memoria intermedia para establecer 32 - un carácter vacío. El valor estará en la barra, pero no se mostrará. Entonces el valor puede ser el número de la semana del año, y en el objeto escriba lo que quiera y el objeto se mostrará en la barra encontrada.


Escribí sobre el día de la semana: lunes, viernes, miércoles..., no el número. Sólo necesitas 5 marcas diferentes en el gráfico.

 
psyman:

Escribí sobre el día de la semana: lunes, martes, miércoles, no el número. Sólo necesitas cinco marcas diferentes en el gráfico.

Entonces necesitas cinco buffers, y asignar un número de flecha diferente a cada uno - de 140 a 144.

 
Artyom Trishkin:

Si algo se construye usando un array, debería construirse usando un array ya preparado. Y esto es un ciclo de preparación de la matriz y el segundo ciclo de dibujo del indicador por esta matriz. Este es un caso general. Hay algunos casos más específicos, pero deben ser considerados por separado - por ejemplo, podemos crear funciones, que devuelven los valores de una sola barra calculada:

Pero también requieren una matriz de datos ya preparada como entrada, porque StdDevOnArray y BandsOnArray utilizan el suavizado simple para el que se necesitan los datos rellenados iguales al valor del suavizado del periodo.

Gracias por aclarar la situación.
 

hola

¿Cómo puedo hacer una ventana emergente con botones para confirmar/cancelar manualmente una transacción?

 
Andrey Sokolov:

hola

¿Cómo puedo hacer una ventana emergente con botones para confirmar/cancelar manualmente una transacción?

MessageBox()
 
Artyom Trishkin:
MessageBox()

Gracias

 

Hola a todos.

¿Cómo puedo obtener el porcentaje de reducción máxima como en el probador?

Aquí está el código:

double  MaxPeak,DD, MaxDD, DD2, MaxDD2;
--------------------------------------
--------------------------------------
это вывод:

 SM("Maximal drawdown        : " + DoubleToString(MaxDrawdown_Money(), 2)+ " (" + DoubleToString(MaxDrawdown_Protsent(), 2) +" %)");

-------------------------------------
-------------------------------------

//--------------------Рассчет % относительной просадки----------
double MaxDrawdown_Protsent()
{
if (AccountEquity() > MaxPeak)
{
MaxPeak = AccountEquity();
}
if (AccountEquity() < MaxPeak)
{
DD2 = NormalizeDouble((MaxPeak - AccountEquity())/MaxPeak*100,2);
}
if (MaxDD2< DD2)
{
MaxDD2 = DD2;
}
return (MaxDD2);
}
//---------------------Рассчет суммы максимальной просадки--------
double MaxDrawdown_Money()
{
if (AccountEquity() > MaxPeak)
{
MaxPeak = AccountEquity();
}
if (AccountEquity() < MaxPeak)
{
DD = NormalizeDouble(MaxPeak - AccountEquity(),2);
}
if (MaxDD< DD)
{
MaxDD = DD;
}
return (MaxDD);
}

La cantidad de reducción máxima es la misma que en el probador, el porcentaje de reducción relativa también es el mismo que en el probador.

¿Cómo puedo obtener el porcentaje de reducción máxima como en el probador ?

Razón de la queja: