[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 404

 
Bonjour à tous. J'ai une telle question. Je négocie sur plusieurs comptes (deux dans une société de courtage et un dans une autre), alors j'utilise le copieur Best, c'est très pratique. Il est installé sur un compte (l'exportateur) sur n'importe quel graphique et copié dans d'autres comptes (importateurs), où cet EA est également installé sur le même graphique (si vous le mettez, dans l'importateur, sur plusieurs graphiques, il ouvrira autant d'ordres). Une fois, lorsque j'ai voulu vérifier le travail avec l'une des sociétés de courtage et ouvrir un compte de démonstration), à un moment merveilleux, il a été spontanément installé sur plusieurs graphiques et bien sûr il a ouvert autant d'ordres. Ensuite, je n'y ai pas prêté attention et j'ai pensé qu'il s'agissait d'une défaillance du terminal de cette société de courtage. J'ai ensuite négocié pendant longtemps sur les comptes mentionnés ci-dessus et rien de tel ne s'est produit. Mais hier, juste pendant le communiqué de presse, cette situation s'est reproduite sur l'un des comptes (pour une autre société de courtage, pas celle qui a installé l'exportateur). 6 graphiques ont été placés automatiquement et le plus intéressant est que 16 ordres ont été ouverts sur un symbole. Pourquoi cela se produit-il et quelle en est la raison ? Est-ce un inconvénient du conseiller expert lui-même ou une autre raison ? Y a-t-il un moyen de le réparer ? Merci d'avance.
 
// Зачем этот тормоз без обработки возвращаемого значения?

Qui pose une telle question ?
 
hoz:

Quel est le problème selon vous ?


Ce n'est pas mauvais, c'est juste boueux.

Fin :

 if (ld_price != 0)
return (ld_price); 

Si ld_price = 0, la fonction retournera 0 par elle-même. Nous n'avons donc pas besoin d'un chèque.

Celui-ci est une panne :

 if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);

Également inutile. Vous pouvez utiliser MraketInfo() dans tous les cas.

Au final, la fonction devient la fonction MarketInfo() dans sa forme pure (si vous supprimez toutes les choses inutiles).

 

En principe, théoriquement, ce sont les bons endroits :

RefreshRates();
ld_price = Bid;
RefreshRates();
ld_price = Ask;

Nous ne nous soucions pas de ce que RefreshRates() renvoie, il est important que les variables Ask et Bid aient les dernières valeurs connues par le terminal.

 

Bonjour !

Quelle est la raison des différents résultats du testeur pour la même EA ?

La période, la paire de devises et le cadre temporel testés sont les mêmes, mais les résultats obtenus aujourd'hui sont très différents des précédents, l'EA a cessé d'ouvrir des positions longues.

Je ne sais pas si c'est la faute des cotations du terminal ou si c'est le week-end. Peut-être que les personnes bien informées peuvent m'ouvrir les yeux sur la raison évidente ?

 
skyjet:

Bonjour !

Quelle est la raison des différents résultats du testeur pour la même EA ?

La période, la paire de devises et le cadre temporel testés sont les mêmes, mais les résultats obtenus aujourd'hui sont très différents des précédents, l'EA a cessé d'ouvrir des positions longues.

Je ne sais pas si c'est la faute des cotations du terminal ou si c'est le week-end. Peut-être que les personnes bien informées peuvent m'ouvrir les yeux sur la raison évidente ?


Même deux tests effectués l'un après l'autre peuvent être différents, et ce de manière très sensible. Le courtier modifie l'écart et le test est effectué avec un écart différent. Un changement d'un point est suffisant.

S'il y a eu un test précédent il y a longtemps, les réglages se sont peut-être relâchés.

 
Zhunko:

1. S'il n'y a pas de données et qu'en même temps il y a toutes ces données, mais que nous n'en savons rien ? Il renvoie FALSE. Comment faut-il l'interpréter ? Il n'y a pas de données ou une erreur, ou il y a encore des données ?

Je ne vous comprends pas. Allons-y dans l'ordre... Nous appelons RefreshRates(), aucune donnée n'est arrivée... Mais il y a des données. Ce que nous avons ici est un désordre. Si les données ne sont pas arrivées, les données ne sont pas disponibles ou les données n'ont pas été mises à jour parce que la variable du marché n'a pas changé... Il n'y a que deux options.

S'il renvoie TRU après avoir appeléRefreshRates(), alors les données ont été mises à jour. Et s'il retourne FELS, alors soit ils n'ont pas mis à jour, parce qu'il y a une erreur, soit ils n'ont pas mis à jour, parce que les données sont fraîches et n'ont pas besoin d'être mises à jour.

Par conséquent, je comprends que cela peut être vu comme suit :RefreshRates() vérifie les données, si les données ne sont pas nouvelles, il ne met pas à jour les données qui ne sont pas nouvelles, c'est-à-dire qui n'ont pas changé, et si elles sont nouvelles, il les met à jour. Vous ne pouvez donc compter que sur l'indicateur renvoyé parRefreshRates(). Avez-vous d'autres options ?

Zhunko:

2. Vous devez effectuer un rapprochement pour résoudre le problème du 1er élément.

Tu l'as dit :

Je réconcilie les données du serveur (MarketInfo()) avec la barre zéro. J'attends qu'ils soient les mêmes.

Eh bien, MarketInfo() tire de la barre des zéro comme c'est le cas... Que voulez-vous dire par là ?

Zhunko:

3. Vous ne tenez pas compte de la dynamique du processus. J'ai allumé l'ordinateur, le terminal. Toutes les données semblent être arrivées. Tout convergeait vers le bar 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 ?

J'ai décidé de le mettre à jour à nouveau. Mais que se passe-t-il si nous appelons RefreshRates() et que les données sont mises à jour lentement ? C'est-à-dire que certains calculs seront effectués avec certaines données du marché, et d'autres avec d'autres données... Et alors ?

Zhunko:

4. Marqué en rouge. De plus, une erreur éventuelle de sélection d'un mauvais identifiant dans le commutateur n'est pas traitée. J'ai écrit plus haut comment il faut s'y prendre.

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

Hm. Eh bien, si on l'attend, la citation peut changer... Y a-t-il une rue à double sens ici ?

RefreshRates() ; // Pourquoi ce frein sans traitement de la valeur de retour ?

Vous le mentionnez plusieurs fois, mais il n'y a toujours pas de précisions. Je veux dire, autant que je vois cette fonction habituellement utilisée, c'est juste avant le code où les variables de données du marché sont utilisées et c'est tout. Ils n'y pensent pas vraiment. Mais j'y ai réfléchi, et j'ai décidé de trouver un moyen de le faire correctement. Savoir avec certitude que telle ou telle approche est effectivement correcte et qu'elle fonctionnera dans toutes les conditions normales.

Alors Vadim, que voulez-vous dire par cette expression :

"

Pourquoi ce frein sans traitement de la valeur de retour ?"

Comment peut-on les traiter ? J'ai écrit ma logique ci-dessus, mais je n'ai pas eu de réponse. Je l'ai décrit de manière assez précise et sans variantes.

 
Integer:


Ce n'est pas mauvais, c'est juste boueux.

Fin :

if (ld_price != 0)
    return (ld_price); 

Si ld_price = 0, la fonction retournera 0 par elle-même. Par conséquent, aucun contrôle n'est nécessaire.

Pourquoi je ferais ça ? Il suffit d'ajouter else, pour que la fonction renvoie une autre valeur, ce qui signifierait "Pas de prix". Ça semble logique. Quand j'ai lancé la fonction, je pensais plus à la logique précédente, puis je n'ai pas fait attention à sa fin. Et je ne comprends pas pourquoi la fonction 0 renvoie 0 par elle-même...
Entier:


C'est la répartition :

if (fs_symbol == Symbol())
{
    RefreshRates();
    ld_price = Bid;
}
else
    ld_price = MarketInfo(fs_symbol, MODE_BID);

Il n'est pas non plus nécessaire. Vous pouvez utiliser MraketInfo() dans tous les cas.

Au final, la fonction se transforme en une pure fonction MarketInfo() (si vous supprimez toutes les choses inutiles).


Et puis pourquoi demander (si nous parlons spécifiquement du prix d'achat), si nous pouvons toujours utiliser MarketInfo(fs_symbol, MODE_ASK) ? Après tout, si l'on voit les choses sous cet angle, en se référant à Ask, on ne peut pas être sûr qu'il soit exact à ce moment précis ?
 
Integer:

Peu importe ce que la fonction RefreshRates() renvoie, il est important que les variables Ask et Bid aient les dernières valeurs connues par le terminal.


En pratique, nous avons besoin d'autre chose, d'après ce que je comprends. Et nous avons besoin d'un dernier serveur Ask and Bid et non d'un terminal local. N'est-ce pas ?

C'est pourquoi j'ai lancé une discussion ici, pour comprendre une fois pour toutes comment l'organiser de manière plus logique et plus correcte. Car en théorie, c'est correct, mais en pratique...

 
hoz:
1. Pourquoi ça arriverait tout d'un coup ? Nous devons juste ajouter autre chose, cette fonction a retourné une autre valeur, ce qui signifierait, "Pas de prix". Ça semble logique. Quand j'ai lancé la fonction, je pensais plus à la logique précédente, puis je n'ai pas fait attention à sa fin. Et pourquoi la fonction 0 retournera 0 par elle-même, je ne comprends pas quelque chose...

2) Pourquoi ai-je besoin de Ask (si nous parlons spécifiquement du prix d'achat), si je peux toujours utiliser MarketInfo(fs_symbol, MODE_ASK) ? Après tout, si l'on regarde de cette façon, en se référant à Ask, on ne peut pas être sûr qu'il soit exact à un moment donné ?

1. Simple. La fonction est déclarée comme double, donc lorsqu'elle est appelée, elle renvoie le double, qu'elle appelle return ou non. Si on ajoute autre chose... mais nous ne disposons pas encore de cet autre élément.

2. Si cela ne fait aucune différence que vous appuyiez sur 3 ou 30 touches, vous n'avez pas besoin de ces offres et demandes. Si l'Expert Advisor ne fait pas de longs calculs, ce n'est pas grave, il est plus pratique d'utiliser Bid et Ask. S'il effectue de longs calculs, vous pouvez utiliser RefreshRates(). Il existe plusieurs façons de procéder.