sei sicuro che funzioni????
Una semplice compilazione solleva già la domanda
e in secondo luogo cosa restituirà questa funzione!
CopyClose(symbol,timeframe,start,count,Close); return(ArrayMaximum(Close,start,count));
copia i prezzi di chiusura nell'array Klose, copia dalla posizione "start" e il numero di "Counts" correttamente.
e restituisce l'indice dell'elemento massimo dell'array Klose partendo dalla posizione "start" e guardando solo gli elementi "count"......
qual è la vostra eresia scusate la franchezza.....
sei sicuro che funzioni????
Sì, funziona.
//+------------------------------------------------------------------+
//|test.mq5 |
//|Copyright DC2008 |
//| http://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "DC2008"
//--- Array di serie temporali
double Close[];
double Open[];
double High[];
double Low[];
long Volume[];
datetime Time[];
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'esperto|
//+------------------------------------------------------------------+
int OnInit()
{
//---
ArraySetAsSeries(Close,true);
ArraySetAsSeries(Open,true);
ArraySetAsSeries(High,true);
ArraySetAsSeries(Low,true);
ArraySetAsSeries(Volume,true);
ArraySetAsSeries(Time,true);
ArraySetAsSeries(Low,true);
//---
return(0);
}
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione dell'esperto|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Funzione tick dell'esperto|
//+------------------------------------------------------------------+
void OnTick()
{
//---
Comment(
"\niHighest",iHighest("EURUSD",PERIOD_M2,0,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,0,10,0)," Open",
"\niHighest",iHighest("EURUSD",PERIOD_M2,1,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,1,10,0)," Low",
"\niHighest",iHighest("EURUSD",PERIOD_M2,2,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,2,10,0)," High",
"\niHighest",iHighest("EURUSD",PERIOD_M2,3,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,3,10,0)," Close",
"\niHighest",iHighest("EURUSD",PERIOD_M2,4,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,4,10,0)," Volume",
"\niHighest",iHighest("EURUSD",PERIOD_M2,5,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,5,10,0)," Time",
"\n",""
);
}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iLowest(string symbol,
int tf,
int type,
int count=WHOLE_ARRAY,
int start=0)
{
ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
if(type<=0)
{
CopyOpen(symbol,timeframe,start,count,Open);
return(ArrayMinimum(Open,start,count));
}
if(type==1)
{
CopyLow(symbol,timeframe,start,count,Low);
return(ArrayMinimum(Low,start,count));
}
if(type==2)
{
CopyHigh(symbol,timeframe,start,count,High);
return(ArrayMinimum(High,start,count));
}
if(type==3)
{
CopyClose(symbol,timeframe,start,count,Close);
return(ArrayMinimum(Close,start,count));
}
if(type==4)
{
CopyTickVolume(symbol,timeframe,start,count,Volume);
return(ArrayMinimum(Volume,start,count));
}
if(type>=5)
{
CopyTime(symbol,timeframe,start,count,Time);
return(ArrayMinimum(Time,start,count));
}
//---
return(0);
}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iHighest(string symbol,
int tf,
int type,
int count=WHOLE_ARRAY,
int start=0)
{
ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
if(type<=0)
{
CopyOpen(symbol,timeframe,start,count,Open);
return(ArrayMaximum(Open,start,count));
}
if(type==1)
{
CopyLow(symbol,timeframe,start,count,Low);
return(ArrayMaximum(Low,start,count));
}
if(type==2)
{
CopyHigh(symbol,timeframe,start,count,High);
return(ArrayMaximum(High,start,count));
}
if(type==3)
{
CopyClose(symbol,timeframe,start,count,Close);
return(ArrayMaximum(Close,start,count));
}
if(type==4)
{
CopyTickVolume(symbol,timeframe,start,count,Volume);
return(ArrayMaximum(Volume,start,count));
}
if(type>=5)
{
CopyTime(symbol,timeframe,start,count,Time);
return(ArrayMaximum(Time,start,count));
}
//---
return(0);
}
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES TFMigrate(int tf)
{
switch(tf)
{
case 0: return(PERIOD_CURRENT);
case 1: return(PERIOD_M1);
case 5: return(PERIOD_M5);
case 15: return(PERIOD_M15);
case 30: return(PERIOD_M30);
case 60: return(PERIOD_H1);
case 240: return(PERIOD_H4);
case 1440: return(PERIOD_D1);
case 10080: return(PERIOD_W1);
case 43200: return(PERIOD_MN1);
default: return(PERIOD_CURRENT);
}
}
Nelle celle delle tabelle dove c'è scritto "Nessun analogo" si dovrebbe dare una breve descrizione di come queste cose sono risolte in mql5 con riferimenti a una sezione specifica della documentazione (qualcosa come, per esempio, questo: "non ha senso, perché in mql5 questo e quello").
Si dovrebbe intendere come segue: l'implementazione è troppo complicata e non è giustificata. Dopo tutto, l'obiettivo è quello di abbandonare completamente le funzioni MQL4.
Ma cercherò di tenerne conto se potrò fornire dei link a quelle funzioni MQL5 che possono essere utilizzate per fare qualcosa di simile.
Questo lo prendiamo dal TF m2. Giusto, capisco.
ma è solo una specie di lancio di polvere negli occhi. Il TF migrate ci sta dando
default: return(PERIOD_CURRENT);
da 0 bar. È strano.
Ma se proviamo a partire da 20, per esempio.
Stai cercando di confonderci di nuovo.
e simili assurdità in ogni funzione.
E perché fare la migrazione TF?
se mql5 ha tutti i TF che mql4 ha anche di più......
eresia completa =))))
Come hanno fatto i vostri moderatori a non notare una cosa del genere?
Caro Eugene, spero che non sia stato tu a controllare questo articolo.
completa eresia =))))
Come hanno fatto i vostri moderatori a non accorgersi di questo?
Caro Eugene, spero che tu non abbia controllato questo articolo.
Caro Vasily!
Grazie per i suoi commenti, le funzioni della sezione 18 sono state aggiornate. Si prega di controllare la versione attuale.
L'autore ha fatto molto lavoro, potrebbero esserci degli errori, li correggeremo insieme.
La funzione TFMigrate(int tf) è necessaria per sostituire i valori corretti dei timeframe di MQL5. Ad esempio, in MQL4 il valore numerico della costante PERIOD_H1 è 60, mentre in MQL5 il valore numerico di PERIOD_H1=16385, quindi TFMigrate(60)=16385.
Credo che gli errori siano molti di più.
perché si verificano anche in momenti così semplici, direi addirittura i più semplici.
In alcune sezioni, le funzioni vengono confrontate tra loro.
in altre, viene scritto un analogo.
non c'è un solo esempio riuscito di come implementare l'articolo,
per quanto ho capito, questo articolo è un tentativo di trasferire qualcosa da µl4.....
Il vostro atteggiamento nei confronti della verifica è sempre ammirevole.
Credo che sia il desiderio sfrenato dell'autore di gettarvi polvere negli occhi.
cosa che è certamente riuscita.
poiché conosco la vostra sensibilità nei confronti del materiale da verificare.
E se si prova con 20, per esempio.
Stai cercando di confondermi di nuovo.
e simili assurdità in ogni funzione.
E perché far migrare i TF????
se mql5 ha tutti i TF che mql4 ha anche di più......
eresia completa =)))))
Grazie per aver trovato l'errore. Mi era sfuggito che la ricerca può essere avviata da un punto diverso dalla barra dello zero. Ecco le funzioni corrette:
//+------------------------------------------------------------------+ //|test.mq5 | //|Copyright DC2008 | //| http://www.mql5.com //+------------------------------------------------------------------+ #property copyright "DC2008" //--- Array di serie temporali double Close[]; double Open[]; double High[]; double Low[]; long Volume[]; datetime Time[]; //+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'esperto| //+------------------------------------------------------------------+ int OnInit() { //--- ArraySetAsSeries(Close,true); ArraySetAsSeries(Open,true); ArraySetAsSeries(High,true); ArraySetAsSeries(Low,true); ArraySetAsSeries(Volume,true); ArraySetAsSeries(Time,true); ArraySetAsSeries(Low,true); //--- return(0); } //+------------------------------------------------------------------+ //| Funzione di deinizializzazione dell'esperto| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Funzione tick dell'esperto| //+------------------------------------------------------------------+ void OnTick() { //--- Comment(Open[0],Close[0],Open[1],Close[1], "\niHighest",iHighest("EURUSD",PERIOD_M2,0,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,0,10,20)," Open", "\niHighest",iHighest("EURUSD",PERIOD_M2,1,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,1,10,20)," Low", "\niHighest",iHighest("EURUSD",PERIOD_M2,2,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,2,10,20)," High", "\niHighest",iHighest("EURUSD",PERIOD_M2,3,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,3,10,20)," Close", "\niHighest",iHighest("EURUSD",PERIOD_M2,4,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,4,10,20)," Volume", "\niHighest",iHighest("EURUSD",PERIOD_M2,5,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,5,10,20)," Time", "\n","" ); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ int iLowest(string symbol, int tf, int type, int count=WHOLE_ARRAY, int start=0) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(type<=0) { CopyOpen(symbol,timeframe,start,count,Open); return(ArrayMinimum(Open,0,count)); } if(type==1) { CopyLow(symbol,timeframe,start,count,Low); return(ArrayMinimum(Low,0,count)); } if(type==2) { CopyHigh(symbol,timeframe,start,count,High); return(ArrayMinimum(High,0,count)); } if(type==3) { CopyClose(symbol,timeframe,start,count,Close); return(ArrayMinimum(Close,0,count)); } if(type==4) { CopyTickVolume(symbol,timeframe,start,count,Volume); return(ArrayMinimum(Volume,0,count)); } if(type>=5) { CopyTime(symbol,timeframe,start,count,Time); return(ArrayMinimum(Time,0,count)); } //--- return(0); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ int iHighest(string symbol, int tf, int type, int count=WHOLE_ARRAY, int start=0) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(type<=0) { CopyOpen(symbol,timeframe,start,count,Open); return(ArrayMaximum(Open,0,count)); } if(type==1) { CopyLow(symbol,timeframe,start,count,Low); return(ArrayMaximum(Low,0,count)); } if(type==2) { CopyHigh(symbol,timeframe,start,count,High); return(ArrayMaximum(High,0,count)); } if(type==3) { CopyClose(symbol,timeframe,start,count,Close); return(ArrayMaximum(Close,0,count)); } if(type==4) { CopyTickVolume(symbol,timeframe,start,count,Volume); return(ArrayMaximum(Volume,0,count)); } if(type>=5) { CopyTime(symbol,timeframe,start,count,Time); return(ArrayMaximum(Time,0,count)); } //--- return(0); } //+------------------------------------------------------------------+ ENUM_TIMEFRAMES TFMigrate(int tf) { switch(tf) { case 0: return(PERIOD_CURRENT); case 1: return(PERIOD_M1); case 5: return(PERIOD_M5); case 15: return(PERIOD_M15); case 30: return(PERIOD_M30); case 60: return(PERIOD_H1); case 240: return(PERIOD_H4); case 1440: return(PERIOD_D1); case 10080: return(PERIOD_W1); case 43200: return(PERIOD_MN1); default: return(PERIOD_CURRENT); } }
Credo che gli errori siano molti di più.
perché si verificano anche in momenti così semplici, direi addirittura i più semplici.
In alcune sezioni, le funzioni vengono confrontate tra loro.
in altre, viene scritto un analogo.
non c'è un solo esempio riuscito di come implementare l'articolo,
per quanto ho capito, questo articolo è un tentativo di trasferire qualcosa da µl4.....
Il vostro atteggiamento nei confronti della verifica è sempre ammirevole.
Penso che sia il desiderio sfrenato dell'autore di gettarvi polvere negli occhi.
cosa che è certamente riuscita.
poiché conosco la vostra sensibilità nei confronti del materiale oggetto di verifica.
Potrebbero esserci degli errori, il materiale è piuttosto vasto.
L'argomento del porting (più precisamente, l'argomento della scrittura di una classe emulatore con metodi MQL4) è stato affrontato in un altro articolo (speriamo che venga terminato). Nel corso della lettura del materiale, abbiamo chiesto all'autore di scrivere un articolo sotto forma di libro di riferimento per coprire tutte le funzioni di MQL4 (ad eccezione del trading - vedrete presto una delle soluzioni per loro), per fornire un analogo per ciascuna di esse in MQL5, in generale, per mettere tutto insieme in modo che coloro che riscrivono programmi MQL4 possano trovare rapidamente un analogo. Per quanto riguarda il desiderio sfrenato, se parliamo del numero di sezioni considerate, abbiamo insistito per coprire tutte le funzioni (che sono risultate essere più di 250).
Per quanto riguarda il confronto delle funzioni in alcune sezioni, non si trattava esattamente di un confronto. È stato necessario fornire un analogo, anche se è lo stesso. Per tutte le funzioni. Quindi sembra che ci sia un confronto, ma dal confronto si capisce che, per esempio, le funzioni di matematica sono le stesse. A proposito, come raccomandazione, sarebbe probabilmente utile menzionare questo all'inizio di ogni sezione, che è qualcosa da tenere d'occhio.
Per questo motivo (architettura delle funzioni dell'emulatore) l'autore ha inserito alcune cose non ovvie nell'implementazione (ad esempio, per iLowest/iHighest globali Open[]...High[]..., che in precedenza erano dichiarati globalmente e resi AsSeries in OnInit), che erano implicite come nell'emulatore, naturalmente per l'universalità delle funzioni è meglio usare array locali.
Per quanto riguarda il lavoro con gli indicatori tecnici, ci possono essere molte domande, il lavoro con essi non dovrebbe essere come in MQL4 - è meglio crearli manualmente in OnInit e fare riferimento ai descrittori, invece di crearli ogni volta nelle funzioni locali. Ma anche l'approccio proposto dall'autore funziona, perché il terminale non distrugge immediatamente gli indicatori. Ci sono quindi molte sottigliezze.
La cosa importante è che ora c'è qualcosa da discutere, se trovate degli errori (compresi quelli causati dalla struttura delle funzioni proposta) - proponete le vostre varianti.

- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Il nuovo articolo Migrazione da MQL4 a MQL5 è stato pubblicato:
Questo articolo è una guida rapida alle funzioni del linguaggio MQL4, ti aiuterà a migrare i tuoi programmi da MQL4 a MQL5. Per ogni funzione MQL4 (ad eccezione delle funzioni di trading) vengono presentate la descrizione e l'implementazione MQL5, che consente di ridurre significativamente il tempo di conversione. Per comodità, le funzioni MQL4 sono suddivise in gruppi, in modo simile a MQL4 Reference.
In MQL5, le costanti del periodo del grafico sono cambiate e sono stati aggiunti alcuni nuovi periodi di tempo (M2, M3, M4, M6, M10, M12, H2, H3, H6, H8, H12). Per convertire i periodi di tempo MQL4, è possibile utilizzare la seguente funzione:
Autore: Sergey Pavlov