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

 
Forexman77:
Comment faire pour que le programme sorte le niveau EMA comme le prix ? Supposons que EMA1 avec la période (1), EMA2 avec la période (0), EMA1 égale 1.3321, EMA2 pour la période actuelle 1.3200. Le résultat de l'expression (EMA1 à EMA2) doit être de 0,0121. Lorsque j'exécute le script, l'alerte affiche zéro, alors que j'ai besoin de "0.0121". Comment résoudre ce problème ?

Est-il possible de voir le script lui-même ? - Il est probable que vous ayez un mauvais type de données, par exemple un entier au lieu d'un double (ce qui fait qu'il est arrondi à zéro), ou quelque chose d'autre qui provoque un zéro : c'est difficile à comprendre sans le code.

A propos, si vous vérifiez ce que vous avez écrit auparavant avec le script, l'erreur peut être soit dans le script lui-même (vraisemblablement écrit juste pour vérifier votre indicateur), soit dans le code de l'indicateur lui-même.

 
TarasBY:
Si vous avez correctement filtré vos ordres, ce que je vous ai suggéré de faire, et si vous incluez les commissions et les swaps dans vos calculs, alors tout fonctionne correctement.


Vous avez dû donner un chemin très compliqué.

ça ne marche pas pour moi.


J'ai stupidement inséré ce qui suit dans votre échantillon :

ld_Profit = fGet_ProfitLastCloseOrd (12);    
Print (ld_Profit);

Il donne des chiffres, mais ils sont loin de la réalité.

Pourriez-vous m'indiquer où je dois entrer le chiffre 12 pour que cela fonctionne ? Parce que je ne connais pas du tout le "filtrage des commandes" .....

 
lottamer:


Vous avez dû donner un moyen très compliqué.

ça ne marche pas pour moi.


J'ai stupidement inséré ce qui suit dans votre échantillon :

Il donne des chiffres, mais ils sont loin de la réalité.

Pourriez-vous m'indiquer où je dois entrer le chiffre 12 pour que cela fonctionne ? Parce que je ne connais pas du tout le "filtrage des commandes". ....

J'ai fait tous les calculs intermédiaires sur le graphique pour avoir un meilleur contrôle du fonctionnement de la fonction.

Il ne vous reste plus qu'à écrire le code.

Vous avez deux possibilités : soit le comprendre vous-même (par des exemples - je vous ai donné un script de travail), soit trouver quelqu'un qui le fera pour vous.

P.S. Si vous voulez soudainement le comprendre, vous pouvez commencer par ici.

 
Chiripaha:

Est-il possible de voir le script lui-même ? - Il est probable que vous ayez un mauvais type de données, par exemple un entier au lieu d'un double (ce qui fait qu'il est arrondi à zéro), ou quelque chose d'autre qui provoque un zéro : c'est difficile à comprendre sans le code.

À propos, si vous écrivez un script comme vous l'avez fait auparavant, l'erreur peut se trouver soit dans le script lui-même (vraisemblablement écrit pour tester votre indicateur), soit dans le code de l'indicateur lui-même.


Vous avez raison, j'ai supprimé EMA de int à double et tout est comme il se doit.
 
TarasBY:

Pour un contrôle total de la fonction, tous les calculs intermédiaires sont affichés sur le graphique.

Il ne vous reste plus qu'à écrire le code.

Il y a deux façons de procéder : soit vous vous débrouillez tout seul (en utilisant des exemples - je vous ai donné un script de travail), soit vous trouvez quelqu'un pour le faire à votre place.

P.S. Si vous voulez soudainement comprendre, vous pouvez commencer par ici.


Merci, je vais certainement essayer de trouver une solution.
 
Forexman77:
Comment puis-je faire en sorte que le programme affiche le niveau de l'EMA sous forme de prix ? Supposons que l'EMA1 avec la période (1), l'EMA2 avec la période (0), l'EMA1 est 1.3321 et l'EMA2 est 1.3200 pour la période actuelle. Le résultat de l'expression (EMA1 à EMA2) doit être de 0,0121. Lorsque j'exécute le script, l'alerte affiche zéro, alors que j'ai besoin de "0.0121". Comment résoudre ce problème ?

Utilisez des variables de type double au lieu de int dans les calculs ;

utiliser NormalizeDouble(nombre1-nombre2, la précision souhaitée) lors du calcul du résultat de l'expression ;

utiliser DoubleToStr(le résultat obtenu, la précision souhaitée) pour afficher le résultat à l'écran (dans le journal) ;

Il n'y a rien d'autre à suggérer sans votre code...

 
Forexman77:
Vous avez raison, j'ai supprimé l'EMA de int à double et tout est comme il se doit.

Ici, nous l'avons déjà trouvé... Quoi qu'il en soit, notez que pour éviter les erreurs cachées et les imprécisions, utilisez la normalisation lorsque vous comparez et calculez des données de type double.
 
Chiripaha:

Bottom line : Bien sûr, on pourrait, par intérêt, vous demander de décrire les conditions de manière plus détaillée, puisque vous n'avez fourni qu'une description générale : quand les ordres du robot ont-ils été fixés (à l'avance ou non ; manuellement à peu près en même temps que le robot ou non, etc.) Mais de toute façon, même dans ce cas, vous n'aurez à traiter qu'avec votre courtier, car il a son propre fil de discussion qui met probablement les transactions en attente. Supposons que l'ordre manuel en attente ait été placé en premier, le moment de son exécution sera différent (y compris la file d'attente des autres clients), et le prix peut donc être différent. Si le robot a placé les ordres dans la période des signaux formés, alors l'arrivée des ordres dans la file d'attente n'est pas évidente - d'où le biais possible dans le prix d'exécution. De plus, elle peut être affectée par la taille des positions sur lesquelles vous n'écrivez rien... etc...

Mais... tout de même, cela ne peut être clarifié qu'avec un courtier (DC). Et je suppose qu'il trouvera un tas de raisons que je n'ai pas mentionnées. - Et le conseil était juste : le journal dans vos mains et au courtier, sauf si bien sûr vous pensez toujours que vos ordres en attente ont bougé. Mais il ne faut pas confondre deux concepts différents : un ordre en attente et une transaction sur cet ordre en attente. L'ordre à cours limité est une instruction d'entrer sur le marché à tout prix le plus proche avec un volume déclaré. Et le Deal - est le prix auquel il a été possible d'exécuter votre ordre pour le volume d'argent (lot) déclaré. - Et les prix de ces commandes sont susceptibles d'être différents (notamment sur le marché rapide, dont on vous a donné le lien). Pour les ordres à cours limité, le prix de l'ordre et le prix d'exécution sont égaux (par définition).

Et le fait que la démo et le courtier réel ne diffèrent pas l'un de l'autre est une bonne chose ! - Cela montre que le courtier ne truque pas les transactions pour attirer les clients (d'après vos propos). - Il n'y a pas de divergence à constater dans ce cas.


Merci pour cette réponse si détaillée, tout devient clair. Si nous utilisons le système d'exécution instantanée, ce problème sera-t-il résolu ?

Qu'en est-il des conditions que je n'ai pas mentionnées :

Le robot a placé des ordres plus tôt que les ordres placés manuellement, mais ils ont été modifiés avant les nouvelles.

Le volume des transactions est resté le même, les distances sont à peu près les mêmes.

en général, les conditions étaient presque exactement les mêmes.

 
TarasBY:
Le jour actuel commence au début de la barre D1 actuelle (iTime (NULL, PERIOD_D1, 0)), mais vous ne cherchez pas la facilité ! :)))


Voilà le problème.

Tout fonctionne, mais seulement UNE fois. Par exemple, si je fixe la période (iTime (NULL, PERIOD_D1, 0)) d'un jour, cela ne fonctionne pas le jour suivant.

écrit un code de test pour tester

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_M1, 0));  

if  (GetProfitFromDateInCurrency()<1 && GetProfitFromDateInCurrency()>-1)
    { My_buy ();  My_close(); }
поставил период МИНУТКИ, так чтобы за минуту слить доллар на спреде и остановиться, ДО НАЧАЛА ВТОРОЙ МИНУТЫ. И он льет и останавливается. А вот почему на второй минуте он не открывает сделок? 
 
Comment trouver l'élément maximal dans la première dimension d'un tableau à quatre dimensions?