Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 11

 
AndEv:
Buon pomeriggio. Ci sono due punti con coordinate (x1,y1) e (x2,y2). Come posso usare questi due punti per costruire una funzione logaritmica con una base logaritmica diversa da quella naturale? Sembra che io debba usare la funzione inversa (), ma non so come renderla diagonale. Se qualcuno ha affrontato il problema, per favore consigliatelo. Vi sono grato in anticipo.

Facile, dividi per la base del tuo logaritmo. Cioè, se volete il logaritmo x di grado due, dividete il logaritmo x per il logaritmo due, e otterrete il logaritmo x di grado due.
 
gyfto:

Facile, dividi per la base del tuo logaritmo. Cioè, se volete il logaritmo x di grado due, dividete il logaritmo x per il logaritmo due, e otterrete il logaritmo x di grado due.
Non ho capito bene. Quello che volevo dire è che la funzione di logaritmo regolare in MT4 calcola solo il logaritmo naturale di un numero. Non esiste un'altra funzione logaritmica in MT4. Potete usare la funzione inversa, cioè MathPow, ma deve essere speculare alla diagonale. Non riesco a pensare a un modo più semplice per farlo.
 
Fox_RM:

Posso chiarire cosa intende per non a prezzo di mercato? Con SELLLIMIT e BUYLIMIT, tutto è corretto.

Vai nell'area di editing e leggi cosa sono gli ordini in sospeso... e tutte le domande spariranno.
 
hoz:

Dovresti andare in modifica e leggere cosa sono gli ordini in sospeso... e tutte le domande spariranno.


Sell limit - vendere dal confine superiore, Buy limit - comprare da quello inferiore. Tutti

Giusto con gli ordini in sospeso, non è questo il punto.

 
Tutti i vostri ordini nel codice sono ordini di mercato
 
AndEv:
Non ho capito bene. Quello che volevo dire è che la funzione logaritmica regolare in MT4 calcola solo il logaritmo naturale di un numero. Non esiste un'altra funzione logaritmica in MT4. Potete usare la funzione inversa, cioè MathPow, ma deve essere speculare alla diagonale. Non riesco a pensare a un modo più semplice per farlo.


Di questo?

L'inverso di una funzione di potenza è una funzione logaritmica sulla stessa base. Per ottenere una funzione logaritmica sulla base a desiderata, è necessario dividere MathLog(x) per MathLog(a).

 
gyfto:


Di questo?

L'inverso di una funzione di potenza è una funzione logaritmica sulla stessa base. Per ottenere una funzione logaritmica sulla base a desiderata, dividete MathLog(x) per MathLog(a).

Sì, ora ho capito, grazie.
 
hoz:
È più o meno così:


Qualcosa, sto sbagliando...

Era così:

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


È andata così:

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

Dopo la compilazione, nessun errore, ma l'indicatore mostra solo una barra lunga.

 
Krokus:

Dopo la compilazione, non ci sono errori, ma l'indicatore mostra solo una barra lunga.


Non ho il tempo di capire la logica del tuo indicatore, ma ti ho scritto come impostare correttamente il ciclo.

A proposito, sarebbe utile semplificare il codice e renderlo più leggibile. Sarebbe più facile analizzarlo in questo caso. Questa è spesso la ragione degli errori. Più il codice è leggibile e i nomi delle variabili sono ben studiati, meglio è.

 
hoz:


Beh, non ho ancora il tempo di esaminare la logica del tuo indicatore, ma ti ho scritto come impostare correttamente il ciclo.

A proposito, non sarebbe male semplificare il codice e renderlo più leggibile. E poi sarebbe più facile analizzarlo. Questa è spesso la ragione degli errori. Più il codice è leggibile, e migliori sono i nomi delle variabili, meglio è.


Ci darò un'occhiata. Grazie.