No todos los EA y no todas las estrategias son rentables
Al utilizar el strategytester hazlo también con el modo visual activado y coloca en el gráfico los indicadores que tienes con la misma configuración que has establecido en el EA
MA200 = iMA(NULL, 0, 200, 8,MODE_SMA,PRICE_CLOSE, 0); MA5 = iMA(NULL, 0, 5, 8,MODE_SMA,PRICE_CLOSE, 0); CurrentRSI = iRSI (NULL, 0, VarPeriod,PRICE_CLOSE ,0);
Cada tick estás calculando los valores de arriba y pueden cambiar con cada tick porque has elegido "....,PRICE_CLOSE, 0);"
Los valores que ves en el gráfico cuando se hace el test no son los que tenías cuando se abre una operación...
if(AccountFreeMargin()<(1000*BuyVolume)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (CurrentRSI < LowerBound && MarketInfo(Symbol(), MODE_ASK) > MA200 ) { //Condition to execute buy entry Ticket = OrderSend(Symbol(), OP_BUY, BuyVolume, Ask, 3, Bid - ( StopLoss * Point ), Ask + ( TakeProfit * Point ), "Buy.", 111,0,Yellow) ; //execute buy order if(Ticket>0) { if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } if (Ticket < 0) { Print("Error opening BUY order : ",GetLastError()); return(0); } return(0); }
Cuando se cumplen las condiciones para abrir una compra, y el probador abre una compra, entonces no se comprueba si ya tienes una abierta con la misma condición.
Después de que una compra se abre la siguiente garrapata puede tener de nuevo la condición para la apertura de un comercio.
Esta apertura de operaciones puede funcionar en StrategyTester pero en tiempo real en demo en cuenta real,
Por ejemplo, la elección de "3" deslizamiento es demasiado bajo para el comercio en '5 dígitos' cuenta
Enviando el OrderSend con un valor para OrderStopLoss() y OrdertakeProfit() > 0 fallará para cuentas ECN
Total=OrdersTotal(); for(cnt=0;cnt<Total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) // check for symbol and check for opened position {En el OrderSend y en este bucle de comprobación de operaciones echo de menos que hagas uso de tu OrderMagicNumber()
y veo que el bucle está contando hacia arriba en lugar de contar hacia abajo, mientras que usted también quiere que cerrar las posiciones si es necesario Así que otro error
El OrderModify puede ocurrir con cada punto esto puede conducir a errores de broker como tradecontext demasiado ocupado
En una nota lateral, ¿puedo saber lo que es el cambio y ma_shift y cómo debo llenarlo? es un parámetro necesario para el indicador iRSI() no sabía qué escribir así que sólo asignar 0 a la misma.
No sé de dónde has sacado esa información pero es incorrecta....
iRSI() double iRSI(string symbol,int timeframe,int period,int applied_price,int shift)
¿quizás te referías a iMA()? shift es el número de barra del tiempo para el que quieres la MA, ma_shift te permite mover el valor de la MA en relación al número de barra, así que si le das un shift de 5 y un ma_shift de -2 te dará la MA de la barra 7, tendrías que experimentar un poco con esto para comprobar que estoy en lo cierto, en principio sí.
Con el uso del strategytester hazlo también con el modo visual activado y coloca en el gráfico los indicadores que estés con la misma configuración que hayas establecido en el EA
Cada tick estás calculando los valores de arriba y pueden cambiar con cada tick porque has elegido " ....,PRICE_CLOSE, 0);"
¿qué debo elegir para el valor de desplazamiento" ....,PRICE_CLOSE, 0);" entonces?
¿Qué debo elegir para el valor de desplazamiento" ....,PRICE_CLOSE,0);" entonces?
¿Qué es lo que pide tu estrategia? Usa eso. Usa la barra 0 si quieres, pero se "repintará" incluso si usas PRICE_CLOSE, Close[0](precio de cierre de la barra 0) == Bid. Cuando la barra 0 finalmente se cierra ya no es la barra 0, se convierte en la barra 1.
No todos los EA y no todas las estrategias son rentables
Con el uso del strategytester hazlo también con el modo visual activado y coloca en el gráfico los indicadores que estás con la misma configuración que has puesto en el EA
Cada tick estás calculando los valores de arriba y pueden cambiar con cada tick porque has elegido "....,PRICE_CLOSE, 0);"
Los valores que ves en el gráfico cuando se hace la prueba no son los valores que tenías cuando se abre una operación...
Cuando se cumplen las condiciones para abrir una compra, y el probador abre una compra, entonces no se comprueba si ya tienes una abierta con la misma condición.
Después de que una compra se abre la siguiente garrapata puede tener de nuevo la condición para la apertura de un comercio.
Esta apertura de operaciones puede funcionar en StrategyTester pero en tiempo real en demo en cuenta real,
Por ejemplo, la elección de "3" deslizamiento es demasiado bajo para el comercio en '5 dígitos' cuenta
Enviando el OrderSend con un valor para OrderStopLoss() y OrdertakeProfit() > 0 fallará para cuentas ECN
En el OrderSend y en este bucle de comprobación de operaciones echo de menos que hagas uso de tu OrderMagicNumber()y veo que el bucle está contando hacia arriba en lugar de contar hacia abajo, mientras que usted también quiere que cerrar las posiciones si es necesario Así que otro error
El OrderModify puede ocurrir con cada punto esto puede conducir a errores de corredor como tradecontext demasiado ocupado
He rehecho todo y he arreglado el bucle, el deslizamiento, he arreglado los valores de la media móvil y del RSI, me he asegurado de que todas las posiciones abiertas se cierren antes de iniciar una nueva posición, pero cuando hago el backtest, no pasa nada, no se ejecuta ninguna compra/venta... ¿cuál es el problema?
//+------------------------------------------------------------------+ //| My Strategy 4.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern double StopLoss = 40; extern double TakeProfit = 40; extern double Lots = 0.1; extern double Slippage = 10; extern double RSINow; extern double MA200; extern double MA5; extern bool A1 = false; extern bool A2 = false; extern int Ticket; extern int Ticket2; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Alert("Minimum Stop Level is " + MarketInfo(Symbol(), MODE_STOPLEVEL)); //find out minimum stop loss RSINow = iRSI(NULL, 1440, 2, PRICE_CLOSE, 0); //calculates the RSI value for 2 days MA200 = iMA(NULL, 1440, 200, 0, MODE_SMA, PRICE_CLOSE,0); //calculates the moving average for 200 days MA5 = iMA(NULL, 1440, 5, 0, MODE_SMA, PRICE_CLOSE,0); //calculates the moving average for 5 days Alert(RSINow); Alert(MA200); Alert(MA5); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- //check if a long position is possible, A is false means no buy trade is open , execute buy when RSI drops below 5 and when Ask price rises above 200 day moving average if (A1 == false && RSINow < 5 && Ask > MA200) { Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Bid - ( StopLoss * Point ), Ask + ( TakeProfit * Point )); if(Ticket>0) { if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) { Print("BUY order opened : ",OrderOpenPrice()); A1 = true; } if (Ticket < 0) { Print("Error opening BUY order : ",GetLastError()); return(0); } } } //check if a short position is possible, A2 is false means no sell trade is open , execute sell when RSI rises above 95 and when Bid price drops below 200 day moving average if (A2 == false && RSINow > 95 && Bid < MA200) { Ticket2 = OrderSend(Symbol(), OP_BUY, Lots, Bid, Slippage, Ask + ( StopLoss * Point ), Bid - ( TakeProfit * Point )); if(Ticket2>0) { if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) { Print("SELL order opened : ",OrderOpenPrice()); A2 = true; } if (Ticket2 < 0) { Print("Error opening SELL order : ",GetLastError()); return(0); } } } //check if buy position can be closed, once Ask price rises above 5 day moving average, its time to close the position. if ((A1 == true) && (Ask > MA5)) { OrderClose(Ticket, Lots, Bid, Slippage, Violet); A1 = false; return(0); } //check if sell position can be closed, if Bid price drops below 5 day moving average, close sell position. if ((A2 == true) && (Bid < MA5)) { OrderClose(Ticket2, Lots, Bid, Slippage, Violet); A2 = false; return(0); } //---- return(0); } //+------------------------------------------------------------------+
He rehecho todo y he arreglado el bucle, el deslizamiento, he arreglado los valores de la media móvil y del RSI, me he asegurado de que todas las posiciones abiertas se cierren antes de iniciar una nueva posición, pero cuando hago el backtest, no pasa nada, no se ejecuta ninguna compra/venta... ¿cuál es el problema?
No, el bucle no está arreglado, sino que se ha eliminado, por lo que el problema es mayor.
. estás usando A1 y A2 que obtienen el valor verdadero en el momento en que se abre la operación
Pero que pasaría si el suministro de energía de tu pc se cae y tienes que reiniciar tu pc y metatrader.
Tienes que comprobar en ese momento si hay operaciones abiertas desde tu EA
Como vas a hacer eso ????
Para hacerlo más fácil utiliza un OrderMagicNumber específico para abrir y comprobar tus operaciones
.
la media móvil ahora no se mueve algunas barras en el futuro ok
pero la calculas solo en la sección init() esta solo se ejecutará al arrancar tu Expert Advisor
Lo echo de menos en Start() .... ¿Por qué lo has quitado ahí?
.
He reescrito su código y probado una prueba ver también la configuración
No con los mejores backtestdata pero si lo haces bien puede ser rentable
Símbolo | EURUSD (Euro vs Dólar) | ||||
Periodo | Diario (D1) 2010.10.01 00:00 - 2013.01.29 00:00 (2010.10.01 - 2013.01.30) | ||||
Modelo | Cada tick (el método más preciso basado en todos los marcos temporales mínimos disponibles) | ||||
Parámetros | RSIPeriod=3; UpperBound=90; LowerBound=5; MASlowPeriod=200; MAFastPeriod=5; Lots=0.1; StopLoss=60; TakeProfit=120; TrailingStop=40; MagicNumber=54333; CommentEA="Estrategia RSI"; Slippage.Pips=3; | ||||
Barras en la prueba | 1603 | Ticks modelados | 40187739 | Calidad de la modelización | n/d |
Errores de gráficos no coincidentes | 2062601 | ||||
Depósito inicial | 3000.00 | ||||
Beneficio neto total | 967.18 | Beneficio bruto | 2226.34 | Pérdida bruta | -1259.16 |
Factor de beneficio | 1.77 | Beneficio esperado | 13.62 | ||
Reducción absoluta | 107.10 | Reducción máxima | 327.47 (7.99%) | Reducción relativa | 7.99% (327.47) |
Total de operaciones | 71 | Posiciones cortas (% de ganancias) | 66 (69.70%) | Posiciones largas (% de won) | 5 (80.00%) |
Operaciones con beneficios (% del total) | 50 (70.42%) | Operaciones con pérdidas (% del total) | 21 (29.58%) | ||
Mayor | de beneficios | 120.07 | operación con pérdidas | -60.00 | |
Media | de beneficios | 44.53 | Comercio de pérdidas | -59.96 | |
Máximo | victorias consecutivas (beneficio en dinero) | 8 (424.26) | Pérdidas consecutivas (pérdida en dinero) | 3 (-179.93) | |
Máximo | beneficio consecutivo (recuento de victorias) | 424.26 (8) | Pérdidas consecutivas (recuento de pérdidas) | -179.93 (3) | |
Media | ganancias consecutivas | 4 | pérdidas consecutivas | 2 |
He reescrito su código y probado una prueba ver también la configuración
No con el mejor backtestdata pero si lo haces bien puede ser rentable
Total de operaciones | 71 | Posiciones cortas (% ganado) | 66 (69.70%) | Posiciones largas (% de ganancias) | 5 (80.00%) |

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Imité y escribí un mismo EA con el ejemplo de aquí https://www.mql5.com/en/articles/1510 excepto las condiciones de compra/venta
Condición para abrir la posición de compra : RSI por debajo de 5 Y precio de venta por encima de la media móvil de 200 días, salir cuando el precio de venta esté por encima de la media móvil de 5 días.
Condición para abrir una posición de venta : El RSI está por encima de 95 Y el precio de oferta está por debajo de la media móvil de 200 días, salir cuando el precio de oferta esté por debajo de la media móvil de 5 días.
Cuando hago pruebas de espalda obtengo ganancias negativas cada vez que no sé por qué. La mejor parte es que a veces me da error 134 que significa que no tiene suficiente dinero.
En una nota lateral, ¿puedo saber lo que es el cambio y ma_shift y cómo debo llenar en? es un parámetro necesario para iRSI () indicador que no sabía qué escribir así que sólo asignar 0 a la misma.
Aquí está el código