Problemas de comprobación del comercio abierto - página 2

 
dazamate:


int start(){
   static datetime Time0;
   if (Time0 == Time[0]) return; Time0 = Time[0];
   // A new bar has started.

WHRoeder, este código parece tan simple pero no puedo entender cómo funciona, ¿no será la declaración if siempre verdadera si hace que time0 sea igual a time[0] cada vez que time0 sea igual a time[0]? No digo que no funcione pero no entiendo como funciona estructurado así.

1er tick: Time0 no es igual a Time[ 0 ] por lo que no se ejecuta el retorno,Time0 se ponea Time[0 ] (tiempo de inicio de la barra actual) el resto de la función de inicio se ejecuta.

Segundo y siguientes ticks: si Time0 sigue siendo igual a la hora de inicio de la barra actual, entonces seguimos en la misma barra, se ejecuta return y se sale de la función de inicio. Si Time0 no es igual a la hora de inicio de la barra actual, entonces estamos en una nueva barra, no se ejec uta return,Time0 sepone a Time[0] (hora de inicio de la nueva barra actual) y se ejecuta el resto de la función de inicio.

 
dazamate:

¿Cómo puedo hacer un contador en el que si una orden pendiente es colocada y no se activa en una cantidad x de barras, entonces se cancela? Todo lo que se me ocurre es poner un contador que cuente cada vez que se forme una nueva barra y si la cantidad de barras contadas == las barras permitidas especificadas antes de que se cancelen las órdenes pendientes. El contador de barras se reinicia cada vez que se abre una nueva orden pendiente? ¿Cómo suena eso?

Yo crearía una función que compruebe las órdenes pendientes, mira a ver cuándo se abrió cada orden, comprueba cuánto tiempo ha pasado y si es más largo que el límite de tiempo cierra la orden.

 
dazamate:

Quiero hacer una función que escanee eurusd, usdchf, gbpusd, usdjpy en 1hr tf. Se remonta a la última vela de las 06:00 gmt y registra la apertura, se remonta otras 24 barras a la vela anterior de las 06:00 gmt y registra el rango de 6gmt -6gmt para cada par. Luego compara el rango 6gmt - 6gmt de todos los pares y devuelve el que es más alto. ¿Es posible que un ea haga eso estando unido a 1 gráfico de tiempo?

Con todos los problemas como este antes de pensar en el código que tiene que averiguar su solución en primer lugar ... IMO. Crear un diagrama de flujo o escribir algún pseudo código . . obtener una solución que tenga sentido en primer lugar. . luego mirar el código.

Para responder a su última pregunta, sí es posible hacer eso, por ejemplo, para obtener el valor de apertura de una vela en particular de un par diferente al que el EA está en el que usaría ...

iOpen( string symbol, int timeframe, int shift)

una vez que tenga sus valores para la rabia de los 4 pares puede determinar fácilmente el mayor usando algo como esto:

  MathMax( double value4, (MathMax( double value3, (MathMax( double value1, double value2))))) ;

. . o podrías poner los valores en un array y usar ArraySort . . normalmente hay más de una forma de hacer algo, primero tienes que tener un plan de cómo vas a resolver tu problema.

EDIT: ten en cuenta que algunas de estas cosas no funcionarán correctamente con el probador de estrategias.

 
extern int     iOpenHour                = 6;

int start()
  {
  
int b, scannedhour;
datetime bartime;
double dibsclose, dibsopen, prevdayrange;

for(b=0; b<=24; b++)                                   // scans the last 24 bars 
   {
      bartime = iTime("EURUSD", 60, b);                // checks the open time of each bar
      scannedhour = TimeHour(bartime);                 // extracts the hour of that bar
    
      if ( scannedhour == iOpenHour )                  // Check to see if scanned hour = Dibs hour
         {
            dibsclose    = iOpen("EURUSD", 60, b);     // Get the open value of that bar (Close of 6gmt day) 
            dibsopen     = iOpen("EURUSD", 60, b-24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange = (dibsclose-dibsopen);       // Calculate the range of the Dibs day
         }                                             // End of if statement
    }                                                  // End of for statement


Comment("Prev Dibs day range is...",prevdayrange, "dibsclose  =  ", dibsclose, "dibsopen  =  ",dibsopen, "Scannedhour=",scannedhour);      


   return(0);
  }

Muy bien, este es mi propio intento de escribir un código que escaneará el gráfico del eurusd 1hr hasta que encuentre la última barra de las 06:00, registra su apertura, retrocede otras 24 barras para registrar la apertura de esa barra (inicio del día de las 06:00) y obtiene el rango de apertura de las 2 barras seleccionadas.

Sorpresa, sorpresa, no funciona. Lol ------> http://myfacewhen.com/307/

Dígame lo que he f*'d para arriba. ¿O es que me he equivocado de camino? Lo he intentado jeje

 

He detectado un problema... 24 horas antes de b es b+24 . . las barras cuentan desde la barra actual ( 0 ) hacia la izquierda

dibsopen     = iOpen("EURUSD", 60, b-24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)

change to:

dibsopen     = iOpen("EURUSD", 60, b+24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)

Bien hecho por añadir los comentarios, muy buena práctica para entrar. . . :-)

 
RaptorUK:

He detectado un problema... 24 horas antes de b es b+24 . . las barras cuentan desde la barra actual ( 0 ) hacia la izquierda

Bien hecho por añadir los comentarios, muy buena práctica para entrar. . . :-)


Wow bien visto que me habría tomado un tiempo para averiguar que lol. No puedo creer que haya acertado en todo eso - ese tonto error. Siento que estoy llegando a alguna parte ahora. Si, he añadido los comentarios para ayudarme a seguir lo que estoy haciendo y para que sea super fácil para vosotros ver lo que estoy tratando de hacer. Ahora voy a hacer que compare los 4 pares y escupa el que tenga el valor más alto. Gracias RaptorUK
 
Buen material, bien hecho. De nada :-)
 
extern int     iOpenHour                = 6;

int start()
  {
                                                            //  Array Categorys ( 1  EURUSD, 2 GBPUSD, 3 USDCHF, 4 USDJPY )
int b[4], scannedhour[4];
datetime bartime[4];
double dibsclose[4], dibsopen[4], prevdayrange[4];

//----------------------------------------------------------------------------------------------
//        EURUSD PREV DAY RANGE CALC

for(b[1]=0; b[1]<=24; b[1]++)                               // scans the last 24 bars on eurusd
   {
      bartime[1] = iTime("EURUSD", 60, b[1]);               // checks the open time of each bar
      scannedhour[1] = TimeHour(bartime[1]);                // extracts the hour of that bar
    
      if ( scannedhour[1] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[1]    = iOpen("EURUSD", 60, b[1]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[1]     = iOpen("EURUSD", 60, b[1]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[1] = (dibsclose[1]-dibsopen[1]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement
    

//----------------------------------------------------------------------------------------------
//        GBPUSD PREV DAY RANGE CALC

for(b[2]=0; b[2]<=24; b[2]++)                               // scans the last 24 bars on eurusd
   {
      bartime[2] = iTime("GBPUSD", 60, b[2]);               // checks the open time of each bar
      scannedhour[2] = TimeHour(bartime[2]);                // extracts the hour of that bar
    
      if ( scannedhour[2] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[2]    = iOpen("GBPUSD", 60, b[2]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[2]     = iOpen("GBPUSD", 60, b[2]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[2] = (dibsclose[2]-dibsopen[2]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement



//----------------------------------------------------------------------------------------------
//        USDCHF PREV DAY RANGE CALC

for(b[3]=0; b[3]<=24; b[3]++)                               // scans the last 24 bars on eurusd
   {
      bartime[3] = iTime("EURUSD", 60, b[3]);               // checks the open time of each bar
      scannedhour[3] = TimeHour(bartime[3]);                // extracts the hour of that bar
    
      if ( scannedhour[3] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[3]    = iOpen("USDCHF", 60, b[3]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[3]     = iOpen("USDCHF", 60, b[3]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[3] = (dibsclose[3]-dibsopen[3]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement


//----------------------------------------------------------------------------------------------
//        USDJPY PREV DAY RANGE CALC

for(b[4]=0; b[4]<=24; b[4]++)                               // scans the last 24 bars on eurusd
   {
      bartime[4] = iTime("USDJPY", 60, b[4]);               // checks the open time of each bar
      scannedhour[4] = TimeHour(bartime[4]);                // extracts the hour of that bar
    
      if ( scannedhour[4] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[4]    = iOpen("USDJPY", 60, b[4]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[4]     = iOpen("USDJPY", 60, b[4]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[4] = (dibsclose[4]-dibsopen[4]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement




//----------------------------------------------------------------------------------------------



Comment("DIBS RANGE EURUSD:...", prevdayrange[1],        //Display Ranges of each pair
        "DIBS RANGE GBPUSD:...", prevdayrange[2],
        "DIBS RANGE USDCHF:...", prevdayrange[3],
        "DIBS RANGE USDJPY:...", prevdayrange[4]);      


   return(0);
  }
Muy bien, he convertido todas las variables en matrices y he ejecutado las comprobaciones para cada una de ellas. Ahora ha dejado de funcionar. ¿No es posible tener múltiples bucles for como este?
 
dazamate:
Muy bien, he convertido todas las variables en matrices y he ejecutado las comprobaciones para cada una de ellas. Ahora ha dejado de funcionar. ¿No es posible tener múltiples bucles for como este?
Sí se puede, no hay problema, pero no uses un array en el índice del bucle for, puedes usar b cada vez si quieres. Se restablece a 0 para cada uno de los bucles for, así que reutilizarlo no es un problema. ¿para qué necesitas usar un array? ¿no es sólo para los valores del rango?
 
RaptorUK:
Sí puedes, no hay problema, pero no uses un array en el índice del bucle for, puedes usar b cada vez si quieres. Se pone a 0 en cada uno de los bucles for, así que reutilizarlo no es un problema. ¿Para qué necesitas usar un array? ¿No es sólo para los valores del rango?
Ahhh sí, ya veo lo que dices, lo arreglaré y veré cómo me va. Las respuestas rápidas hombre voy a pagar algunos $ $ si este ea me hace rico lol