Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 11

 
AndEv:
Boa tarde. Há dois pontos com coordenadas (x1,y1) e (x2,y2). Como posso usar esses dois pontos para construir uma função logarítmica com uma base logarítmica diferente da natural? Parece que preciso usar a função inversa (), mas não sei como torná-la diagonal. Se alguém tiver enfrentado o problema, por favor, avise. Agradeço antecipadamente.

Fácil, divida pela base de seu logaritmo. Isto é, se você quiser logaritmo x de grau dois, você divide logaritmo x por logaritmo dois, e você obtém logaritmo x de grau dois.
 
gyfto:

Fácil, divida pela base de seu logaritmo. Isto é, se você quiser logaritmo x de grau dois, você divide logaritmo x por logaritmo dois, e obtém logaritmo x de grau dois.
Eu não entendo bem. O que eu quis dizer foi que a função logarítmica regular em MT4 calcula apenas o logaritmo natural de um número. Não há outra função logarítmica no MT4. Você pode usar a função inversa, ou seja, MathPow, mas ela precisa ser espelhada na diagonal. Não consigo pensar em uma maneira mais fácil de fazer isso.
 
Fox_RM:

Posso esclarecer o que se entende por não a preço de mercado? Com SELLLIMIT e BUYLIMIT, tudo está correto.

Vá para a área de edição e leia o que são ordens pendentes... e todas as perguntas desaparecerão.
 
hoz:

Você deve ir para editar e ler o que são ordens pendentes... e todas as perguntas desaparecerão.


Vender limite - vender a partir da borda superior, Comprar limite - comprar a partir da borda inferior. Todos

A questão não é essa, com as ordens pendentes.

 
Todas as suas ordens no código são ordens de mercado
 
AndEv:
Eu não entendo bem. O que eu quis dizer foi que a função logarítmica regular em MT4 calcula apenas o logaritmo natural de um número. Não há outra função logarítmica no MT4. Você pode usar a função inversa, ou seja, MathPow, mas ela tem que ser espelhada na diagonal. Não consigo pensar em uma maneira mais fácil de fazer isso.


Sobre isto?

O inverso de uma função de potência é uma função logarítmica na mesma base. Para obter uma função logarítmica na base desejada a, você precisa dividir MathLog(x) por MathLog(a).

 
gyfto:


Sobre isto?

O inverso de uma função de potência é uma função logarítmica na mesma base. Para obter uma função logarítmica na base desejada a, divida MathLog(x) por MathLog(a).

Sim, agora eu entendi, obrigado.
 
hoz:
É mais ou menos assim:


Algo, eu estou fazendo errado...

Foi assim:

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


Foi assim:

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

Após a compilação, nenhum erro, mas o indicador mostra apenas uma barra longa.

 
Krokus:

Após a compilação, não há erros, mas o indicador mostra apenas uma barra longa.


Não tenho tempo para entender a lógica de seu indicador, mas escrevi-lhe como definir corretamente o laço.

A propósito, isso ajudaria a simplificar o código e torná-lo mais legível. Neste caso, seria mais fácil analisá-lo. Esta é muitas vezes a razão dos erros. Quanto mais legível o código e os nomes bem pensados das variáveis, melhor.

 
hoz:


Bem, ainda não tenho tempo para analisar a lógica de seu indicador, mas escrevi-lhe como definir corretamente o laço.

A propósito, não faria mal em simplificar o código e torná-lo mais legível. E então seria mais fácil analisá-lo. Esta é muitas vezes a razão dos erros. Quanto mais legível o código, e quanto melhores os nomes das variáveis, melhor.


Vou investigar isso. Obrigado.