Pasos para operar con un EA

Foro para cuestiones generales sobre la plataforma MetaTrader 4.

Re: Pasos para operar con un EA

Notapor pedro44forex » 12 Jun 2012, 23:42

Hola a todos y perdonar mi ignorancia:

Pero lo de esperar a una vela larga a favor de la tendencia tambien va ir programado en el ea. Porque yo de eso ni idea.
pedro44forex
 
Mensajes: 6
Registrado: 20 Feb 2012, 23:27
Karma: 0

Re: Pasos para operar con un EA

Notapor Trader2010 » 13 Jun 2012, 04:49

bueno, creo que la idea de navar es analizar un experto cualquiera e ir despejando dudas, no se trata de automatizar una estrategia si no de conocer los codigos.
por ahora esperamos el comentario de navar y vamos mirando y explicando linea por linea,
Saludos
Trader2010
 
Mensajes: 317
Registrado: 17 Sep 2009, 15:26
Karma: 0

Re: Pasos para operar con un EA

Notapor Navar » 13 Jun 2012, 10:17

Trader2010 escribió:bueno, creo que la idea de navar es analizar un experto cualquiera e ir despejando dudas, no se trata de automatizar una estrategia si no de conocer los codigos.
por ahora esperamos el comentario de navar y vamos mirando y explicando linea por linea,
Saludos


Pues sí, esa era la idea. Es decir hacer una especie de tutorial de mql básico para entender mejor como funcionan los sitemas automáticos.

No soy programador, ni mucho menos. Todo lo que voy a poner ya está en alguna web pero no en castellano.

Creo que lo primero es copiar el código de la opción propuesta por Trader 2010 e ir explicando que hace que y porque:

//+------------------------------------------------------------------+
//| Moving Average.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#define MAGICMA 20050610

extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern double MovingPeriod = 12;
extern double MovingShift = 6;
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1) lot=0.1;
return(lot);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double ma;
int res;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
if(Open[1]>ma && Close[1]<ma)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
//---- buy conditions
if(Open[1]<ma && Close[1]>ma)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
}
//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+
http://navarinversiones.blogspot.com/

Lo hago porque puedo, puedo porque quiero y quiero porque me dijeron que no podía.
Avatar de Usuario
Navar
 
Mensajes: 450
Registrado: 13 May 2011, 11:28
Karma: 1

Re: Pasos para operar con un EA

Notapor Navar » 13 Jun 2012, 10:48

Lo primero que veo es que quiere diferenciar cuales son las operaciones que hace el robot y cuales pueden ser hechas en manual (define magicma), para eso sirve el n.º mágico.

A continuación, hay 5 variables externas que se podrán modificar el el cuadro propiedades que aparecerá en el gráfico cuando le añadamos el EA. En este caso, decidiremos sobre el tamaño del lote, el riesgo que asumiremos, un valor que va a reducir algo, el periodo de la ema y su desplazamiento.

#define MAGICMA 20050610

extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern double MovingPeriod = 12;
extern double MovingShift = 6;

Para decidir poner variables externas se usa la instrucción extern. la instrucción double nos permite decidir si va a ser una variable con decimales. Si el valor fuera un n.º entero sin decimales pondríamos int.

A partir de aquí, vienen las condiciones para decidir la entrada al mercado.

Lo primero es ver si ya hay órdenes abiertas:

int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}

Si las órdenes son 0, crea una instrucción for (para) que dice que si "para las órdenes=0 y sean menos que el total de las que existan (i<OrdersTotal), se incrementará en una unidad (i++, es lo mismo que decir i=i+1, luego si i=0+1; i=1).

Si (if) la orden seleccionada, sea buy o sell, (order_select) y seleccionada por posición (select_by_pos) y tipo (mode_trades) es igual a (==) no existe (false) que pare de buscar (break), entonces con estos datos lo que "piensa" es:

Si (if) la orden sobre el par (OrderSymbol) coincide con el par y (&&), además, el n.º mágico coincide con el asignado al principio del EA (magicma), que se prepare para abrir una orden buy ((OrderType()==OP_BUY)) o bien una orden sell ((OrderType()==OP_SELL)). Cuando ha recopilado esta información y si las "buys" son mayores que 0 entonces nos diga si están y le resten las "sells".


Al menos yo lo entiendo así. ¿Alguien lo entiende de otra manera? :)
http://navarinversiones.blogspot.com/

Lo hago porque puedo, puedo porque quiero y quiero porque me dijeron que no podía.
Avatar de Usuario
Navar
 
Mensajes: 450
Registrado: 13 May 2011, 11:28
Karma: 1

Re: Pasos para operar con un EA

Notapor elolima » 13 Jun 2012, 13:46

Navar escribió:
Trader2010 escribió:bueno, creo que la idea de navar es analizar un experto cualquiera e ir despejando dudas, no se trata de automatizar una estrategia si no de conocer los codigos.
por ahora esperamos el comentario de navar y vamos mirando y explicando linea por linea,
Saludos


Pues sí, esa era la idea. Es decir hacer una especie de tutorial de mql básico para entender mejor como funcionan los sitemas automáticos.

No soy programador, ni mucho menos. Todo lo que voy a poner ya está en alguna web pero no en castellano.

Creo que lo primero es copiar el código de la opción propuesta por Trader 2010 e ir explicando que hace que y porque:

//+------------------------------------------------------------------+
//| Moving Average.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#define MAGICMA 20050610

extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern double MovingPeriod = 12;
extern double MovingShift = 6;
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}

No utiliza el parametro symbol, ademas le da igual, por que MAGICMA es un número único que identifica la orden
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}

No me queda claro que si la orden es SELL, devuelva 0, ejecuta CheckforOpen() para poner una nueva orden
//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1) lot=0.1;
return(lot);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double ma;
int res;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
if(Open[1]>ma && Close[1]<ma)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
//---- buy conditions
if(Open[1]<ma && Close[1]>ma)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
}
//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol

Se pasa el par (Symbol()), aunque luego no lo utiliza ?¿?¿
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+
elolima
 
Mensajes: 47
Registrado: 13 May 2012, 10:10
Karma: 0

Re: Pasos para operar con un EA

Notapor Navar » 14 Jun 2012, 12:16

No sé que querías decir, elolima. No ha salido en tu post.

Ayer me quedé en el momento antes de q el EA calcula la rutina para decidir cual es el tamaño óptimo de nuestra posición:

//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1) lot=0.1;
return(lot);
}

Lo primero que se ha hecho es crear la función LotsOptimized para poder asignarle las condiciones y valores que nos permitan calcular ese tamaño adecuado para entrar al mercado. Después le pregunta a la rutina inicial (los extern) desde donde empezamos (0.1), que cuente todas las órdenes que ha habido hasta el momento (int orders=HistoryTotal();) y la cantidad de perdedoras sin que la rutina se haya cortado.

Y como se hace esto?
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1); Aquí le pedimos al EA que calcule nuestra cuenta y lo multiplique por el riesgo que hemos asumido.

Ahora le diremos que si hemos decidido un factor de reductor por si nos hemos pasado con el riesgo.

¿Cómo voy hasta ahora?
http://navarinversiones.blogspot.com/

Lo hago porque puedo, puedo porque quiero y quiero porque me dijeron que no podía.
Avatar de Usuario
Navar
 
Mensajes: 450
Registrado: 13 May 2011, 11:28
Karma: 1

Re: Pasos para operar con un EA

Notapor Trader2010 » 14 Jun 2012, 16:02

hola,
aporte
si notamos, tenemos un control externo,
extern double Lots = 0.1; esto es para el valor de los lotes, si deseamos hacer un backtest podemos variar ese valor, ejemplo 0.05 o 0.2, por poner algo,
pero debemos saber que lo que deseamos ganar asumimos poderlo perder.
esa variable externa le podemos poner otro nombre como por ejemplo: Lotes=0.1 / Riesgo=0.2 / son solo unos ejemplos para personalizar y saber que cosas podemos cambiar sin alterar nuestro experto.

saludos
Trader2010
 
Mensajes: 317
Registrado: 17 Sep 2009, 15:26
Karma: 0

Anterior

Volver a MetaTrader 4

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron