Ayuda a la codificación - página 239

 

Hola,

he modificado el indicador estándar stepMA 9 en éste en ventana separada como histograma pero no sé por qué las señales de compra no están sincronizadas con el indicador estándar (las de venta sí). Con el nuevo se producen una barra atrás que el indicador original. ¿Por qué? He modificado sólo la parte de código que determina el aspecto gráfico del indicador.

stepma_9_histo_mtf.mq4

stepma_9.0.mq4

Archivos adjuntos:
 
thefxpros:
Hola,

He modificado el indicador estándar stepMA 9 en éste en ventana separada como histograma pero no sé por qué las señales de compra no están sincronizadas con el indicador estándar (las señales de venta sí). Con el nuevo se producen una barra atrás que el indicador original. ¿Por qué? He modificado sólo la parte de código que determina el aspecto gráfico del indicador.

stepma_9_histo_mtf.mq4

stepma_9.0.mq4

thefxpros

Esto es el resultado de cómo se dibujan las líneas.

Cuando dibujas una línea tienes que empezar a dibujar la línea 1 barra atrás para que sea visible (si no sería un punto y no sería visible en el gráfico). Prueba estos dos y compáralos ahora

Archivos adjuntos:
 

Hola,

He estado buscando un EA que abra una operación de forma similar a como funcionaría un trailing stop.

Digamos que estoy esperando un retroceso en un instrumento. Me gustaría abrir mi comercio tan alto (o bajo) en el precio como sea posible. Así que con un EA como este, sería capaz de establecer mis parámetros de comercio y este EA seguirá el precio de una manera similar a un trailing stop. Cuando hay una reversión, el comercio es golpeado y abierto.

¿Has visto alguna vez un EA de este tipo?

Gracias

 

Hola a todos

Intento hacer el código, pero por qué no puede abrir el comercio

int varCurrentTime = TimeCurrent();

for (int iTS = 0; iTS < 2000; iTS++) {

int varZonStart = StrToTime(TimeToStr(varCurrentTime, TIME_DATE) + " " + "00:00");

int varZonEnd = StrToTime(TimeToStr(varCurrentTime, TIME_DATE) + " " + "10:00");

int JamStart=TimeHour(varZonStart);

int JamEnd=TimeHour(varZonEnd);

if (JamStart>JamEnd) {

varCurrentTime = decDateTradeDay(varCurrentTime);

//if (TimeDayOfWeek(varCurTime) < 1) varCurTime = decDateTradeDay(varCurTime);

if (TimeDayOfWeek(varCurrentTime) > 5) varCurrentTime = decDateTradeDay(varCurrentTime);

}

varZonStart = StrToTime(TimeToStr(varCurrentTime, TIME_DATE) + " " + "00:00");

int varShiftStart = iBarShift(NULL, 0, varZonStart - 60 * Period());

int varShiftEnd = iBarShift(NULL, 0, varZonEnd);

varHighest = High;

varLowest = Low;

varCurrentTime = decDateTradeDay(varCurrentTime); //set 1 hari kebelakang

if (TimeDayOfWeek(varCurrentTime) < 1) varCurrentTime = decDateTradeDay(varCurrentTime); //jika minggu mundur lagi

if (TimeDayOfWeek(varCurrentTime) > 5) varCurrentTime = decDateTradeDay(varCurrentTime); //jika sabtu mundur lagi

}

for (int iTSh = 0; iTSh < 2000; iTSh++) {

for (int iTSl = 0; iTSl < 2000; iTSl++) {

if(((varHighest-varLowest)/Pip)<=5) varHL=(varHighest+varLowest)/2;

}

}

double isg10a = iOpen(Symbol(),PERIOD_M15,1);

double isg10b = iClose(Symbol(),PERIOD_M15,1);

int static isg10c = -1;

for (iTS = 0; iTS < 2000; iTS++) {

if(isg10avarHL)isg10c =0;

if(isg10a>varHL&&isg10b<varHL)isg10c =1;

}

if (isg10c==0) To code Buy

else if (isg10c==1) To code Sel

else no trade

 
mladen:
Jim En lugar de reescribir toda la cosa añadió un límite para calcular las barras y luego todas esas barras se vuelven a calcular. Eso debería resolver el problema de la actualización (sólo hay que mantener el BarsTocalculate en un valor razonable, no demasiado grande ni demasiado pequeño. Usé 1000 como valor por defecto y parece estar bien así). Pruébalo

Estimado mladen,

muchas gracias por tu esfuerzo y tu rápida ayuda.

Lo probaré.

Muchos saludos desde Munich

 

Por favor, ayúdenme a actualizar este indicador de volumen para adjuntarlo en mi mt4

Hola gurús por favor amablemente ayudarme a solucionar los errores en este indicador de volumen. Acabo de notar que no puede adjuntar a mi gráfico mt4 recientemente. He hecho todo lo posible para arreglar los errores en el archivo, pero en vano. Sospecho que es debido a la gran actualización de mt4. Todos los demás indicadores en mi carpeta de mt4, tanto las versiones antiguas como las nuevas, funcionan bien. Funcionaba hace un año que lo usé por última vez. No soy un programador todavía.

Por favor, encontrar el archivo adjunto

Archivos adjuntos:
 

Hola MLaden y Mrtools,

espero que estéis bien

Necesito que me confirméis algo sobre el RSX

Veo que utilizáis una fórmula más sencilla para calcular el RSX :

__________________________

doble Kg = (3.0)/(2.0+Longitud);

doble Hg = 1,0-Kg;

if (slope[limit]==-1) CleanPoint(limit,rsxDa,rsxDb);

if (ArrayRange(wrkBuffer,0) != Bars) ArrayResize(wrkBuffer,Bars);

for(i=limit, r=Bars-i-1; i>=0; i--, r++)

{

wrkBuffer[r][12] = iMA(NULL,0,1,0,MODE_SMA,Precio,i);

if (i==(Bars-1)) { for (int c=0; c<12; c++) wrkBuffer[r][c] = 0; continue; }

//

//

//

//

//

double mom = wrkBuffer[r][12]-wrkBuffer[r-1][12];

double moa = MathAbs(mom);

for (int k=0; k<3; k++)

{

int kk = k*2;

wrkBuffer[r][kk+0] = Kg*mom + Hg*wrkBuffer[r-1][kk+0];

wrkBuffer[r][kk+1] = Kg*wrkBuffer[r][kk+0] + Hg*wrkBuffer[r-1][kk+1]; mom = 1,5*wrkBuffer[r][kk+0] - 0,5 * wrkBuffer[r][kk+1];

wrkBuffer[r][kk+6] = Kg*moa + Hg*wrkBuffer[r-1][kk+6];

wrkBuffer[r][kk+7] = Kg*wrkBuffer[r][kk+6] + Hg*wrkBuffer[r-1][kk+7]; moa = 1,5*wrkBuffer[r][kk+6] - 0,5 * wrkBuffer[r][kk+7];

}

if (moa != 0)

rsx = MathMax(MathMin((mom/moa+1.0)*50.0,100.00),0.00);

si no, rsx = 50;

____________________________________

Sólo para estar seguro de entender cómo se calcula el RSX con esta fórmula

Primero con la línea

mom = wrkBuffer[r][12]-wrkBuffer[r-1][12];

de hecho wrkBuffer[r][12] es la media móvil simple del precio, nota el prise como con un RSI habitual ?

¿No es así? Pero no entiendo cuál es el período de este SMA (Probablemente no longitud)?

Y después, si tengo bien entender con las líneas:

for (int k=0; k<3; k++)

{

int kk = k*2;

wrkBuffer[r][kk+0] = Kg*mom + Hg*wrkBuffer[r-1][kk+0];

wrkBuffer[r][kk+1] = Kg*wrkBuffer[r][kk+0] + Hg*wrkBuffer[r-1][kk+1];

mom = 1,5*wrkBuffer[r][kk+0] - 0,5 * wrkBuffer[r][kk+1];

De hecho calcula 3 veces el mom (uno tras otro), con el primer mom arriba (mom = wrkBuffer[r][12]-wrkBuffer[r-1][12];)

¿Es correcto?

Y después de esto es "clásico" con RSX=((mom/moa)+1)*50

Gracias por tu siguiente respuesta, como codificador (en otra plataforma), sabes que me gusta entender cómo funcionan los códigos

Que tengas un buen día

Zilliq

 
zilliq:
Hola MLaden y Mrtools,

Espero que estés bien

Necesito que me confirmes lo del RSX

Veo que utilizas una fórmula más sencilla para calcular el RSX :

__________________________

doble Kg = (3.0)/(2.0+Longitud);

doble Hg = 1,0-Kg;

if (slope[limit]==-1) CleanPoint(limit,rsxDa,rsxDb);

if (ArrayRange(wrkBuffer,0) != Bars) ArrayResize(wrkBuffer,Bars);

for(i=limit, r=Bars-i-1; i>=0; i--, r++)

{

wrkBuffer[r][12] = iMA(NULL,0,1,0,MODE_SMA,Precio,i);

if (i==(Bars-1)) { for (int c=0; c<12; c++) wrkBuffer[r][c] = 0; continue; }

//

//

//

//

//

double mom = wrkBuffer[r][12]-wrkBuffer[r-1][12];

double moa = MathAbs(mom);

for (int k=0; k<3; k++)

{

int kk = k*2;

wrkBuffer[r][kk+0] = Kg*mom + Hg*wrkBuffer[r-1][kk+0];

wrkBuffer[r][kk+1] = Kg*wrkBuffer[r][kk+0] + Hg*wrkBuffer[r-1][kk+1]; mom = 1,5*wrkBuffer[r][kk+0] - 0,5 * wrkBuffer[r][kk+1];

wrkBuffer[r][kk+6] = Kg*moa + Hg*wrkBuffer[r-1][kk+6];

wrkBuffer[r][kk+7] = Kg*wrkBuffer[r][kk+6] + Hg*wrkBuffer[r-1][kk+7]; moa = 1,5*wrkBuffer[r][kk+6] - 0,5 * wrkBuffer[r][kk+7];

}

if (moa != 0)

rsx = MathMax(MathMin((mom/moa+1.0)*50.0,100.00),0.00);

si no, rsx = 50;

____________________________________

Sólo para estar seguro de entender cómo se calcula el RSX con esta fórmula

Primero con la línea

mom = wrkBuffer[r][12]-wrkBuffer[r-1][12];

de hecho wrkBuffer[r][12] es la media móvil simple del precio, nota el prise como con un RSI habitual ?

¿No es así? Pero no entiendo cuál es el período de este SMA (Probablemente no longitud)?

Y después, si tengo bien entender con las líneas:

for (int k=0; k<3; k++)

{

int kk = k*2;

wrkBuffer[r][kk+0] = Kg*mom + Hg*wrkBuffer[r-1][kk+0];

wrkBuffer[r][kk+1] = Kg*wrkBuffer[r][kk+0] + Hg*wrkBuffer[r-1][kk+1];

mom = 1,5*wrkBuffer[r][kk+0] - 0,5 * wrkBuffer[r][kk+1];

De hecho calcula 3 veces el mom (uno tras otro), con el primer mom arriba (mom = wrkBuffer[r][12]-wrkBuffer[r-1][12];)

¿Es correcto?

Y después de esto es "clásico" con RSX=((mom/moa)+1)*50

Gracias por tu siguiente respuesta, como codificador (en otra plataforma), sabes que me gusta entender cómo funcionan los códigos

Que tengas un buen día

Zilliq

"de hecho wrkBuffer[r][12] es la media móvil simple del precio, fíjate en el precio como con un RSI habitual?"

No. El periodo de cálculo de esa media es 1, lo que significa que es igual al precio de la "media" utilizada. En metatader esa es la forma más rápida de obtener el precio deseado (si intentas escribir la estructura "case" haciendo eso mismo verás que es mucho más lento que la forma utilizada en el código rsx)

"De hecho calcula 3 veces el mom (uno tras otro), con el primer mom por encima"

No. Mira qué valores está utilizando en todas y cada una de las nuevas iteraciones. mom y moa se cambian constantemente y se reutilizan (en esa forma cambiada) durante el proceso de bucle

 

Muchas gracias Mladen,

Es muy extraño, si tengo bien entendido wrkBuffer[r][12] es igual al precio, pero se utiliza una media móvil con un período de 1 para acelerar el cálculo. Eso es muy curioso...

Para lo segundo, creo/supongo que es lo que intento decir

calcula la mom como un momentum del precio

Y calcula otra mama con Kg y Hg. Da una nueva mamá, que se utiliza para crear una nueva mamá, y así sucesivamente, 3 veces

Algo más "fácil" (para facilitar la comprensión) como esto

mamá

mom1=kg*mom

mom2=kg*mom1

mom3=kg*mom2

Y al final utiliza mom3, y moa3

¿Estoy en lo cierto?

 
zilliq:
Muchas gracias Mladen,

Es muy extraño, si tengo bien entendido wrkBuffer[r][12] es igual al precio, pero utilizas una media móvil con un periodo de 1 para acelerar el cálculo. Eso es muy curioso...

Para lo segundo, creo/supongo que es lo que intento decir

calcula la mom como un momentum del precio

Y calcula otra mama con Kg y Hg. Da una nueva mamá, que se utiliza para crear una nueva mamá, y así sucesivamente, 3 veces

Algo más "fácil" (para facilitar la comprensión) como esto

mamá

mom1=kg*mom

mom2=kg*mom1

mom3=kg*mom2

Y al final utiliza mom3, y moa3

¿Tengo razón?

Zilliq,

sí, así es como se hace