Requiero ayuda para hacer funcionar un EA muy basico

¿Tiene dudas sobre el trading con divisas? No se preocupe, FXWizard tiene todas las respuestas.

Requiero ayuda para hacer funcionar un EA muy basico

Notapor paco14065 » 27 Jul 2016, 01:24

He tratado de hacer que funcione este EA pero no he podido, mis conocimientos son menos que básicos, solo quiero abra-cierre una orden con una misma señal, es decir si la señal es de venta abrimos venta y cerramos la compra, no he podido "enlazar" una primera estructura con la segunda, mil gracias por su ayuda, anexo el código, el comentario donde dice //Hay compra-venta según, lo que entiendo debe ser el enlace, gracias por su tiempo!

//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright 2005-2014, MetaQuotes Software Corp. |
//| http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "http://www.mql4.com"


input double Lots =0.1;
input double MagicNum =1234;
double CrossUp[];
double CrossDown[];
extern int FasterMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int FasterMA = 1;
extern int SlowerMode = 3; //0=sma, 1=ema, 2=smma, 3=lwma
extern int SlowerMA = 2;
int tiempo;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+

int start() {
int limit, i, counter;
double fasterMAnow, slowerMAnow, fasterMAprevious, slowerMAprevious, fasterMAafter, slowerMAafter;
double Range, AvgRange;
int counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

for(i = 0; i <= limit; i++) {

counter=i;
Range=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;

fasterMAnow = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i);
fasterMAprevious = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i+1);
fasterMAafter = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i-1);

slowerMAnow = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i);
slowerMAprevious = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i+1);
slowerMAafter = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i-1);

if ((fasterMAnow > slowerMAnow) && (fasterMAprevious < slowerMAprevious) && (fasterMAafter > slowerMAafter)) {
CrossUp[i] = Low[i] - Range*0.5;
} else if ((fasterMAnow < slowerMAnow) && (fasterMAprevious > slowerMAprevious) && (fasterMAafter < slowerMAafter)) {
CrossDown[i] = High[i] + Range*0.5;
}
if (i==1 && CrossUp[i] > CrossDown[i]){//hay venta

}
if (i==1 && CrossUp[i] < CrossDown[i]){//hay compra

}

}
return(0);
}
void OnTick ()
{
//---
//Buscar si hay operaciones abiertas, si si,buscar operacion contraria para cerrar
//Si no buscar operacion para abrir
int TicketOperar=EnOperacion();
// No hay trades abiertos, buscare uno
if (TicketOperar==-1);
{
if(HayCompra())OrderSend(NULL,0,Lots,Ask,20,0,0,NULL,MagicNum,0,clrNONE);
if(HayVenta())OrderSend(NULL,1,Lots,Bid,20,0,0,NULL,MagicNum,0,clrNONE);

}
//Ya tengo trade monitoreo salida
if(TicketOperar>-1)
{
if(OrderSelect(TicketOperar,SELECT_BY_TICKET,MODE_TRADES))
{
//Es una compra y necesito buscar una venta
if(OrderType()==0 && HayVenta())OrderClose(TicketOperar,OrderLots(),OrderClosePrice(),20,clrNONE);
//Es una venta y necesito buscar una compra
if(OrderType()==0 && HayCompra())OrderClose(TicketOperar,OrderLots(),OrderClosePrice(),20,clrNONE);
}
}
}



//----

bool HayCompra()
{
if (//Hay Compra)return(true);
else return(false);
}
bool HayVenta()
{
if (//Hay Venta)return(true);
else return(false);
}


//-----
int EnOperacion()

{
for(int o=0;o<OrdersTotal();o++ )
{
if(OrderSelect(o,SELECT_BY_POS,MODE_TRADES))

{
if(OrderMagicNumber()==MagicNum && OrderSymbol()==Symbol())return(OrderTicket());
}
return(-1);//no encontre nada
}

}
paco14065
 
Mensajes: 4
Registrado: 27 Jul 2016, 01:12
Karma: 0

Re: Requiero ayuda para hacer funcionar un EA muy basico

Notapor FXWizard » 30 Jul 2016, 16:45

Hola paco14065, revisando el código veo que hay errores de sintaxis en este bloque de código:

Código: Seleccionar todo
bool HayCompra()
{
if (//Hay Compra)return(true);
else return(false);
}
bool HayVenta()
{
if (//Hay Venta)return(true);
else return(false);
}


Revísalo y dime qué es lo que quieres hacer exactamente ahí.

Saludos,
FXWizard
Avatar de Usuario
FXWizard
 
Mensajes: 8493
Registrado: 12 Feb 2008, 15:17
Karma: 35

Re: Requiero ayuda para hacer funcionar un EA muy basico

Notapor paco14065 » 30 Jul 2016, 22:35

Mil gracias por tomarte el tiempo de revisar mi código, exactamente esa parte que me señalas es donde quiero enlazar la primera parte de mi EA, es donde no puedo entrelazar para que funcione el código, de alguna forma lo deje así para quien quiera o pueda ayudarme, me diga como entrelazo la primera parte con la segunda, nuevamente te agradezco tu tiempo
paco14065
 
Mensajes: 4
Registrado: 27 Jul 2016, 01:12
Karma: 0

Re: Requiero ayuda para hacer funcionar un EA muy basico

Notapor FXWizard » 03 Ago 2016, 16:57

Hola paco14065, casi es mejor que me digas qué es lo que quieres hacer en la estrategia y vemos cómo incorporarlo en tu plantilla. En todo caso donde pones HayCompra y HayVenta debes poner la condición que deseas verificar (por ejemplo Close > MovAvg(20)).

Saludos,
FXWizard
Avatar de Usuario
FXWizard
 
Mensajes: 8493
Registrado: 12 Feb 2008, 15:17
Karma: 35

Re: Requiero ayuda para hacer funcionar un EA muy basico

Notapor Refresko » 03 Ago 2016, 18:39

paco14065 escribió:He tratado de hacer que funcione este EA pero no he podido....

Hola paco

no me puse a revisar cual es la condición de compra y venta, pero acomode para que cuando se de la condicion de compra, simplemente cierre la venta y haga Compra,
luego, cuando se de la condicion de venta, cierre la compra, y haga la venta.

insisto, no revise la condicion que genera las compras o ventas, solo el cierre de una y la consecución de la otra,,,,,,,igual es para que te des una idea

Código: Seleccionar todo

#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "http://www.mql4.com"


input double Lots =0.1;
input double MagicNum =1234;
double CrossUp[];
double CrossDown[];
extern int FasterMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int FasterMA = 1;
extern int SlowerMode = 3; //0=sma, 1=ema, 2=smma, 3=lwma
extern int SlowerMA = 2;
int tiempo;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+

int start() {
int limit, i, counter;
double fasterMAnow, slowerMAnow, fasterMAprevious, slowerMAprevious, fasterMAafter, slowerMAafter;
double Range, AvgRange;
int counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

for(i = 0; i <= limit; i++) {

counter=i;
Range=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;

fasterMAnow = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i);
fasterMAprevious = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i+1);
fasterMAafter = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i-1);

slowerMAnow = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i);
slowerMAprevious = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i+1);
slowerMAafter = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i-1);

if ((fasterMAnow > slowerMAnow) && (fasterMAprevious < slowerMAprevious) && (fasterMAafter > slowerMAafter)) {
CrossUp[i] = Low[i] - Range*0.5;
} else if ((fasterMAnow < slowerMAnow) && (fasterMAprevious > slowerMAprevious) && (fasterMAafter < slowerMAafter)) {
CrossDown[i] = High[i] + Range*0.5;
}
if (i==1 && CrossUp[i] > CrossDown[i]){HAYCOMPRA(); //SUPONGO QUE ESTA ES LA CONDICION QUE GENERA LA COMPRA

}
if (i==1 && CrossUp[i] < CrossDown[i]){HAYVENTA();///SUPONGO QUE ESTA ES LA CONDICION QUE GENERA LA VENTA
}

}
return(0);
}
void OnTick ()
{
/*
//---
//Buscar si hay operaciones abiertas, si si,buscar operacion contraria para cerrar
//Si no buscar operacion para abrir
int TicketOperar=EnOperacion();
// No hay trades abiertos, buscare uno
if (TicketOperar==-1);
{

if(HayCompra())OrderSend(NULL,0,Lots,Ask,20,0,0,NULL,MagicNum,0,clrNONE);
if(HayVenta())OrderSend(NULL,1,Lots,Bid,20,0,0,NULL,MagicNum,0,clrNONE);

}
//Ya tengo trade monitoreo salida
if(TicketOperar>-1)
{
if(OrderSelect(TicketOperar,SELECT_BY_TICKET,MODE_TRADES))
{
//Es una compra y necesito buscar una venta
if(OrderType()==0 && HayVenta())OrderClose(TicketOperar,OrderLots(),OrderClosePrice(),20,clrNONE);
//Es una venta y necesito buscar una compra
if(OrderType()==0 && HayCompra())OrderClose(TicketOperar,OrderLots(),OrderClosePrice(),20,clrNONE);
}
}*/
}

void HAYCOMPRA()
{
// HACEMOS COMPRA,
//pero antes cerramos la venta, si es que existe.

for(int o=0;o<OrdersTotal();o++ )
{
 OrderSelect(o,SELECT_BY_POS,MODE_TRADES);
  if(OrderMagicNumber()==MagicNum && OrderSymbol()==Symbol() && OrderType()==OP_SELL)
  {
   OrderClose(OrderTicket(),Lots,Ask,10,Gray);
  }
}
// Una vez cerradas las ventas como se hizo arriba, abrimos la compra

OrderSend(NULL,0,Lots,Ask,20,0,0,NULL,MagicNum,0,clrNONE);
}




//----------------------------------------------------
void HAYVENTA()
{
// HACEMOS VENTA,
//pero antes cerramos la COMPRA, si es que existe.

for(int o=0;o<OrdersTotal();o++ )
{
 OrderSelect(o,SELECT_BY_POS,MODE_TRADES);
  if(OrderMagicNumber()==MagicNum && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
  {
   OrderClose(OrderTicket(),Lots,Bid,10,Gray);
  }
}
// Una vez cerradas las COMPRAS como se hizo arriba, abrimos la VENTA

OrderSend(NULL,1,Lots,Bid,20,0,0,NULL,MagicNum,0,clrNONE);
}


//----
/*
bool HayCompra()
{
if (//Hay Compra)return(true);
else return(false);
}
bool HayVenta()
{
if (//Hay Venta)return(true);
else return(false);
}*/


//-----
/*
int EnOperacion()

{
for(int o=0;o<OrdersTotal();o++ )
{
if(OrderSelect(o,SELECT_BY_POS,MODE_TRADES))

{
if(OrderMagicNumber()==MagicNum && OrderSymbol()==Symbol())return(OrderTicket());
}
return(-1);//no encontre nada
}

}*/
No puedes cometer/ dos veces el mismo error/ la segunda vez sera/ Por eleccion...
Avatar de Usuario
Refresko
 
Mensajes: 165
Registrado: 12 Dic 2011, 22:56
Karma: 5

Re: Requiero ayuda para hacer funcionar un EA muy basico

Notapor paco14065 » 03 Ago 2016, 20:00

Muchas gracias lo revisare nuevamente, soy nuevo en el foro me podrían indicar como doy por cerrado el tema? gracias por su tiempo
paco14065
 
Mensajes: 4
Registrado: 27 Jul 2016, 01:12
Karma: 0

Re: Requiero ayuda para hacer funcionar un EA muy basico

Notapor FXWizard » 10 Ago 2016, 16:35

Hola paco14065, sería de agradecer que a cambio de la ayuda recibida compartieras el EA definitivo en el Foro ;)

Saludos,
FXWizard
Avatar de Usuario
FXWizard
 
Mensajes: 8493
Registrado: 12 Feb 2008, 15:17
Karma: 35

Re: Requiero ayuda para hacer funcionar un EA muy basico

Notapor paco14065 » 10 Ago 2016, 22:49

con todo gusto pero no tengo el producto terminado, lo que esta en este foro es todo lo que tengo, y claro que soy agradecido pero si no tengo producto final que les ofrezco?, no supe como concretar la idea para que me ayudaran, así que no puedo avanzar y el EA tendría que haber calculo los cruces de las medias que están en la primera parte y simplemente cerraba y abría operaciones en los cruces, era todo lo que quería hacer, lo que esta en el foro es todo lo que tengo, créeme no me robo idea de nadie porque el EA sigue haciendo lo mismo que cuando llegue a pedir ayuda, es decir nada.
paco14065
 
Mensajes: 4
Registrado: 27 Jul 2016, 01:12
Karma: 0

Siguiente

Volver a Pregunte a FXWizard

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado