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

 

S'il vous plaît, dites-moi ce que je fais mal. J'essaie de créer un indicateur simple :


  {

   int limit,i;
   double last;
   int counted_bars = IndicatorCounted();
   //---- check for possible errors
   if (counted_bars < 0) 
       return(-1);
   //---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(i=limit; i>=0; i--)
   {
      double OptClose = Close[i]*10000;
      if (MathMod(OptClose,step1)==0)
      {
      Buffer0[i] = Close[i];
      last = Close[i];
      }
      else
      Buffer0[i] = last;
   }

//----
   return(0);
  }
//+------------------------------------------------------------------+

Il fonctionne dans la fenêtre du graphique, mais lorsque j'essaie de le tester dans le conseiller expert, il dessine soit ce qu'il est, soit "aucune étape".

 
Virtuon:

S'il vous plaît, dites-moi ce que je fais mal. J'essaie de créer un indicateur simple :

Il fonctionne dans la fenêtre du graphique, mais lorsque j'essaie de le tester dans le conseiller expert, il dessine soit ce qu'il est, soit "aucune étape".

      if (MathMod(OptClose,step1)==0)
         Buffer0[i] = Close[i];
      else
         Buffer0[i] = Buffer0[i+1];
 
PapaYozh:

Je l'ai essayé. Même juste dans la fenêtre, ça ne marche pas comme ça. Apparemment, il y a une sorte d'astuce ici. Cela fonctionne de cette façon maintenant, mais c'est terriblement lent :
 for(i=WindowBarsPerChart(); i>=0; i--)
   {
      double OptClose = Close[i]*10000;
      if (MathMod(i+step1,step1)==0)
      {
      Buffer0[i] = Close[i];
      last = Close[i];
      }
      else
      Buffer0[i] = last;
      Comment(Buffer0[WindowBarsPerChart()]," ",Buffer0[0]);
   }
Ceci avec la vérification du recalcul de la dernière barre désactivée.
 

Bonjour, gourous de la programmation MQL4 ! Veuillez me dire comment cela est possible :

Un morceau de code de programme :

   LogAdd("Начинаю вычисления переменных для текущего тика ... ");  
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);           
      LogAdd("Выбираю ордер с тикетом: " + i); 
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) {    
         opnTime = OrderOpenTime();
         currentTicket = OrderTicket(); 
         currentStopLoss = OrderStopLoss();          
         LogAdd("Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - " + opnTime + ", currentTicket - " + currentTicket + ", currentStopLoss - " + currentStopLoss + ".");
      }
      if (OrderType() == OP_BUY) {         
         buyCntr ++;   
         buyOpnPrice = OrderOpenPrice();
         lotsSumBuy += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0); 
         LogAdd("Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - " + buyCntr + ", buyOpnPrice - " + buyOpnPrice + ", lotsSumBuy - " + lotsSumBuy + ".");  
      }  
      if (OrderType() == OP_SELL) {
         sellCntr ++;
         sellOpnPrice = OrderOpenPrice();
         lotsSumSell += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0);
         LogAdd("Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - " + sellCntr + ", sellOpnPrice - " + sellOpnPrice + ", lotsSumSell - " + lotsSumSell + ".");
      }  
      if (OrderType() == OP_SELLSTOP) {
         sellOpnPrice = OrderOpenPrice();         
         LogAdd("Ордер является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - " + sellOpnPrice + ".");
      }  
      if (OrderType() == OP_BUYSTOP) {
         buyOpnPrice = OrderOpenPrice();
         LogAdd("Ордер является отложенным, тип ордера - на покупку, фиксирую цену открытия: buyOpnPrice - " + buyOpnPrice + ".");
      }  
   }
   LogAdd("Вычисления переменных для текущего тика завершены."); 

Un morceau de bois pour cette section :

2013.10.2 15:59:0 - Начинаю вычисления переменных для текущего тика ... 
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 5
2013.10.2 15:59:0 - Ордер является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - 1.35250000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 4
2013.10.2 15:59:0 - Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - 1380728738, currentTicket - 93537240, currentStopLoss - 0.00000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 1, buyOpnPrice - 1.35620000, lotsSumBuy - 0.06000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 1, sellOpnPrice - 1.35250000, lotsSumSell - 0.01000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 3
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 2, sellOpnPrice - 1.35250000, lotsSumSell - 0.04000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 2
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 2, buyOpnPrice - 1.35620000, lotsSumBuy - 0.07000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 3, sellOpnPrice - 1.35250000, lotsSumSell - 0.05000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 1
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 3, buyOpnPrice - 1.35620000, lotsSumBuy - 0.08000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 4, sellOpnPrice - 1.35250000, lotsSumSell - 0.06000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 0
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 5, sellOpnPrice - 1.35250000, lotsSumSell - 0.07000000.
2013.10.2 15:59:0 - Вычисления переменных для текущего тика завершены.
La question est de savoir comment, pour la même commande, les conditions auraient pu fonctionner :
      if (OrderType() == OP_BUY) {         
          ...
      }  
      if (OrderType() == OP_SELL) {
          ...
      } 

Je ne comprends pas quelque chose, mais alors logiquement il s'avère que pour cet ordre :

OP_BUY == OP_SELL
En fait, je ne me soucie pas de savoir pourquoi cela se produit, ce qui compte c'est que sellCntr++ et buyCntr++ soient exécutés sans ambiguïté pour un certain type d'ordre ouvert, aidez-moi à corriger cela ?
 
Mepkypuu:

Bonjour, gourous de la programmation MQL4 ! Veuillez me dire comment cela est possible :

Un morceau de code de programme :

Un morceau de bois pour cette section :

La question est de savoir comment, pour la même commande, les conditions auraient pu fonctionner :

Je ne comprends pas quelque chose, mais alors logiquement il s'avère que pour cet ordre :

En fait, je me fiche de savoir pourquoi cela se produit, ce qui compte c'est que sellCntr++ et buyCntr++ soient exécutés sans ambiguïté pour un certain type d'ordre ouvert, aidez-moi à réparer ?
Comment savez-vous que c'est le même ordre ? Vous n'imprimez pas le ticket ;).... Je suis sûr que lors du chalutage, il y a un surplus de commandes ;) - L'erreur induite vient de là.
TrailingByShadows(OrderTicket(), Period(), 11, 0);  ?????????????????????????????? Вы при трале разве ордера не перебираете ?????????? 
 
VladislavVG:
Comment pouvez-vous être sûr qu'il s'agit du même ordre ? Vous n'imprimez pas le ticket ;).... J'en suis sûr : quand on chaloupe, l'ordre est suréchantillonné ;) - L'erreur induite vient de là.

Logiquement, pourquoi passerais-je en revue les commandes dans le chalut si je sais déjà quelle commande spécifique je dois chaluter ? Il n'y a pas de force brute, voici le code :

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))
      if((new_extremum - indent * Point) > OrderOpenPrice())
      if(new_extremum - indent * Point < Bid - MarketInfo(Symbol(), MODE_STOPLEVEL) * Point)
      if(AcountProfitEx(new_extremum) > ProfitSize)
      OrderModify(ticket, OrderOpenPrice(), new_extremum - indent * Point, OrderTakeProfit(), OrderExpiration());
   }
   
   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)) 
      if ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point) < OrderOpenPrice())                          
      if ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point > Ask + MarketInfo(Symbol(),MODE_STOPLEVEL) * Point)) 
      if (AcountProfitEx(new_extremum) > ProfitSize)
      OrderModify(ticket, OrderOpenPrice(), new_extremum + (indent + MarketInfo(Symbol(), MODE_SPREAD)) * Point, OrderTakeProfit(), OrderExpiration());
   }      
}
PS : A propos, ce problème ne se produit qu'en conditions réelles, c'est-à-dire qu'il n'est pas reproduit dans le testeur.
 
Chers programmeurs, pourriez-vous me dire pourquoi lorsque j'ai redémarré mon ordinateur, lorsque j'ai ouvert le terminal au lieu d'un graphique normal, j'ai vu une fenêtre grise et j'ai perdu les positions ouvertes, EA, indicateurs, mais lorsque j'ai ouvert un nouveau graphique, les positions sont apparues, mais il n'y avait pas d'EA et d'indicateurs, j'ai dû les installer à nouveau. Qu'est-ce que ça a à voir avec ça ? J'ai dû les installer à nouveau. Merci.
 

Un tel problème s'est posé. Le testeur de stratégie ne fonctionne qu'une fois. Plus précisément, le test de visualisation est déclenché une fois, et les fois suivantes où vous appuyez sur le bouton "start", la case "visualisation" est remise à zéro et rien ne se passe (en quelque sorte ne se passe pas). Comment peut-on vaincre cela ?

 
Mepkypuu:

Logiquement, pourquoi passerais-je en revue les commandes dans le chalut si je sais déjà quelle commande spécifique je dois chaluter ? Il n'y a pas de force brute, voici le code :

PS : A propos, ce problème ne se produit qu'en conditions réelles, c'est-à-dire qu'il n'est pas reproduit dans le testeur.


Essayez de l'exécuter dans cette variante :

   LogAdd("Начинаю вычисления переменных для текущего тика ... ");  
   for (int i = OrdersTotal()-1; i >= 0; i--) 
   {
      if(!OrderSelect(i, SELECT_BY_POS)) continue;           
      int OrdType=OrderType() ;
      int OrdTckt = OrderTicket(); 
      LogAdd("Выбираю ордер ( "+i+" ) с тикетом: " + OrdTckt); 
      if ((OrderOpenTime() > opnTime) && (OrdType == OP_BUY) || (OrdType == OP_SELL)) {    
         opnTime = OrderOpenTime();
         currentTicket = OrderTicket(); 
         currentStopLoss = OrderStopLoss();          
         LogAdd("Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - " + opnTime + ", currentTicket - " + currentTicket + ", currentStopLoss - " + currentStopLoss + ".");
      }
      if (OrdType == OP_BUY) 
      {         
         buyCntr ++;   
         buyOpnPrice = OrderOpenPrice();
         lotsSumBuy += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0); 
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - " + buyCntr + ", buyOpnPrice - " + buyOpnPrice + ", lotsSumBuy - " + lotsSumBuy + ".");  
      }  
      if (OrdType== OP_SELL) 
      {
         sellCntr ++;
         sellOpnPrice = OrderOpenPrice();
         lotsSumSell += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0);
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - " + sellCntr + ", sellOpnPrice - " + sellOpnPrice + ", lotsSumSell - " + lotsSumSell + ".");
      }  
      if (OrderType() == OP_SELLSTOP) 
      {
         sellOpnPrice = OrderOpenPrice();         
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - " + sellOpnPrice + ".");
      }  
      if (OrderType() == OP_BUYSTOP) 
      {
         buyOpnPrice = OrderOpenPrice();
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" является отложенным, тип ордера - на покупку, фиксирую цену открытия: buyOpnPrice - " + buyOpnPrice + ".");
      }  
   }
   LogAdd("Вычисления переменных для текущего тика завершены."); 

Voyez ce que le journal dira.

 
Est-il possible de définir l'indentation de manière programmatique, sans passer par le modèle ? Je peux obtenir la taille de l'indentation par
WindowBarsPerChart() - WindowFirstVisibleBar() - 2;

vous pouvez, mais comment l'exposer.

Ajouté

Il semble que vous puissiez le faire de manière programmatique par le biais de modèles. Créer un modèle avec un indicateur, avec _lread kernel32.dll lire la valeur shift_size, avec _lwrite y écrire un nombre de 10 à 50, comme de telles plages peuvent accepter ce paramètre, puis par InternalMsg charger un modèle. Mais nous ne savons pas si c'est 33511 ou 35511. Dans WinUser32.mqh, c'est la première option, tandis que dans le forum, c'est la deuxième. La question doit être adressée à Junko. C'est beaucoup plus facile dans MT5. CHART_SHIFT_SIZE y est disponible via ChartSetString() et ChartGetString() à n'importe quel endroit du code... Peut-être existe-t-il d'autres options dans MT4 ? Question stupide, cependant...