Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 11

 
AndEv:
Buenas tardes. Hay dos puntos con coordenadas (x1,y1) y (x2,y2). ¿Cómo puedo utilizar estos dos puntos para construir una función logarítmica con una base de logaritmo distinta de la natural? Parece que tengo que usar la función inversa (), pero no sé cómo hacerla diagonal. Si alguien se ha enfrentado al problema, por favor, avise. Se lo agradezco de antemano.

Fácil, divide por la base de tu logaritmo. Es decir, si quieres un logaritmo x de grado dos, divides el logaritmo x entre el logaritmo dos, y obtienes el logaritmo x de grado dos.
 
gyfto:

Fácil, divide por la base de tu logaritmo. Es decir, si quieres un logaritmo x de grado dos, divides el logaritmo x entre el logaritmo dos, y obtienes el logaritmo x de grado dos.
No lo entiendo. Lo que quería decir es que la función regular de logaritmo en MT4 calcula sólo el logaritmo natural de un número. No hay ninguna otra función logarítmica en MT4. Se puede utilizar la función inversa, es decir, MathPow, pero hay que reflejarla en la diagonal. No se me ocurre una forma más fácil de hacerlo.
 
Fox_RM:

¿Puedo aclarar lo que quiere decir con no a precio de mercado? Con SELLLIMIT y BUYLIMIT, todo es correcto.

Ve al área de edición y lee lo que son las órdenes pendientes... y todas las preguntas desaparecerán.
 
hoz:

Deberías ir a editar y leer lo que son los pedidos pendientes... y todas las preguntas se disiparán.


Límite deventa - vender desde el borde superior, Límite de compra - comprar desde el inferior. Todo

Cierto con los pedidos pendientes, ese no es el punto.

 
Todas sus órdenes en el código son órdenes de mercado
 
AndEv:
No lo entiendo. Lo que quería decir es que la función logarítmica normal en MT4 calcula sólo el logaritmo natural de un número. No hay ninguna otra función logarítmica en MT4. Puede utilizar la función inversa, es decir, MathPow, pero tiene que ser reflejada en la diagonal. No se me ocurre una forma más fácil de hacerlo.


¿Sobre esto?

La inversa de una función potencia es una función logarítmica sobre la misma base. Para obtener una función logarítmica en la base a deseada, hay que dividir MathLog(x) entre MathLog(a).

 
gyfto:


¿Sobre esto?

La inversa de una función potencia es una función logarítmica sobre la misma base. Para obtener una función logarítmica en la base a deseada, divide MathLog(x) entre MathLog(a).

Sí, ahora lo tengo, gracias.
 
hoz:
Es más o menos así:


Algo, estoy haciendo mal...

Fue así:

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


Fue así:

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

Después de la compilación, no hay errores, pero el indicador muestra sólo una barra larga.

 
Krokus:

Después de la compilación, no hay errores, pero el indicador sólo muestra una barra larga.


No tengo tiempo para entender la lógica de su indicador, pero le escribí cómo configurar correctamente el bucle.

Por cierto, ayudaría a simplificar el código y hacerlo más legible. Sería más fácil analizarlo en este caso. Esta es a menudo la razón de los errores. Cuanto más legible sea el código y los nombres de las variables estén bien pensados, mejor.

 
hoz:


Bueno, aún no tengo tiempo de mirar la lógica de tu indicador, pero te escribí cómo configurar correctamente el bucle.

Por cierto, no estaría de más simplificar el código y hacerlo más legible. Y entonces sería más fácil analizarlo. Esta es a menudo la razón de los errores. Cuanto más legible sea el código y mejores sean los nombres de las variables, mejor.


Lo investigaré. Gracias.