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

 
AndEv:
Bon après-midi. Il existe deux points dont les coordonnées sont (x1,y1) et (x2,y2). Comment puis-je utiliser ces deux points pour construire une fonction logarithmique avec une base de logarithme autre que naturelle ? Il semble que je doive utiliser la fonction inverse (), mais je ne sais pas comment la rendre diagonale. Si quelqu'un a été confronté à ce problème, veuillez le conseiller. Je vous en remercie d'avance.

Facile, divisez par la base de votre logarithme. Autrement dit, si vous voulez un logarithme x de degré deux, vous divisez le logarithme x par le logarithme deux, et vous obtenez le logarithme x de degré deux.
 
gyfto:

Facile, divisez par la base de votre logarithme. Autrement dit, si vous voulez un logarithme x de degré deux, vous divisez le logarithme x par le logarithme deux, et vous obtenez le logarithme x de degré deux.
Je ne comprends pas bien. Ce que je voulais dire, c'est que la fonction logarithme ordinaire de MT4 calcule uniquement le logarithme naturel d'un nombre. Il n'existe pas d'autre fonction logarithmique dans MT4. Vous pouvez utiliser la fonction inverse, c'est-à-dire MathPow, mais elle doit être reflétée sur la diagonale. Je ne peux pas penser à un moyen plus facile de le faire.
 
Fox_RM:

Puis-je préciser ce que vous entendez par "pas au prix du marché" ? Avec SELLLIMIT et BUYLIMIT, tout est correct.

Allez dans la zone d'édition et lisez ce que sont les ordres en attente... et toutes les questions disparaîtront.
 
hoz:

Vous devriez aller dans l'édition et lire ce que sont les ordres en attente... et toutes les questions disparaîtront.


Limite de vente - vendre à partir de la limite supérieure, limite d'achat - acheter à partir de la limite inférieure. Tous

C'est vrai avec les ordres en attente, ce n'est pas la question.

 
Tous vos ordres dans le code sont des ordres de marché
 
AndEv:
Je ne comprends pas bien. Ce que je voulais dire, c'est que la fonction logarithmique ordinaire de MT4 ne calcule que le logarithme naturel d'un nombre. Il n'existe pas d'autre fonction logarithmique dans MT4. Vous pouvez utiliser la fonction inverse, c'est-à-dire MathPow, mais elle doit être reflétée sur la diagonale. Je ne vois pas de moyen plus simple de le faire.


A propos de ça ?

L'inverse d'une fonction puissance est une fonction logarithmique sur la même base. Pour obtenir une fonction logarithmique sur la base a souhaitée, vous devez diviser MathLog(x) par MathLog(a).

 
gyfto:


A propos de ça ?

L'inverse d'une fonction puissance est une fonction logarithmique sur la même base. Pour obtenir une fonction logarithmique sur la base a souhaitée, divisez MathLog(x) par MathLog(a).

Oui, j'ai compris maintenant, merci.
 
hoz:
C'est plus ou moins comme ça :


Il y a quelque chose que je fais mal...

C'était comme ça :

int start()                         
  {
   int i, Counted_bars;  
//--------------------------------------------------------------------
   CurrentPoint1 = 0;
   CurrentPoint2 = 0; 
   kVol1=MarketInfo(Symbol_1, MODE_TICKVALUE)/MarketInfo(Symbol_1, MODE_TICKSIZE);
   kVol2=MarketInfo(Symbol_2, MODE_TICKVALUE)/MarketInfo(Symbol_2, MODE_TICKSIZE);
   Counted_bars=IndicatorCounted(); 
   i=Bars-Counted_bars-1;           
   while(i>=0)                     
     {
      Symbol1_Buf[i] = MACD (Symbol_1, iBarShift(Symbol_1, 0, Time[i], FALSE));
      if(Revers) Symbol2_Buf[i] = -1*MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      else Symbol2_Buf[i] = MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      
      if((Symbol1_Buf[i+1]>Symbol2_Buf[i+1] && Symbol1_Buf[i+2]<=Symbol2_Buf[i+2]) ||
         (Symbol1_Buf[i+1]<Symbol2_Buf[i+1] && Symbol1_Buf[i+2]>=Symbol2_Buf[i+2]))
         {
          CurrentPoint1 = 0;
          CurrentPoint2 = 0;
          ZeroClose1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i+1]));
          ZeroClose2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i+1]));         
         }
      
      CurrentPoint1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i])) - ZeroClose1;
      if(Revers) CurrentPoint2 = -1*(iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2);
      else CurrentPoint2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2;

      Spread_Buf[i]  = (CurrentPoint1 / MarketInfo(Symbol_1, MODE_POINT) - CurrentPoint2 / MarketInfo(Symbol_2, MODE_POINT));
                              
      Buf_Up[i] = Spread_Buf[i];     
      Buf_Dw[i] = Spread_Buf[i];  
      if(Spread_Buf[i] < Spread_Buf[i+1]) Buf_Up[i] = EMPTY_VALUE;
      if(Spread_Buf[i] > Spread_Buf[i+1]) Buf_Dw[i] = EMPTY_VALUE; 
      i--;                          
     }


C'était comme ça :

int start()                         
  {
    int i, countedBars = IndicatorCounted();
        
    for(i = Bars - countedBars;i > 0;i--)    
//--------------------------------------------------------------------
   CurrentPoint1 = 0; 
   CurrentPoint2 = 0; 
   kVol1=MarketInfo(Symbol_1, MODE_TICKVALUE)/MarketInfo(Symbol_1, MODE_TICKSIZE);
   kVol2=MarketInfo(Symbol_2, MODE_TICKVALUE)/MarketInfo(Symbol_2, MODE_TICKSIZE);
             
   while(i>=0)                 
     {
      Symbol1_Buf[i] = MACD (Symbol_1, iBarShift(Symbol_1, 0, Time[i], FALSE));
      if(Revers) Symbol2_Buf[i] = -1*MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      else Symbol2_Buf[i] = MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      
      if((Symbol1_Buf[i+1]>Symbol2_Buf[i+1] && Symbol1_Buf[i+2]<=Symbol2_Buf[i+2]) ||
         (Symbol1_Buf[i+1]<Symbol2_Buf[i+1] && Symbol1_Buf[i+2]>=Symbol2_Buf[i+2]))
         {
          CurrentPoint1 = 0;
          CurrentPoint2 = 0;
          ZeroClose1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i+1]));
          ZeroClose2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i+1]));         
         }
      
      CurrentPoint1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i])) - ZeroClose1;
      if(Revers) CurrentPoint2 = -1*(iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2);
      else CurrentPoint2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2;

      Spread_Buf[i]  = (CurrentPoint1 / MarketInfo(Symbol_1, MODE_POINT) - CurrentPoint2 / MarketInfo(Symbol_2, MODE_POINT));
                              
      Buf_Up[i] = Spread_Buf[i];     
      Buf_Dw[i] = Spread_Buf[i];  
      if(Spread_Buf[i] < Spread_Buf[i+1]) Buf_Up[i] = EMPTY_VALUE;
      if(Spread_Buf[i] > Spread_Buf[i+1]) Buf_Dw[i] = EMPTY_VALUE; 
      i--;                          
     }

Après la compilation, pas d'erreur, mais l'indicateur ne montre qu'une seule barre longue.

 
Krokus:

Après la compilation, il n'y a pas d'erreur, mais l'indicateur ne montre qu'une seule barre longue.


Je n'ai pas le temps de comprendre la logique de votre indicateur, mais je vous ai écrit comment régler correctement la boucle.

D'ailleurs, il serait utile de simplifier le code et de le rendre plus lisible. Il serait plus facile de l'analyser dans ce cas. Pour cette raison, les erreurs sont assez fréquentes. Plus le code est lisible et les noms des variables bien pensés, mieux c'est.

 
hoz:


Eh bien, je n'ai pas encore le temps d'examiner la logique de votre indicateur, mais je vous ai écrit comment régler correctement la boucle.

D'ailleurs, cela ne ferait pas de mal de simplifier le code et de le rendre plus lisible. Et il serait alors plus facile de l'analyser. C'est souvent la raison des erreurs. Plus le code est lisible, et plus les noms des variables sont précis, mieux c'est.


Je me pencherai sur la question. Merci.
Raison: