Indicateur Questions diverses - page 3

 
whroeder1:

Avant la construction 600 (3 février2014), il n'y avait que start(). Maintenant il y a OnTick (EAs,) OnCalculate (indicateurs,) et OnStart (scripts.) J'ai oublié que vous parliez d'un indicateur.

Commencez à utiliser les nouvelles fonctions de gestion des événements - Fonctions - Notions de base du langage - Référence MQL4. Voir Comment faire vos lookbacks correctement.

Ouais ! Maintenant je vous comprends beaucoup plus clairement, et merci beaucoup plus.

Et votre commentaire #20 m'a donné une autre idée. (une fois que vous avez partagé cela avec moi et maintenant je le garde dans mon esprit)

J'essaie aussi d'écrire un meilleur code pour mon indicateur, et maintenant j'essaie d'apprendre le commentaire#18-@Marco vd Heijden

Alors je vais largement étudier votre commentaire.

Merci encore une fois !

 
Marco vd Heijden:

Veuillez le mettre dans un expert au lieu d'un indicateur, cela permet une utilisation plus facile à l'avenir lorsque vous voulez ajouter votre stratégie de trading.

Pour le problème des barres, stockez l'heure d'ouverture de la barre dans une variable datetime et comparez simplement l'heure enregistrée avec l'heure réelle, puis chaque fois qu'une nouvelle barre apparaît, elle se déclenchera.

Voici un exemple :

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

Tout d'abord, merci beaucoup pour votre commentaire très clair.

Je reste toujours sur Indicator. J'ai essayé quelque chose, et cela fonctionne bien pour moi, mais j'ai rencontré un problème, je ne peux pas le tester sur 'Strategy Tester' - il me donne une erreur fatale : MT4 'Not Responding'.

#1 - Marco, pouvez-vous me dire d'où cela vient, s'il vous plaît ?

#2 - Le code ci-dessous est-il correct ?

Le code ci-dessous est celui que j'ai essayé.

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

J'ai arrêté de travailler dessus, je vais continuer après votre commentaire. (En fait, je crains que le code ci-dessus n'écrase mes autres indicateurs si je l'utilise ensemble).

Merci beaucoup.

 
La fonction de minuterie ne fonctionne pas dans le testeur de stratégie MT4, vous devez donc la placer dans la fonction tick.
 
Marco vd Heijden: La fonction timer ne fonctionne pas dans le testeur de stratégie MT4, vous devez donc la mettre dans la fonction tick.
Dans le backtest OnTimer() ne fonctionne pas (M. Ali) - MQL4 forum
Chart Event For MT4 Backtester (Migel) - MQL4 forum
 
Marco vd Heijden:
La fonction timer ne fonctionne pas dans le testeur de stratégie MT4 donc vous devez la mettre dans la fonction tick.

Grand merci !

Je suis sûr que le problème ne vient pas du code.

 
Comment le savez-vous ?
 

Marco vd Heijden:

Voici un exemple :

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

Merci beaucoup.

Ce commentaire m'a appris beaucoup de choses.

Il semble que ce code fonctionne bien pour moi, celui que j'ai posté dans mon commentaire précédent.

Mais j'ai besoin que ce code (qui fonctionne pour Period_M5) ne fonctionne pas à l'horloge 12:00 (c'est peut-être 13:00, 14:00...) et le code ci-dessous ignore les temps passés de 'OBJ_VLINE's (c'est bien pour moi) mais alors que l'horloge 12:00 actuelle, le code ci-dessous me montre en plus l'heure actuelle VLINE mais je ne le veux pas.

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

J'ai essayé quelque chose qui résout mon problème, mais cela n'a pas fonctionné correctement.

J'ai également ajouté une capture d'écran.


S'il vous plaît, aidez-moi, j'ai vraiment besoin de résoudre ce problème.

Merci beaucoup par avance.

Dossiers :
 
Marco vd Heijden:
Comment le savez-vous ?

Parce que la connexion a été perdue et j'ai essayé d'utiliser le"Strategy Tester" pendant le temps de déconnexion et il fonctionne parfaitement pour moi.

Après avoir lu vos commentaires et ceux de M. William, j'en suis sûr.

Ce n'est pas suffisant, désolé?

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

Dans cet exemple, vous obtenez une ligne à chaque heure SAUF à 12:00 parce que vous excluez avec l'instruction != différent puis 12, donc quand c'est == égal à 12, pas de ligne.

 
Marco vd Heijden:

Dans cet exemple, vous obtenez une ligne à chaque heure MAIS à 12:00 parce que vous excluez avec != différent puis 12 déclaration, donc quand il est == égal à 12 pas de ligne.

C'est génial , merci :))

C'est simple mais ça ne me dérange pas. C'est simple et génial.

(En fait, j'utilise '==' dans mon indicateur mais je me suis vraiment concentré sur 'OnTimer').

//--- deuxième édition...

Cela fonctionne bien pour moi, mais quand le temps sera 00:00 - temps actuel supplémentaire VLINE montre à nouveau.

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
)

(J'ai plusieurs fois mis à jour ce commentaire parce que j'ai été recherché)

S'il vous plaît aidez-moi.