Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 790

 
Forexman77:

La cuestión no ha sido descartada. Así que, en primer lugar.

Se encuentra un máximo y se traza una línea con respecto a él. Se comprueba la distancia entre esta línea máxima y el mínimo actual. Si supera "Rmax", se coloca una flecha en la barra donde se encuentra el máximo. La flecha está colocada pero no está. Para que quede claro, he añadido el buffer "BufferLow[i]" que muestra la diferencia y sus datos se pueden ver en la ventana del explorador.

Siempre es así. No puedo esperar a que nieve en invierno) Lo hice yo mismo.

Si alguien estaba atormentado por una idea similar, aquí está el código:

#property copyright "Kamil Gazizullin"
#property link      "forexman77@yandex.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 5
#property  indicator_color1 Magenta
#property  indicator_color2 Aqua
#property  indicator_color3 SlateBlue
#property  indicator_color4 SlateBlue
#property  indicator_color5 clrNONE
//--- input parameters
extern int       Period_=10;
extern double diapazon  =0.003;
//--- buffers
double Max[];
double Min[];
double MaxIndex[];
double MinIndex[];
double rAZNOST[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(5);
   SetIndexBuffer(0,MaxIndex);
   SetIndexBuffer(1,MinIndex);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,116);
   SetIndexEmptyValue(1,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,116);
   SetIndexEmptyValue(0,0.0);
   SetIndexBuffer(2,Max);
   SetIndexBuffer(3,Min);
   SetIndexBuffer(4,rAZNOST);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),limit, i,k,r,p,t,f;
    double minimum,maximum,Dmax,Dmin;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
   for(i=0;i<limit;i++)
   {
      maximum=High[iHighest(NULL,0,MODE_HIGH,Period_,i)];
      minimum=Low[iLowest(NULL,0,MODE_LOW,Period_,i)];
      Max[i]=maximum;
      Min[i]=minimum;
   }
   for(i=0;i<limit;i++)
   {
      k=iHighest(NULL,0,MODE_HIGH,Period_,i);
      t=iLowest(NULL,0,MODE_LOW,Period_,i);
      Dmax=Max[i]-Low[i];
      Dmin=High[i]-Min[i];
      if (Dmax > diapazon){p=k;for(r=p;r>=k;r--)MaxIndex[k]=Max[k];}
      if (Dmin > diapazon){p=t;for(f=p;f>=t;f--)MinIndex[t]=Min[t];}
      if (MaxIndex[i]==Max[i+1])MaxIndex[i]=0;
      if (MinIndex[i]==Min[i+1])MinIndex[i]=0;
      rAZNOST[i]=Max[i]-Min[i];
   }
   return(0);
  }
 
Awwl:

El Heiken Ashi incorporado parece un poco subdesarrollado (¿me pregunto si soy sólo yo en el 745?), pero está claro cómo funciona. ¡Y no está claro cómo se construye WmiFor!

En el código Heiken Ashi se dibuja una vela a partir de 4 histogramas de barras:

Es decir, a medida que aumenta el número del buffer (de 0 a 3), se dibujan nuevas barras sobre las anteriores. El orden es el siguiente:

AltoMínimo - AltoMínimo - Apertura - Cierre.

El orden de los candelabros debe ser el siguiente para conseguir su aspecto adecuado, con cuerpos y colas:

max(Open,Close)//línea gruesa de color// - min(Open,Close)//blanco grueso// - High//línea gruesa de color// - Low//blanco grueso//.

Compilemos el indicador, pongámoslo en el gráfico y veamos todos los problemas (ver imagen).

Pero este método, al igual que el Heiken Ashi, tiene una desventaja: debajo de cada "vela" obtenemos un bucle blanco en el color de fondo que cubre todo lo inferior. Pero con WmiFor todo es perfecto. ¿Funciones no documentadas?

Primera imagen - Heiken Ashi (colocada en una ventana separada), segunda imagen - WmiFor, el fondo está en verde claro para mayor claridad.

¿Estamos comparando una suave y redonda? ¿Por qué poner Haken en una ventana separada si está diseñado para una ventana de gráfico y dibujado allí como una vela con sombras y cuerpo? Si el valor del buffer cambia, la misma barra cambiará su tamaño y no se dibujará una nueva encima de ella.

El MT4 no tiene un método para dibujar en forma de velas, por lo que sólo un histograma es posible, y cómo se calculan los valores de búfer allí es su propio negocio. Por cierto, WmiFor también dibuja por histograma. Pongámoslo también en una ventana aparte y veamos sus fallos )))

Para que los candelabros de una ventana separada parezcan candelabros con sombras, deben dibujarse relativamente 0, como el Acelerador. O puede dibujarlos como objetos, véase por ejemplo All_Stars.

 

¡Buenas tardes a todos!

Mi cerebro está confuso; no he encontrado una respuesta en la documentación, pero tal vez alguien lo haya encontrado. Aquí está la línea en el Asesor Experto (fracción de operaciones positivas):

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd,",2/5*100,",100*2/5);

Lo imprime en el diario (por ejemplo):

3/6=0.00=0 0 40

Al mismo tiempo, si la solución es 1:

3/3=1.00=1 0 40

La variable BestOd=OderPluseCount/OderTotal es de tipo double, el resto son int.

Es decir, en cuanto se encuentra un valor inferior a 1, el compilador lo convierte en 0 automáticamente... Las dos últimas expresiones a partir de constantes producen resultados sorprendentes - parece lo mismo, pero no ))))

He probado diferentes sustituciones - todo lo que es mayor que 1 tiene la parte fraccionaria correcta.

 
Igor_:

¡Buenas tardes a todos!

Mi cerebro está confuso; no he encontrado una respuesta en la documentación, pero tal vez alguien lo haya encontrado. Aquí está la línea en el Asesor Experto (fracción de operaciones positivas):

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd,",2/5*100,",100*2/5);

Lo imprime en el diario (por ejemplo):

3/6=0.00=0 0 40

Al mismo tiempo, si la solución es 1:

3/3=1.00=1 0 40

La variable BestOd=OderPluseCount/OderTotal es de tipo double, el resto son int.

Es decir, en cuanto se encuentra un valor inferior a 1, el compilador lo convierte en 0 automáticamente... Las dos últimas expresiones a partir de constantes producen resultados sorprendentes - parece lo mismo, pero no ))))

He probado diferentes sustituciones, todo lo que es mayor que 1 tiene la parte fraccionaria correcta.

Prueba esto

DoubleToStr((double)(OderPluseCount/OderTotal),2)

 
AlexeyVik:

Prueba esto

DoubleToStr((double)(OderPluseCount/OderTotal),2)

No ayuda. Pero gracias )
 
Igor_:
No sirve de nada. Pero gracias )
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)
 
Vinin:
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)

Funciona así, gracias. Suena a chamanismo )))

Sinceramente, me preocupa más no la pantalla, sino el cálculo correcto deBestOd. También tuve que corregirlo.

Lo hice así:

BestOd=(OderPluseCount/(OderTotal*1,0));

¿Hay alguna explicación para esto? Después de todo, sería muy difícil detectar este error si no fuera por la impresión. ¿En qué casos puede ocurrir?

 
Igor_:

Funciona así, gracias. Parece que el chamanismo ))))

Sinceramente, no es la pantalla lo que más me preocupa, sino el cálculo correcto deBestOd. También tuve que corregirlo.

Lo hice así:

BestOd=(OderPluseCount/(OderTotal*1,0));

¿Hay alguna explicación para esto? Después de todo, sería muy difícil detectar este error si no fuera por la impresión. ¿En qué casos puede aparecer?

En cualquier operación con valores enteros el resultado será un número entero.
 

Yo mismo encontré la respuesta en el libro de referencia, sección"Conversión de tipos".

Если два значения объединяются бинарным оператором, то перед выполнением операции операнд младшего типа преобразовывается к более старшему типу в соответствии с приоритетом, указанным на схеме: 

Pero el tipo doble en este esquema es el más antiguo. Y tenía las dos int. Por lo tanto, el resultado es un número entero. Introducción de una constante de un tipo superior (double, float), convirtiendo todos los int a ella.

Se aprende durante mucho tiempo, y se consulta la documentación)))

 
Hola, tengo la siguiente pregunta.
Cómo debo hacer un EA que recorra y modifique las posiciones abiertas, para que no modifique repetidamente las órdenes que han sido modificadas en la siguiente pasada. Hay que "engrasarlos" de alguna manera.
No se me ocurre nada.
Se lo agradecería mucho.
Razón de la queja: