[Archive] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 2. - page 125

 
pyatka__ASD:
Pouvez-vous me dire si quelqu'un a un logiciel qui a une connexion d'extrémité zig zag haute et basse. Merci

Je ne sais pas de quelle connexion vous avez besoin, mais... C'est ainsi que je détermine dans l'EA quel est l'extremum zigzag disponible - bas ou haut, j'espère que vous trouverez ce dont vous avez besoin :

//-----------------------------------------------------------------------------------------------------------------   
   if (op==OP_BUY)
      {
         for (m=1; m<=CalcBarsLimit; m++)                      // Найдём первый перелом ЗЗ слева от первого бара
            {
               zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, m); // Берём данные 0 буфера ЗЗ с бара m
               if (zz!=0 &&                                    // Если первый экстремум верхний
                  NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 1, m), dg))
                     return(false);                            // Валим отсюда
               else if (zz!=0 &&                               // Если первый экстремум нижний
                        NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 2, m), dg)) 
                  {
                     if (MathRound((KLevel-zz)/pt)>=DistanceMIN &&         // Если расстояние от ZZ до KLevel ...
                         MathRound((KLevel-zz)/pt)<=DistanceMAX)           // ... в заданных пределах
                        {
                           if (Open[1]<KLevel && 
                               Close[1]>KLevel &&
                               pa>KLevel)
                              {
                                 Fibo0_PriceB=zz;                                   // Сохраним цену излома ZZ
                                 Fibo23_PriceB=pa;                                  // Сохраним цену 23 фибы
                     
                                 nmKLB=DoubleToStr(Time[m], 4);                     // имя метки
                                 SetArrow(5, DeepSkyBlue, nmKLB, Time[m], zz, 1);   // Отмечаем излом ЗЗ на графике
                                 return(true);
                              }
                        }       
                  }
            }
      }
//-----------------------------------------------------------------------------------------------------------------   
   if (op==OP_SELL)
      {
         for (m=1; m<=CalcBarsLimit; m++)                      // Найдём первый перелом ЗЗ слева от первого бара
            {
               zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, m); // Берём данные 0 буфера ЗЗ с бара m
               if (zz!=0 &&                                    // Если первый экстремум нижний
                  NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 2, m), dg))
                     return(false);                            // Валим отсюда
               else if (zz!=0 &&                               // Если первый экстремум верхний
                        NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 1, m), dg)) 
                  {
                     if (MathRound((zz-KLevel)/pt)>=DistanceMIN &&         // Если расстояние от ZZ до KLevel ...
                         MathRound((zz-KLevel)/pt)<=DistanceMAX)           // ... в заданных пределах
                        {
                           if (Open[1]>KLevel && 
                               Close[1]<KLevel &&
                               pb<KLevel)
                              {
                                 Fibo0_PriceS=zz;                                // Сохраним цену излома ZZ
                                 Fibo23_PriceS=pb;                               // Сохраним цену 23 фибы
                     
                                 nmKLS=DoubleToStr(Time[m], 4);                  // имя метки
                                 SetArrow(5, BurlyWood, nmKLS, Time[m], zz, 1);  // Отмечаем излом ЗЗ на графике
                                 return(true);
                              }
                        }       
                  }
            }
      }

   return(false);
}
//-------------------------------------------------------------------------------

ZS... Le code est grossier et non optimisé. J'espère que vous savez qu'il est préférable de soustraire deux valeurs normalisées et de vérifier que le résultat est nul...

 
alsu:

Vous pouvez. Retour aux paramètres.

comment ? si une variable est déclarée à l'intérieur de start, peut-on l'assigner à return_value1?
 
eddy:
comment ? si une variable est déclarée à l'intérieur de start, vous pouvez l'assigner à return_value1?

Oui. Cela s'appelle passer un paramètre par référence. Si une fonction est normalement déclarée, son appel provoque la copie de toutes les variables, passées comme paramètres formels, dans les variables locales de la fonction et leur manipulation. La copie n'est pas effectuée lorsque les paramètres sont passés par référence, c'est-à-dire que la fonction fonctionne avec leurs originaux, et non avec leurs copies. Par conséquent, toutes les modifications effectuées dans le code de fonction avec ces paramètres restent effectives après le retour du code de fonction.

Pour passer un paramètre par référence, indiquez cette méthode dans la déclaration de la fonction en mettant le signe & devant l'identifiant du paramètre requis.

 

Exemple (compiler comme un script et vérifier)

void Func1(double a)
{
   a=a*2;
}

void Func2(double &a)
{
   a=a*2;
}

int start()
{
   double a=5;

   Func1(a);
   
   Print(a); //выведет 5

   Func2(a);
   
   Print(a); //выведет 10
}
 
eddy:
5*5=5 ?))
n'est pas multiplié par 5, mais par 2. Dans le premier cas, le paramètre a est passé "par valeur" et son contenu n'est pas sauvegardé après la sortie de la fonction, dans le second cas il est passé par référence (double &a), donc la valeur modifiée, c'est-à-dire 5*2=10 sera contenue dans la variable a après la sortie de la fonction Func2.
 

cool :)

Que pensez-vous de ça ?

double a=5;

   Print(Func2(a));
 
eddy:


Que pensez-vous de ça ?

ça fait dix. Il est plus rapide de vérifier que de demander, d'ailleurs))).
 

L'ordinateur est occupé par des calculs, je ne peux donc pas le vérifier moi-même pour le moment.

Il y a un morceau de code comme celui-ci :

   if(DecreaseFactor>0){
      for(int cnt=OrdersHistoryTotal()-1; cnt>=0; cnt--){
        if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY)){ 
          if(OrderMagicNumber()==Magic){
            if(OrderSymbol()==Symbol()){
              if(OrderType()<2){ 
                  if(OrderProfit()>0) break;
                  if(OrderProfit()<0) losses++;
       } } } } } 
      if(losses>1) Lot=NormalizeDouble(Lot-Lot*losses/DecreaseFactor,1);
    }

Google a trouvé plusieurs répétitions de ce code, j'en conclus donc qu'il fonctionne.

Cependant, cette ligne

Lot=NormalizeDouble(Lot-Lot*losses/DecreaseFactor,1);

est déroutant.

Si DecreaseFactor=3 et pertes=3, alors selon la formule nous obtenons Lot=0 ! !!

Si les pertes>3, on obtientLot<0! !!

Est-ce possible ?

 
Alors, quel est le facteur de perte et de diminution ?
 
eddy:

cool :)

Que pensez-vous de ça ?

ça ne fera rien. La fonction Funk2 - ne renvoie aucune valeur. Elle est nulle.
Raison: