Discussione sull’articolo "Passi su Nuovi Binari: Indicatori Personalizzati in MQL5"

 

Il nuovo articolo Passi su Nuovi Binari: Indicatori Personalizzati in MQL5 è stato pubblicato:

Non elencherò tutte le nuove possibilità e funzionalità del nuovo terminale e del nuovo linguaggio. Sono numerose e alcune novità meritano la trattazione in un articolo a parte. Inoltre non c'è codice qui, scritto con programmazione orientata agli oggetti, è un argomento troppo serio per essere semplicemente menzionato in un contesto come i vantaggi aggiuntivi per gli sviluppatori. In questo articolo, considereremo gli indicatori, la loro struttura, il disegno, i tipi e i loro dettagli di programmazione rispetto a MQL4. Spero che questo articolo sia utile sia per i principianti che per gli sviluppatori esperti, forse alcuni di loro troveranno qualcosa di nuovo.

Ecco un esempio di visualizzazione dei toni, utilizzando il numero massimo di colori:

Autore: TheXpert

 

Ora non capisco una cosa, devo creare 2 buffer per avere High & Low di un altro periodo nell'indicatore????


e nell'articolo

CopiaAlto


perché le funzioni non funzionano correttamente, ad es:

//+------------------------------------------------------------------+
//| Ottenere il massimo per un dato numero di barra|
//+------------------------------------------------------------------+
doubleiHigh(stringsymbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
intcopiato=CopyHigh(simbolo,timeframe,0,Barre(simbolo,timeframe),High);
if(copiato>0 && indice<copiato) high=High[indice];
return(high);
}

 

Cosa significa "sbagliato"? Dovreste fornire esempi concreti invece di affermazioni generiche "tutto è sbagliato".

Provate a eseguire l'esempio della sezione CopyHigh():

//+------------------------------------------------------------------+
//|Alto e basso.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. | |
//| http://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#property description "Esempio di output dei valori High[i] e Low[i]"
#property description "per barre selezionate a caso".

double High[],Low[];
//+------------------------------------------------------------------+
//|| Ottenere il livello basso per un dato numero di barre.
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| Ottenere il massimo per un determinato numero di barre.
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+
//| Funzione tick dell'esperto|
//+------------------------------------------------------------------+
void OnTick()
  {
//--- visualizzare i valori alti e bassi della barra con l'indice ad ogni tick,
//--- pari al secondo di arrivo del tick
   datetime t=TimeCurrent();
   int sec=t%60;
   printf("High[%d] =%G  Low[%d] =%G",
          sec,iHigh(Symbol(),0,sec),
          sec,iLow(Symbol(),0,sec));
  }
//+------------------------------------------------------------------+

Questo è ciò che ho ottenuto, mostra tutto correttamente.



 
Rosh   :

Cosa significa "sbagliato"? Dovreste fornire esempi concreti invece di affermazioni generiche "tutto è sbagliato".

Provate a eseguire l'esempio della sezione CopyHigh():

Questo è ciò che ho ottenuto, mostra tutto correttamente.




Mi scuso per l'aspecificità delle affermazioni.

Mi sembra che se una funzione è scritta, è implicito che funzioni con parametri diversi. Altrimenti non hanno senso.

Aggiungiamo il parametro TimeFrame. E testiamo il programma con un parametro diverso, ad esempio uguale a quello attuale, ad esempio impostandolo uguale a PERIOD_D1 su un grafico giornaliero.


//+------------------------------------------------------------------+
//|Alto e basso.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. | |
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property description "Esempio di output dei valori High[i] e Low[i]"
#property description "per barre selezionate a caso".

double High[],Low[];
input ENUM_TIMEFRAMES TimeFrame;
//+------------------------------------------------------------------+
//|| Ottenere il livello basso per un dato numero di barre.
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| Ottenere il massimo per un determinato numero di barre.
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+
//| Funzione tick dell'esperto|
//+------------------------------------------------------------------+
void OnTick()
  {
//--- visualizzare i valori alti e bassi della barra con l'indice ad ogni tick,
//--- uguale al secondo di arrivo del tick
   datetime t=TimeCurrent();
   int sec=t%60;
   printf("High[%d] =%G  Low[%d] =%G",
          sec,iHigh(Symbol(),TimeFrame,sec),
          sec,iLow(Symbol(),TimeFrame,sec));
  }
//+------------------------------------------------------------------+
 
zfs   :


Mi scuso per l'aspecificità delle affermazioni.

Mi sembra che se si scrive una funzione, è implicito che essa funzioni con parametri diversi. Altrimenti non hanno senso.

Aggiungiamo il parametro TimeFrame. E testiamo il programma con un altro parametro, per esempio uguale a quello attuale, cioè, per esempio, impostandolo uguale a PERIOD_D1 su un grafico giornaliero.



Ho controllato la vostra variante: funziona correttamente. L'ho eseguita come script sul timeframe D1 con i parametri H1 e D1. I valori erano corretti (ho controllato le ultime tre barre).

 
Rosh   :


Ho controllato la tua variante - anche questa funziona correttamente. L'ho eseguita come script sul timeframe D1 con i parametri H1 e D1. I valori erano corretti (ho controllato le ultime tre barre).



Sì, funziona bene. A quanto pare, è colpa mia, intendo la direzione degli array. Ma il motivo per cui ho ottenuto dati diversi durante i test rimarrà un segreto per me. Grazie per l'attenzione. Quando si inizia qualcosa di nuovo, si hanno sempre dei dubbi.
 

Ho appena iniziato a imparare. L'ho scaricato, l'ho messo nella cartella D:/MetaTrader 5/ MQL5/Indicators.

L'ho compilato e messo sul grafico. Alcuni indicatori non mostrano nulla ((.

Dovrebbe essere così o ho fatto qualcosa di sbagliato?

Gli indicatori CrossMa.mq5, Toned_WPR.mq5 e HistogramSample.mq5 non vengono visualizzati.

gli altri funzionano

 
Rosh:

Cosa significa "sbagliato"? Dovreste fornire esempi concreti invece di affermazioni generiche "tutto è sbagliato".

Provate a eseguire l'esempio della sezione CopyHigh():

Questo è ciò che ho ottenuto, mostra tutto correttamente.



Copiare l'intero array di dati?

Penso che sia molto antieconomico copiare 1 elemento.

 

Prival:

È normale che sia così o ho sbagliato qualcosa?

Ciao, Sergei. Questo articolo è stato scritto nella foga del momento, per le prime build pubbliche. Da allora sono cambiate molte cose e forse alcuni indicatori devono essere migliorati.

Lo rivedrò non appena avrò tempo.

[Eliminato]  
I file di codice sorgente allegati e gli inserti di codice sorgente nel codice HTML sono ora completamente tradotti in portoghese per comodità.
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
Ciao e grazie per questo ottimo articolo, una domanda :
avete mai riscontrato un'anomalia per cui se definite più di un buffer con flag INDICATOR_DATA di conseguenza nel codice della vostra classe derivata iCustom ottenete sempre un -1 negativo quando cercate di recuperare i dati (con CopyBuffer/GetData) da tutti i buffer con flag INDICATOR_DATA tranne il primo?

Sono riuscito a risolvere questo problema solo definendo un solo buffer contrassegnato come INDICATOR_DATA e spostando tutti gli altri in INDICATOR_CALCULATIONS, in questo modo CopyBuffer/GetData restituiscono gli elementi copiati correttamente negli array di destinazione.