Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 11

 
AndEv:
Guten Tag. Es gibt zwei Punkte mit den Koordinaten (x1,y1) und (x2,y2). Wie kann ich diese beiden Punkte verwenden, um eine logarithmische Funktion mit einer anderen Logarithmusbasis als der natürlichen zu konstruieren? Es scheint, als müsste ich die Umkehrfunktion () verwenden, aber ich weiß nicht, wie ich sie diagonal machen kann. Falls jemand mit diesem Problem konfrontiert wurde, bitte ich um Rat. Ich bin Ihnen im Voraus dankbar.

Ganz einfach: Teilen Sie durch die Basis Ihres Logarithmus. Das heißt, wenn man einen Logarithmus x zweiten Grades sucht, teilt man den Logarithmus x durch den Logarithmus zwei und erhält den Logarithmus x zweiten Grades.
 
gyfto:

Ganz einfach: Teilen Sie durch die Basis Ihres Logarithmus. Das heißt, wenn man einen Logarithmus x zweiten Grades sucht, teilt man den Logarithmus x durch den Logarithmus zwei und erhält den Logarithmus x zweiten Grades.
Ich verstehe das nicht ganz. Was ich meinte, war, dass die reguläre Logarithmusfunktion in MT4 nur den natürlichen Logarithmus einer Zahl berechnet. Es gibt keine andere logarithmische Funktion in MT4. Sie können die Umkehrfunktion, z. B. MathPow, verwenden, aber sie muss an der Diagonale gespiegelt werden. Ich kann mir keinen einfacheren Weg vorstellen.
 
Fox_RM:

Darf ich erklären, was Sie mit "nicht zum Marktpreis" meinen? Mit SELLLIMIT und BUYLIMIT ist alles richtig.

Gehen Sie in den Bearbeitungsbereich und lesen Sie, was ausstehende Aufträge sind... und alle Fragen werden verschwinden.
 
hoz:

Sie sollten auf Bearbeiten gehen und lesen, was ausstehende Aufträge sind... und alle Fragen werden verschwinden.


Verkaufslimit - Verkauf ab der oberen Grenze, Kauflimit - Kauf ab der unteren Grenze. Alle

Das mit den ausstehenden Aufträgen stimmt, darum geht es nicht.

 
Alle Ihre Aufträge im Code sind Marktaufträge
 
AndEv:
Ich verstehe das nicht ganz. Was ich meinte, war, dass die reguläre logarithmische Funktion in MT4 nur den natürlichen Logarithmus einer Zahl berechnet. Es gibt keine andere logarithmische Funktion in MT4. Sie können die Umkehrfunktion, d. h. MathPow, verwenden, aber sie muss an der Diagonale gespiegelt werden. Ich kann mir keinen einfacheren Weg vorstellen.


Und das hier?

Die Umkehrung einer Potenzfunktion ist eine logarithmische Funktion auf derselben Grundlage. Um eine logarithmische Funktion auf der gewünschten Basis a zu erhalten, müssen Sie MathLog(x) durch MathLog(a) dividieren.

 
gyfto:


Und das hier?

Die Umkehrung einer Potenzfunktion ist eine logarithmische Funktion auf derselben Grundlage. Um eine logarithmische Funktion auf der gewünschten Basis a zu erhalten, teilen Sie MathLog(x) durch MathLog(a).

Ja, jetzt habe ich es verstanden, danke.
 
hoz:
Es ist mehr oder weniger wie folgt:


Irgendetwas mache ich falsch...

Es war folgendermaßen:

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--;                          
     }


Das ging so:

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--;                          
     }

Nach dem Kompilieren keine Fehler, aber der Indikator zeigt nur einen langen Balken an.

 
Krokus:

Nach dem Kompilieren treten keine Fehler auf, aber der Indikator zeigt nur einen langen Balken an.


Ich habe keine Zeit, um die Logik Ihres Indikators zu verstehen, aber ich schrieb Ihnen, wie Sie die Schleife richtig einstellen.

Übrigens würde es helfen, den Code zu vereinfachen und lesbarer zu machen. In diesem Fall wäre es einfacher, sie zu analysieren. Dies ist häufig der Grund für Fehler. Je lesbarer der Code und je durchdachter die Namen der Variablen sind, desto besser.

 
hoz:


Nun, ich habe noch keine Zeit, die Logik Ihres Indikators zu untersuchen, aber ich habe Ihnen geschrieben, wie Sie die Schleife richtig einstellen.

Übrigens könnte es nicht schaden, den Code zu vereinfachen und lesbarer zu machen. Und dann wäre es einfacher, sie zu analysieren. Dies ist häufig der Grund für Fehler. Je besser der Code lesbar ist und je besser die Namen der Variablen sind, desto besser.


Ich werde mich damit befassen. Ich danke Ihnen.