Vous pouvez dessiner toutes les lignes dans OnInit() et ensuite en dessiner de nouvelles dès que le temps d'ouverture de la dernière barre change, vous saurez qu'il y a eu une nouvelle barre.
Mais je ne suis pas sûr de ce que vous voulez faire exactement.
OK ! Je vais essayer quelque chose. Puis je reviendrai ici.
Avant de commencer mes recherches sur ce sujet. J'ai vraiment besoin de demander, est-ce que la fonction start() ralentit le graphique (/ Plateformes MT4) ?
p.s J'ai mis tous les codes dans la fonction spéciale start() , ce code fonctionne pour les lignes de période- H1, H4, D1, W1, MN1.
Je vous souhaite un bon week-end et vous remercie d'avance.
Max Enrik: J'ai vraiment besoin de demander, est-ce que la fonction start() ralentit le graphique (/ Plateformes MT4) ?
Pendant que tous les indicateurs sont mis à jour, le terminal ne fait rien d'autre. C'est pourquoi les indicateurs ne peuvent pas dormir, ne peuvent pas trader, ou faire des requêtes web.
Pendant que tous les indicateurs sont mis à jour, le terminal ne fait rien d'autre. C'est pourquoi les indicateurs ne peuvent pas dormir, ne peuvent pas trader, ou faire des requêtes web.
Merci pour votre commentaire. (après votre commentaire, j'ai décidé de changer quelque chose dans tous mes indicateurs - parce que presque j'ai fait tous mes indicateurs dans lafonctionstart() ).
J'ai mis le code ci-dessous dans la fonction start(), alors pouvez-vous m'aider à savoir quelle est la meilleure façon pour mon indicateur ?
En fait, je n'ai aucune idée de la façon dont je peux modifier le code ci-dessous pour arrêter la mise à jour continue(sans tous les codes start() mis dans la fonction init()).
//---MN1 int _cnt_MN1 = 11; // 12 lines for a year 24 for two years and etc. for ( int i_MN = 0; i_MN < _cnt_MN1; i_MN++ ) { if ( _Period < PERIOD_MN1 ) { //---time convert datetime _tltpMN1 = TimeToString( iTime( Symbol(), PERIOD_MN1, i_MN ), TIME_DATE ); datetime _time = iTime( Symbol(), PERIOD_MN1, i_MN );// + PeriodSeconds( PERIOD_MN1 ); //---name string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
Max Enrik: En fait, je n'ai aucune idée de la façon dont je peux modifier le code ci-dessous pour arrêter la mise à jour continue.
Adapter un nouveau code barre pour un nouveau mois.
Les barres ne sont pas fiables (un rafraîchissement/une reconnexion peut changer le nombre de barres sur le graphique) Le volume n'est pas fiable (ticks manqués) Utilisez toujours le temps. Nouvelle bougie - MQL4 forum Je ne suis pas d'accord pour faire une nouvelle fonction de barre, car elle ne peut être appelée qu'une fois par tick. Une variable peut être testée plusieurs fois.
N' utilisez pas de chiffres de décalage dans les noms d'objets. Une fois qu'une nouvelle barre commence, tous vos objets sont mal nommés et vous ne pouvez pas créer un nouveau "<prefix>0". Vous aviez raison dans votre message original (en utilisant le temps)
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.
//+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ voidOnTimer() { if(M1!=iTime(Symbol(),PERIOD_M1,0)) { M1=iTime(Symbol(),PERIOD_M1,0); // overwrite old value with new value //Alert("New Bar on M1! ",TimeToString(M1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M1",0,M1,0); }
if(M5!=iTime(Symbol(),PERIOD_M5,0)) { M5=iTime(Symbol(),PERIOD_M5,0); //Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M5",0,M5,0); }
if(M15!=iTime(Symbol(),PERIOD_M15,0)) { M15=iTime(Symbol(),PERIOD_M15,0); //Alert("New Bar on M15! ",TimeToString(M15,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M15",0,M15,0); }
if(M30!=iTime(Symbol(),PERIOD_M30,0)) { M30=iTime(Symbol(),PERIOD_M30,0); //Alert("New Bar on M30! ",TimeToString(M30,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M30",0,M30,0); }
if(H1!=iTime(Symbol(),PERIOD_H1,0)) { H1=iTime(Symbol(),PERIOD_H1,0); //Alert("New Bar on H1! ",TimeToString(H1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-H1",0,H1,0); }
if(H4!=iTime(Symbol(),PERIOD_H4,0)) { H4=iTime(Symbol(),PERIOD_H4,0); //Alert("New Bar on H4! ",TimeToString(H4,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-H4",0,H4,0); }
if(D1!=iTime(Symbol(),PERIOD_D1,0)) { D1=iTime(Symbol(),PERIOD_D1,0); //Alert("New Bar on D1! ",TimeToString(D1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-D1",0,D1,0); }
if(W1!=iTime(Symbol(),PERIOD_W1,0)) { W1=iTime(Symbol(),PERIOD_W1,0); //Alert("New Bar on W1! ",TimeToString(W1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-W1",0,W1,0); }
if(MN1!=iTime(Symbol(),PERIOD_MN1,0)) { MN1=iTime(Symbol(),PERIOD_MN1,0); //Alert("New Bar on MN1! ",TimeToString(MN1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-MN1",0,MN1,0); } } //+------------------------------------------------------------------+
N' utilisez pas les numéros d'équipes dans les noms d'objets. Une fois qu'une nouvelle barre commence, tous vos objets sont mal nommés et vous ne pouvez pas créer un nouveau "<prefix>0". Vous aviez raison dans votre message original (en utilisant le temps)
Depuis votre commentaire, j'ai commencé à essayer de faire des recherches sur votre commentaire.(parce que je n'ai jamais utilisé la fonction 'Void OnTick()').
Donc, j'ai lu le lien ci-dessous et j'ai compris que la fonction 'OnTick()' ne fonctionne que pour les Expert Advisors.
J'utilise déjà un conseiller expert (Trade Panel) dans mon graphique (j'ai besoin d'utiliser tous mes indicateurs et mon conseiller expert dans une seule fenêtre graphique).
Si vous voulez dire que je pourrais utiliser votre code dans 'Expert Advisor', en fait je ne le ferai pas car je vais améliorer mon 'Trade Panel', et je veux aussi écrire le code séparément. (Il est possible que dans le futur je combine ce groupe d'indicateurs(qui sont importants pour moi) - mais pas pour le moment).
Quoi qu'il en soit, M. William, votre commentaire m'a vraiment donné une idée et m'a aussi appris quelque chose.
(p.s. si je pense mal, dites-le moi s'il vous plaît).
Max Enrik: (parce que je n'ai jamais utilisé la fonction 'Void OnTick()')
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.
#Ordre des objets
J'ai créé 3 objets et ces objets se croisent les uns les autres.
#1 Ligne Horizontale, #2 Ligne Verticale, #3 Ligne de Tendance
J'ai besoin de définir leurs positions z.
Alors comment puis-je leur donner une valeur de position z?
Merci.
Vous pouvez dessiner toutes les lignes dans OnInit() et ensuite en dessiner de nouvelles dès que le temps d'ouverture de la dernière barre change, vous saurez qu'il y a eu une nouvelle barre.
Mais je ne suis pas sûr de ce que vous voulez faire exactement.
OK ! Je vais essayer quelque chose. Puis je reviendrai ici.
Merci.
@Marco vd Heijden
Avant de commencer mes recherches sur ce sujet. J'ai vraiment besoin de demander, est-ce que la fonction start() ralentit le graphique (/ Plateformes MT4) ?
p.s J'ai mis tous les codes dans la fonction spéciale start() , ce code fonctionne pour les lignes de période- H1, H4, D1, W1, MN1.
Je vous souhaite un bon week-end et vous remercie d'avance.
Merci pour votre commentaire. (après votre commentaire, j'ai décidé de changer quelque chose dans tous mes indicateurs - parce que presque j'ai fait tous mes indicateurs dans lafonction start() ).
J'ai mis le code ci-dessous dans la fonction start(), alors pouvez-vous m'aider à savoir quelle est la meilleure façon pour mon indicateur ?
En fait, je n'ai aucune idée de la façon dont je peux modifier le code ci-dessous pour arrêter la mise à jour continue (sans tous les codes start() mis dans la fonction init()).
int _cnt_MN1 = 11; // 12 lines for a year 24 for two years and etc.
for ( int i_MN = 0; i_MN < _cnt_MN1; i_MN++ )
{
if ( _Period < PERIOD_MN1 )
{
//---time convert
datetime _tltpMN1 = TimeToString( iTime( Symbol(), PERIOD_MN1, i_MN ), TIME_DATE );
datetime _time = iTime( Symbol(), PERIOD_MN1, i_MN );// + PeriodSeconds( PERIOD_MN1 );
//---name
string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
ObjectCreate ( 0, _vlineName_MN, OBJ_VLINE , 0, _time, 0 );
ObjectSetString ( 0, _vlineName_MN, OBJPROP_TOOLTIP , _tltpMN1 );
ObjectSetInteger ( 0, _vlineName_MN, OBJPROP_COLOR , C'180,160,080' );
ObjectSet ( _vlineName_MN, OBJPROP_BACK , true );
ObjectSet ( _vlineName_MN, OBJPROP_HIDDEN , true );
ObjectSet ( _vlineName_MN, OBJPROP_SELECTABLE , false );
ObjectSet ( _vlineName_MN, OBJPROP_STYLE , STYLE_SOLID );
} //---if Close
} //---for Close
Merci !
J'ai vraiment besoin d'aide, s'il vous plaît, que quelqu'un réponde à ma question.
Merci.
Je ne suis pas d'accord pour faire une nouvelle fonction de barre, car elle ne peut être appelée qu'une fois par tick. Une variable peut être testée plusieurs fois.
static datetime BOMcur=0; dateTime BOMpre = BOMcur;
BOMcur = iTime( _Symbol, PERIOD_MN1, 0); bool isNewMonth = BOMcur != BOMpre;
if(isNewMonth){
DO_UPDATE(); ...
}
string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
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 :
int OnInit()
{
//--- create timer
EventSetMillisecondTimer(250);
//--- create some things
CreateLines(); // Function that creates time lines
//--- load open times
M1=iTime(Symbol(),PERIOD_M1,0);
M5=iTime(Symbol(),PERIOD_M5,0);
M15=iTime(Symbol(),PERIOD_M15,0);
M30=iTime(Symbol(),PERIOD_M30,0);
H1=iTime(Symbol(),PERIOD_H1,0);
H4=iTime(Symbol(),PERIOD_H4,0);
D1=iTime(Symbol(),PERIOD_D1,0);
W1=iTime(Symbol(),PERIOD_W1,0);
MN1=iTime(Symbol(),PERIOD_MN1,0);
//--- set timelines
ObjectMove(0,"Time-M1",0,M1,0);
ObjectMove(0,"Time-M5",0,M5,0);
ObjectMove(0,"Time-M15",0,M15,0);
ObjectMove(0,"Time-M30",0,M30,0);
ObjectMove(0,"Time-H1",0,H1,0);
ObjectMove(0,"Time-H4",0,H4,0);
ObjectMove(0,"Time-D1",0,D1,0);
ObjectMove(0,"Time-W1",0,W1,0);
ObjectMove(0,"Time-MN1",0,MN1,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
if(M1!=iTime(Symbol(),PERIOD_M1,0))
{
M1=iTime(Symbol(),PERIOD_M1,0); // overwrite old value with new value
//Alert("New Bar on M1! ",TimeToString(M1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M1",0,M1,0);
}
if(M5!=iTime(Symbol(),PERIOD_M5,0))
{
M5=iTime(Symbol(),PERIOD_M5,0);
//Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M5",0,M5,0);
}
if(M15!=iTime(Symbol(),PERIOD_M15,0))
{
M15=iTime(Symbol(),PERIOD_M15,0);
//Alert("New Bar on M15! ",TimeToString(M15,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M15",0,M15,0);
}
if(M30!=iTime(Symbol(),PERIOD_M30,0))
{
M30=iTime(Symbol(),PERIOD_M30,0);
//Alert("New Bar on M30! ",TimeToString(M30,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M30",0,M30,0);
}
if(H1!=iTime(Symbol(),PERIOD_H1,0))
{
H1=iTime(Symbol(),PERIOD_H1,0);
//Alert("New Bar on H1! ",TimeToString(H1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-H1",0,H1,0);
}
if(H4!=iTime(Symbol(),PERIOD_H4,0))
{
H4=iTime(Symbol(),PERIOD_H4,0);
//Alert("New Bar on H4! ",TimeToString(H4,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-H4",0,H4,0);
}
if(D1!=iTime(Symbol(),PERIOD_D1,0))
{
D1=iTime(Symbol(),PERIOD_D1,0);
//Alert("New Bar on D1! ",TimeToString(D1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-D1",0,D1,0);
}
if(W1!=iTime(Symbol(),PERIOD_W1,0))
{
W1=iTime(Symbol(),PERIOD_W1,0);
//Alert("New Bar on W1! ",TimeToString(W1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-W1",0,W1,0);
}
if(MN1!=iTime(Symbol(),PERIOD_MN1,0))
{
MN1=iTime(Symbol(),PERIOD_MN1,0);
//Alert("New Bar on MN1! ",TimeToString(MN1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-MN1",0,MN1,0);
}
}
//+------------------------------------------------------------------+
static datetime BOMcur=0; dateTime BOMpre = BOMcur;
BOMcur = iTime( _Symbol, PERIOD_MN1, 0); bool isNewMonth = BOMcur != BOMpre;
if(isNewMonth){
DO_UPDATE(); ...
}
string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
Merci pour votre commentaire.
Depuis votre commentaire, j'ai commencé à essayer de faire des recherches sur votre commentaire. (parce que je n'ai jamais utilisé la fonction 'Void OnTick()').
Quoi qu'il en soit, M. William, votre commentaire m'a vraiment donné une idée et m'a aussi appris quelque chose.
(p.s. si je pense mal, dites-le moi s'il vous plaît).
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.