Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 441

 

Pode por favor dizer-me o que estou a fazer mal?

Preciso de calcular quantas barras passaram desde a última vez que o preço atravessou o MA - excluindo a barra zero.

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i!=1000 || Stop!=1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

 
-Aleks-:

Pode por favor dizer-me o que estou a fazer mal?

É necessário - contar quantas barras passaram desde a última vez que o preço atravessou o MA - não incluindo a barra zero.

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i<1000 || Stop==1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

Tanto quanto sei, uma vez identificada a travessia e estabelecida a paragem=1, há uma saída imediata do ciclo. Ok, então é preciso ir mais longe e lembrar o número da vela onde ocorreu a travessia. Isto é

É mais fácil escrevê-lo você mesmo:

for( int i = 1; i < 1000; i++ )
{
 iMaValue = ...;   // Значение МА на i свече
 if( iMaValue < High[ i ] && iMaValue > low[ i ] )
 {
  num = i;   // Запоминаем номер свечи, на котором произошло пересечение
  break;     // Выходим из цикла
 }
}

Este é o número da vela que identificou. Se o número = 2 e não tiver em conta o actual, então desde que a vela de cruzamento foi formada (ou interprete-a como quiser).

 
Tapochun:

Tanto quanto sei, uma vez identificado o cruzamento e estabelecida a paragem=1, há uma saída imediata do ciclo. OK, então é preciso ir mais longe e lembrar o número da vela onde ocorreu o cruzamento. Isto é

É mais fácil escrevê-lo você mesmo:

Este é o número da vela que identificou. Se o número = 2 e ignorar o actual, então uma vela formou-se desde a travessia (bem, ou interprete-a como quiser).

Obrigado, foi assim que funcionou para mim


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

 
alph:
Pode dizer-me se esta é uma figura de teste realista? E é um resultado bom ou mau durante um ano com um depoimento de 3.000 dólares?
A resposta é simples: o desempenho do testador NÃO é REAL se se estiver a testar uma EA. O Strategy Tester é utilizado pelos comerciantes para verificar o desempenho do ATC, ou para testar estratégias manuais em linha.
 
-Aleks-:

Obrigado, foi assim que funcionou para mim


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

Não se deve escrever assim, porque se não houve crossover durante os últimos 1000 compassos, primeiro, o laço continuará, e segundo, pode fazer loop/erro, porque se a história terminar e não houver crossover, não haverá saída do laço, porque Stop = 0. É melhor escrevê-lo da forma que mencionei acima.

 
Tapochun:

Não se deve escrever assim, porque se não houve cruzamento durante as últimas 1000 barras, em primeiro lugar, o ciclo continuará, e em segundo lugar, pode fazer loop/erro, porque se a história terminar e não houver cruzamento, não haverá saída do ciclo, porque Stop = 0. É melhor escrevê-lo da forma que mencionei acima.

Não funciona "ou" assinar - de acordo com a expressão, ou o laço será ultrapassado por 1000 barras ou terminará assim que for encontrado o resultado requerido. Ou será mais do que 1000 barras se o resultado exigido, ou seja, a travessia de MA?
 
-Aleks-:
O sinal "ou" não funciona - a condição diz que ou atinge 1000 barras ou termina assim que o resultado desejado é encontrado. Ou será mais antes de 1000 barras, se o resultado desejado, ou seja, a travessia do MA?
|| significa que se pelo menos uma das condições entre parênteses for verdadeira, o ciclo irá repetir-se. Portanto, mesmo quando i >= 1000, mas parar = 0, o ciclo continuará e eu continuarei a aumentar, o que causará valores de MA incorrectos (no caso de ficar fora da história). E o operador de quebra é responsável pela terminação do laço quando é encontrado o resultado desejado;
 
Tapochun:
|| significa que se pelo menos uma das condições entre parênteses for verdadeira, o laço será repetido, portanto, mesmo quando i >= 1000, mas stop = 0, o laço continuará, i continuará a aumentar, o que causará o valor errado de MA (no caso de haver um outlier na história). E o operador de break é responsável pela terminação do loop ao encontrar o resultado desejado;
Já percebi, obrigado pelo esclarecimento! Pensei que uma das condições estaria errada e que depois o laço pararia.
 

Olá 2015.09.19_02:13AM MSC. Na função ArrayResize() de qualquer forma o compilador escreve

oposto ao tamanho da matriz -- vírgula esperada, quer escreva int ou não. Se não escrever int, diz: "-.

Mudei-o sem tipo. E eu removi & referências e parênteses rectos - funcionou!
Avisos: quando foi escrito normalmente, -- o compilador escreveu: esconde o identificador

declaração a nível mundial. E quando removi a declaração de identificador a nível global, - escrevi

escreve: "Erro, identificador não declarado. E mudei as arrays High[] e Low[] para HighP[] e LowP[]. Não

ajudou. O compilador escreve a mesma coisa. 02:27 MSC. Estou a anexar um ficheiro de captura de ecrã.

Arquivos anexados:
 
Николай Никитюк:

Olá 2015.09.19_02:13AM MSC. Na função ArrayResize() de qualquer forma o compilador escreve

oposto ao tamanho da matriz -- vírgula esperada, quer escreva int ou não. Se não escrever int, diz: "-.

"sem tipo. E eu removi & referências e parênteses rectos - ajudou!
Avisos: quando foi escrito normalmente, -- o compilador escreveu: esconde o identificador

declaração a nível mundial. E quando removi a declaração de identificador a nível global, - escrevi

escreve: "Erro, identificador não declarado. E mudei as arrays High[] e Low[] para HighP[] e LowP[]. Não

ajudou. O compilador escreve a mesma coisa. 02:27 MSC. Estou a anexar o ficheiro de captura de ecrã.

  1. As imagens devem ser inseridas da seguinte forma:Fórum: como inserir uma imagem
  2. Não lê de todo o que lhe estão a aconselhar?

    Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

    Perguntas de principiantes

    Karputov Vladimir, 2015.09.17 18:46

    1. Ortografia incorrecta de ArrayResize. Deveria ser assim:
      //--- устанавливаю размеры массивов с запасом (reserve)
      ArrayResize(mrate,16,9);
      ArrayResize(maVal,16,9);
      ArrayResize(fVal,3,2);
      ArrayResize(zVal,3);
    2. E a colocação da bandeira da série cronológica para a matriz terá este aspecto:
      //--- массив максимальных цен баров
      ArraySetAsSeries(High,true);
      //---  
      ArraySetAsSeries(Low,true);