Ce que vous appelez Trailing n'en est en fait pas un, il est calculé d'une manière différente et son comportement peut être illogique.
Même si nos conceptions des termes ne coïncident pas, mais vous me comprenez, n'est-ce pas ?
J'ai résolu le problème, c'était ici :
double getLots(double newSL) {
int opnTime = 0; // время открытия трейда для цикла пересчета позицийdouble lotSum = 0;
for (int i = 0; i <= OrdersTotal()-1; i++) {
OrderSelect(i, SELECT_BY_POS);
if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) {
opnTime = OrderOpenTime();
if (OrderType() == OP_BUY) { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
if (OrderType() == OP_SELL) { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
}
}
return(lotSum);
}
Cette fonction ne prenait pas en compte toutes les transactions ouvertes, j'ai donc dû modifier les conditions de la boucle. Maintenant, ça ressemble à ça :
Cette fonction calcule la somme des profits de toutes les transactions ouvertes au niveau de prix qui lui est spécifié. Cependant, certains estiment qu'il ne tient pas compte de l'écart, et je suis d'accord avec eux. L'auteur de cet avis a suggéré cette solution :
Mais, pour être honnête, je ne le comprends pas tel qu'il écrit :
Je n'ai pas l'impression de comprendre son algorithme ; comment l'écart est considéré là ? Quelqu'un peut-il expliquer ?
OrderProfit() compte les positions courtes à l'Ask actuel, c'est là que la valeur du spread actuel est prise en compte. Si le spread ne change pas, lorsque le prix passe du Bid actuel au newSL, le profit de la position (n'importe laquelle, Achat ou Vente, avec un signe approprié) dans un lot changera de la valeur du delta, qui est écrite dans l'opérateur :
delta = ( newSL - Bid ) * TickValue ;
En bref, OrderProfit() compte tout, y compris les spreads. Nous fixons le résultat pour un certain moment ( le prix actuel) en utilisant OrderProfit(). À partir de là, il ne nous reste plus qu'à surveiller l'évolution des prix.
OrderProfit() est compté pour les positions courtes à l'Ask actuel, c'est là que les valeurs actuelles du spread sont prises en compte. Si l'écart ne change pas, lorsque le prix passe du Bid actuel au newSL, le profit d'un lot de la position (soit Achat ou Vente, avec le signe correspondant) changera de la valeur du delta, qui est écrite dans la déclaration :
delta = ( newSL - Bid ) * TickValue ;
En bref, OrderProfit() compte tout, y compris les spreads. Nous fixons le résultat pour un certain moment ( le prix actuel) en utilisant OrderProfit(). A partir de là, tout ce que nous avons à faire est de surveiller l'évolution du prix.
Je pense que je commence à comprendre, mais peut-être est-ce plus correct :
OrderProfit pour les positions courtes est calculé à partir du prix Ask, n'est-ce pas ?
À propos, MarketInfo( SymbolName, MODE_TICKVALUE) renvoie 329.02 pour la paire de devises EURUSD, c'est pourquoi cette fonction ne fonctionne pas correctement pour moi.
Mislaid: La façon dont il a été écrit est correcte. Autant le Bid bouge, autant le Ask bouge, si le spread reste inchangé.
D'après mon expérience personnelle, l'écart est généralement inchangé, et il est assez fort). Lors de mouvements brusques, j'ai vu le spread passer de 8 à 80 pips sur un chiffre à cinq.
Lors du test d'une EA, une erreur s'affiche dans le journal.
2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30 : Erreur 4002 (indice de tableau - hors de portée)
2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30 : Tentative d'ouverture d'un ordre d'achat. J'attends une réponse.
En conséquence, les commandes ne sont pas ouvertes. Comment éliminer l'erreur ? Quelles sont les raisons ?
Je serais heureux de vous aider.
Les messages du terminal ne suffisent pas à clarifier la situation, et rien ne peut vous aider si vous ne publiez pas le code de l'EA. Quelque part dans votre tableau, vous écrivez un lot de données inexistant, comme l'une des hypothèses, mais deviner n'est pas mon profil.
Ce que vous appelez Trailing n'en est en fait pas un, il est calculé d'une manière différente et son comportement peut être illogique.
Même si nos conceptions des termes ne coïncident pas, mais vous me comprenez, n'est-ce pas ?
J'ai résolu le problème, c'était ici :
Cette fonction ne prenait pas en compte toutes les transactions ouvertes, j'ai donc dû modifier les conditions de la boucle. Maintenant, ça ressemble à ça :
Cette fonction calcule la somme des profits de toutes les transactions ouvertes au niveau de prix qui lui est spécifié. Cependant, certains estiment qu'il ne tient pas compte de l'écart, et je suis d'accord avec eux. L'auteur de cet avis a suggéré cette solution :
Mais j'avoue pour être honnête, je ne le comprends pas comme il écrit :
Mais, pour être honnête, je ne le comprends pas tel qu'il écrit :
Je n'ai pas l'impression de comprendre son algorithme ; comment l'écart est considéré là ? Quelqu'un peut-il expliquer ?OrderProfit() compte les positions courtes à l'Ask actuel, c'est là que la valeur du spread actuel est prise en compte. Si le spread ne change pas, lorsque le prix passe du Bid actuel au newSL, le profit de la position (n'importe laquelle, Achat ou Vente, avec un signe approprié) dans un lot changera de la valeur du delta, qui est écrite dans l'opérateur :
delta = ( newSL - Bid ) * TickValue ;
En bref, OrderProfit() compte tout, y compris les spreads. Nous fixons le résultat pour un certain moment ( le prix actuel) en utilisant OrderProfit(). À partir de là, il ne nous reste plus qu'à surveiller l'évolution des prix.
OrderProfit() est compté pour les positions courtes à l'Ask actuel, c'est là que les valeurs actuelles du spread sont prises en compte. Si l'écart ne change pas, lorsque le prix passe du Bid actuel au newSL, le profit d'un lot de la position (soit Achat ou Vente, avec le signe correspondant) changera de la valeur du delta, qui est écrite dans la déclaration :
delta = ( newSL - Bid ) * TickValue ;
En bref, OrderProfit() compte tout, y compris les spreads. Nous fixons le résultat pour un certain moment ( le prix actuel) en utilisant OrderProfit(). A partir de là, tout ce que nous avons à faire est de surveiller l'évolution du prix.
Je pense que je commence à comprendre, mais peut-être est-ce plus correct :
OrderProfit pour les positions courtes est calculé à partir du prix Ask, n'est-ce pas ?
À propos, MarketInfo( SymbolName, MODE_TICKVALUE) renvoie 329.02 pour la paire de devises EURUSD, c'est pourquoi cette fonction ne fonctionne pas correctement pour moi.
Jusqu'à présent, j'ai décidé d'opter pour une astuce, à savoir MarketInfo(SymbolName, MODE_TICKVALUE) pour compter différemment:
Jusqu'à présent, j'ai décidé d'opter pour une astuce, à savoir MarketInfo(SymbolName, MODE_TICKVALUE) pour compter différemment:
La façon dont il a été écrit est correcte. Autant le Bid bouge, autant le Ask bouge, si le spread reste inchangé.
D'après mon expérience personnelle, l'écart est généralement inchangé, et il est assez fort). Lors de mouvements brusques, j'ai vu le spread passer de 8 à 80 pips sur un chiffre à cinq.
Un double top peut-il être codé (de manière fiable) ?
Lors du test d'un conseiller expert dans le journal, une erreur s'affiche.
2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30 : Erreur 4002 (indice de tableau - hors de portée)
2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30 : Tentative d'ouverture d'un ordre d'achat. J'attends une réponse.
En conséquence, les commandes ne sont pas ouvertes. Comment éliminer l'erreur ? Quelles sont les raisons ?
Je serais heureux de vous aider.
Lors du test d'une EA, une erreur s'affiche dans le journal.
2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30 : Erreur 4002 (indice de tableau - hors de portée)
2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30 : Tentative d'ouverture d'un ordre d'achat. J'attends une réponse.
En conséquence, les commandes ne sont pas ouvertes. Comment éliminer l'erreur ? Quelles sont les raisons ?
Je serais heureux de vous aider.