Opciones binarias tester

 
¿Cómo puedo insertar un backtester de búfer como la imagen en mt4 (por ejemplo: si 5 minutos después del búfer 1 es mayor que el inicio, cuente 1 victoria, si no cuente 1 pérdida)? Lo que deseo está en EURAUDM15.PNG

Mi intento
if(close[i+5]>Buffer1[i]&&i>1){nVit=nVit+1;} else{nDer=nDer+1;}
if(close[i+5]<Buffer2[i]&&i>1){nVit=nVit+1;} else{nDer=nDer+1;}

ObjectCreate("Nome", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Nome", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Nome", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Nome", OBJPROP_YDISTANCE, 15);// Y coordinate
ObjectSetText("Nome",Nome_do_indicador,10,"Arial",clrAliceBlue);

ObjectCreate("Vitórias", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Vitórias", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Vitórias", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Vitórias", OBJPROP_YDISTANCE, 30);// Y coordinate
ObjectSetText("Vitórias","Vitórias:"+nVit,10,"Arial",clrAliceBlue);

ObjectCreate("Derrotas", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Derrotas", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Derrotas", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Derrotas", OBJPROP_YDISTANCE, 45);// Y coordinate
ObjectSetText("Derrotas","Derrotas:"+nDer,10,"Arial",clrAliceBlue);

ObjectCreate("wR", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("wR", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("wR", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("wR", OBJPROP_YDISTANCE, 60);// Y coordinate
ObjectSetText("wR","WinRate:"+MathRound(nWr)+"%",10,"Arial",clrAliceBlue);
Archivos adjuntos:
 
Renato Jose:

seria algo asi:, esto no lo he probado, pero es mas o menos una idea:

   for (int i = Bars-1; i<6; i--)
     {
      if(Buffer1[i]>0 && Buffer1[i]!=EMPTY_VALUE && Close[i-5]>Buffer1[i])
        {
         nVit=nVit+1;
        }
      else
        {
         nDer=nDer+1;
        }
      if(close[i+5]<Buffer2[i]&&i>1)
        {
         nVit=nVit+1;
        }
      else
        {
         nDer=nDer+1;
        }

      if(Buffer2[i]>0 && Buffer2[i]!=EMPTY_VALUE && Close[i-5]<Buffer2[i])
        {
         nVit=nVit+1;
        }
      else
        {
         nDer=nDer+1;
        }
     }

   ObjectCreate("Nome", OBJ_LABEL,0,0,0);// Creating obj.
   ObjectSet("Nome", OBJPROP_CORNER, 0);    // Reference corner
   ObjectSet("Nome", OBJPROP_XDISTANCE, 10);// X coordinate
   ObjectSet("Nome", OBJPROP_YDISTANCE, 15);// Y coordinate
   ObjectSetText("Nome",Nome_do_indicador,10,"Arial",clrAliceBlue);

   ObjectCreate("Vitórias", OBJ_LABEL,0,0,0);// Creating obj.
   ObjectSet("Vitórias", OBJPROP_CORNER, 0);    // Reference corner
   ObjectSet("Vitórias", OBJPROP_XDISTANCE, 10);// X coordinate
   ObjectSet("Vitórias", OBJPROP_YDISTANCE, 30);// Y coordinate
   ObjectSetText("Vitórias","Vitórias:"+nVit,10,"Arial",clrAliceBlue);

   ObjectCreate("Derrotas", OBJ_LABEL,0,0,0);// Creating obj.
   ObjectSet("Derrotas", OBJPROP_CORNER, 0);    // Reference corner
   ObjectSet("Derrotas", OBJPROP_XDISTANCE, 10);// X coordinate
   ObjectSet("Derrotas", OBJPROP_YDISTANCE, 45);// Y coordinate
   ObjectSetText("Derrotas","Derrotas:"+nDer,10,"Arial",clrAliceBlue);

   ObjectCreate("wR", OBJ_LABEL,0,0,0);// Creating obj.
   ObjectSet("wR", OBJPROP_CORNER, 0);    // Reference corner
   ObjectSet("wR", OBJPROP_XDISTANCE, 10);// X coordinate
   ObjectSet("wR", OBJPROP_YDISTANCE, 60);// Y coordinate
   ObjectSetText("wR","WinRate:"+MathRound(nWr)+"%",10,"Arial",clrAliceBlue);

Esto debes de hacerlo una única vez, así que haz una condición  para que no se repita en cada tick o hazlo en el OnInit

Es solo una idea, no esta probado,
Espero te oriente mejor

Saludos!!!

 
Miguel Antonio Rojas Martinez:

seria algo asi:, esto no lo he probado, pero es mas o menos una idea:

Esto debes de hacerlo una única vez, así que haz una condición  para que no se repita en cada tick o hazlo en el OnInit

Es solo una idea, no esta probado,
Espero te oriente mejor

Saludos!!!

Miguel, muchas gracias por las aclaraciones, pero creo que lo que necesito es exactamente esto:

"Esto debes de hacerlo una única vez, así que haz una condición  para que no se repita en cada tick o hazlo en el OnInit"

hacer que estos números en el pasado se agreguen solo una vez, y los siguientes se agregarán

como se passa aca

https://fxsklad.ru/threads/besplatnyj-tester-dlja-binarnyx-opcionov-novaja-versija.1218/

Fundamentos de la Simulación en MetaTrader 5
Fundamentos de la Simulación en MetaTrader 5
  • www.mql5.com
¿Qué diferencias hay entre los tres modos de simulación en MetaTrader 5, y qué deberíamos buscar particularmente? ¿Como tiene lugar la simulación de un EA haciendo trading en múltiples instrumentos al mismo tiempo? ¿Cuándo y cómo se calculan los valore del indicador durante la simulación, y cómo se gestionan los eventos? ¿Cómo se sincronizan las barras de diferentes instrumentos durante la simulación en un modo de "Solo precios de Apertura"? Este artículo dará respuestas a estas y otras cuestiones.
 
Renato Jose:

Miguel, muchas gracias por las aclaraciones, pero creo que lo que necesito es exactamente esto:

"Esto debes de hacerlo una única vez, así que haz una condición  para que no se repita en cada tick o hazlo en el OnInit"

hacer que estos números en el pasado se agreguen solo una vez, y los siguientes se agregarán

como se passa aca

https://fxsklad.ru/threads/besplatnyj-tester-dlja-binarnyx-opcionov-novaja-versija.1218/

        if(Buffer1[6]>0 && Buffer1[6]!=EMPTY_VALUE && Close[1]>Buffer1[6])
        {
         nVit=nVit+1;
        }
      else
        {
         nDer=nDer+1;
        }
     
      if(Buffer2[6]>0 && Buffer2[6]!=EMPTY_VALUE && Close[1]<Buffer2[6])
        {
         nVit=nVit+1;
        }
      else
        {
         nDer=nDer+1;
        }

Ok, sacalo del "For"
Seria algo asi (el anterior tenia un error tambien)
Recuerda que no lo he probado, 

Saludos!!!

 
Miguel Antonio Rojas Martinez :

Ok, rola do "Para" Seria algo assim (ou antes também tinha um erro) Lembre-se que ainda não tentei,  Saudações!




Minha tentativa





int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {...

for (int i = limit-1; i>=0; i--)
if (i >= MathMin(50000-1, rates_total-1-50)) continue;
...

static double nVit = 1.00;
static double nDer = 1.00;

if (rates_total == prev_calculated) 
{
       if(Buffer1[6]>0 && Buffer1[6]!=EMPTY_VALUE && Close[1]>Buffer1[6])
        {
         nVit=nVit+1;
        }
      else
        {
         nDer=nDer+1;
        }
     
      if(Buffer2[6]>0 && Buffer2[6]!=EMPTY_VALUE && Close[1]<Buffer2[6])
        {
         nVit=nVit+1;
        }
      else
        {
         nDer=nDer+1;
        }
     }
ObjectCreate("Nome", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Nome", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Nome", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Nome", OBJPROP_YDISTANCE, 15);// Y coordinate
ObjectSetText("Nome",Nome_do_indicador,10,"Arial",clrAliceBlue);

ObjectCreate("Vitórias", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Vitórias", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Vitórias", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Vitórias", OBJPROP_YDISTANCE, 30);// Y coordinate
ObjectSetText("Vitórias","Vitórias:"+(nVit-1),10,"Arial",clrAliceBlue);

ObjectCreate("Derrotas", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Derrotas", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Derrotas", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Derrotas", OBJPROP_YDISTANCE, 45);// Y coordinate
ObjectSetText("Derrotas","Derrotas:"+(nDer-1),10,"Arial",clrAliceBlue);

ObjectCreate("wR", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("wR", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("wR", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("wR", OBJPROP_YDISTANCE, 60);// Y coordinate
ObjectSetText("wR","WinRate:"+NormalizeDouble(((nVit-1)/(nVit+nDer-2)*100),Digits)+"%",10,"Arial",clrAliceBlue);


}

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

meu resultado :'(


 
No lo hagas en  cada tick (a eso llegas cuando haces la comparacion :

if (rates_total == prev_calculated) 
{
....
}

Hazo en cada nueva vela (una sola busqueda de la condicion por vela),
Haz la prueba y  quizas  tengas mejor resultado

Saludos!!!

 
Miguel Antonio Rojas Martinez:
No lo hagas en  cada tick (a eso llegas cuando haces la comparacion :

Hazo en cada nueva vela (una sola busqueda de la condicion por vela),
Haz la prueba y  quizas  tengas mejor resultado

Saludos!!!

@Miguel Antonio Rojas Martinez muchas gracias, con su guía logré hacer que se calcule en el futuro, ahora solo necesito encontrar una manera de agregar al historial.


si me puedes dar más esta ayuda estaría aún más agradecida, si es posible

 
Renato Jose:

@Miguel Antonio Rojas Martinez muchas gracias, con su guía logré hacer que se calcule en el futuro, ahora solo necesito encontrar una manera de agregar al historial

si lo haces en un indicador, por ejemplo, lo corres en un backtest y deberia funcionar en el historial

 
Miguel Antonio Rojas Martinez:

si lo haces en un indicador, por ejemplo, lo corres en un backtest y deberia funcionar en el historial

lo que me gustaría es que se cuente tan pronto como lo adjunte al gráfico sin la necesidad de ejecutar el backtest

if(historical)
static double nVit1 = 0.00;
static double nDer1 = 0.01;
{
       if(Buffer1[cExpiration+1]>0.000001&&Buffer1[cExpiration+1]<9999999 && Buffer1[cExpiration+1]!=EMPTY_VALUE && Close[1]>Close[cExpiration+1])

         nVit1+=0.5;

       if(Buffer1[cExpiration+1]>0.000001&&Buffer1[cExpiration+1]<9999999 && Buffer1[cExpiration+1]!=EMPTY_VALUE && Close[1]<Close[cExpiration+1])
        {
         nDer1+=0.5;
        }
     
       if(Buffer2[cExpiration+1]>0.000001&&Buffer2[cExpiration+1]<9999999 && Buffer2[cExpiration+1]!=EMPTY_VALUE && Close[1]<Close[cExpiration+1])
        {
         nVit1+=0.5;
        }
       if(Buffer2[cExpiration+1]>0.000001&&Buffer2[cExpiration+1]<9999999 && Buffer2[cExpiration+1]!=EMPTY_VALUE && Close[1]>Close[cExpiration+1])
        {
         nDer1+=0.5;
        } 
 }       
//BackTester Futuro
if (rates_total == prev_calculated) return(rates_total);
static double nVit = nVit1;
static double nDer = nDer1;

{
       if(Buffer1[cExpiration+1]>0.000001&&Buffer1[cExpiration+1]<9999999 && Buffer1[cExpiration+1]!=EMPTY_VALUE && Close[1]>Close[cExpiration+1])

         nVit+=0.5;

       if(Buffer1[cExpiration+1]>0.000001&&Buffer1[cExpiration+1]<9999999 && Buffer1[cExpiration+1]!=EMPTY_VALUE && Close[1]<Close[cExpiration+1])
        {
         nDer+=0.5;
        }
     
       if(Buffer2[cExpiration+1]>0.000001&&Buffer2[cExpiration+1]<9999999 && Buffer2[cExpiration+1]!=EMPTY_VALUE && Close[1]<Close[cExpiration+1])
        {
         nVit+=0.5;
        }
       if(Buffer2[cExpiration+1]>0.000001&&Buffer2[cExpiration+1]<9999999 && Buffer2[cExpiration+1]!=EMPTY_VALUE && Close[1]>Close[cExpiration+1])
        {
         nDer+=0.5;
        } 
ObjectCreate("Nome", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Nome", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Nome", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Nome", OBJPROP_YDISTANCE, 15);// Y coordinate
ObjectSetText("Nome",Nome_do_indicador,10,"Arial",clrAliceBlue);

ObjectCreate("Vitórias", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Vitórias", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Vitórias", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Vitórias", OBJPROP_YDISTANCE, 30);// Y coordinate
ObjectSetText("Vitórias","Vitórias:"+(nVit),10,"Arial",clrAliceBlue);

ObjectCreate("Derrotas", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Derrotas", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Derrotas", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Derrotas", OBJPROP_YDISTANCE, 45);// Y coordinate
ObjectSetText("Derrotas","Derrotas:"+MathRound(nDer),10,"Arial",clrAliceBlue);

if((nVit/(nVit+nDer)*100)>0){
ObjectCreate("wR", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("wR", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("wR", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("wR", OBJPROP_YDISTANCE, 60);// Y coordinate
ObjectSetText("wR","WinRate:"+NormalizeDouble(((nVit)/(nVit+MathRound(nDer))*100),Digits)+"%",10,"Arial",clrAliceBlue);
      }
   }
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

pero no tiene efecto 

cualquier condición a la que agregue if(historical)

 
Jajjaa, fue lo  primero que te recomende hacer y me dijiste que NO, que lo necesitabas en el Backtest

Me vuelvo loco


Esto que te pasare,  haz que se ejecute una única vez por vela:






for(int i=Bars-1;i<6;i--) 
{
 if
(Buffer1[ i ]>0 && Buffer1[ i ]!=EMPTY_VALUE && Close[i- 5 ]>Buffer1[6])          {          nVit=nVit+1;         }       else          {          nDer=nDer+1;         }             if(Buffer2[ i ]>0 && Buffer2[ i ]!=EMPTY_VALUE && Close[ i-5 ]<Buffer2[6])          {          nVit=nVit+1;         }        else          {          nDer=nDer+1;         } }
 
Miguel Antonio Rojas Martinez:
Jajjaa, fue lo  primero que te recomende hacer y me dijiste que NO, que lo necesitabas en el Backtest

Me vuelvo loco


Esto que te pasare,  haz que se ejecute una única vez por vela:


no funcionó, solo 0 en todos los contadores, intenté ponerlo en OnInit() y tampoco funcionó


int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
  
  int limit = rates_total - prev_calculated; // definindo limit
  if (MaximoDeBarras>0 && MaximoDeBarras<Bars) limit = MaximoDeBarras;
  //--- definindo arrays/buffer
  ArraySetAsSeries(Buffer1,true);
  ArraySetAsSeries(Buffer2,true);
  
  if(prev_calculated<1)
  {ArrayInitialize(Buffer1, 0);
   ArrayInitialize(Buffer2, 0);}
   else
      limit++;
      
//--- loop principal
     
for (int i = limit-1; i>=0; i--){
...


for(int i=limit-1;i<6;i--) 
double nVit2 = 0.01;
double nDer2 = 0.01;
{

 if(Buffer2[cExpiration+1]>0.000001&&Buffer2[cExpiration+1]<9999999 && Buffer2[cExpiration+1]!=EMPTY_VALUE && Close[1]>Close[cExpiration+1])
        {
         nDer2+=0.5;
        } 
        
        
        if(Buffer1[cExpiration+1]>0.000001&&Buffer1[cExpiration+1]<9999999 && Buffer1[cExpiration+1]!=EMPTY_VALUE && Close[1]>Close[cExpiration+1])
        
         {nVit2+=0.5;}
         
         if(Buffer1[cExpiration+1]>0.000001&&Buffer1[cExpiration+1]<9999999 && Buffer1[cExpiration+1]!=EMPTY_VALUE && Close[1]<Close[cExpiration+1])
        {
         nDer2+=0.5;
        }
        
        if(Buffer2[cExpiration+1]>0.000001&&Buffer2[cExpiration+1]<9999999 && Buffer2[cExpiration+1]!=EMPTY_VALUE && Close[1]<Close[cExpiration+1])
        {
         nVit2+=0.5;
        }
        

ObjectCreate("Nome2", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Nome2", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Nome2", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Nome2", OBJPROP_YDISTANCE, 165);// Y coordinate
ObjectSetText("Nome2",Nome_do_indicador,10,"Arial",clrAliceBlue);

ObjectCreate("Vitórias2", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Vitórias2", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Vitórias2", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Vitórias2", OBJPROP_YDISTANCE, 180);// Y coordinate
ObjectSetText("Vitórias2","Vitórias:"+(nVit2),10,"Arial",clrAliceBlue);

ObjectCreate("Derrotas2", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("Derrotas2", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("Derrotas2", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("Derrotas2", OBJPROP_YDISTANCE, 195);// Y coordinate
ObjectSetText("Derrotas2","Derrotas:"+MathRound(nDer2),10,"Arial",clrAliceBlue);

if((nVit2/(nVit2+nDer2)*100)>0){
ObjectCreate("wR2", OBJ_LABEL,0,0,0);// Creating obj.
ObjectSet("wR2", OBJPROP_CORNER, 0);    // Reference corner
ObjectSet("wR2", OBJPROP_XDISTANCE, 10);// X coordinate
ObjectSet("wR2", OBJPROP_YDISTANCE, 210);// Y coordinate
ObjectSetText("wR2","WinRate:"+NormalizeDouble(((nVit2)/(nVit2+MathRound(nDer2))*100),Digits)+"%",10,"Arial",clrAliceBlue);
         }
     }
}
 

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+