Ayuda con la codificación... ¿Cómo puedo hacer que el indicador filtre en lugar de alertar? - página 4

 
Aaragorn:
Lo he reducido a esto... pero espera...

si esto es solo usar la media móvil simple de esta barra multiplicada por 3,5 para encontrar un punto alto. ¿Cómo es posible que el punto pueda alcanzarlo? ¿No se está calculando el valor de la línea a partir de la misma barra que tendría que tocarla para dar la señal? A medida que la barra sube también lo hace la línea de borde???

Lamedia móvil se calcula a partir de más de 1 barra por lo que la línea puede ser un valor y el precio otro

 
elihayun:
Si quieres saber si la línea superior está cerca del precio, una forma de averiguarlo es si la diferencia entre ambos es pequeña (digamos 2 puntos).

No me importa (lo cual no es una buena idea) si el precio está por debajo o por encima de la línea. Para mí 2 puntos de distancia es todo lo que se necesita. por lo que la diferencia es

upper - High te dará la diferencia pero no en puntos (es algo así como 0.0004 o -0.0004) . Para asegurarnos de que la diferencia es positiva usamos la función MathAbs que devuelve el valor absoluto (positivo). Ahora tenemos que comprobar si es menos de 2 puntos. La palabra reservada Point devolverá el valor cuando el precio suba 1 pip. Es diferente con cada par.

Ponerlo todo junto

if (MathAbs(upper - High) < 2*Point) significa que la diferencia es menor a 2 pips, y para nosotros es suficiente.

En realidad usar High no es bueno, porque el High puede estar por encima, pero el precio actual está muy lejos. Tenemos que usar Ask en lugar de High (en el indicador tenemos que usar Close[x])

Para asegurarse de que el precio está por encima de la línea que podemos hacer esto

if ((Ask > upper) && (Ask - upper < 2 * Point))

.....(alert or open a trade)

[/PHP]

eres muy bueno para responder a tantas de mis preguntas espero no cansarte estoy ansioso por aprender.

Entiendo el valor absoluto. Me pregunto que cambiaría usar el ask en lugar del close? no sería bueno usar el close? o habría mucha diferencia? lo único que me sigue confundiendo es el lado del 2 * punto de la segunda condición. ¿No se multiplicaría el punto por 2? ¿Estoy interpretando mal el símbolo '*' o es el símbolo de la multiplicación?

Veo que ask-upper da la diferencia entre la línea superior y el valor actual de ask. pero ¿multiplicar el punto por 2? No estoy seguro de lo que resultaría que podría ser utilizado para la comparación.

¿podría hacer esto para permitir sólo las compras cuando la señal se produce por debajo de mi tolerancia de compra filtrada?

[php]

extern double longrange = 25; //--la proximidad permitida para acercarse a la línea de banda superior antes de no permitir las compras

extern double shortrange = 20; //--la proximidad permitida para acercarse a la línea de la banda inferior antes de no permitir las ventas

// ENTRADA

if(total < 2 || isNewSumbol(Symbol())) //He modificado la condición if también: era total<1 (orBanAway aka cucurucu)

{

double HedgeLots = (HedgePercent/100)*Lotes; //calcula los Lotes de la posición cubierta

if(isCrossed == 1 && Ask < upper-longrange)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

si no

ticket=Enviar orden(Símbolo(),OP_BUY,Lotes,Venta,3,0,Venta+Toma de beneficios*Punto,comentario,MAGICMA,0,Verde);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de COMPRA abierta : ",OrderOpenPrice());

}

else Print("Error al abrir la orden BUY : ",GetLastError());
 

te falta una cosa. Para entender lo del Punto imagina esto

en USDJPY el precio es 114.95 y en EURUSD el precio es 1.2773

entonces en USDJPY Ask - upper será como : 114.95 - 114.93 = 0.02

y en el EURUSD el precio será 1,2773 - 1,2771 = 0,0002

Ambos son 2 puntos pero en diferente precisión así que en USDJPY tenemos que multiplicar 2 por 0.01 y en EURUSD tenemos que multiplicarlo por 0.0001 y en cada par esto es exactamente lo que equivale a Punto.

 
elihayun:
La media móvil se calcula a partir de más de 1 barra por lo que la línea puede ser un valor y el precio otro

¿Cómo puede ser una media de una sola barra?

//----------channel filter

int x = 0;

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

double avg;

avg = findAvg(back, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg); [/PHP]

I don't see how this works....also the compiler say, 'findAvg' - function is not defined

it's looking for the shift value x which is zero so that is only going to be the current bar right? So what is it averaging?

ok let me see what might be...if i'm telling it to go 'back' 300 periods that is what it's averaging is 300 periods. ok i get it now i think....

now about the undefined function error? what do I do about that? just get rid of it as unnecessary?

[PHP]//----------channel filter

int x = 0;

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

double avg;

avg = (back, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg);
 
elihayun:
Te falta una cosa. Para entender las cosas del punto imagina esto

en USDJPY el precio es 114.95 y en EURUSD el precio es 1.2773

así que en USDJPY Ask - upper será como : 114.95 - 114.93 = 0.02

y en EURUSD el precio será 1.2773 - 1.2771 = 0.0002

Ambos son 2 puntos pero en diferente precisión por lo que en el USDJPY tenemos que multiplicar 2 por 0,01 y en el EURUSD tenemos que multiplicarlo por 0,0001 y en cada par esto es exactamente lo que equivale a Point.

ok veo el problema...lo que quiero hacer es crear una barrera basada en la proximidad a las líneas superior e inferior más allá de la cual no se permitirán las operaciones.

-Así que primero obtengo el valor actual de la línea.

-luego sumo o resto la distancia que quiero definir como intolerable para operar como un entero que considero que es 1=1 pip de movimiento.

-luego tengo que obtener el valor de donde está el precio para cada tick para hacer la condición de comparación

así que esta línea debe ser algo más que 'precio_Típico'

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

No estoy seguro de cómo evitar que las diferentes precisiones causen un problema. Todo lo que quiero hacer es comparar el movimiento del precio en relación con el movimiento de la línea que va a especificar 'no operar en largo por encima de este nivel' o 'no operar en corto por debajo de este nivel'..

Estoy listo para un descanso mi cerebro se ha convertido en papilla.

 

PRICE_TYPICAL no tiene nada que ver con esto. puede leer sobre esto en la ayuda de MQL4

todo lo que tienes que hacer para averiguar la diferencia entre el precio y la línea es restar uno de la otra. Como he dicho, el problema es que a veces se obtiene 0,0006 y otras veces se obtiene 0,06 y esto lo resuelve el Punto.

(Tengo que cerrar ahora. Podemos continuar mañana)

 
elihayun:
te falta una cosa. Para entender lo de Point imagina esto

en USDJPY el precio es 114.95 y en EURUSD el precio es 1.2773

así que en USDJPY Ask - upper será como : 114.95 - 114.93 = 0.02

y en el EURUSD el precio será 1,2773 - 1,2771 = 0,0002

Ambos son 2 puntos pero en diferente precisión así que en USDJPY tenemos que multiplicar 2 por 0.01 y en EURUSD tenemos que multiplicarlo por 0.0001 y en cada par esto es exactamente lo que Point es igual.

¿así que el punto es como el seguimiento del movimiento de los pips en cada par, independientemente de la diferente precisión requerida?

 
elihayun:
PRICE_TYPICAL no tiene nada que ver con esto. puedes leerlo en la ayuda de MQL4

Todo lo que tienes que hacer para averiguar la diferencia entre el precio y la línea es restar uno de la otra. Como he dicho, el problema es que a veces se obtiene 0,0006 y a veces se obtiene 0,06 y esto lo está resolviendo el Punto.

(Tengo que cerrar ahora. podemos continuar mañana)

muchas gracias por la paciencia y los ánimos

 

Esto es lo que hice....

//----------channel filter

double upLevel = iCustom(NULL,TF, "Trend Bands v2", back, 0, 0);

double LowLevel = iCustom(NULL,TF, "Trend Bands v2", back, 2, 0);

// ENTRY

if(total < 2 || isNewSumbol(Symbol())) //I have modified the if condition too: it was total<1 (orBanAway aka cucurucu)

{

double HedgeLots = (HedgePercent/100)*Lots; //calculates the Lots for the hedged position

if(isCrossed == 1 && Ask < upLevel-longrange)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

else

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

//###################################################################### the added code starts here

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

else

ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

//###################################################################### ends here

return(0);

}

if(isCrossed == 2 && Ask > LowLevel + shortrange)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

else

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

//###################################################################### the added code starts here

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

else

ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

//###################################################################### ends here

return(0);

}

return(0);

}

return(0);

}

return(0);

}

}

//+------------------------------------------------------------------+[/PHP]

this is what I got from the tester....

[PHP]2006.06.30 11:18:09 2006.06.06 14:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.06 12:14 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.06 10:26 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.05 22:47 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.05 09:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:09 2006.06.05 08:41 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:09 2006.06.05 07:30 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:09 2006.06.05 07:29 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:08 2006.06.02 19:55 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:08 2006.06.01 11:27 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 06:45 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 04:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 02:44 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 00:37 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:00 2006.05.31 04:00 Trend Bands v2 EURUSD,M30: loaded successfully

2006.06.30 11:18:00 EMA_CROSSv5 EURUSD,M5: Tester comment: ----------------------------------------

TakeProfit=10 | TrailingStop=20 | StopLoss=20 | UseStopLoss=False

----------------------------------------

immediate_trade=True | reversal=False

----------------------------------------

Lots=1 | MM=True | Risk=10%

----------------------------------------

2006.06.30 11:18:00 EMA_CROSSv5 inputs: TakeProfit=10; TrailingStop=20; StopLoss=20; ShortEma=1; LongEma=5; Lots=1; HedgePercent=1; StartHour=0; StopHour=23; Risk=10; MAGICMA=20060301; longrange=1; shortrange=1; back=30; TF=30;

2006.06.30 11:17:35 EMA_CROSSv5: loaded successfully

informe muestra que tiene la configuración, pero en blanco....

Obviamente, no permite las operaciones, pero TODOS ellos? ¡Me resulta difícil de creer cuando sólo he establecido los rangos largos y cortos a 1! Seguramente había algunas señales de comercio dentro de ese rango. No creo que esto esté haciendo lo que pretendía.

Archivos adjuntos:
mac5.htm  5 kb
 

He cambiado el indicador de bandas de tendencia para que sea más flexible

extern int period = 34;

extern int factor = 8;

avg = findAvg(period, x);

upper[x] = middle2 + (factor*avg);

lower[x] = middle2 - (factor*avg);[/PHP]

then i did this to the EA

//---- Trend Bands v2 and Filter Parameters

extern double back = 300; //--how many periods back for the custom indicator to average

extern double bandwidth = 6; //--how wide the trend bands are

extern double TF = 30; //--which bar period for the custom indicator to use

//----------channel filter

double upLevel = iCustom(NULL,TF, "Trend Bands v3", back, bandwidth, 0, 0);

double LowLevel = iCustom(NULL,TF, "Trend Bands v3", back, bandwidth, 2, 0);

I got this from the tester...(slightly abbreviated report)..

[PHP]2006.06.30 12:10:38 2006.06.29 23:59 Trend Bands v3 EURUSD,M30: removed

2006.06.30 12:10:38 2006.06.29 20:21 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:21 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:20 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:20 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:16 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:16 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:15 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:15 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:12 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:12 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:04 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:04 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:03 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:03 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:00 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:00 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:00 Trend Bands v3 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 12:10:38 2006.06.29 19:59 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:59 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:32 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:32 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:25 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:25 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:21 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:21 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:20 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:20 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:09 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:09 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:08 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:08 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:06 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:06 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 18:35 Trend Bands v3 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 12:10:38 2006.06.29 18:16 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 18:16 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 18:15 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 18:15 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:37 2006.06.29 00:00 Trend Bands v3 EURUSD,M30: loaded successfully

2006.06.30 12:10:37 EMA_CROSSv5 EURUSD,M5: Tester comment: ----------------------------------------

TakeProfit=10 | TrailingStop=20 | StopLoss=20 | UseStopLoss=False

----------------------------------------

immediate_trade=True | reversal=False

----------------------------------------

Lots=1 | MM=True | Risk=10%

----------------------------------------

2006.06.30 12:10:37 EMA_CROSSv5 inputs: TakeProfit=10; TrailingStop=20; StopLoss=20; ShortEma=1; LongEma=5; Lots=1; HedgePercent=1; StartHour=0; StopHour=23; Risk=10; MAGICMA=20060301; back=300; bandwidth=6; TF=30;

Moví el ancho de banda a 20 después de esto para que nunca toque las bandas... todavía me da el "error de apertura 131"

ERR_INVALID_TRADE_VOLUME 131 Volumen comercial no válido.

¿qué pasa con eso?