Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 66

 
Roger:

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 :

double AcountProfitEx(double Price) {
   double   ProfitSum   = 0;
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);
      if(OrderType() == OP_BUY)
      ProfitSum -= (OrderOpenPrice() - Price) * OrderLots() / Point;
      if(OrderType() == OP_SELL)
      ProfitSum += (OrderOpenPrice() - Price) * OrderLots() / Point;
   }
   return (ProfitSum);
}

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 :

double getLots(double newSL)
{
   double TickValue, delta;
   double lotSum;
   string SymbolName;
   
   SymbolName = Symbol();
   TickValue = MarketInfo( SymbolName, MODE_TICKVALUE) / Point;
   delta = ( newSL - Bid ) * TickValue;

   lotSum = 0.0; 
   for (int i = 0; i <= OrdersTotal()-1; i++)
   {
      OrderSelect(i, SELECT_BY_POS);     
      if ( OrderSymbol() == SymbolName )
      { 
         if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * delta; }
         if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * delta; }
      }
   }   
   return(lotSum);
}

Mais j'avoue pour être honnête, je ne le comprends pas comme il écrit :

L'écart n'est pas comptabilisé. Cela peut être corrigé en comptant le résultat à partir du prix actuel.
Je ne comprends pas l'algorithme qu'il a suggéré, comment le spread est-il pris en compte ? Quelqu'un peut-il m'expliquer ?
 
Mepkypuu:

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.

 
Mislaid:

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 :

if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * ((newSL - Bid) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }
if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * ((newSL - Ask) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }

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:

double GetTickValue(string CurrentQuote) {
   string AccountCurr = AccountCurrency();
   string BaseCurr = StringSubstr(CurrentQuote,0,3);
   string CurrentCurr = StringSubstr(CurrentQuote,3,3);
   
   if (CurrentCurr == AccountCurr)  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE));
   if (BaseCurr == AccountCurr)
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) / MarketInfo(CurrentQuote, MODE_BID));
   if ((CurrentCurr != AccountCurr) && (BaseCurr != AccountCurr))  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) * MarketInfo(StringConcatenate(BaseCurr,AccountCurr), MODE_BID) / MarketInfo(CurrentQuote, MODE_BID));
}
 
Mepkypuu:

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. De combien le Bid est décalé, de combien le Ask est décalé, le spread restant inchangé.
 
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.
 
Est-il possible de coder (de manière fiable) un double top?
 
001:
Un double top peut-il être codé (de manière fiable) ?
C'est possible.
 

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.

 
alexey1979621:

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.