¿Por qué mi EA sigue dando ganancias negativas cuando hace pruebas de espalda? - página 3

 
deVries:

cuando inicias tu Metatrader el EA tiene que averiguar si hay una operación abierta

Yo sólo hago el bucle de cuenta atrás para comprobar las operaciones si hay una operación

Si lo pongo al principio en uno y OrdersTotal() >0 entonces hago la comprobación de operaciones if(.......> || .......> ){hacer el bucle....

¿estás seguro de que me diste el código que te dio los resultados mostrados arriba? lo probé en 1440 (1 día) período y no se ejecutaron las operaciones. sin embargo, cuando lo cambio a 1M muchas operaciones se ejecutaron
 
cyxstudio:
¿estás seguro de que me diste el código que te dio los resultados mostrados arriba? lo probé en 1440 (1 día) y no se ejecutó ninguna operación. sin embargo cuando lo cambié a 1M se ejecutaron muchas operaciones
cuantos días atrás van sus datos si revisa mi prueba de nuevo encontrará el periodo de la prueba y el marco de tiempo probado en
 

OK aquí va..... Intentaré ayudar aquí si puedo.

Esta pregunta de Ma_Shift es una que he tenido durante algún tiempo y nunca fue capaz de obtener una respuesta clara en.

Si usted notará en su código que está utilizando un desplazamiento de 8 en su Moving averages.... ¿qué significa esto?

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);
Como puedes ver este settting de desplazamiento no existe en el RSI ... se muestra en su propia ventana.. eso es una pista.
Si suelta una media móvil en su gráfico verá lo que equivale al Ma_Shift como un ajuste en el cuadro Shift.
También note que el orden de los parámetros 200,8,sma,close. son los mismos cuando llama al indicador
como el orden en el que aparecen en el cuadro...el NULL y el timeframe son los que usted suelta el Ma
así que no se necesitan aquí. ni tampoco el último ajuste de cambio... ya que este ma estará cambiando constantemente en la 
vela actual.... usted entenderá esto en un momento.
si usted va y mira la configuración del indicador iAlligator verá la configuración para el desplazamiento de la mandíbula, el desplazamiento de los dientes, y el desplazamiento de los labios... este es el MaShift de cada uno de esos promedios móviles.
todos ellos pueden ser desplazados en el gráfico a la izquierda o a la derecha, sin importar el número de barras que desee.

que se muestra así............

Esto hace una diferencia de 3 pip en el valor de esta vela 08:00 como se muestra aquí en la ventana de datos.

Lo que nos lleva a la pregunta: ¿Para qué sirve el ajuste "Shift" del final?

Bueno, si pasas el ratón por el gráfico con la ventana de datos abierta y te mueves de una vela a otra

verás que los números cambian para la 5 SMA a medida que vas de vela en vela...

De eso se trata el último valor de SHIFT... teniendo en cuenta que la vela actual que se está dibujando es la vela cero...

vela actual que se dibuja es la vela cero... la última vela completada es la vela 1, así que si hay 1000 velas totales en

en el gráfico, se numeran hacia atrás desde la 999 en el borde izquierdo del gráfico hasta la 0 en la que se encuentra actualmente.

Así que si quieres saber cuál era el valor de la 5 SMA hace 5 velas completadas

usted pone un 5 en ese último lugar... por supuesto a medida que el tiempo avanza... la vela 5 cambiará a la siguiente vela.

Ahora, como se mencionó... si usted siempre está recibiendo el valor de la vela 0.. entonces ese valor es constantemente

cambiando con el precio. Así que usted puede tomar una señal y luego el indicador repinta en usted .. pero si usted está

siempre pidiendo la información de la vela 1 se hace y no va a cambiar....

Espero que esto ayude...

 
cyxstudio:

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?



la función init() solo se ejecuta al inicio y no en cada tick como la función start()... tendrás que poner las medias móviles de nuevo en la función start en lugar de en la init() solo para que funcione y siga obteniendo números frescos...
 

Revisado

Añadir una función en la que el EA compruebe si hay órdenes pendientes antes de decidir abrir una nueva posición. Si hay una orden pendiente o abierta entonces no intentará abrir más.

veo que todos usan un bucle para comprobar si hay una posición abierta antes de comprar, no veo la lógica de eso. mientras OrdersTotal sea > 0 hay órdenes abiertas y mi EA no intentará abrir más posiciones.

He arreglado el bucle decreciente.

Esta vez me da el error OrderClose 138 que no se soluciona añadiendo refreshrates()

y sigo perdiendo dinero que no debería.

No se me ocurre nada más que arreglar...

//+------------------------------------------------------------------+
//|                                       RSI_strategy_cyxstudio.mq4 |
//|                                  Copyright 2013, Tjipke de Vries |
//|                                     https://forum.mql4.com/53695/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


extern int RSIPeriod        =  3;      //number of periods for RSI
extern double UpperBound    =  90;     //set upper bound value for RSI
extern double LowerBound    =  5;      //set lower bound value for RSI
extern int MASlowPeriod     = 200;
extern int MAFastPeriod     = 5;
extern double Lots  = 0.1;
extern double StopLoss      = 60;       //Set the stop loss level
extern double TakeProfit    = 120;       //Set the take profit level
extern double TrailingStop = 40;
//extra settings for OrderSend
extern int        MagicNumber = 54333;
extern string     CommentEA = "RSI strategy";
extern int        Slippage.Pips    = 3;


int    BUYS=1,SELLS=1;
//++++ These are adjusted for 5 digit brokers.
int     pips2points;      // slippage  3 pips    3=points    30=points
double  pips2dbl;         // Stoploss 15 pips    0.015      0.0150
int     Digits.pips;      // DoubleToStr(dbl/pips2dbl, Digits.pips)
//---
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----   
   if(Digits % 2 == 1)  // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
     {pips2dbl = Point*10; pips2points = 10;   Digits.pips = 1;}
     else {pips2dbl = Point;    pips2points =  1;   Digits.pips = 0;}
     // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl        
//----      

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Ticket;
   double SL,TP;
   int Total;
   double MagicNo;
   double Slippage;
   
   double pAsk = MarketInfo(Symbol(), MODE_ASK);
   double pBid = MarketInfo(Symbol(), MODE_BID);
   double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average
   double CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
  
   int Ticket2;
   int cnt;
   
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   
   if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


  
        
        
        if (OrdersTotal() == 0 ) {
        
        if (CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( 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); 
   }
  
  }
  
  
 
  if (CurrentRSI > UpperBound && pBid < MA200) {     //Condition to execute sell entry
  
       Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, 3, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",000, 0, Yellow)  ;     //execute sell order
       if(Ticket2>0)
           {
            if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("SELL order opened : ",OrderOpenPrice());
           
           }
         if (Ticket2<0) {
          Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      
   
   } 
   }
   
   if (OrdersTotal() > 0 ) {
   
   int PositionIndex;    //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   RefreshRates();
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )      // <-- or is it a Sell Order ?
   
   if (pAsk > MA5){      //condition to close long position
   RefreshRates();
    OrderClose(OrderTicket(),OrderLots(),pBid,3,Violet); // close long position
 
   return(0); // exit
   
   if(TrailingStop>0)  
              {                 
               if(pBid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<pBid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pBid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
   
  }
   
   if(pBid < MA5){       //condition to close short position
   RefreshRates();
   OrderClose(OrderTicket(),OrderLots(),pAsk,3,Violet); // close short position
  
   return(0); // exit
   
   
  if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-pAsk)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(pAsk+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pAsk+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
   }
   
      if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) )               // <-- try to close the order
         Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop
   
   
   }
  
   
   
   
   
   
        
        
           return(0);
}
 
cyxstudio:

Revisado

Añadir una función en la que el EA compruebe si hay órdenes pendientes antes de decidir abrir una nueva posición. Si hay una orden pendiente o abierta entonces no intentará abrir más.

veo que todos usan un bucle para comprobar si hay una posición abierta antes de comprar, no veo la lógica de eso. mientras OrdersTotal sea > 0 hay órdenes abiertas y mi EA no intentará abrir más posiciones.

He arreglado el bucle decreciente.

Esta vez me da el error OrderClose 138 que no se soluciona añadiendo refreshrates()

y sigo perdiendo dinero que no debería.

No se me ocurre nada más que arreglar...

¿Por qué colocaste la lógica para abrir una compra antes de comprobar las operaciones que tu EA tiene abiertas en tu cuenta ????

¿Qué pasará ahora ???? con la programación que tienes hasta ahora?

Suponga que tiene una cuenta funcionando con su EA. Abres manualmente una operación para el GBPUSD.

¿Cuántas operaciones tiene OrdersTotal() con esa operación?

Su código.... para BUY

if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


  
        
        
        if (OrdersTotal() == 0 ) {
        
        if (CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( 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); 
   }
  

¿qué está haciendo ahora? y ¿por qué razón lo hace?

 
deVries:

¿Por qué la lógica para la apertura de una compra antes de comprobar los oficios de su EA han abierto en su cuenta ????

¿Qué pasará ahora ???? con la programación que tienes hasta ahora?

Suponga que tiene una cuenta funcionando con su EA. Abres manualmente una operación para el GBPUSD.

¿Cuántas operaciones tiene OrdersTotal() con esa operación?

Su código.... para BUY

¿qué está haciendo ahora? y ¿por qué razón lo hace?


comprar sólo si se han cumplido las condiciones de compra y si no se han abierto posiciones
 
cyxstudio:

comprar sólo si las condiciones de compra se han cumplido y si no se ha abierto ninguna posición

Supongamos que tiene una cuenta que funciona con su EA. Usted abre manualmente una operación para GBPUSD.

La condición será verdadera

 if (OrdersTotal() == 0 )
 
cyxstudio2013.01.31 18:04

¿podría por favor dejarme echar un vistazo a sus códigos?

quiero saber por qué he fallado y cómo hacerlo bien.

.

Su mensaje a mí puedo darle el código completo directamente.....

Eso no será gratis. Para eso tienes que usar la sección deTrabajos y pagar para conseguirlo...

Entonces lo obtendrás allí

.

Otra forma es leer bien los temas

Aquí te ayudamos a que aprendas a programarlo tú mismo, eso es ayuda gratuita

Te mostramos tus errores y te ayudamos en la dirección de cómo resolver.

Muestro el código que tengo en el momento en que usted ha aprendido una manera de escribirlo ....

No hace falta pagar entonces y puedes ese momento compararlo con el código que hiciste aquí con ayuda de este foro

....

mi ultima pregunta aqui sigue sin respuesta

Supongamos que tienes una cuenta funcionando con tu EA. Usted abre manualmente un comercio para GBPUSD.

la condición será verdadera

 if (OrdersTotal() == 0 )

.

. En otro temaOrderClose error 138

usted ha sido ayudado allí muy bien(RaptorUK y WHRoeder gracias por la explicación allí creo que muy bien hecho)

.

Otra pregunta que tengo para usted es

¿Por qué cambiar el marco de tiempo en este cálculo de la media móvil

   double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average

Esto no es lo mismo que he dado,

No está calculando el valor correcto en otro gráfico diario

.

Así que tómese su tiempo para aprender y practicar y leer cuidadosamente la ayuda que se obtiene aquí en este foro

o pagar a alguien para programar para usted en un sitio como Jobs

 
deVries:
cyxstudio2013.01.31 18:04

¿podría por favor dejarme echar un vistazo a sus códigos?

quiero saber por qué he fallado y cómo hacerlo bien.

.

Su mensaje a mí puedo darle el código completo directamente.....

Eso no será gratis. Para eso tienes que usar la sección deTrabajos y pagar para conseguirlo...

Entonces lo obtendrás allí

.

Otra forma es leer bien los temas

Aquí te ayudamos a que aprendas a programarlo tú mismo, eso es ayuda gratuita

Te mostramos tus errores y te ayudamos en la dirección de cómo resolver.

Muestro el código que tengo en el momento en que usted ha aprendido una manera de escribirlo ....

No hace falta pagar entonces y puedes ese momento compararlo con el código que hiciste aquí con ayuda de este foro

....

mi ultima pregunta aqui sigue sin respuesta

Supongamos que tienes una cuenta funcionando con tu EA. Usted abre manualmente un comercio para GBPUSD.

la condición será verdadera

.

. En otro temaOrderClose error 138

usted ha sido ayudado allí muy bien(RaptorUK y WHRoeder gracias por la explicación allí creo que muy bien hecho)

.

Otra pregunta que tengo para usted es

¿Por qué cambiar el marco de tiempo en este cálculo de la media móvil

Esto no es lo mismo que he dado,

No está calculando el valor correcto en otro gráfico diario

.

Así que tómese su tiempo para aprender y practicar y leer cuidadosamente la ayuda que se obtiene aquí en este foro

o pagar a alguien para programar para usted en un sitio como Jobs

¿se supone queOrdersTotal() revela la cantidad total de órdenes pendientes y órdenes de mercado independientemente de que se hayan abierto a través de EA o manual?

Estaba pensando de esta manera. Mi EA siempre comprobará si hay órdenes abiertas y si las hay, no abrirá más órdenes y sólo abrirá nuevas órdenes cuando no haya órdenes abiertas.

if (OrdersTotal() == 0 )

Creo que está funcionando bien porque mi sección de resultados me muestra la secuencia de órdenes 1,1,2,2,3,3,4,4 que significa que una orden se cierra antes de que se abra una nueva orden.

las variables para la media móvil y el RSI cambiaron debido a razones de prueba. Estaba experimentando en un marco de tiempo/periodo diferente pero no lo cambié cuando lo publiqué aquí.

Y lo más extraño de todo, mi código sólo ejecutará la orden de compra. nunca ha ejecutado ni siquiera una orden de venta,

en pocas palabras, los problemas que todavía estoy enfrentando ahora.

1. sólo ejecuta la compra pero nunca ejecuta la venta a pesar de que he codificado la venta

2. sigue haciendo ganancias negativas lo cual estoy seguro que esta estrategia no se supone que lo haga.