[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 129

 
borilunad:


Comme c'est simple ! M5 est ouvert et son sommet est un peu saucé et M1 en dessous montre les commentaires que vous voulez.

Comme on dit, c'est toujours mieux le matin ! Bonjour !


C'est là que sont posées les questions et que sont données les réponses concernant la mise en œuvre du logiciel.

Et vous pouvez lire les commentaires sur une feuille de papier ;)

 
Pouvez-vous me dire où se trouve l'erreur - je ne la trouve pas.
J'ai déjà réécrit le code de modification de la commande et l'erreur demeure.
J'insiste sur le fait que l'erreur ne provient pas du journal - il n'y a pas une seule erreur dans le journal.
J'ai trouvé l'erreur dans les résultats en exécutant un test.
Exemple :
J'ai ouvert une position d'achat (ordre numéro 1) au prix de 1,4654
puis dans les Résultats il est indiqué de modifier (ordre numéro 1) au prix de 1,4654 et TakeProfit 1,4752
puis dans les Résultats il est indiqué de fermer (ordre numéro 1) au prix de 1,4704 et TakeProfit 1,4752
Profit = 50.00

Exemple de position déficitaire bien que je doive fermer uniquement au TakeProfit car je n'ai pas défini de Stop Loss.
J'ai ouvert une position d'achat (ordre numéro 271) à 1,4820
et dans les Résultats il est indiqué modifier (ordre numéro 271) prix 1,4820 et TakeProfit 1,4918
et dans les Résultats il est indiqué fermer (ordre numéro 1) prix 1,4737 et TakeProfit 1,4918
Profit = - 83,46

J'ai mis un TakeProfit de 100 partout.

Je n'ai pas mis de StopLoss.

Je ne sais pas comment le réparer.

Lors de la compilation de ce code EA = 0 erreur et 0 avertissement.

J'ai utilisé ce code pour modifier les commandes :

//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0){
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);

  if (pp!=op || sl!=os || tp!=ot) {
    if (MathMod(OrderType(), 2)==0) cl=clModifyBuy;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(",er,") modifying order: ",Error(error_code));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
    }
  }
}
 
J'ai oublié de mentionner que cet EA fonctionne via une feuille de calcul Excel - le fichier Orders.csv sauvegardé dans le dossier \experts\file
 
alex12:
Pouvez-vous me dire où se trouve l'erreur - je ne la trouve pas.
J'ai déjà réécrit le code de modification de la commande et l'erreur demeure.
J'insiste sur le fait que l'erreur ne provient pas du journal - il n'y a pas une seule erreur dans le journal.
J'ai trouvé l'erreur dans les résultats pendant le test.
Exemple :
J'ai ouvert une position d'achat (ordre numéro 1) à 1.4654
Ensuite, dans les Résultats, il est dit de modifier (ordre numéro 1) le prix 1.4654 et TakeProfit 1.4752.
Ensuite, dans les résultats, il est indiqué que la clôture (ordre numéro 1) se fait au prix de 1,4704 et le TakeProfit à 1,4752.
Profit = 50.00

Un exemple de position perdante alors que je ne devrais fermer qu'au niveau du Take Profit parce que je n'ai pas fixé de Stop Loss.
J'ai ouvert une position d'achat (ordre numéro 271) à 1,4820.
Ensuite, dans les résultats, il est indiqué de modifier (ordre numéro 271) le prix 1.4820 et TakeProfit 1.4918.
Ensuite, il est indiqué que le prix de clôture (ordre numéro 1) est de 1,4737 et que le TakeProfit est de 1,4918 dans les résultats.
Bénéfice = - 83,46

J'ai mis le TakeProfit à 100 partout.

Je n'ai pas mis de StopLoss.

Je ne sais pas comment le réparer.

Lors de la compilation de ce code EA = 0 erreur et 0 avertissement.

J'ai utilisé ce code pour modifier les commandes :

Lorsque la clôture des transactions dans le testeur est écrite comme indiqué ici, il s'agit très probablement du résultat de la fonction orderclose (le TP et le SL n'ont rien à voir avec cela).
 

Veuillez m'aider à trouver les valeurs de

1 Volatilité quotidienne maximale (haut moins bas quotidien) sur les X=5derniers jours .

2 Volatilité quotidienne moyenne sur lesderniers X=130 jours

3 Et comment écrire ces valeurs dans la condition si la Volatilité journalière maximale se situe dans la plage A=75 à B=150- Volatilité journalière moyenne

double Dmax= 0.0; 
double DAvg= 0.0;
int a = 0; 
int d =d+1;  
while(a < 5) 
  { 
    Dmax = iHigh(Symbol(),PERIOD_D1,d)-iLow(Symbol(),PERIOD_D1,d); 
    a++; 
  } 
//Comment( "T ("+Dmax+")");

while(a < 130) 
   {  
 
DAvg += (iHigh(Symbol(),PERIOD_D1,d-1)-iLow(Symbol(),PERIOD_D1,d-1))/130; 
    a++; 
}
Comment( "T ("+DAvg+")");
 
sergeev:

1. Vous devez d'abord déterminer le nombre de barres dont vous avez besoin dans la fenêtre https://docs.mql4.com/ru/windows/WindowBarsPerChart.

2. Vous obtiendrez alors la date de la première barre https://docs.mql4.com/ru/windows/WindowFirstVisibleBar.

3. Connaissant cette barre initiale et le nombre de barres, parcourez ces barres et déterminez le plus haut et le plus bas d'entre elles.

4. profit


Variante 2

https://docs.mql4.com/ru/windows/WindowPriceMaxтво

https://docs.mql4.com/ru/windows/WindowPriceMinВторой variante

Je penchais pour la première option, mais je ne savais pas comment calculer le nombre de barres dans la fenêtre. La deuxième option est plus laconique.

Mais comment "attraper" les derniers max et min de la barre précédente ? Merci d'avance !

 
MK07:


Mais comment "attraper" les derniers max et min de la barre précédente ?

Il suffit de mémoriser le maximum et le minimum atteints sur la barre actuelle, et lorsqu'une nouvelle barre apparaît et devient la barre précédente, vous prenez le maximum et le minimum des variables mémorisées.

 
sergeev:

Il vous suffit de vous souvenir du maximum et du minimum atteints sur la barre actuelle, et lorsqu'une nouvelle barre apparaît et devient la barre précédente, vous prendrez le maximum et le minimum à partir des variables mémorisées.


Mais comment ? Supposons que nous attribuions une valeur maximale à la variable Z et qu'une nouvelle barre apparaisse (ce qui peut être vérifié) et que l'on attribue immédiatement une nouvelle valeur à Z, tandis que la valeur (Z-1) est "perdue". Probablement, il devrait y avoir une vérification lors de l'attribution d'une nouvelle valeur à Z (peut-être une nouvelle barre est-elle apparue), je compte sur votre professionnalisme et votre patience ! Merci pour vos efforts.
 

déclarer la variable zet comme statique, ou la déclarer dans la zone globale.

Avant de lui attribuer une nouvelle valeur, vérifiez la présence d'une nouvelle barre, et vérifiez la différence entre sa valeur et la valeur actuelle, puis attribuez-lui une nouvelle valeur.

 
smshev:
Lorsque la clôture des transactions dans le testeur est écrite comme vous l'avez indiqué, c'est très probablement le résultat de la fonction orderclose (le TP et le SL n'ont rien à voir avec cela).

Merci, mais il semble n'y avoir aucune erreur dans le code :

int CloseOrder(int ticket, double lots)
              {
               int err,i1;
               double price;
               OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
               if (lots<MarketInfo(Symbol(),MODE_MINLOT))lots=MarketInfo(Symbol(),MODE_MINLOT);
               while(i1<10)
                   {
                    RefreshRates();
                    if (OrderType()==0)price=Bid;
                    if (OrderType()==1)price=Ask;
                    if (OrderType()>1){OrderDelete(ticket);return(0);}
                    OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod);
                    err = GetLastError();
                    if (err == 0) break;
                    Print(WindowExpertName(),Symbol(),Error(err),"  при закрытии ордера");
                    Sleep(100);
                    i1++;
                   }
               return(0);
              }
Raison: