Uma pergunta para os especialistas em MQL - página 16

 
artmedia70:

Existe tal símbolo?

Muito obrigado!!!! Nunca teria encontrado tal falha... Eles escrevem muita porcaria em livros didáticos e eu só copio sem olhar...
 

Você poderia me dizer, por favor, onde está o erro? Por que os resultados são diferentes?

//+------------------------------------------------------------------+
//|                                                       TestFr.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double FrUpz=0;
   double FrUp1 = GetFractal("0", 0, 1, MODE_UPPER);
   double FrUp2 = GetFractal("0", 0, 2, MODE_UPPER);
   double FrUp3 = GetFractal("0", 0, 3, MODE_UPPER);
   Print("# FrUp1=",FrUp1);
   Print("# FrUp2=",FrUp2);
   Print("# FrUp3=",FrUp3);
   for(int z=1;z<=3;z++)
      {
       FrUpz = GetFractal("0", 0, z, MODE_UPPER);
       Print("z=",z," FrUpz=",FrUpz);
      } 
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru  & khorosh        |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.02.2009                                                     |
//|  Описание : Возвращает фрактал по его номеру.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер фрактала                  (    0       - последний)          |
//+----------------------------------------------------------------------------+
double GetFractal(string sy="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    i, k=iBars(sy, tf), kf;
  for (i=3; i<k; i++) {
    if(mode==MODE_LOWER){
    f=iFractals(sy, tf, MODE_LOWER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(iLow(sy,tf,i));
     } 
    }
    if(mode==MODE_UPPER){
    f=iFractals(sy, tf, MODE_UPPER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(iHigh(sy,tf,i));
      }
    }
  }
  Print("GetFractalBar(): Фрактал не найден");
  return(-1);
}

Resultado:

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=3 FrUpz=1.37083

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=2 FrUpz=1.37083

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=1 FrUpz=1.37104

2014.02.17 19:56:38.828 TestFr EURUSD,M15: # FrUp3=1.37056

2014.02.17 19:56:38.812 TestFr EURUSD,M15: # FrUp2=1.37162

2014.02.17 19:56:38.812 TestFr EURUSD,M15: # FrUp1=1.37083

 
khorosh:

Você poderia me dizer, por favor, onde está o erro? Por que os resultados são diferentes?

Resultado:

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=3 FrUpz=1.37083

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=2 FrUpz=1.37083

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=1 FrUpz=1.37104

2014.02.17 19:56:38.828 TestFr EURUSD,M15: # FrUp3=1.37056

2014.02.17 19:56:38.812 TestFr EURUSD,M15: # FrUp2=1.37162

2014.02.17 19:56:38.812 TestFr EURUSD,M15: # FrUp1=1.37083


Para facilidade de controle, a função é ligeiramente modificada para retornar o número da barra

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru  & khorosh        |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.02.2009                                                     |
//|  Описание : Возвращает фрактал по его номеру.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер фрактала                  (    0       - последний)          |
//+----------------------------------------------------------------------------+
double GetFractal(string sy="0",int tf=0,int nf=0,int mode=MODE_UPPER) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0;
   int    i,k=iBars(sy,tf),kf;
   for(i=3; i<k; i++) 
     {
      if(mode==MODE_LOWER)
        {
         f=iFractals(sy,tf,MODE_LOWER,i);
         if(f!=0) 
           {
            kf++;
//            if(kf>nf) return(iLow(sy,tf,i));
               if(kf>nf) return(i);
           }
        }
      if(mode==MODE_UPPER)
        {
         f=iFractals(sy,tf,MODE_UPPER,i);
         if(f!=0) 
           {
            kf++;
//            if(kf>nf) return(iHigh(sy,tf,i));
               if(kf>nf) return(i);
           }
        }
     }
   Print("GetFractalBar(): Фрактал не найден");
   return(-1);
  }
//+------------------------------------------------------------------+

Resultado

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: z=3 FrUpz=9.0

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: z=2 FrUpz=9.0

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: z=1 FrUpz=13.0

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: # FrUp3=24.0

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: # FrUp2=17.0

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: # FrUp1=13.0


 

Adicionada a inicialização explícita de todas as variáveis

double GetFractal(string sy="0",int tf=0,int nf=0,int mode=MODE_UPPER) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0;
   int    i=0,k=iBars(sy,tf),kf=0;
   for(i=3; i<k; i++) 
     {
      if(mode==MODE_LOWER)
        {
         f=iFractals(sy,tf,MODE_LOWER,i);
         if(f!=0) 
           {
            kf++;
//            if(kf>nf) return(iLow(sy,tf,i));
               if(kf>nf) return(i);
           }
        }
      if(mode==MODE_UPPER)
        {
         f=iFractals(sy,tf,MODE_UPPER,i);
         if(f!=0) 
           {
            kf++;
//            if(kf>nf) return(iHigh(sy,tf,i));
               if(kf>nf) return(i);
           }
        }
     }
   Print("GetFractalBar(): Фрактал не найден");
   return(-1);
  }

Resultado

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=3 FrUpz=24.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=2 FrUpz=17.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=1 FrUpz=13.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp3=24.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp2=17.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp1=13.0

Precisamos mostrar aos desenvolvedores. Algo não está certo nas funções

 

Notei que o código

Print(ChartID()," ",ChartGetInteger(ChartID(),CHART_HEIGHT_IN_PIXELS,0))

colocado no indicador produz resultados estranhos. Por exemplo, se a guia do gráfico for aberta, para a qual o indicador foi reinicializado, os resultados da altura da janela principal do gráfico estão corretos.

Entretanto, assim que eu deixar o gráfico "nativo" o resultado por alguma razão se torna igual a 75 (é claro, em outros casos os resultados podem ser diferentes), mas o valor do ID do gráfico permanece o mesmo.

Quando volto ao gráfico "nativo", os valores de altura se tornam corretos.

Um grande pedido aos desenvolvedores e àqueles "que sabem" para explicar qual é a peculiaridade aqui. É realmente o que se pretendia?! Eu não acredito nisso!

Se este for o caso, sugira o código que dá o valor de altura correto para a carta nativa quando qualquer aba estiver aberta.
 
Vinin:

Adicionada a inicialização explícita de todas as variáveis

Resultado

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=3 FrUpz=24.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=2 FrUpz=17.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=1 FrUpz=13.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp3=24.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp2=17.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp1=13.0

Precisamos mostrar aos desenvolvedores. Algo não está certo nas funções

Obrigado por prestar atenção à minha pergunta. Acontece que a causa foi apenas porque duas variáveis da função não foram explicitamente inicializadas. Terei que olhar todas as funções da Kim e consertá-la.
 

Boa tarde.

O código EA envolve o f-i da I.Kim. O que envolve chamar as bibliotecas "montadas". O código após os "parêmetros externos" é fornecido:

//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>

Entretanto, acidentalmente (após a mesma atualização do mt4 - EA não funciona) notei uma entrada estranha na janela "propriedades EA", aba "dependências":

Você pode me dizer o que significa este erro e como corrigi-lo (se ambas as bibliotecas ainda estiverem presentes na pasta Include)? O que a pasta Bibliotecas tem a ver com isso?

 
Rita:

Boa tarde.

O código EA envolve o f-i da I.Kim. O que envolve chamar as bibliotecas "montadas". O código após os "parêmetros externos" é fornecido:

Entretanto, acidentalmente (após a mesma atualização do mt4 - EA não funciona) notei uma entrada estranha na janela "propriedades EA", aba "dependências":

Você pode me dizer o que significa este erro e como corrigi-lo (se ambas as bibliotecas ainda estiverem presentes na pasta Include)? O que a pasta Bibliotecas tem a ver com isso?


stderror.mqh importa a função ErrorDescription da stdlib.ex4 library, que está localizada na pasta Libraries, junto com a fonte. Verifique se você tem este arquivo lá, se não, obtenha-o de qualquer outro terminal.
 

Ambas as pastas (Incloud e Libraries) contêm fontes stdlib. Por via das dúvidas, eu acrescentei - copiado da pasta Incloud.

Mas o erro descrito acima ainda é exibido na guia "dependências". Talvez, de alguma forma, mude a vocação destas funções: Em vez de:

//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>

Definir a chamada de alguma outra forma?

Ou será impossível usar as funções da I.Kim na última versão do mt4 agora?

 
Rita:

Ambas as pastas (Incloud e Libraries) contêm fontes stdlib. Por via das dúvidas, eu acrescentei - copiado da pasta Incloud.

Mas o erro descrito acima ainda é exibido na guia "dependências". Talvez, de alguma forma, mude a vocação destas funções: Em vez de:

Definir a chamada de alguma outra forma?

Ou será impossível usar as funções da I.Kim na última versão do mt4 agora?


Certifique-se de que haja um arquivo stdlib.ex4 executável na pasta Bibliotecas, embora pareça que não é da Kim, é um arquivo padrão da entrega.


Alternativamente, veja o que a função Kim retira dela e descubra o que está errado.