Questions des débutants MQL5 MT5 MetaTrader 5 - page 714

 
dimnik:

Avec l'utilisation de OnTradeTransaction, le temps d'optimisation a étrangement changé. Un système sur 15M, très simple, historique annuel, une course se produit en 0,3 - 0,4 secondes.

Après le démarrage de l'optimisation, les 200-300 premières courses vont à moins d'une seconde, les suivantes ralentissent jusqu'à 15-20 secondes (50 fois !) ;

Pas de surchauffe ni de trottement du processeur, plus de la moitié de la mémoire est libre (à partir de 16 Go).

Avant l'utilisation du gestionnaire OnTradeTransaction, il n'y avait rien de tel - même des conseillers experts plus complexes sur de petites échéances étaient optimisés avec approximativement la même vitesse.

Est-ce que HistoryDealSelect affecte autant la vitesse ? Comment éliminer les décalages ?

void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   if( trans.type != TRADE_TRANSACTION_DEAL_ADD) return;
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   long     deal_type         =0;
   double   deal_volume       =0;
   long     deal_magic        =0;
   if(HistoryDealSelect(trans.deal))
     {
      deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
      deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
      deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
     }
   else
      return;
   if (deal_type == DEAL_TYPE_BUY && deal_magic == MagicNumber) current_position += deal_volume;
   if (deal_type == DEAL_TYPE_SELL && deal_magic == MagicNumber) current_position -= deal_volume;
      
  }


Montre-moi tout le code.
 

Salut !

Qui sait - comment afficher les barres à droite de la barre zéro dans l'indicateur et combien de maximum ? (prévision de prix à faire)

 
dimnik:

Est-ce que c'est HistoryDealSelect qui affecte gravement la vitesse ? Comment éliminer le ralentissement ?

Les développeurs recommandent de minimiser l'appel aux fonctions d'historique (coûteuses) - par la mise en cache de l'historique.

J'ai posté une solution fonctionnelle dans kodobase (MT4Orders), mais elle ne vous conviendra probablement pas.

Je n'ai pas vu de décalage après avoir utilisé la mise en cache.

Cependant, votre OnTradeTransaction ne devrait pas ralentir, même si elle n'est pas écrite de manière optimale.

 
Renat Akhtyamov:

Salut !

Qui sait - comment afficher les barres à droite de la barre zéro dans l'indicateur et combien de maximum ? (prévision de prix à faire)

Ajoutez PeriodSeconds() à l'heure d'ouverture de la dernière barre et dessinez-y une bougie avec des objets graphiques. Le montant maximal sera affiché à droite. Mais je n'ai pas vérifié comment il sera affiché s'il y a une sortie. Probablement, elle devrait être prise en compte par elle-même.
 
Alexey Viktorov:
Ajoutez PeriodSeconds() à l'heure d'ouverture de la dernière barre et dessinez-y une bougie avec des objets graphiques. Tout au plus sera-t-il visible sur la droite. Mais je n'ai pas vérifié comment il sera affiché s'il y a une sortie. Il faut probablement en tenir compte.
Merci, je l'ai !
 
Alexey Viktorov:
Ajoutez PeriodSeconds() à l'heure d'ouverture de la dernière barre et dessinez le chandelier à cet endroit. Tout au plus, vous le verrez sur la droite. Mais je n'ai pas vérifié son apparence. Il est probablement nécessaire de prendre en compte.

Sur le graphique, il dessine une continuation, mais malheureusement pas dans la fenêtre de l'indicateur.

Je me trompe peut-être, bien sûr...

Que pensez-vous - puis-je continuer la ligne de l'indicateur au-delà de la barre zéro vers la droite ?

 
Qui sait - est-il possible de poursuivre la ligne de l'indicateur au-delà de la barre zéro vers la droite ?
 
Renat Akhtyamov:
Qui sait - la ligne de l'indicateur peut-elle être prolongée au-delà de la barre de zéro à droite ?
Vous pouvez. Il est possible de définir un décalage, mais il ne sera probablement pas possible de calculer par des valeurs inexistantes, et le temps n'est pas utilisé dans l'affichage de l'indicateur. C'est pourquoi je parlais de l'affichage des barres à l'aide d'éléments graphiques. L'ObjectCreate() contient à la fois le numéro de la fenêtre (sous-fenêtre) et l'heure. Il ne devrait pas y avoir de problèmes lors de la création d'éléments graphiques.
 
Alexey Viktorov:
Vous pouvez. Vous pouvez le décaler, mais le calcul ne sera probablement pas effectué avec des valeurs inexistantes, et l'heure n'est pas utilisée dans l'affichage de l'indicateur. C'est pourquoi je parlais de l'affichage des barres à l'aide d'éléments graphiques. L'ObjectCreate() contient à la fois le numéro de la fenêtre (sous-fenêtre) et l'heure. Par conséquent, il ne devrait y avoir aucun problème lors de la création d'éléments graphiques.

Dans la fenêtre du graphique, en utilisant les horodatages, vous pouvez vous référer aux futures barres prévues. Cela a fonctionné.

Cependant, je ne peux pas faire la même chose dans la fenêtre de l'indicateur. En d'autres termes, je ne peux pas écrire de valeurs dans le tampon de l'indicateur avec l'indice -1, -2, etc.

La question est la suivante.

C'est clair, en principe. La solution consiste à créer un indicateur par des objets graphiques.

 
Renat Akhtyamov:

Dans la fenêtre du graphique, en utilisant les horodatages, vous pouvez vous référer aux futures barres prévues. Cela a fonctionné.

Cependant, je ne peux pas faire la même chose dans la fenêtre de l'indicateur. En d'autres termes, je ne peux pas écrire de valeurs dans le tampon de l'indicateur avec l'indice -1, -2, etc.

La question est la suivante.

En principe, c'est clair. La solution consiste à créer l'indicateur par des objets graphiques.

Calculer le deuxième tampon sur ses valeurs normales, par exemple (si nous voulons calculer 10 barres pour afficher "future"), puis calculer ce tampon sur les valeurs Buff[9] -- Buff[8] -- Buff[n] -- Buff[0], et ensuite afficher ce tampon avec un décalage non nul. Réglez le décalage de la mémoire tampon sur le nombre souhaité de barres dans le futur - 10 dans ce cas.