Indicadores de élite :) - página 183

 

Mensaje de DTosc...

Mladen,

Me aparece un mensaje en la carpeta de Expers que dice....... "posición de inicio incorrecta 10148 para la función Array Maximum" - el indicador parece comportarse perfectamente sin embargo.

¿Alguna explicación, por favor?

Gracias de antemano.

 

ValeoFX

Sin saber de qué indicador se trata, suele ser algo así Encuentra dónde se determina el límite y cámbialo por algo así :

limit=MathMin(Bars-counted_bars,Bars-1);

El segundo parámetro de esta expresión (Bars-1) en este caso asegura que el límite no es mayor que el número de barras del gráfico.

Pero, como ya habrás notado, es un error "benigno" : sólo ocurrirá una vez (cuando se cargue el indicador o cuando se cambie el marco temporal) y, a diferencia de otros errores, no detiene el cálculo del indicador, por lo que todo el resto del cálculo se realiza correctamente y los valores se calculan adecuadamente

saludos

mladen

ValeoFX:
Mladen,

Me aparece un mensaje en la Carpeta de Expers que dice....... "posición de inicio incorrecta 10148 para la función Array Maximum" - aunque el indicador parece comportarse perfectamente.

¿Alguna explicación, por favor?

Gracias de antemano.
 

Gracias...

mladen:
ValeoFX

Sin saber de qué indicador se trata, suele ser algo así Encuentra dónde se determina el límite y cámbialo por algo así :

limit=MathMin(Bars-counted_bars,Bars-1);

El segundo parámetro de esta expresión (Bars-1) en este caso asegura que el límite no es mayor que el número de barras del gráfico.

Pero, como ya te habrás dado cuenta, es un error "benigno": sólo se producirá una vez (cuando se cargue el indicador o cuando se cambie el marco temporal) y, a diferencia de otros errores, no detiene el cálculo del indicador, por lo que el resto del cálculo se realiza correctamente y los valores se calculan de forma adecuada

saludos

mladen

======================

Lo siento Mladen, tenía el nombre del indicador en la ventana "Título" (DTOsc) y no pensé en repetirlo de nuevo. No obstante, gracias por la explicación, lo miraré inmediatamente.

En la línea 124 he encontrado

limit = MathMax(limit,MathMin(Bars,iCustom(NULL,timeFrame,IndicatorFileName, "getBarsCount",0,0)*timeFrame/Period()));

Como es diferente a lo que has sugerido, ¿te importaría detallar qué debo hacer para rectificarlo, por favor?

Te lo agradezco mucho.

 

ValeoFX

No he prestado atención al subtítulo del mensaje, lo siento

De todas formas, si estás usando el de este post : https://www.mql5.com/en/forum/general entonces te va a salir ese mensaje

Por otro lado, si estás usando el de este post : https://www.mql5.com/en/forum/general (el más nuevo) entonces no vas a recibir ese mensaje

No recuerdo cuando exactamente hice el del primer post pero he cambiado algunos estilos de codificación desde entonces (de ahí la falta de ese mensaje de error) y francamente, antes no me importaba demasiado ese mensaje de error ya que realmente no cambia nada. Después simplemente decidí no dejar espacio para eventuales errores, de ahí la "comprobación de seguridad" al determinar el límite

____________________________________

PD: esa línea funciona en modo multi time frame. Le "pregunta" al marco temporal objetivo cuántas barras han cambiado en el marco temporal objetivo para poder recalcular el número exacto de barras en el marco temporal actual que se necesita. Así que esa línea es efectiva sólo cuando está en modo mtf

 

mladen,

Soy nuevo en la codificación. Y es difícil. Pero si sólo tengo el libro de CodersGuru para hacer un EA....... no será suficiente ...

ver mi página post 183

 

Tradefx1

De la tendencia diaria que está tratando de encontrar : necesita redefinirla (reescribirla). Ahora mismo está escrito así :

int GetDailyTrend (int res){

double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);

double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);

double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);

double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);

if (MA5_1 MA8_0) res =1;//Cross up

if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down

BarCount=Bars;

return (res);

}[/php]and you are calling it like this :

if (GetDailyTrend(1) && ...) Order = SIGBNAL_BUY;

if (GetDailyTrend(2) && ...) Order = SIGNAL_SELL;

[/php]The way it is used and called now expressions GetDailyTrend(1) and GetDailyTrend(2) are always true (in metatrader any value not equal to 0 is considered a true.

_________________________

Redefine the GetDailyTrend() to something like this:

[php]int GetDailyTrend ()

{

int res = 0;

double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);

double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);

double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);

double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);

if (MA5_1 MA8_0) res =1;//Cross up

if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down

return (res);

}

And then use it this way :

[php]if (GetDailyTrend()==1 && ...) Order = SIGBNAL_BUY;

if (GetDailyTrend()==2 && ...) Order = SIGNAL_SELL;

_________________________

En cuanto al libro y la codificación : siempre he creído que la mejor manera de aprender a codificar es a partir de ejemplos y programas de trabajo. Lo creas o no, pero la gente de Microsoft es excelente para aprender (ellos escriben el código de manera uniforme (lo que significa que tienen reglas firmes de equipo de cómo el código debe ser escrito) muy limpio y están tratando de hacerlo tan eficiente como pueden).

Hay un montón de ejemplos y EAs de trabajo en la sección de élite que cualquiera puede utilizar (te puedo recomendar este https://www.mql5.com/en/forum/180383 ) por las razones que ya he dicho en ese hilo y creo que puede ser fácilmente utilizado como un "marco" para otros EAs. Pero también, hay un montón de otros EAs muy útiles que se pueden utilizar para aprender y hacer EAs de trabajo.

Y siempre recuerde una cosa: los lenguajes de codificación son exactamente eso: "lenguajes". Lo que significa que es una simple charla como cualquier otra charla. Solo hay que tener cuidado con lo que se le "dice" al ordenador porque este, a diferencia de las personas, no cuestiona lo que se le dice sino que simplemente lo ejecuta (y a veces no es lo que queremos que haga ) Y luego, después de algún tiempo, te acostumbras a "hablar" con el PC y entonces todo se vuelve mucho más fácil

 

Por si acaso...

En caso de que alguien se pregunte cuál es la lógica básica detrás del indicador adxvma, aquí hay un paso intermedio del mismo que podría ser tan útil como el propio indicador. (hay pasos adicionales después de este, por lo que no comparar los 2 indicadores, pero este paso parece particularmente interesante)

Si a alguien le resulta familiar, la respuesta es "sí". Parece que es el indicador power trend (el power trend "real", no los que se cuelgan y publican como él - de esto no estoy 100% seguro (todo lo que he visto del "real" son fotos de él), pero seguro que se parece mucho)
Archivos adjuntos:
 
mladen:
ValeoFX

No presté atención al subtítulo del mensaje, lo siento

De todos modos, si estás usando el de este post : https://www.mql5.com/en/forum/general entonces estás recibiendo ese mensaje

Por otro lado, si estás usando el de este post : https://www.mql5.com/en/forum/general (el más nuevo) entonces no vas a recibir ese mensaje

No recuerdo cuando exactamente hice el del primer post pero he cambiado algunos estilos de codificación desde entonces (de ahí la falta de ese mensaje de error) y francamente, antes no me importaba demasiado ese mensaje de error ya que realmente no cambia nada. Después simplemente decidí no dejar espacio para eventuales errores, de ahí la "comprobación de seguridad" al determinar el límite

____________________________________

PD: esa línea funciona en el modo multi time frame. Le pregunta al marco temporal objetivo cuántas barras han cambiado en el marco temporal objetivo para poder recalcular el número exacto de barras en el marco temporal actual que se necesita. Así que esa línea es efectiva sólo cuando está en modo mtf

=========================================================

Muchas gracias por la explicación. Se agradece mucho y además me ayuda a entender mejor la codificación.

Voy a descargar el 2º inmediatamente.

Un saludo.

 

adxvma

mladen,

¿Estaría fuera de lugar pedirte que publiques la versión de Tradestation?

Ray

mladen:
Chicos, me he dado cuenta de una cosa ilógica en el indicador (el primer paso de cómo se calcula la parte adx) Yo usé el indicador de tradestation como modelo y parece que hay un error en él que heredé sin pensar en ello . En estos se corrige ese error. Incluso los resultados son mejores de esta manera.
Este cálculo es mucho más parecido al de la sección pública (por lo que el de la sección pública es un indicador bastante correcto) con un código mucho más rápido en el 99% del tiempo y con extras que son específicos sólo de estos publicados en la sección de élite. Así que si descargaste los indicadores de los posts anteriores, por favor usa estos en su lugar. También se ha añadido una opción más a la versión "regular" : MultiColorMode- si se establece en falso sólo un color se va a utilizar para mostrar adxvma (útil si uno quiere usar un par de adxvma para comprobar los cruces como señales)

saludos

Mladen
 

Ray,

Aquí está. El indicador :

inputs:

Price (close),

length (14);

vars:

av (0);

av = ADXVMA(Price, length);

Plot1(av, "Rising");

Plot2(av, "Falling");

Plot3(av, "Neutral");

Plot4(av, "ADXVMA", iff(av = av[1], GetPlotColor(3), iff(av > av[1], GetPlotColor(1), GetPlotColor(2))));

NoPlot(1);

NoPlot(2);

NoPlot(3); [/php]and the adxvma function

[php]inputs:

Price (NumericSeries),

Length (NumericSimple);

vars:

TR(0),

DI_Diff(0),

DI_Sum(0),

ma(0),

pdm(0),

mdm(0),

pdi(0),

mdi(0),

DI_Factor(0),

VI(0),

diff(0),

HHV(0),

LLV(0),

WeightDM(Length),

WeightDI(Length),

WeightDX(Length),

ChandeEMA(Length),

out(0),

j(0);

once ma=Price;

//

// in order to make it right the "pdm=0; mdm=0;" must be added (it does not

// exist in original and that is an error, tradestation inherits values fom

// a previous loop and they must be zeroed before these calculations)

//

pdm=0; mdm=0;

if(Price>Price[1]) then pdm=Price-Price[1] else mdm=Price[1]-Price;

pdm=((WeightDM-1)*pdm[1] + pdm)/WeightDM;

mdm=((WeightDM-1)*mdm[1] + mdm)/WeightDM;

TR=pdm+mdm;

if (TR>0) then begin pdi=pdm/TR; mdi=mdm/TR; end

else begin

pdi=0;

mdi=0;

end;

pdi=((WeightDI-1)*pdi[1] + pdi)/WeightDI;

mdi=((WeightDI-1)*mdi[1] + mdi)/WeightDI;

DI_Diff=pdi-mdi;

if (DI_Diff<0) then DI_Diff= -DI_Diff;

DI_Sum=pdi+mdi;

DI_Factor=0;

if (DI_Sum>0) then out=DI_Diff/DI_Sum else out=0;

out=((WeightDX-1)*out[1] + out)/WeightDX;

if (out>out[1]) then begin HHV=out; LLV=out[1]; end

else begin

HHV=out[1];

LLV=out;

end;

for j = 1 to Length-1 begin

if(out[j+1]>HHV)then HHV=out[j+1];

if(out[j+1]<LLV) then LLV=out[j+1];

end;

diff = HHV - LLV;

VI=0;

if (diff>0) then VI=(out-LLV)/diff;

ma=((ChandeEMA-VI)*ma[1]+VI*Price)/ChandeEMA;

ADXVMA = ma;

Añadido un comentario y una corrección de código que no existía en el original (es el único cambio que hice en él). Algunos de los nombres de las variables son engañosos : no hay cálculo de EMA en ninguno de los pasos. Se trata de una media móvil suavizada que se utiliza en los pasos intermedios de suavización, no EMA. También te darás cuenta de que aunque la lógica básica de cálculo es de ADX en realidad no es un ADX, pero se acerca lo suficiente como para merecer el nombre en el caso de este indicador "híbrido"

saludos

Mladen

traderduke:
mladen

¿Me equivoco si te pido que publiques la versión de Tradestation?

Ray