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

 
anrei2002 #:

¡¡¡Las flechas irrelevantes desaparecieron inmediatamente!!!

No espero que lo entiendas, tuve un cliente con un problema similar, no pude explicárselo durante un año, había un indicador diferente, pero también con un vistazo. Parece un tipo inteligente, pero al parecer su afán de lucro apagó su lógica y su pensamiento... Al final se dio cuenta de todo cuando vació un montón de dinero. No sé qué hacer... Si lo reinicias, el indicador dejará de funcionar. Si lo reinicias, sólo quedan las flechas de la derecha, pero en la historia... He visto muchos de estos indicadores

 
MakarFX #:
Muestra lo que ya has hecho.
#property description "Oscilador estocástico"
#propiedad estricta

#property indicador_separar_ventana
#propiedad indicador_mínimo 0
#propiedad indicador_máximo 100
#property indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Rojo
#property indicator_level1 20.0
#property indicator_level2 80.0
#property indicator_levelcolor clrSilver
#property indicator_levelstyle STYLE_DOT
//--- parámetros de entrada
input int InpKPeriod=5; // input K Period
input int InpDPeriod=3; // input D Period
input int InpSlowing=3; // Ralentización

cadena de entrada PARA_Ref = "$USDX";
//cadena de entrada PARA_Ref = "ETHUSD";


//--- buffers
doble ExtMainBuffer[];
doble ExtSignalBuffer[];
doble ExtHighesBuffer[];
doble ExtLowesBuffer[];

doble cl[];
doble hi[];
doble lo[];



//---
int inicio_de_dibujo1=0;
int inicio_de_dibujo2=0;
//+------------------------------------------------------------------+
//| Función de inicialización de indicadores personalizada |
//+------------------------------------------------------------------+
int OnInit(void)
{
nombre_corto_de_cadena;
//--- Se utilizan 2 buffers adicionales para el conteo.
IndicatorBuffers(4);
SetIndexBuffer(2, ExtHighesBuffer);
SetIndexBuffer(3, ExtLowesBuffer);
//--- líneas indicadoras
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMainBuffer);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtSignalBuffer);
//--- nombre para la etiqueta de la subventana DataWindow y del indicador
short_name="Stochastic_Mult_1("+IntegerToString(InpKPeriod)+", "+IntegerToString(InpDPeriod)+", "+IntegerToString(InpSlowing)+")";
IndicadorNombreCorto(nombre_corto);
SetIndexLabel(0,short_name);
SetIndexLabel(1, "Señal");
//---
draw_begin1=InpKPeriod+InpSlowing;
draw_begin2=draw_begin1+InpDPeriod;
SetIndexDrawBegin(0,draw_begin1);
SetIndexDrawBegin(1,draw_begin2);
//--- inicialización realizada
return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Oscilador estocástico |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculado,
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,pos,n;

//--- comprobar el recuento de barras
if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
return(0);
//--- contando de 0 a rates_total
ArraySetAsSeries(ExtMainBuffer,false);
ArraySetAsSeries(ExtSignalBuffer,false);
ArraySetAsSeries(ExtHighesBuffer,false);
ArraySetAsSeries(ExtLowesBuffer,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(close,false);

//---
pos=InpKPeriod-1;
if(pos+1<prev_calculado)
pos=prev_calculado-2;
si no
{
for(i=0; i<pos; i++)
{
ExtLowesBuffer[i]=0.0;
ExtHighesBuffer[i]=0.0;
}
}
//--- calcular HighesBuffer[] y ExtHighesBuffer[]
for(i=pos; i<tasa_total && !IsStopped(); i++)
{
doble dmin=1000000.0;
doble dmax=1000000.0;
for(k=i-InpKPeriod+1; k<=i; k++)
{
n = i-k;
if(dmin>iLow(PARA,0,n)* iLow(PARA_Ref,0,n)) // original: if(dmin>low[k])
dmin=iLow(PARA,0,n)* iLow(PARA_Ref,0,n); // original: dmin=low[k];
if(dmax<iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n)) // original: if(dmax<high[k])
dmax=iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n); // original: dmax=high[k];

}
ExtLowesBuffer[i]=dmin;
ExtHighesBuffer[i]=dmax;
}
//--- %K línea
pos=InpKPeriod-1+InpSlowing-1;
if(pos+1<prev_calculado)
pos=prev_calculado-2;
si no
{
for(i=0; i<pos; i++)
ExtMainBuffer[i]=0.0;
}
//--- ciclo principal
for(i=pos; i<tasa_total && !IsStopped(); i++)
{
double sumlow=0.0;
double sumhigh=0.0;
for(k=(i-InpSlowing+1); k<=i; k++)
{
n = i-k;
sumlow +=((iClose(PARA,0,n) * iClose(PARA_Ref,0,n))-ExtLowesBuffer[k]); // original: sumlow +=(close[k]-ExtLowesBuffer[k]);
sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
}
if(sumhigh==0.0)
ExtMainBuffer[i]=100.0;
si no
ExtMainBuffer[i]=suma baja/suma alta*100,0;
}
//--- señal
pos=InpDPeriod-1;
if(pos+1<prev_calculado)
pos=prev_calculado-2;
si no
{
for(i=0; i<pos; i++)
ExtSignalBuffer[i]=0.0;
}
for(i=pos; i<tasa_total && !IsStopped(); i++)
{
doble suma=0,0;
for(k=0; k<InpDPeriod; k++)
Suma+=Buffer principal externo[i-k];
ExtSignalBuffer[i]=suma/InpDPeriod;
}
//--- OnCalculate hecho. Devuelve el nuevo prev_calculado.
return(rates_total);
}
//+------------------------------------------------------------------+
 
Se puede arreglar sin perder la lógica, pero dibujará la flecha en la 8ª barra, o incluso en la 9ª barra (pero sin redibujar y sin señales de izquierda). Lo necesitarás así, es decir, la flecha nueva y más fresca estará en la 9ª barra. Y el retraso de la apertura también será de 9 bares.
 
Nikolay Ivanov #:

No espero que lo entiendas, tuve un cliente con un problema similar, no pude explicarle este punto durante un año, había otro indicador, pero también con una mirada. Parece un tipo inteligente, pero al parecer su afán de lucro apagó su lógica y su pensamiento... Al final se dio cuenta de todo cuando vació un montón de dinero. No sé qué hacer... Si lo reseteas, el indicador dejará de funcionar. Si lo reinicias, sólo quedan las flechas de la derecha, pero en la historia... He visto muchos de estos indicadores.

No soy programador, pero sigo sin entender por qué no se puede corregir la flecha con la aparición de una nueva vela.

El mundo está lleno de indicadores con recrudecimiento y ¡funciona bien para todos ellos! La flecha se desplaza junto con el cruce establecido y no hay oscilación.

Todos tienen el mismo código...

Archivos adjuntos:
02.png  15 kb
 
asdkika1 #:

Mejor escribe lo que quieres hacer... punto por punto

 
anrei2002 #:

No soy programador, pero sigo sin entender por qué no se puede corregir la flecha con la aparición de una nueva vela?

El mundo está lleno de indicadores con recrudecimiento y ¡funciona bien para todos ellos! La flecha se desplaza junto con el cruce establecido y no hay oscilación.

Todos tienen el mismo código.

La repetición normal es cuando la barra de la señal (donde está la flecha) interviene en el cálculo de la señal y puede tener el índice 0... Es decir, el bar actual... Se vuelve a dibujar cada tick y, respectivamente, la señal también se puede volver a dibujar...

Pero además de la barra 0, utilizas -1 -2 -3 -4 -5 -6 -7... ¿De dónde saldrá la barra menos 8? Es mala forma usar incluso la barra 0... y las barras con índices negativos es simplemente inaceptable...

He escrito más arriba cómo solucionarlo... Funcionará bien si esperas la señal a la derecha de 8 barras, entonces estará bien, no cree que la flecha será siempre 9 bares de retraso, ¿quieres eso?

 
MakarFX #:

Mejor escribe lo que quieres hacer... punto por punto

Cálculo del estocástico a partir de la multiplicación de dos pares.
Sólo tomé el indicador estocástico estándar y cambié
datos de entrada (líneas marcadas).
Nunca utilicé OnCalculate - aparentemente aquí es donde está enterrado el perro.
No funciona - no puedo entender por qué.
Esperaba no tener que
Espero no tener que rediseñarlo yo mismo.
 
Nikolay Ivanov #:

El exceso normal es cuando la propia barra de la señal (donde está la flecha) interviene en el cálculo para que aparezca la señal y puede tener un índice de 0... Ese es el bar actual... Se vuelve a dibujar cada tick y, en consecuencia, la señal también se puede volver a dibujar...

Pero además de la barra 0, utilizas -1 -2 -3 -4 -5 -6 -7... ¿De dónde saldrá la barra menos 8? Es mala forma usar incluso la barra 0... y las barras con índices negativos es simplemente inaceptable...

He escrito más arriba cómo solucionarlo... Funcionará correctamente si esperas la señal a la derecha de 8 barras, entonces todo estará bien, no cree que la flecha siempre será de 9 barras de retraso, ¿lo necesitas?

He aquí un ejemplo de otro indicador de este tipo.

Además de las flechas en el gráfico, hay círculos en la intersección de las líneas en el sótano.

Y los círculos, a diferencia de las flechas, están estrictamente detrás de la intersección de las líneas. No hay círculos adicionales.

¿Por qué no hay flechas?

Archivos adjuntos:
03.png  98 kb
EATA__Alert.mq4  20 kb
 
anrei2002 #:

He aquí un ejemplo de otro de estos indicadores.

Además de las flechas del gráfico, tiene círculos en la intersección de las líneas del sótano.

Y los círculos, a diferencia de las flechas, están estrictamente detrás de la intersección de las líneas. No hay círculos adicionales.

¿Por qué hay algo malo en las flechas?

ejecute este indicador en el probador y observe las líneas y los círculos en la visualización a velocidad acelerada... Si no tiene sentido incluso después de eso, no sé cómo explicarlo de forma sencilla...

 
asdkika1 #:
Cálculo estocástico a partir de la multiplicación de dos pares.
Sólo tomé el indicador estocástico estándar y cambié
datos de entrada (líneas marcadas).
Nunca he utilizado OnCalculate, supongo que aquí radica el problema.
No funciona - no puedo entender por qué.
Esperaba no tener que
Esperaba no tener que rehacerlo yo mismo. Debería ser muy sencillo.

¿Multiplicar qué? ¿Abierto? ¿Cerca? ¿Stoch?