Indicatore Domande varie - pagina 3

 
whroeder1:

Pre-build 600 (3 febbraio2014) c'era solo start(). Ora c'è OnTick (EAs,) OnCalculate (indicatori,) e OnStart (scripts).

Iniziate ad usare le nuove funzioni di gestione degli eventi - Funzioni - Fondamenti del linguaggio - Riferimento MQL4. Vedi Come fare i tuoi lookback correttamente.

Sì! Ora ti capisco molto più chiaramente e ti ringrazio molto di più.

E il tuo commento #20 mi ha dato un'altra idea. (una volta l'hai condiviso con me e ora lo tengo in mente)

Inoltre cerco di scrivere un codice migliore per il mio indicatore, e ora cerco diimparare il commento#18-@Marco vd Heijden

Poi io ampiamente ricerca il tuo commento.

Grazie ancora una volta!

 
Marco vd Heijden:

Per favore, mettilo in un esperto al posto dell'indicatore, questo permette un uso più facile in futuro quando vuoi aggiungere la tua strategia di trading.

Per il problema delle barre, memorizza il tempo di apertura della barra in una variabile datetime e confronta semplicemente il tempo registrato con il tempo reale, quindi ogni volta che si presenta una nuova barra si attiverà.

Ecco un esempio:

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

Prima di tutto un enorme grazie per il tuo commento molto chiaramente.

Rimango ancora su Indicator. Ho provato qualcosa, e funziona bene per me, ma ho affrontato un problema, non posso testarlo su 'Strategy Tester' - mi dà errore fatale: MT4 'Non risponde'.

#1 - Marco puoi farmi sapere da dove viene, per favore?

#2 - Il codice qui sotto è giusto?

Sotto il codice che ho provato.

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

Ho smesso di lavorarci, continuerò dopo il tuo commento. (In realtà mi preoccupo che il codice di cui sopra schiaccerà i miei altri indicatori mentre lo uso insieme).

Grande grazie.

 
La funzione timer non funziona in MT4 strategy tester quindi devi metterla nella funzione tick.
 
Marco vd Heijden: La funzione timer non funziona in MT4 strategy tester quindi bisogna metterla nella funzione tick.
Nel backtest OnTimer() non funziona (M. Ali) - MQL4 forum
Evento grafico per MT4 Backtester (Migel) - MQL4 forum
 
Marco vd Heijden:
La funzione timer non funziona in MT4 strategy tester quindi devi metterla nella funzione tick.

Grazie mille!

So per certo che il problema non viene dal codice.

 
Come fa a saperlo?
 

Marco vd Heijden:

Ecco un esempio:

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

Grazie mille.

Questo commento mi insegna molte cose.

Sembra che il codice che ho postato nel mio commento precedente funzioni bene per me.

Ma ho bisogno che il codice (che funziona per Period_M5) non funzioni all'orologio 12:00 (forse è 13:00, 14:00...) e sotto il codice che ignora i tempi passati di 'OBJ_VLINE'(che è buono per me) ma mentre attualmente l'orologio 12:00 sotto il codice mi mostra in aggiunta il tempo corrente VLINE ma io non lo voglio.

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

Ho provato qualcosa che risolve il mio problema, ma non ha funzionato correttamente.

Ho anche aggiunto uno screenshot.


Per favore, aiutatemi ho davvero bisogno di risolvere questo problema.

Un enorme grazie in anticipo.

File:
 
Marco vd Heijden:
Come si fa a sapere?

Perché la connessione è andata persa e ho provato a usare'Strategy Tester' durante il tempo di disconnessione e funziona perfettamente per me.

Dopo aver letto i commenti tuoi e del signor William, e poi lo so per certo.

Non è abbastanza, scusa?

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

In questo esempio si ottiene una linea ad ogni ora MA le 12:00 perché si esclude con != differ then 12 dichiarazione così quando è == uguale a 12 nessuna linea.

 
Marco vd Heijden:

In questo esempio si ottiene una linea ad ogni ora MA le 12:00 perché si esclude con != differ then 12 dichiarazione così quando è == uguale a 12 nessuna linea.

Uomobrillante, grazie :))

Questo è semplice ma non mi dispiace. Semplice e solo wow.

(In realtà uso '==' nel mio questo indicatore ma mi sono davvero concentrato su 'OnTimer')

//--- seconda volta modificato...

Questo funziona bene per me, ma quando il tempo sarà 00:00 - ulteriore tempo corrente VLINE mostra ancora.

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
)

(Ho aggiornato poche volte questo commento perché sono stato ricercato)

Per favore aiutatemi.