Indicador Perguntas Diversas - página 3

 
whroeder1:

Pré-construção 600 (3 de fevereiro de2014), houve apenas o início(). Agora há OnTick (EAs,) OnCalculate (indicadores,) e OnStart (scripts.) Esqueci que você estava falando de um indicador.

Comece a usar as novas Funções de Tratamento de Eventos - Funções - Noções básicas de linguagem - Referência MQL4. Veja Como fazer seuslookbacks corretamente.

Sim! Neste momento eu o entendo muito claramente, e muito mais obrigado.

E seu comentário #20 me deu outra idéia. (uma vez você a compartilhou comigo e agora eu a mantenho em minha mente)

Também tento escrever melhor código para meu indicador, e agora tentoaprender o comentário#18-@Marco vd Heijden

Depois, vou pesquisar amplamente seu comentário.

Mais uma vez, obrigado!

 
Marco vd Heijden:

Por favor, coloque-o em um especialista em vez de um indicador que permite uma utilização mais fácil no futuro quando você quiser adicionar sua estratégia comercial.

Para a questão das barras, armazene o tempo de abertura da barra em uma variável de data e simplesmente compare o tempo registrado com o tempo real, então sempre que uma nova barra surgir, ela será acionada.

Aqui está um exemplo:

datetime M1,M5,M15,M30,H1,H4,D1,W1,MN1;

Primeiro de tudo, um grande obrigado por seu comentário muito claro.

Eu ainda fico no Indicador. Eu tentei algo, e funciona bem para mim, mas enfrentei um problema, não posso testá-lo no 'Testador de Estratégia' - isso me dá um erro fatal: MT4 'Não Respondendo'.

#1 - Marco, você pode me dizer de onde ele vem, por favor?

#2 - O código abaixo está correto?

Abaixo do código qual eu tentei.

string _prefix = "_Preriod_M5 - " ;
string _vlineName_M5 ;
int _prd = PERIOD_M5 ;

int _prd_add = PeriodSeconds( _prd ) ;
datetime _dt_Prd_M5 ;

int _time_M5 ;
datetime _prdCvrt_M5 ;
datetime _timeCvrt_M5 ;

//---init
EventSetMillisecondTimer( 10 );
_CreateLines();

//---timer
if ( _dt_Prd_M5 != iTime( Symbol(), _prd, 0 ) )
{
    _dt_Prd_M5 = iTime( Symbol(), _prd, 0 );
    _CreateLines();
}

//---_CreateLines()
    //---
    int _dayCnt_M5 = 0;
    int _cnt_M5 = iBarShift( Symbol(), 0, iTime( Symbol(), PERIOD_M15, _dayCnt_M5 ) );
    for ( int i = 0; i < _cnt_M5; i++ )
    {
        //---time convert
        _time_M5     = Time[i];
        _prdCvrt_M5  = PeriodSeconds( _prd );
        _timeCvrt_M5 = _time_M5 - ( _time_M5 % _prdCvrt_M5 ) + _prdCvrt_M5;

        //---name
        _vlineName_M5 = _prefix + "PERIOD_M5 - " + TimeToStr( _timeCvrt_M5, TIME_DATE|TIME_MINUTES );

        //---
        if ( _Period < PERIOD_M30 )
        {
            {
                ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
            }
        }
    }
    ObjectMove ( 0, _vlineName_M5, 0, _dt_Prd_M5, 0 );

Eu parei de trabalhar nisso, continuarei depois de seu comentário. (Na verdade, a preocupação com o código acima irá esmagar meus outros indicadores enquanto eu o utilizo em conjunto).

Muito obrigado.

 
A função temporizador não funciona no testador de estratégia MT4, então você tem que colocá-lo na função carrapato.
 
Marco vd Heijden: A função temporizador não funciona no testador de estratégia MT4, então você tem que colocá-lo na função carrapato.
No backtestOnTimer() não executa (M. Ali) - Fórum MQL4
Evento gráfico para MT4Backtester (Migel) - Fórum MQL4
 
Marco vd Heijden:
A função temporizador não funciona no testador de estratégia MT4, então você tem que colocá-lo na função carrapato.

Muito obrigado!

Eu sei com certeza que esse problema não vem do código.

 
Como você sabe?
 

Marco vd Heijden:

Aqui está um exemplo:

datetime  M5;

//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(250);

//--- create some things

   CreateLines(); // Function that creates time lines

//--- load open times
   M5=iTime(Symbol(),PERIOD_M5,0);

//--- set timelines

   ObjectMove(0,"Time-M5",0,M5,0);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(M5!=iTime(Symbol(),PERIOD_M5,0))
     {
      M5=iTime(Symbol(),PERIOD_M5,0);  // overwrite old value with new value  
      //Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-M5",0,M5,0);
     }
  }
//+------------------------------------------------------------------+

Muito obrigado.

Este comentário me ensina muitas coisas.

Parece que esse código funciona bem para mim, e eu o publiquei em meu comentário anterior.

Mas eu preciso desse código (qual ele está funcionando para o Period_M5) não funcionará no Relógio 12:00 (são talvez 13:00, 14:00...) e abaixo do código ignorando 'OBJ_VLINE's past times (que é bom para mim), mas enquanto atualmente o Relógio 12:00 abaixo do código me mostra adicionalmente a hora atual VLINE, mas eu não o quero.

if ( TimeHour( _timeCvrt_M5 ) != 12 )
{
    ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
}   //---if Close

Eu tentei algo que resolvesse meu problema, mas não funcionou corretamente.

Também acrescentei uma captura de tela.


Por favor, ajude-me, eu realmente preciso resolver esse problema.

Muito obrigado de antemão.

Arquivos anexados:
 
Marco vd Heijden:
Como você sabe?

Porque a conexão se perdeu e eu tentei usar o'Testador de Estratégia' enquanto o tempo de desconexão funcionava perfeitamente para mim.

Depois de ler seus comentários e os do Sr. William, tenho certeza disso.

Isso não é suficiente, desculpe?

 
if ( TimeHour( _timeCvrt_M5 ) != 12 )
{
    ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
}   //---if Close

Neste exemplo, você recebe uma linha a cada hora MAS 12:00 porque você exclui com != diferente de 12 declarações, então quando é == igual a 12 sem linha.

 
Marco vd Heijden:

Neste exemplo, você recebe uma linha a cada hora MAS 12:00 porque você exclui com != diferente de 12 declarações, então quando é == igual a 12 sem linha.

Brilhante homem, obrigado :))

Isso é simples, mas não me importo com isso. Simples e simplesmente "uau".

(Na verdade eu uso '==' neste indicador, mas realmente me concentrei no 'OnTimer')

//--- segunda vez editado...

Isto funciona bem para mim, mas quando o horário será 00:00 - a hora atual adicional VLINE mostra novamente.

if (
     TimeHour( _timeCvrt_M5 ) == 1  ||
     TimeHour( _timeCvrt_M5 ) == 2  ||
     TimeHour( _timeCvrt_M5 ) == 3  ||

     TimeHour( _timeCvrt_M5 ) == 5  ||
     TimeHour( _timeCvrt_M5 ) == 6  ||
     TimeHour( _timeCvrt_M5 ) == 7  ||

     TimeHour( _timeCvrt_M5 ) == 9  ||
     TimeHour( _timeCvrt_M5 ) == 10 ||
     TimeHour( _timeCvrt_M5 ) == 11 ||

     TimeHour( _timeCvrt_M5 ) == 13 ||
     TimeHour( _timeCvrt_M5 ) == 14 ||
     TimeHour( _timeCvrt_M5 ) == 15 ||

     TimeHour( _timeCvrt_M5 ) == 17 ||
     TimeHour( _timeCvrt_M5 ) == 18 ||
     TimeHour( _timeCvrt_M5 ) == 19 ||

     TimeHour( _timeCvrt_M5 ) == 21 ||
     TimeHour( _timeCvrt_M5 ) == 22 ||
     TimeHour( _timeCvrt_M5 ) == 23
)

(Eu atualizei este comentário poucas vezes porque fui pesquisado)

Por favor, me ajude.