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

 

Bonne journée à vous tous ! Si j'ai essayé de placer un stop loss sur un chalut, cela ne fonctionnerait pas dans le testeur de stratégie, mais je n'ai pas vu un tel problème. Dans le Strategy Tester, lorsque l'EA doit placer un stop loss, il ne le fait pas mais parfois il le fait, mais je n'ai pas trouvé de régularités et la précision des tests en souffre beaucoup. Le même Expert Advisor sur le dépôt de démonstration montre que le chalut fonctionne. Le terminal ne signale aucune erreur. Est-ce un bug dans le code ou un bug dans le terminal ? Pouvez-vous m'aider à le comprendre ? J'ai essayé tout le code et je ne comprends pas ce qui ne va pas, je ne veux pas changer la stratégie du sentier. J'ai joint le code complet de l'Expert Advisor et ci-dessous le code du trawl (légèrement modifié trailing on candlestick shadow par Yury Dzyuban)

void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent) {  
   int i;
   double new_extremum;

   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) {
      Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
   } 
   if (OrderType()==OP_BUY) {
      for(i=1;i<=bars_n;i++) {
         if (i==1) new_extremum = iLow(Symbol(),tmfrm,i); else if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i);
      }  
  
      if ((((new_extremum - indent*Point)>OrderStopLoss() + 1.0 * Point) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && (getLots(new_extremum) > 0))
      if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
   }
   if (OrderType()==OP_SELL) {
      for(i=1;i<=bars_n;i++) {
         if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i); else if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i);
      }         
      if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss() - 1.0 * Point) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && (getLots(new_extremum) > 0))
      if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());     
   }      
}

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);
}
Dossiers :
avalanche.mq4  12 kb
 
Dans quel délai faites-vous vos tests et avec quelle qualité ?
 

EURUSD, M1, 99%, 90%

Au début, j'ai utilisé l'historique standard des ticks, chargé avec MT, j'ai trouvé ce problème, ainsi que des lacunes inexplicables dans l'historique des cotations, donc je suis passé à Tick Data Suite, j'ai téléchargé les cotations de Dukascopy, la qualité est passée de 90 à 99, mais le problème persiste.

ZS : Probablement la même situation dans la vie réelle, ou je n'ai pas testé assez longtemps (environ 3 semaines), au cours de cette période, j'ai dû fermer manuellement plusieurs fois parce que le chalut n'était pas installé, mais je pensais que c'était parce que je devais déconnecter la machine du terminal périodiquement et que cela affectait d'une manière ou d'une autre le fonctionnement de l'EA, je l'ai récemment déplacé vers un VPS il y a peut-être une semaine et maintenant il semble que la même situation se produise

 

Le test est-il effectué sur un horizon temporel égal à la valeur de la variable tmfrm ou non ?

si ce n'est pas le cas, vous devriez vous assurer qu'il y a un historique sur le délai de tmfrm...

et le nombre de réservoirs transmis dans la variable bars_n correspond à l'horizon temporel transmis dans la variable tmfrm ?

 
keekkenen:

Le test est-il effectué sur un horizon temporel égal à la valeur de la variable tmfrm ou non ?

si ce n'est pas le cas, vous devriez vous assurer qu'il y a un historique sur le délai de tmfrm...

et le nombre de réservoirs passés dans la variable bars_n correspond à la période de temps passée dans la variable tmfrm ?


Oui, je suppose que vous avez raison, j'ai négligé le code de la fonction de quelqu'un d'autre, je ne l'ai pas regardé en profondeur et je n'ai pas pris en compte ce paramètre. En conséquence, le stop loss a été fixé pour une période différente. Merci pour votre aide.

ZS : C'est toujours comme ça : une petite chose fait que le code ne fonctionne pas comme je le voudrais.

 

Bonjour ! Qui sait ce qui se passe avec la brique rouge dans le rondin !

2013.08.05 08:00:41 '9291791' : Signal - non trouvé signal de mise à jour - 7400 en base

Il n'y a aucun problème avec mon code ! Et avec des signaux aussi ! Qu'est-ce que cela signifie ?

 
Mepkypuu:


Oui, il semble que vous ayez raison, j'ai négligé le code de la fonction de quelqu'un d'autre, je ne l'ai pas regardé en détail et je n'ai pas pris en compte ce paramètre. En conséquence, le stop loss a été fixé pour une période différente. Merci pour votre aide.

ZS : C'est toujours comme ça : une petite chose fait que le code ne fonctionne pas comme je le voudrais.


Je m'en suis réjoui trop tôt, le suivi a commencé à mieux fonctionner, mais dans l'historique, il y a encore des cas où cela ne fonctionne pas, c'est-à-dire que le problème n'est que partiellement résolu.
 
splxgf:

Fixez-vous le spread ? Parce que pendant les runs, le spread actuel est pris, mais pendant les news et le soir, il diffère du spread quotidien.

Comment réparer l'écart ? Après tout, OrderSend spécifie soit Ask soit Bid.
 
Mepkypuu:

Je n'en suis pas encore satisfait, le suivi fonctionne mieux, mais il y a encore des cas où il ne fonctionne pas, c'est-à-dire que le problème n'est que partiellement résolu.

Ce que vous appelez Trailing n'est pas vraiment Trailing, il est calculé d'une manière différente et son comportement peut être illogique.
 
Leo59:

Comment fixer l'écart ? Après tout, OrderSend spécifie soit Ask soit Bid.
Dans le testeur sous le TF !