Re: Pasos para operar con un EAHola 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.
Re: Pasos para operar con un EAbueno, 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
Re: Pasos para operar con un EA
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.
Re: Pasos para operar con un EALo 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.
Re: Pasos para operar con un EA
Re: Pasos para operar con un EANo 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.
Re: Pasos para operar con un EAhola,
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
31 mensajes
• Página 4 de 4 • 1, 2, 3, 4
|
|
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados