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

 
mould:
¿pero cómo se activa este modo?

Marque la casilla en la ventana del comprobador, abajo a la izquierda:

 

Hola Gurú.

¿Puede decirme si voy por el buen camino?

Objetivo: introducir un tamaño de lote variable en función de la distancia a la MA.

En los parámetros de entrada:

extern double Lote1 = 0.01; // primera variante del lote
extern double Lote2 = 0.03; // segunda variante del lote
extern int Distan = 20; // distancia de SlowMA

Ma ha sido definida en el cuerpo del Asesor Experto:

double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);

Además necesitamos una condición: si el precio actual (Bid o Ask dependiendo de la dirección) es hasta el tamaño Distant, usamos el primer tamaño de lote, si es más alto, usamos el segundo.

Lo primero que me vino a la mente:

si (Ask-SlowMA<Distan) Lote == Lote1;
si (SlowMA-Bid<Distan) Lote == Lote1;
si (Ask-SlowMA>Distan) Lote == Lote2;
si (SlowMA-Bid>Distan) Lote == Lote2;

Pero no funciona. El error está en los enlaces con Lot o en la lógica general.

Gracias de antemano.

 
delf699:

Hola Gurú.

¿Puede decirme si estoy en el camino correcto?

Objetivo: introducir un tamaño de lote variable en función de la distancia a la MA.

En los parámetros de entrada:

extern double Lote1 = 0.01; // primer tamaño de lote
extern double Lote2 = 0,03; // segunda variante de lote.
extern int Distan = 20; // distancia de la SlowMA

En el cuerpo del Asesor Experto definido Ma:

double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);

Entonces necesitamos una condición: si el precio actual (Bid o Ask dependiendo de la dirección) es hasta el tamaño Distant, usamos el primer tamaño de lote, si es mayor, usamos el segundo.

Lo primero que me vino a la mente:

if (Ask-SlowMA<Distan) Lot == Lot1;
si (SlowMA-Bid<Distan) Lote == Lote1;;
if (Ask-SlowMA>Distan) Lot == Lot2;
si (SlowMA-Bid>Distan) Lote == Lote2;

Pero no funciona. Es un error en conjunto con Lot, o en la lógica general.

Gracias de antemano.

¿Qué importancia tienen Ask, Bid y SlowMA cuando Ask-SlowMA puede ser mayor que Distan?
 

La oferta y la demanda son los últimos precios conocidos de oferta y demanda, es decir, el precio actual.

SlowMA es mi rebautizada Ma

(double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);)

La desviación del precio actual (Bid o Ask) del Ma (SlowMA) puede ser mayor o menor que Distans. De acuerdo con esto, debe establecer el primer o el segundo tamaño de lote.

He encontrado variantes de cambiar el lote en función del depósito o del número de órdenes abiertas, pero no consigo ninguna respuesta de un término tan lineal.

Algo me dice que necesitamos una función que devuelva un valor absoluto. Es decir, si lo aplicamos a un número negativo, el resultado será positivo.

 
delf699:

La oferta y la demanda son los últimos precios conocidos de oferta y demanda, es decir, el precio actual.

SlowMA es mi rebautizada Ma

(double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);)

La desviación del precio actual (Bid o Ask) del Ma (SlowMA) puede ser mayor o menor que Distans. De acuerdo con esto, debe establecer el primer o el segundo tamaño de lote.

He encontrado variantes de cambiar el lote en función del depósito o del número de órdenes abiertas, pero no consigo ninguna respuesta de un término tan lineal.

Algo me dice que necesitamos una función que devuelva un valor absoluto. Es decir, si lo aplicamos a un número negativo, el resultado será positivo.


El valor absoluto de la diferencia entre Bid y MA puede ser necesario un poco más tarde; ahora, ya que no has entendido la pista, vamos a calcular juntos

Oferta = 1,12730;

MA = 1,12530;

Distans = 20;

Pregunta:

¿Cuándo y si 1,1273 a 1,1253 será más de 20?

Por alguna razón mi calculadora sólo muestra 0,002. Pero eso está muy lejos de los 20...

 

Gracias, ya veo. O puedes hacerlo así:

dist=Distan*Punto;

si (Ask-SlowMA<dist) Lote == Lote1;
si (SlowMA-Bid<dist) Lote == Lote1;
si (Ask-SlowMA>dist) Lote == Lote2;
si (SlowMA-Bid>dist) Lote == Lote2;

¿Cómo lo hago correctamente?

 
delf699:

Gracias, ya veo. O puedes hacerlo así:

dist=Distan*Punto;

si (Ask-SlowMA<dist) Lote == Lote1;
si (SlowMA-Bid<dist) Lote == Lote1;
si (Ask-SlowMA>dist) Lote == Lote2;
si (SlowMA-Bid>dist) Lote == Lote2;

¿Cómo lo hago correctamente?

Y ahora podemos usar MathAbs() para no complicarnos la cabeza llevando la cuenta de qué se resta a qué. Y hay otro operador condicional interesante

Lot = MathAbs(Ask-SlowMA) < dist ? Lot1 : Lot2;


Lo que significa: A la variable Lote se le asignará el valor de Lote1 si Ask- SlowMA es menor que dist, de lo contrario, se le asignará el valor de Lote2.

Una recomendación más: olvida la variable Punto. Utilice _Point o la función Point()

 
Gracias, una hermosa solución.
 
Ya me he roto los ojos, no encuentro dónde faltan paréntesis, me salen errores como '(' - paréntesis izquierdo desequilibrado test.mq4 31 8 (a partir de la línea donde se llama a TrendDetection())

Necesito ayuda, todavía estoy aprendiendo...


#define BULL 1;
#define OSO 2;

//--------------------------------------------------------------------
extern int SL = 200;
extern int TP = 200;
extern double Lots = 0,01;
extern double SarStep = 0,02;
extern double SarMaximum = 0,2;
extern int deslizamiento = 5;
extern int Magia = 1;
extern int MaxOrder = 1;
string OrderComments = "Ganga 1.0;
int Cnt=0;
datetime PreviousBar;

int inicio()
{
Cnt=Total de pedidos();
{
si (Cnt<MaxOrder)
{
if(NewBar() == true)
{
if(TrendDetection() == BULL){
OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),slippage,NormalizeDouble(Ask,Digits)-(SL*Point),NormalizeDouble(Ask,Digits)+(TP*Point),OrderComments,Magic,0,CLR_NONE);}
if(TrendDetection() == BEAR){
OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),slippage,NormalizeDouble(Bid,Digits)+(SL*Point),NormalizeDouble(Bid,Digits)-(TP*Point),OrderComments,Magic,0,CLR_NONE);}
}
}
si no
{return(0);}
}
return(0);
}

int DetecciónTendencia()
{
double Sar = iSAR(NULL,0,SarStep,SarMaximum,1);
if(Close[1] > Sar) {return(BULL);}
if(Close[1] < Sar) {return(BEAR);}
return(0);}
bool NuevaBarra()
{
if(PreviousBar<Time[0])
{
BarraAnterior = Tiempo[0];
return(true);
}
si no
{
return(false);
}
return(false);
}
 
AlexeyVik:

Y ahora puedes aplicar MathAbs() para no tener que estar pendiente de qué restar a qué. Y otro interesante operador condicional


Lo que significa: A la variable Lote se le asignará el valor de Lote1 en caso de que Ask- SlowMA sea menor que dist, de lo contrario, se le asignará el valor de Lote2.

Una recomendación más: olvida la variable Punto. Utilice _Point o la función Point()

¿Qué pasa con Point, todo parece funcionar?