Una domanda per gli esperti di MQL - pagina 16

 
artmedia70:

Esiste un tale simbolo?

Grazie mille!!! Non avrei mai trovato un tale difetto... Scrivono un sacco di stronzate nei libri di testo, e io sto solo copiando senza guardare...
 

Potresti dirmi dove si trova l'errore? Perché i risultati sono diversi?

//+------------------------------------------------------------------+
//|                                                       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);
}

Risultato:

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:

Potresti dirmi dove si trova l'errore? Perché i risultati sono diversi?

Risultato:

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


Per facilità di controllo, la funzione è leggermente modificata per restituire il numero di 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);
  }
//+------------------------------------------------------------------+

Risultato

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


 

Aggiunta l'inizializzazione esplicita di tutte le variabili

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

Risultato

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

Necessità di mostrare agli sviluppatori. C'è qualcosa che non va nelle funzioni

 

Ho notato che il codice

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

inserito nell'indicatore produce strani risultati. Per esempio, se la scheda del grafico è aperta, alla quale l'indicatore è stato reimpostato, i risultati dell'altezza della finestra principale del grafico sono corretti.

Tuttavia, appena esco dal grafico "nativo" il risultato per qualche motivo diventa uguale a 75 (naturalmente, in altri casi i risultati possono essere diversi), ma il valore di Chart ID rimane lo stesso.

Quando ritorno al grafico "nativo", i valori di altezza diventano corretti.

Una grande richiesta agli sviluppatori e agli "addetti ai lavori" di spiegare quale sia la particolarità qui. È davvero il modo in cui è stato concepito?! Non ci credo!

Se questo è il caso, per favore suggerisci il codice che dà il corretto valore di altezza per il grafico nativo quando qualsiasi scheda è aperta.
 
Vinin:

Aggiunta l'inizializzazione esplicita di tutte le variabili

Risultato

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

Necessità di mostrare agli sviluppatori. C'è qualcosa che non va nelle funzioni

Grazie per aver prestato attenzione alla mia domanda. Si è scoperto che la causa era solo perché due variabili nella funzione non erano inizializzate esplicitamente. Dovrò guardare tutte le funzioni di Kim e sistemarle.
 

Buon pomeriggio.

Il codice EA coinvolge la f-i di I.Kim. Il che implica chiamare le librerie "montate". Il codice dopo i "paremetri esterni" è fornito:

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

Tuttavia, accidentalmente (dopo lo stesso aggiornamento di mt4 - EA non funziona) ho notato una strana voce nella finestra "proprietà EA", scheda "dipendenze":

Potete dirmi cosa significa questo errore e come risolverlo (se entrambe le librerie sono ancora presenti nella cartella Include)? Cosa c'entra la cartella Librerie?

 
Rita:

Buon pomeriggio.

Il codice EA coinvolge la f-i di I.Kim. Il che implica chiamare le librerie "montate". Il codice dopo i "paremetri esterni" è fornito:

Tuttavia, accidentalmente (dopo lo stesso aggiornamento di mt4 - EA non funziona) ho notato una strana voce nella finestra "proprietà EA", scheda "dipendenze":

Potete dirmi cosa significa questo errore e come risolverlo (se entrambe le librerie sono ancora presenti nella cartella Include)? Cosa c'entra la cartella Librerie?


stderror.mqh importa la funzione ErrorDescription dalla libreria stdlib.ex4, che si trova nella cartella Libraries, insieme al sorgente. Controllate se avete questo file lì, altrimenti prendetelo da qualsiasi altro terminale.
 

Entrambe le cartelle (Incloud e Libraries) contengono sorgenti stdlib. Per sicurezza, ho aggiunto-copiato dalla cartella Incloud.

Ma l'errore descritto sopra viene ancora visualizzato nella scheda "dipendenze". Forse cambiare in qualche modo la chiamata di queste funzioni: Invece di:

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

Impostare la chiamata in qualche altro modo?

O sarà impossibile utilizzare le funzioni di I.Kim nell'ultima versione di mt4 ora?

 
Rita:

Entrambe le cartelle (Incloud e Libraries) contengono sorgenti stdlib. Per sicurezza, ho aggiunto-copiato dalla cartella Incloud.

Ma l'errore descritto sopra viene ancora visualizzato nella scheda "dipendenze". Forse cambiare in qualche modo la chiamata di queste funzioni: Invece di:

Impostare la chiamata in qualche altro modo?

O sarà impossibile utilizzare le funzioni di I.Kim nell'ultima versione di mt4 ora?


Assicurati che ci sia il file eseguibile stdlib.ex4 nella cartella Libraries, anche se sembra che non sia di Kim, è un file standard di consegna.


In alternativa, vedere cosa prende la funzione Kim e capire cosa c'è di sbagliato.