[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 403

 
lottamer:

2 heures à essayer d'écrire une pièce d'essai, pour tester davantage différentes conditions.

Ça ne marche pas !

Veuillez me donner l'erreur.

le fait est que les ordres s'ouvrent après 2pp dans leur propre direction.

ouvre la vente et se termine...



Tout semble être logiquement correct ! Seule attention - toutes les variables doivent être déclarées au-dessus du début, y compris celle entre parenthèses.
 
hoz:


Je me demande pourquoi il y a une condition ici ?


Il existe une boucle while qui, en principe, pourrait être infinie. Des mesures ont donc été prises pour faciliter le retrait de l'EA du graphique ou sa désactivation.

Il est préférable de mettre fin au démarrage si quelque chose ne va pas, plutôt que de tourner en boucle. Au prochain tic, répétez-le.

 
lottamer:

La fonction de Kim a le paramètre time ="Date et heure en secondes depuis 1970".

J'ai essayé 2 variantes.

et tous deux donnent un bénéfice non pas pour le jour en cours, mais un bénéfice total sur l'ensemble de l'historique.....

Le jour en cours commence au début de la barre D1 actuelle (iTime (NULL, PERIOD_D1, 0)), mais vous ne cherchez pas de solutions de facilité ? :)))
 
hoz:

Je ne comprends pas bien la logique de l'écriture d'une fonction séparée. Après tout, la fonction RefreshRates() elle-même sert à mettre à jour les données des variables prédéfinies. Et Bid et Ask sont des variables prédéfinies. Si la fonction RefreshRates() met à jour des variables prédéfinies, pourquoi écrire une fonction supplémentaire ?

Il y a une particularité :

bool RefreshRates( )

Rafraîchit les données dans les variables prédéfinies et les tableaux de séries chronologiques. Cette fonction est utilisée lorsqu'un conseiller expert ou un script effectue des calculs depuis longtemps et a besoin de données actualisées. Elle renvoie VRAI si les données sont mises à jour, sinon FAUX. Les données ne peuvent pas être mises à jour uniquement parce qu'elles correspondent à l'état actuel du terminal client. Les conseillers experts et les scripts travaillent avec leur propre copie des données historiques. La copie des données sur le symbole actuel est créée au premier lancement du conseiller expert ou du script. À chaque nouveau lancement du conseiller expert (rappelons que le script est exécuté une fois et ne dépend pas des ticks entrants), la copie initialement créée est mise à jour. Pendant que le conseiller expert ou le script est en cours d'exécution, un ou plusieurs nouveaux ticks peuvent arriver, de sorte que les données peuvent devenir obsolètes.

Les données ne sont pas non plus mises à jour instantanément. Cela doit être contrôlé.

 
Zhunko:

Il y a une particularité :

bool RefreshRates( )

Rafraîchit les données dans les variables prédéfinies et les tableaux de séries chronologiques. Cette fonction est utilisée lorsqu'un conseiller expert ou un script effectue des calculs depuis longtemps et a besoin de données actualisées. Elle renvoie VRAI si les données sont mises à jour, sinon FAUX. Les données ne peuvent pas être mises à jour uniquement parce qu'elles correspondent à l'état actuel du terminal client. Les conseillers experts et les scripts travaillent avec leur propre copie des données historiques. La copie des données sur le symbole actuel est créée au premier lancement du conseiller expert ou du script. À chaque nouveau lancement du conseiller expert (rappelons que le script est exécuté une fois et ne dépend pas des ticks entrants), la copie initialement créée est mise à jour. Pendant que le conseiller expert ou le script est en cours d'exécution, un ou plusieurs nouveaux ticks peuvent arriver, de sorte que les données peuvent devenir obsolètes.

Les données ne sont pas non plus mises à jour instantanément. Cela doit être contrôlé.


Sur la base de la référence donnée, prenons le prix ASK. Si nous exécutons RefreshRates(), les données des tableaux de variables prédéfinies sont mises à jour. Si le prix de l'ASC a changé, alors après avoir exécutéRefreshRates(), l'ASC prendra la nouvelle valeur. Et si c'est le cas :

Les données peuvent ne pas être rafraîchies simplement parce qu'elles correspondent à l'état actuel du terminal client.

alors la valeur de l'ASC n'a pas changé. Ainsi, la valeur ASK précédente sera utilisée dans le calcul, comme elle l'était, puisqu'elle n'a pas changé.

Après tout, siRefreshRates() renvoie la valeur TRU, cela signifie qu'il a réussi à mettre à jour les données, donc nous n'avons pas besoin de le vérifier ! Vous n'êtes pas d'accord ?

 
hoz:


Sur la base de cette référence, prenons le prix de l'ASC. Si nous exécutons RefreshRates(), les données des tableaux de variables prédéfinies sont mises à jour. Ainsi, si le prix de l'ASC a changé, après avoir exécutéRefreshRates() l'ASC prendra la nouvelle valeur. Et si ça se passe comme ça :

alors la valeur de l'ASC n'a pas changé. Ainsi, la valeur ASK précédente sera utilisée dans les calculs, ce qui est ce qu'elle était puisqu'elle n'a pas changé.

Après tout, siRefreshRates() renvoie la valeur TRU, il a réussi à mettre à jour les données et nous n'avons pas besoin de le vérifier ! Vous n'êtes pas d'accord ?

Non. Il peut retourner FALSE et les données seront fraîches.

La seule raison pour laquelle les données peuvent ne pas être mises à jour est qu'elles correspondent à l'état actuel du terminal client.

Vous devez trouver un indice qui vous indique que les données sont fraîches. Elle peut être différente selon les tâches.
 
Zhunko:

Non. Il peut retourner FALSE et les données seront fraîches.

Il y a donc un bug évident dans la documentation ? Et on ne peut pas faire confiance à la documentation ?

Zhunko:

Vous devez trouver une indication qui vous permettra de supposer que les données sont fraîches. Elle peut être différente selon les tâches.

Supposons que nous parlions du prix ASK. Nous avons deux variables :

ASC - Valeur demandée aprèsRefreshRates().

_ASK - valeur de la dernière demande connue.

_____________________________________________________________________________________

C'est difficile à dire. Quel pourrait être le signe ici ? Il existe deux variantes :

1. La valeur de la variable prédéfinie a changé. RefreshRates() renvoie Vrai.

2. La valeur de la variable prédéfinie n'a pas changé. RefreshRates() renvoie Faux.

Si nous regardons de l'autre côté, à propos de trouver un signe. Il y a deux possibilités :

1. La valeur de la variable prédéfinie a changé. C'est-à-dire que dans notre cas, Ask = ASC

2. La valeur de la variable prédéfinie n'a pas changé. Par exemple, Ask = _ASK

Il y a soit une valeur modifiée, soit une valeur inchangée, il n'y a pas d'autre option. Que voulez-vous faire alors ?

 
hoz:

Il y a donc une erreur flagrante dans la documentation ? Et on ne peut pas faire confiance à la documentation ?

Disons que nous parlons du prix ASK. Nous avons 2 variables :

ASC - Valeur demandée aprèsRefreshRates().

_ASK - valeur de la dernière demande connue.

_____________________________________________________________________________________

C'est difficile à dire. Quel pourrait être le signe ici ? Il y a deux possibilités :

1. La valeur de la variable prédéfinie a changé. RefreshRates() renvoie Vrai.

2. La valeur de la variable prédéfinie n'a pas changé. RefreshRates() renvoie Faux.

Si nous regardons de l'autre côté, à propos de trouver un signe. Il y a deux possibilités :

1. La valeur de la variable prédéfinie a changé. C'est-à-dire que dans notre cas, Ask = ASC

2. La valeur de la variable prédéfinie n'a pas changé. Par exemple, Ask = _ASK

Il y a soit une valeur modifiée, soit une valeur inchangée, il n'y a pas d'autre option. Comment voulez-vous procéder alors ?

La documentation est en ordre. Il est exactement décrit et c'est ce que je vous ai fait remarquer.

TRUE est renvoyé si les données ont été mises à jour, sinon FALSE est renvoyé. La seule raison pour laquelle les données peuvent ne pas être mises à jour est qu'elles correspondent à l'état actuel du terminal client.

Cette fonction indique donc uniquement que de nouvelles données ont été reçues.

Je ne sais pas comment tu veux faire le reste. Je vérifie les données du serveur (MarketInfo()) avec une barre zéro. J'attends qu'ils soient les mêmes. Soit dit en passant, cela ne garantit pas qu'il n'y ait pas de "trou" dans l'histoire la plus proche. Il pourrait facilement manquer 1, 2 ou 3 mesures ou plusieurs mesures, et la barre de zéro sera là. Parfois, ils viennent après. Parfois, ils ne le font pas.

 
Zhunko:

C'est-à-dire que cette fonction indique que de nouvelles données sont arrivées, mais c'est tout.

Donc si de nouvelles données arrivent, c'est ce dont nous avons besoin, n'est-ce pas ?
Zhunko:

Je vérifie les données du serveur (MarketInfo()) par rapport à la barre zéro. J'attends qu'ils soient les mêmes. D'ailleurs, cela ne garantit pas qu'il n'y ait pas de "trou" dans l'histoire la plus proche. Il pourrait facilement manquer 1, 2 ou 3 mesures ou plusieurs mesures, et la barre de zéro sera là. Parfois, ils viennent plus tard. Parfois, ils ne le font pas.

Eh bien, oui, nous avons besoin des données de la 0ème barre. MarketInfo() tire les données de la barre de zéro, c'est tout. Pourquoi devrions-nous le vérifier avec quelque chose d'autre ?
Zhunko:

Par ailleurs, elle ne garantit pas l'absence de "trou" dans l'histoire la plus proche. Il pourrait facilement manquer 1, 2 ou 3 mesures ou plusieurs mesures et le zéro sera là. Parfois, ils viennent plus tard. Parfois, ils ne le font pas.

Même s'il y a un trou dans l'historique, cela n'affectera pas les calculs actuels. Il l'aurait fait à l'époque où il y avait un trou. C'est-à-dire que si nous obtenons le Ask actuel, nous ne nous soucions pas vraiment de ce que les prix étaient il y a plusieurs barres (je ne veux pas dire formellement, mais concernant le moment actuel concernant une certaine variable du marché, parce que la fonction RefreshRates() le fera concernant le moment actuel sur la 0ème barre !

Bien sûr, je suis en train de creuser, mais je veux comprendre comment mieux me comporter.

Vous, Vadim, avez dit que j'ai écrit la fonction incorrectement ci-dessus, je vais la dupliquer à nouveau, avec des lignes ajoutées:

double fGet_TradePrice(int fi_price,       // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
   double ld_price = 0.0;
   
   switch (fi_price)
   {
         case 0:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);
         
         case 1:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Ask;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_ASK);
   }
   
    if (ld_price != 0)
        return (ld_price);
}

Qu'est-ce qui ne va pas, à votre avis ?

 
hoz:
1. Eh bien, si de nouvelles données sont arrivées, c'est ce dont nous avons besoin, n'est-ce pas ?
2. Eh bien, oui, nous avons besoin des données de la barre 0, bien sûr. MarketInfo() tire les données de la barre de zéro, c'est tout. Alors pourquoi le comparer à autre chose ?

3. même s'il y a un trou dans l'histoire, cela n'affectera pas les calculs actuels. Cela aurait eu un impact à l'époque où le trou était là. C'est-à-dire que si nous obtenons le Ask actuel, nous ne nous soucions pas vraiment de ce que les prix étaient il y a plusieurs barres (je ne veux pas dire formellement, mais concernant le moment actuel concernant une certaine variable du marché, parce que la fonction RefreshRates() fera l'affaire concernant le moment actuel dans le temps sur la 0-ème barre !

Bien sûr, j'ai creusé en profondeur, mais je veux comprendre comment mieux me comporter.

4. Vous, Vadim, m'avez dit que j'ai écrit la fonction incorrectement ci-dessus :

double fGet_TradePrice(int fi_price,       // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
 double ld_price = 0.0;
   
switch (fi_price)
 {
  case 0:
   {
    if (fs_symbol == Symbol())
     {
      RefreshRates(); // Зачем этот тормоз без обработки возвращаемого значения?
      ld_price = Bid;
     }
    else ld_price = MarketInfo(fs_symbol, MODE_BID); // <-- Этого достаточно.
   } 
  case 1:
   {
    if (fs_symbol == Symbol())
     {
      RefreshRates(); // Зачем этот тормоз без обработки возвращаемого значения?
      ld_price = Ask;
     }
    else ld_price = MarketInfo(fs_symbol, MODE_ASK); // <-- Этого достаточно.
   }
 }
if (ld_price != 0) return(ld_price); // Некорректно! Что функция будет возвращать, если цена равна нулю?
}

À votre avis, qu'est-ce qui ne va pas ?

1. S'il n'y a pas de données, mais que nous ne savons rien à ce sujet ? Il renvoie FALSE. Comment l'évaluer ? Pas de données ou une erreur, ou y a-t-il encore des données ?
2. Vous devez vous réconcilier pour résoudre le problème du 1er point.
3. Vous ne tenez pas compte de la dynamique du processus. Allumez l'ordinateur, le terminal. Toutes les données semblent être arrivées. Tout convergeait vers la barre de zéro. Les signaux sont trouvés. L'affaire est conclue. Il s'avère que toutes les données ne sont pas arrivées. Cinq minutes plus tard, nous avons obtenu les barres manquantes avec les numéros 1,2,3,4,5. Le signal a disparu. Que faire ?

4. Je l'ai marqué en rouge. Une erreur possible de choix d'un mauvais identifiant dans le commutateur n'est pas encore traitée. J'ai écrit plus haut comment il faut procéder.

Il est inutile d'appeler RefreshRates() sans attendre le résultat. Il peut échouer pendant une longue période.