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

 
Konstantin Nikitin:

Sí, eso es lo que quiero decir. Bien, nos lo perdimos. Lo principal es que entienda lo que es...

¿Quién? Ahí es donde empecé.

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

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

Alexey Viktorov, 2019.06.11 09:06

No se puede utilizar SymbolInfoInteger para obtener Point()).

Y en general, es necesario recordar que Point() o _Point sólo para el símbolo actual. Para los símbolos distintos a los que trabaja el EA, debe utilizar esta función.

La función SymbolInfoInteger no sólo devuelve valores int, sino también long, bool y enumeraciones.

A continuación, por supuesto, se refería a Digits() o _Digits y escribió lo que había escrito. Y la última línea de respuesta se refería a la segunda parte de la pregunta. No olvides el proverbio ruso: "Un hombre inteligente no lo cuenta, un tonto no lo adivina". adivinado y dicho, así que no es ni una cosa ni la otra.
 
Alexey Viktorov:

Может вам очень не повезло, но я не люблю колупаться в чужом коде. Тем более править его...

Alexey Viktorov:

Siguiente pregunta: ¿Con qué frecuencia crees que el valor del indicador será exactamente 50?

Según he entendido el problema, debería ser un color >50 y otro <=50, pero ==50 no lo he visto por ningún lado. Por supuesto, para no perder en caso ==50, deberíamos añadir >=50 a uno de ellos y <=50 a otro. Puede parecer mejor.

Y la segunda pregunta: ¿hasta qué punto era necesario cambiar toda la indexación del buffer? Después de reindexar, ¿arreglaste todo en tu código? Tal vez sería más fácil hacer el índice de la memoria intermedia de color 4, y las memorias intermedias auxiliares 5 y 6 en consecuencia. Tendrías menos que editar y menos posibilidades de cometer más errores.

  • Gracias por la respuesta. Si Luby hubiera hurgado en el código de otra persona, lo más probable es que te hubiéramos perdido como experto, así que es una suerte en este sentido.
  • Acerca de <= o >= estoy de acuerdo, la omisión, por supuesto, uno de ellos debe estar presente, tan pronto como se ejecuta a través, pero hasta ahora no es una cuestión de principio.
  • Lo he intentado, he reasignado un búfer de color, he reasignado grupos enteros, he intercambiado grupos (arriba/abajo) - nada ayuda. Ahora terminaré el post e intentaré hacer un indicador de histograma independiente, sin líneas. Si funciona, intentaré combinarlos de nuevo. Es una cuestión de principios. No quiero dejar atrás manchas blancas de incomprensión.

 
Sergey Voytsekhovsky:

  • Gracias por su respuesta. Si Lubilee hubiera estado hurgando en el código de otras personas, probablemente te habríamos perdido como experto, así que es una suerte en ese sentido.
  • Acerca de <= o >= estoy de acuerdo, la omisión, por supuesto, uno de ellos debe estar presente, tan pronto como se ejecuta a través, pero hasta ahora no es una cuestión de principio.
  • Lo he intentado, he reasignado un búfer de color, he reasignado grupos enteros, he intercambiado grupos (arriba/abajo) - nada ayuda. Ahora terminaré el post e intentaré hacer un indicador de histograma aparte, sin líneas. Si funciona, intentaré combinarlos de nuevo. Es una cuestión de principios. No quiero dejar manchas blancas de incomprensión.

Te habrás devanado los sesos al cambiar la indexación del buffer.

Vuelve a coger el código antiguo del mensaje 8806 y cambia sólo la secuencia del buffer.

   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
Entonces traza las condiciones cuando es necesario poner 0 y cuando es necesario poner 1
 
Alexey Viktorov:

No debiste pensar demasiado cuando cambiaste la indexación del buffer.

Vuelve a coger el código antiguo del post 8806 y cambia sólo la secuencia del buffer.

Luego traza las condiciones de cuándo poner 0 en el buffer de color y cuándo poner 1

Lo hice, no sirvió de nada, admití que me estaba equivocando, después de tu post lo volví a hacer. Aquí están los lugares del código que he cambiado. El antiguo está sin comentar.

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID

#property indicator_type3   DRAW_COLOR_HISTOGRAM2
#property indicator_color3  clrGreen,clrRed
#property indicator_style3  STYLE_SOLID

#property indicator_width1  3 
#property indicator_width2  2 
#property indicator_width3  1 
//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing
//--- indicator buffers
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
     //double    ExtHighesBuffer[];
     //double    ExtLowesBuffer[];
     //double    ColorHistogram_2Colors[];
double    ColorHistogram_2Colors[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(3,ColorHistogram_2Buffer2,INDICATOR_DATA);
        //SetIndexBuffer(4,ExtHighesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(5,ExtLowesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(6,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   //PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetString(0,PLOT_LABEL,"Main");
   PlotIndexSetString(1,PLOT_LABEL,"Signal");
        //PlotIndexSetString(2,PLOT_LABEL,"UP");
        //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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[])
  {
   int i,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>=50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,colors[i]);
   return(rates_total);
  }
//+------------------------------------------------------------------+ 

Así es como estaba antes de hacer los cambios. El histograma está ahí, el color correcto no.

Así es ahora. El histograma ha desaparecido, no se muestra.

Creo que no estoy pensando bien otra vez.


 
Sergey Voytsekhovsky:

Lo hice, no funcionó, cometí errores, después de tu post lo volví a hacer. Aquí están los lugares en el código que he cambiado. El antiguo está sin comentar.

Así es como estaba antes de hacer los cambios. El histograma está ahí, el color correcto no.

Así es ahora. El histograma ha desaparecido, no se muestra.

Creo que no estoy pensando bien otra vez.


Esto no tiene ninguna lógica. La secuencia debe ser la siguiente: se determina el valor del histograma y se rellena el índice i-ésimo de la memoria intermedia del indicador. A continuación, una comprobación separada, si este valor >=50 el búfer de color se llena con 0, de lo contrario 1. Esto se determina por la secuencia de colores en la directiva

#property indicator_color3  clrGreen,clrRed

Si es 0, se toma el color clrGreen y si es 1, clrRed

Y esta línea es completamente superflua, y la secuencia es la opuesta a la primera.

color     colors[]={clrRed,clrGreen};

Y esto

int       cl;

¿añadido con qué propósito? Es más fácil de llenar directamente.

ColorHistogram_2Colors[i]=0;
// или 
ColorHistogram_2Colors[i]=1;

Para rellenar el buffer de color, utilizaría esta construcción

         ColorHistogram_2Colors[i]=ExtMainBuffer[i] >= 50 ? 0 : 1; 
El operador ?: es equivalente a if else pero se aplica más fácilmente
 
Alexey Viktorov:

La lógica aquí está rota en general. La secuencia debe ser la siguiente: Definir el valor del histograma, rellenar el índice i-ésimo del buffer de indicadores. A continuación, una comprobación separada, si este valor >=50 el búfer de color se llena con 0, de lo contrario 1. Esto se determina por la secuencia de colores en la directiva

Si es 0, se toma el color clrGreen y si es 1, clrRed

Y esta línea es absolutamente innecesaria, y la secuencia es la opuesta a la primera.

Y esto

¿añadido con qué propósito? Es más fácil de llenar directamente.

Para rellenar el buffer de color, utilizaría esta construcción

El operador ?: es equivalente a if else pero más fácil de usar

WURRAA, y mi alma ha cantado. ¡¡¡¡¡Alexey, muchas gracias !!!!!

Todo funcionó, no entiendo muy bien cómo es posible prescindir de la matriz

color     colors[]={clrRed,clrGreen};

porque su descripción ha sido eliminada. ¿Así que puedes prescindir de la matriz extra aquí?


 
Sergey Voytsekhovsky:

  • Gracias por su respuesta. Si Luby hubiera hurgado en el código de otras personas, lo más probable es que te hubiéramos perdido como experto, así que es una suerte en ese sentido.
  • Acerca de <= o >= estoy de acuerdo, la omisión, por supuesto, uno de ellos debe estar presente, tan pronto como se ejecuta a través, pero hasta ahora no es una cuestión de principio.
  • Lo he intentado, he reasignado un búfer de color, he reasignado grupos enteros, he intercambiado grupos (arriba/abajo) - nada ayuda. Ahora terminaré el post e intentaré hacer un indicador de histograma aparte, sin líneas. Si funciona, intentaré combinarlos de nuevo. Es una cuestión de principios. No quiero dejar manchas blancas de incomprensión.

Mi Squeaky es un milagro, lo lleva a todas partes y a todas partes.

p.d. Todavía no he aprendido a adjuntar correctamente la imagen, por favor, disculpadme, pondré capturas de pantalla.

Archivos adjuntos:
EURUSD.png  52 kb
GBPUSD.png  54 kb
 
Alexey Viktorov:

Para rellenar el buffer de color utilizaría esta construcción

El operador ?: es equivalente a if else, pero más fácil de usar

¡¡¡Grandes consejos y una gran ciencia para el futuro!!! Incluso fue un poco más allá. A continuación se muestra el resultado.

Así fue:

if(ExtMainBuffer[i]>=50){
         //cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=0;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
if(ExtMainBuffer[i]<50){
         //cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=1;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 

Así se hizo, ¡¡¡la eficacia del enfoque es evidente!!! Gracias.

      ColorHistogram_2Buffer1[i]=ExtMainBuffer[i] >= 50 ? 50 : ExtMainBuffer[i]; 
      ColorHistogram_2Buffer2[i]=ExtMainBuffer[i] >= 50 ? ExtMainBuffer[i] : 50; 
      ColorHistogram_2Colors [i]=ExtMainBuffer[i] >= 50 ? 0 : 1;
         Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
            " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
            " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
            " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
            " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
 
Sergey Voytsekhovsky:

¡¡¡Grandes consejos y una gran ciencia para el futuro!!! Fue incluso un poco más allá de eso. A continuación se muestra el resultado.

Así fue:

Así se hizo, ¡¡¡la eficacia del enfoque es evidente!!! Gracias.

No hay eficiencia aquí - tres condiciones if-else en lugar de una. Aquí, es peor tal y como está...

 
Artyom Trishkin:

Aquí no hay eficiencia: hay tres condiciones if-else en lugar de una. Aquí es peor...

Sí, efectivamente, no me había dado cuenta. Se ve mejor, hay menos letras.

¿Y no hay manera de poner tres ejecuciones (no sé cómo decirlo correctamente) bajo un operador?: a la vez?