Problemas na verificação de comércio aberto - 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 tão simples mas eu não consigo entender como ele funciona, a afirmação não será sempre verdadeira se ele fizer o tempo0 igual ao tempo[0] toda vez que o tempo0 for igual ao tempo[0]? Não dizer que não funciona, mas simplesmente não entendo como funciona estruturado dessa maneira.

1º tique: Time0 não é igual a Time[0 ] então o retorno não é executado,Time0 é definido para Time[0] (hora de início da barra atual) o resto da função de início é executada.

2º tique e subsequentes: se Time0 ainda for igual ao tempo de início da barra de corrente, então ainda estamos na mesma barra, o retorno é executado e a função de início é abandonada. Se Time0 não for igual ao tempo de início da barra atual, então estamos em uma nova barra, o retorno não é executado, Time0 é definido para Time[0] (tempo de início da nova barra atual) o restante da função de início é executado.

 
dazamate:

Como eu faria um contador onde, se um pedido pendente for feito e não for acionado com uma quantidade x de barras, então ele será cancelado? Tudo que eu posso fazer é colocar um contador para contar cada vez que uma nova barra se forma e se a quantidade de barras contadas == as barras especificadas permitidas antes de pedidos pendentes serem cancelados. O contador de barras é reinicializado toda vez que uma nova ordem pendente é aberta? Como isso soa?

Eu criaria uma função que verifica se há ordens pendentes, parece ver quando cada ordem foi aberta, verifica quanto tempo passou e, se for mais longo do que o tempo limite, fecha a ordem.

 
dazamate:

Eu quero fazer uma função que escaneia eurusd, usdchf, gbpusd, usdjpy em 1hr tf. Volta para a última vela de 06:00 gmt que registra a abertura, volta mais 24 barras para os registros de vela de 06:00 gmt que se abrem e registra a faixa de 6gmt -6gmt para cada par. Depois compara o intervalo de 6gmt - 6gmt de todos os pares e retorna aquele que é o mais alto. É possível que uma ea possa fazer isso, desde que esteja anexada a uma tabela de tempo?

Com todos os problemas como este antes de pensar em código, você tem que descobrir sua solução primeiro ... IMO. Criar um diagrama de fluxo ou escrever algum pseudo-código . . obtenha uma solução que faça sentido primeiro . . depois olhe para o código.

Para responder sua última pergunta, sim, é possível fazer isso, por exemplo, para obter o valor aberto para uma vela em particular de um par diferente daquele que a EA está no eu usaria...

iOpen( string symbol, int timeframe, int shift)

uma vez que você tenha seus valores para a raiva dos 4 pares, você pode facilmente determinar o maior usando algo como isto:

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

. . ou você poderia colocar os valores em uma matriz e usar o ArraySort . . geralmente há mais de uma maneira de fazer qualquer coisa, primeiro você tem que ter um plano de como você vai resolver seu problema.

EDIT: tenha em mente que algumas dessas coisas não funcionarão corretamente com o testador de estratégia.

 
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);
  }

Muito bem, esta é minha própria tentativa de escrever algum código que irá escanear o gráfico do eurusd 1hr até encontrar a última barra das 06:00, registrar que está aberta, voltar atrás mais 24 barras para registrar a abertura daquela barra (início das 06:00 horas do dia) e obter uma faixa aberta a partir delas 2 barras selecionadas.

Surpresa, não funciona. Lol ------> http://myfacewhen.com/307/

Diga-me o que eu tenho f*'d up. Ou será que me enganei no caminho? Eu tentei hehe

 

Um problema pontuado . . 24 horas antes de b é b+24 . . barras contam para cima da barra atual ( 0 ) para a esquerda

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)

Bem feito por acrescentar os comentários, muito boa prática para entrar em . . . . :-)

 
RaptorUK:

Um problema pontuado . . 24 horas antes de b é b+24 . . barras contam para cima da barra atual ( 0 ) para a esquerda

Bem feito por acrescentar os comentários, muito boa prática para entrar em . . . . :-)


Uau, bem visto que me demoraria um pouco para descobrir isso rs. Não posso acreditar que acertei tudo isso - esse erro bobo. Sinto que estou chegando a algum lugar agora. Sim, eu acrescentei os comentários para me ajudar a acompanhar o que estou fazendo e fazer é super fácil para vocês verem o que estou tentando fazer. Agora eu vou conseguir comparar os 4 pares e cuspir o de maior valor. Obrigado RaptorUK
 
Bom material, bem feito. Seja bem-vindo :-)
 
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);
  }
Muito bem, então transformei todas as variáveis em arrays e fiz as verificações para cada uma delas. Agora parou de funcionar. Não é possível ter múltiplos para loops como este?
 
dazamate:
Muito bem, então transformei todas as variáveis em matrizes e fiz as verificações para cada uma delas. Agora parou de funcionar. Não é possível ter múltiplos para loops como este?
Sim, você pode, sem problemas, mas não use um array no índice de loop, você pode usar b cada vez que quiser. Ele é zerado para 0 para cada um dos loops, então reutilizá-lo não é um problema. para que você realmente PRECISA usar um array ? não é apenas para os valores do range ?
 
RaptorUK:
Sim, você pode, sem problema, mas não use um array no índice de loop, você pode usar b cada vez que quiser. Ele é zerado para 0 para cada um dos loops, então reutilizá-lo não é um problema. para que você realmente PRECISA usar um array ? não é apenas para os valores do range ?
Ahhh sim, eu vejo o que você está dizendo, eu vou consertar e ver como eu vou. Responda rápido cara, eu lhe pagarei uns $$$ se isso me fizer rico rs