[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 647

 
Mathers:

droite.
 
Bonjour aux membres du forum. J'ai trouvé un code intéressant pour construire une ligne de tendance. Et j'ai décidé de jouer un peu avec - qui dessinerait la ligne de tendance non pas en points, mais en pourcentage, mais pour une raison quelconque - après mon achèvement la tourelle arrête de dessiner l'historique - seulement les trois dernières barres (ou plutôt si vous exécutez la tourelle, la ligne de tendance qu'il dessine depuis le début normal, mais une fois que vous cliquez pour mettre à jour la tourelle -OK propriétés réinitialise l'historique). Qu'est-ce que j'ai fait de mal ?
J'ai dessiné le code ci-dessous. Quelqu'un peut-il me dire quel est le problème - le fragment que j'ai mis en gras ?
Le problème est que l'indicateur dessine l'historique en arrière immédiatement et ne le réinitialise pas après avoir modifié les paramètres.
#propriété indicator_separate_window
#property indicator_buffers 1
#propriété indicator_color1 LimeGreen

double AUD ;

extern int PerAvr=5,Delta=1 ;
double Idx[] ;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé |
//+------------------------------------------------------------------+
int init()
{
//---- indicateurs

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2) ;
SetIndexBuffer(0,Idx) ;

//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'indicateur de dépôt |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisé |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted() ;
si(counted_bars<0) return(-1) ;
si(counted_bars>0) counted_bars-- ;
int limit=Bars-counted_bars ;
for(int i=limit ; i>=0 ; i--)
{
AUD=(iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE,i)-iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE,i+De lta)*100/iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE,i+De lta) ;

//si (Curency =="AUDUSD")
Idx[i] = AUD ;



}

//----

//----
retour(0) ;
}
//+------------------------------------------------------------------+
 
Lonely_man:
Bonjour, membres du forum. J'ai trouvé un code intéressant pour construire une ligne de tendance. J'ai décidé de jouer un peu avec.

Pour une raison quelconque, une anecdote m'est revenue en mémoire : dans une famille de programmeurs, un fils aborde son père et lui demande pourquoi le soleil se lève à l'est et se couche à l'ouest.

Papa, sans quitter son ordinateur des yeux, est-ce que le soleil se lève vraiment à l'est ? -Oui. Et il se couche à l'ouest ? - Oui. Alors, quoi, tous les jours ? - Oui. Eh bien, ne touchez à rien si ça marche.

 
Roger:

Pour une raison quelconque, une anecdote m'est revenue en mémoire : dans une famille de programmeurs, un fils aborde son père et lui demande pourquoi le soleil se lève à l'est et se couche à l'ouest.

Papa, sans quitter son ordinateur des yeux, est-ce que le soleil se lève vraiment à l'est ? -Oui. Et il se couche à l'ouest ? - Oui. Alors, quoi, tous les jours ? - Ouais. Eh bien, vous n'avez pas à toucher quoi que ce soit si ça marche.

:))
 
Lonely_man:
Bonjour utilisateurs du forum, J'ai trouvé un code intéressant pour dessiner la ligne de tendance.

Vous savez ce qui est drôle - vous avez changé le code selon vos principes et vous voulez une brigade d'érudits pour trouver les défauts

et vous essayez juste de sortir les informations que vous voulez obtenir dans le commentaire ? il est possible que tout fonctionne mais que vous obteniez les données qui ne sont pas affichées au prix actuel mais quelque part en bas du graphique - je pense que c'est le separatetwinds

SZS bonne chance

 
IgorM:

Vous savez ce qui est drôle - vous avez changé le code selon vos principes et vous voulez une brigade d'érudits pour trouver les défauts

et vous essayez juste de sortir les informations que vous voulez obtenir dans le commentaire ? il est possible que tout fonctionne mais que vous obteniez les données qui ne sont pas affichées au prix actuel mais quelque part en bas du graphique - je pense que c'est le separatetwinds

SZS bonne chance

Je suis au courant du séparateur - je sais, il est dans une fenêtre séparée, il ne s'agit pas de cela. Je ne vois pas ce qui va se passer avec ce code - apparemment cette méthode de calcul ne fonctionnera pas pour les intérêts((.

Immédiatement, pour une raison quelconque, je me souviens d'une blague : le fils d'un programmeur vient voir son père et lui demande pourquoi le soleil se lève à l'est et se couche à l'ouest ?

Papa, sans quitter son ordinateur des yeux, est-ce que le soleil se lève vraiment à l'est ? -Oui. Et il se couche à l'ouest ? - Oui. Alors, quoi, tous les jours ? - Ouais. Eh bien, vous n'avez pas à toucher quoi que ce soit si ça marche.

))) Je ne suis pas tout à fait sûr de ce que je veux faire. Un indice : j'en ai besoin pour le trading de devises croisées - la variation en pips par rapport au dollar de la GBP ou du JPY ne donne pas d'informations complètes sur laquelle des deux a baissé par rapport à l'autre, mais leur variation en pourcentage par rapport au dollar montre tout clairement - comme un outil supplémentaire est une chose très utile.
 
Mathers:
Merci. Je suppose que la seule différence est que l'EA est lancé à chaque fois qu'un nouveau tick arrive, alors que le script doit être lancé en boucle infinie pour le maintenir en fonctionnement ?


Pas nécessairement. Tout dépend de l'objectif du scénario. Si le but du scénario est d'être exécuté une seule fois (ce qui est la grande majorité), il n'est pas nécessaire d'inventer des boucles sans fin. La nécessité de calculer la somme d'argent qui sera utilisée sur le marché lors de l'ouverture d'une position avec un lot prédéterminé peut servir d'exemple d'un tel script ponctuel. Comme le prix du point au lot minimum est différent pour les différents instruments, il est plus facile d'ouvrir l'instrument requis, d'y appliquer le script, de saisir le lot prévu dans la fenêtre des paramètres et de voir combien d'argent sera bloqué si la transaction est ouverte.

Ce n'est qu'un exemple. L'objectif des scripts peut être différent.

 
Lonely_man:

Je suis conscient de la séparation, c'est dans une fenêtre séparée, il ne s'agit pas de cela. Je ne vois pas comment ce code va fonctionner - apparemment cette méthode de calcul du pourcentage ne fonctionne pas((.

Immédiatement, pour une raison quelconque, je me souviens d'une blague : un fils dans une famille de programmeur vient voir son père et lui demande pourquoi le soleil se lève à l'est et se couche à l'ouest ?

Papa, sans quitter son ordinateur des yeux, est-ce que le soleil se lève vraiment à l'est ? -Oui. Et il se couche à l'ouest ? - Oui. Alors, quoi, tous les jours ? - Ouais. Eh bien, vous n'avez pas à toucher quoi que ce soit si ça marche.

))) L'astuce : j'en ai besoin pour le trading de devises croisées - les pips par rapport au dollar pour la GBP ou le JPY ne donnent pas d'informations complètes sur la baisse de leur prix par rapport à l'autre, mais leur variation en pourcentage par rapport à l'USD montre tout clairement - en tant qu'indicateur supplémentaire, c'est une chose très utile.

C'est un indicateur assez simple. Je ne vois pas en quoi les pourcentages sont meilleurs que les pips, mais peu importe.

Vous avez fait quelques erreurs, cependant :)

1.

AUD=(iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE, i)-iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE,i+Delta)*100/iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE,i+Delta));

Pour calculer correctement le pourcentage, vous devez ajouter des parenthèses.

AUD=((iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE, i)-iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE,i+Delta))*100/iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE,i+Delta));

2.


Le problème est que l'indicateur dessine l'historique en arrière immédiatement et ne le réinitialise pas après avoir modifié les paramètres.

Le plus intéressant, c'est qu'il a éveillé l'intérêt des sportifs et qu'il est resté pendant une demi-heure sur votre indicateur.

Pourquoi l'histoire n'a pas été calculée ?
La réponse est que vous avez ajouté une opération de division.

100/iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE,i+Delta)

Le fait que la fonction iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE ,i+Delta) renvoie 0 au tout début de l'historique n'a pas été pris en compte. Et vous avez été "expulsé" avec l'erreur 4013 (ERR_ZERO_DIVIDE) lorsque vous avez essayé de diviser par 0, vérifiez le journal.

Nous pouvons ajouter une vérification supplémentaire dans la boucle FOR.

if(iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE,i+Delta) == 0)continue;

Et tout ira bien. Voici ma variante.

#property copyright "Copyright © 2010, Анатолий Сергеев"
#property link      "mql.sergeev@yandex.ru"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LimeGreen

double AUD;

extern int PerAvr=5,Delta=1;
double Idx[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+
int init(){
//---- indicators
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
   SetIndexBuffer(0,Idx);
//----
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start(){ 
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;   
   for(int i=limit; i>=0; i--){
      double a = iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE, i);
      double b = iMA("AUDUSD",0,PerAvr,0,MODE_LWMA,PRICE_CLOSE,i+Delta);      
      if(b == 0)continue;      
      AUD=((a-b)*100/b);
      Idx[i] = AUD;
   }
}
//+------------------------------------------------------------------+


 

#property indicator_color1 White

Est-il possible de modifier ce paramètre de manière programmatique dans le module start() ?

Est-il possible de changer la couleur du tampon au fur et à mesure que le programme progresse ?



 
valenok2003:

#property indicator_color1 White

Est-il possible de modifier ce paramètre de manière programmatique dans le module start() ?

Est-il possible de changer la couleur du tampon au fur et à mesure que le programme progresse ?




Je ne pense pas. Et pourquoi le serait-il ?