ayuda fineturn EA

 

¿Puede alguien ayudarme a afinar un EA por favor?

puede hacerlo mejor - todo lo que veo es comprar y vender en los lugares equivocados

Archivos adjuntos:
jbtest3.mq4  5 kb
 
delcor wrote >>

¿Puede alguien ayudarme a afinar un EA por favor?

puede hacerlo mejor - todo lo que veo es comprar y vender en los lugares equivocados

¿Quiere explicar su estrategia? Tenemos que comprobar si está codificado de acuerdo con la estrategia indicada antes de que podamos afinarla.

Si los códigos son correctos y estamos obteniendo malas operaciones del EA, entonces la estrategia es la culpable. ¿Funciona bien la estrategia en el trading manual?

 
ronaldosim:

¿Quiere explicar su estrategia? Tenemos que comprobar si está codificada de acuerdo con la estrategia indicada antes de poder afinarla.

Si los códigos son correctos y estamos obteniendo malas operaciones del EA, ¿entonces la estrategia es la culpable? ¿Funciona bien la estrategia desde el trading manual?

gracias por volver

la estrategia es - solo debe comprar o vender cuando la ema se cruza. hay una configuración que funciona bien y si solo compra y vende en los cruces tomará ganancias

lo he atado tal cual pero no compra en el cruce de las 2 ema's

debe cerrar la orden abierta y comprar cuando la ema corta cruce la ema larga y al revés. en esta etapa quiero que solo haga eso.

Luego podemos hacer la 2da etapa. no hay manejo de dinero en esta etapa. soy nuevo en la programación pero quiero aprender más

me puedes ayudar

como es que hacer el trabajo en el eur / usd 15 and1h tf - pero no es suficiente

 
delcor wrote >>

gracias por volver

la estrategia es - solo debe comprar o vender cuando se cruzan las ema's. hay una configuración que funciona bien y si solo compra y vende en los cruces tomará ganancias

lo he atado tal cual pero no compra en el cruce de las 2 ema's

debe cerrar la orden abierta y comprar cuando la ema corta cruce la ema larga y al revés. en esta etapa quiero que solo haga eso.

Luego podemos hacer la 2da etapa. no hay manejo de dinero en esta etapa. soy nuevo en la programación pero quiero aprender más

me puedes ayudar

tal y como está hace el trabajo en el eur/usd 15 y1h tf - pero no lo suficiente

sospecho que sí; para los cruces EMA tu código es incorrecto

Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);

necesitas dos iMA para la longema y la shortema

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

y para comprobar el cruce

si (SEMA1>LEMA1 && SEMA2<LEMA2) enviar orden de compra

y para la venta

si (SEMA1<LEMA1 && SEMA2>LEMA2) enviar orden de venta

 
ronaldosim:

Sospecho que sí; para los cruces de EMA tu código es incorrecto

Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);

necesitas dos iMA para la longema y la shortema

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

y para comprobar el cruce

si (SEMA1>LEMA1 && SEMA2<LEMA2) enviar orden de compra

y para la venta

si (SEMA1<LEMA1 && SEMA2>LEMA2) enviar orden de venta

ok así que el

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

debe colocarse en las condiciones de "comprobación de órdenes abiertas" - debajo de "obtener la media móvil"

y en la condición "

si (SEMA1>LEMA1 && SEMA2<LEMA2) enviar orden de compra" donde ?

también el LEMA1 Y LEMA2 debe ser definido en la parte superior


todavía es nuevo en esto

mi skype es delcor59 si quieres skypearme

gracias por tu ayuda

 
delcor wrote >>

Bien, entonces el

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

debe colocarse en las condiciones de "comprobación de órdenes abiertas" - debajo de "obtener la media móvil"

y en la condición "

si (SEMA1>LEMA1 && SEMA2<LEMA2) enviar orden de compra" donde ?

también el LEMA1 Y LEMA2 debe ser definido en la parte superior

todavía nuevo en esto

mi skype es delcor59 si quieres skypearme

gracias por tu ayuda

algo como esto modificando tus propios códigos....

void CheckForOpen()
{
doble Ema;
int res;
//---- ir a operar sólo para los primeros tiks de la nueva barra
if(Volume[0]>1) return;
//---- obtener la media móvil
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

//---- condiciones de venta
// if(Open[1]>Ema && Close[1]<Ema)
si (SEMA1<LEMA1 && SEMA2>LEMA2)
{
res=Enviar orden(Símbolo(),OP_VENTA,LotesOptimizados(),Oferta,3,0,0,"",MAGICMA,0,Rojo);
res;
}
//---- condiciones de compra
// if(Open[1]<Ema && Close[1]>Ema)
if (SEMA1>LEMA1 && SEMA2<LEMA2)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
res;
}
//----
}

void CheckForClose()
{
doble Ema;
//---- ir a operar sólo para los primeros tiks de la nueva barra
if(Volume[0]>1) return;
//---- obtener la media móvil
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);
//----
for(int i=0;i<Total de pedidos();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA | OrderSymbol()!=Symbol()) continue;
//---- comprobar el tipo de pedido
if(OrderType()==OP_BUY)
{
// if(Open[1]>Ema && Close[1]<Ema)
if (SEMA1<LEMA1 && SEMA2>LEMA2) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
romper;
}
if(OrderType()==OP_SELL)
{
// if(Open[1]<Ema && Close[1]>Ema)
if (SEMA1>LEMA1 && SEMA2<LEMA2) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
romper;
}
}
//----
}

 
ronaldosim:

algo así modificando sus propios códigos....

void CheckForOpen()
{
double Ema;
int res;
//---- ir a operar sólo para los primeros tiks de la nueva barra
if(Volume[0]>1) return;
//---- obtener la media móvil
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

//---- condiciones de venta
// if(Open[1]>Ema && Close[1]<Ema)
si (SEMA1<LEMA1 && SEMA2>LEMA2)
{
res=Enviar orden(Símbolo(),OP_VENTA,LotesOptimizados(),Oferta,3,0,0,"",MAGICMA,0,Rojo);
res;
}
//---- condiciones de compra
// if(Open[1]<Ema && Close[1]>Ema)
if (SEMA1>LEMA1 && SEMA2<LEMA2)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
res;
}
//----
}

void CheckForClose()
{
doble Ema;
//---- ir a operar sólo para los primeros tiks de la nueva barra
if(Volume[0]>1) return;
//---- obtener la media móvil
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);
//----
for(int i=0;i<Total de pedidos();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA | OrderSymbol()!=Symbol()) continue;
//---- comprobar el tipo de pedido
if(OrderType()==OP_BUY)
{
// if(Open[1]>Ema && Close[1]<Ema)
if (SEMA1<LEMA1 && SEMA2>LEMA2) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
romper;
}
if(OrderType()==OP_SELL)
{
// if(Open[1]<Ema && Close[1]>Ema)
if (SEMA1>LEMA1 && SEMA2<LEMA2) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
romper;
}
}
//----
}

gracias de nuevo

algo no está bien. cuando hago el back test de la Ea sólo muestra compras y no ventas

 
delcor wrote >>

gracias de nuevo

cuando hago el backtest de la Ea solo muestra compras y no ventas

me he dado cuenta de que dependiendo de la orden que se dispare primero, es decir, de compra o de venta, una vez que se inicia el cruce se dispara una orden y cuando se cruza la contraria se cierra la orden; en el start() cuando se comprueba la existencia de una orden de mercado, se evita que se dispare la del tipo de orden, es decir, cuando se inicia con una orden de compra siempre será de compra; cuando se inicia con una orden de venta, siempre será de venta; quita esa condición de comprobación

 
ronaldosim:

noté que dependiendo de la orden que se dispare primero, es decir, compra o venta, una vez que se inicia el cruce se dispara una orden y cuando se cruza la contraria se cierra la orden; en start() cuando se comprueba la existencia de una orden de mercado, se evita que se dispare la del tipo de orden, es decir, cuando se inicia con una orden de compra siempre será de compra; cuando se inicia con una orden de venta, siempre será de venta; elimine esa condición de comprobación

¿se refiere a la condición de control en la parte inferior del EA?

//+------------------------------------------------------------------+
//| Función de inicio |
//+------------------------------------------------------------------+
void start()
{
//---- comprueba el historial y las operaciones
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calcula las órdenes abiertas por símbolo actual
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----

}


porque también hay

void CheckForOpen()

void CheckForClose()

 
delcor:

¿se refiere a la condición de comprobación en la parte inferior del EA?

//+------------------------------------------------------------------+
//| Función de inicio ||.
//+------------------------------------------------------------------+
void start()
{
//---- comprueba el historial y las operaciones
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calcular las órdenes abiertas por el símbolo actual
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----

}


porque también hay

void CheckForOpen()

void CheckForClose()




dime si hay un sistema de prueba en la programación del EA que te muestre paso a paso lo que sucede cuando este EA se ejecuta

 
delcor wrote >>

¿se refiere a la condición de comprobación en la parte inferior del EA?

//+------------------------------------------------------------------+
//| Función de inicio
//+------------------------------------------------------------------+
void start()
{
//---- comprueba el historial y las operaciones
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calcular las órdenes abiertas por el símbolo actual
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----

}

porque también hay

void CheckForOpen()

void CheckForClose()

if(Bars<100 || IsTradeAllowed()==false) return;
//---- calcular las órdenes abiertas por el símbolo actual
CheckForOpen();
CheckForClose();
//----

Razón de la queja: