Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 178

 
Andrey Dik:

Sì, grazie!

No, ma grazie lo stesso).
Non pensavo che si potesse inceppare così... :-)))
 

Buona sera.

Quando si usa iOpen viene specificato uno spostamento. Se non c'è abbastanza storia per il traslatore specificato, viene restituito l'iOpen della barra più vecchia.

Domanda: Come posso fare un controllo per una barra con il cambio specificato? E se non c'è abbastanza storia, non restituire iOpen?

 
Sergey:

Buona sera.

Quando si usa iOpen viene specificato uno spostamento. Se non c'è abbastanza storia per il traslatore specificato, viene restituito l'iOpen della barra più vecchia.

Domanda: Come posso fare un controllo per una barra con il cambio specificato? E se non c'è abbastanza storia, perché iOpen non dovrebbe essere restituito?


CopyOpen

La funzione riceve i dati storici dei prezzi di apertura delle barre per una coppia simbolo-periodo specificata nell'array open_array nella quantità specificata. Va notato che il conteggio degli elementi dalla posizione di partenza viene eseguito dal presente al passato, cioè la posizione di partenza uguale a 0 significa la barra attuale.


Quando si copia una quantità sconosciuta di dati, si raccomanda di usare un array dinamico come array di destinazione, perché se i dati sono meno (o più) di quelli che l'array può contenere, verrà fatto un tentativo di rimescolare l'array in modo che i dati richiesti possano essere copiati nella loro interezza.

Se è necessario copiare una quantità nota di dati, è meglio copiarli in un buffer allocato staticamente per evitare un'inutile sovrallocazione della memoria.

Indipendentemente dalla proprietà as_series=true o as_series=false dell'array ricevente, i dati saranno copiati in modo che l'elemento più vecchio sia all'inizio della memoria fisica assegnata all'array. Ci sono 3 varianti della funzione.

Riferimento per posizione iniziale e numero di elementi richiesti

intCopyOpen(
stringasymbol_name,// nome del simbolo
ENUM_TIMEFRAMEStimeframe,// periodo
intstart_pos,//dove iniziare
intcount,// quanti ne copiamo
doubleopen_array[]// array per copiare i prezzi di apertura
);

Accesso per data di inizio e numero di elementi richiesti

intCopyOpen(
stringasymbol_name,// nome del simbolo
ENUM_TIMEFRAMEStimeframe,// periodo
datetimestart_time,// da quale data
intcount,// quanti ne copiamo
doubleopen_array[]// array per copiare i prezzi di apertura
);

Accesso per data di inizio e fine dell'intervallo di tempo richiesto

intCopyOpen(
stringasymbol_name,// nome del simbolo
ENUM_TIMEFRAMEStimeframe,// periodo
datetimestart_time,// da quale data
datetimestop_time,// fino a quale data
doubleopen_array[]// array per copiare i prezzi di apertura
);

Parametri

nome_simbolo

[Il simbolo.

timeframe

[Periodo.

start_pos

[in] Numero del primo elemento da copiare.

contare

[Numero di elementi da copiare.

ora d'inizio

[Tempo di barra corrispondente al primo elemento da copiare.

stop_time

[in] Il tempo della barra corrispondente all'ultimo elemento.

open_array[]

[out] Matrice di tipo doppio.

Valore restituito

Il numero di elementi della matrice copiati o -1 in caso di errore.

Nota

Se l'intervallo di dati richiesti è completamente al di fuori dei dati disponibili sul server, la funzione restituisce -1. Se vengono richiesti dati al di fuori di TERMINAL_MAXBARS (numero massimo di barre sul grafico), la funzione restituisce anche -1.

Se le serie temporali richieste non sono ancora costruite o devono essere scaricate dal server, la funzione restituisce immediatamente -1.

Quando si richiedono dati dall'Expert Advisor o da uno script, si inizierà il caricamento dal server, se il terminale non ha questi dati localmente, o la costruzione delle serie temporali richieste, se i dati possono essere costruiti dalla storia locale, ma non sono ancora pronti. La funzione restituirà la quantità di dati che sarà pronta entro il tempo di timeout, ma il caricamento della storia continuerà, e la prossima richiesta simile restituirà più dati.

Quando si richiedono dati per data di inizio e numero di elementi richiesti, solo i dati con una data minore (precedente) o uguale a quella specificata saranno restituiti. Allo stesso tempo, l'intervallo è specificato e preso in considerazione al secondo più vicino. Significa che la data di apertura di qualsiasi barra, per la quale viene restituito il valore (volume, spread, valore nel buffer dell'indicatore, prezzo Open, High, Low, Close o open time Time), è sempre uguale o inferiore a quello specificato.

Quando si richiedono dati nell'intervallo di date specificato, solo i dati che rientrano nell'intervallo richiesto saranno restituiti, e l'intervallo è specificato e preso in considerazione al secondo più vicino. Questo significa che il tempo di apertura di qualsiasi barra per la quale viene restituito un valore (volume, spread, valore nel buffer dell'indicatore, prezzo Open, High, Low, Close o open time Time), è sempre entro l'intervallo richiesto.

Così,se il giorno corrente della settimana è sabato, quando si cerca di copiare i dati sul timeframe settimanale, specificando start_time=ultimo martedì e stop_time=ultimo venerdì, la funzione restituirà 0, poiché l'orario di apertura del timeframe settimanale cade sempre di domenica, ma nessuna barra settimanale cade nell'intervallo specificato.

Se abbiamo bisogno di ottenere il valore corrispondente alla barra corrente non finita, possiamo usare la prima forma della chiamata specificando start_pos=0 e count=1.

 

Saluti.

Signori, potete dirmi come fare una condizione di attraversamento dei livelli di prezzo con 1-2-3 zeri alla fine?

 
Andrey Sokolov:

Saluti.

Signori, potete dirmi come fare una condizione di attraversamento dei livelli di prezzo con 1-2-3 zeri alla fine?


Confrontando il valore del prezzo passato e attuale con questo livello, se il livello è tra questi valori allora c'è stato un incrocio.
 
Sergey Gritsay:

Confrontando il prezzo passato e quello attuale con questo livello, se il livello si trova tra questi valori allora si è verificato un incrocio.


Come posso specificare questi livelli per il confronto?

Oppure - come faccio a specificare che il numero deve avere il giusto numero di decimali? Non arrotondando, ma cancellando.

 
Andrey Sokolov:


E come scrivo questi livelli per il confronto?

Oppure - come faccio a specificare che il numero deve avere il giusto numero di decimali? Non arrotondando, ma cancellando.

Ecco la funzione di ricerca.

//===============================================================================================
//---------------------------- Возвращает ближайший круглый уровень ----------------------------+
//===============================================================================================
double GetUniversalLevel(int ne=100, string symb="0") {
 if(symb=="0") symb=Symbol();
 static double LastBid;
 double _Level=0, PriceStep=0, bid=0, point=0;
 bid=dBid(symb);
 point=dPoint(symb);
  if(LastBid<point) {LastBid=bid;} // Инициализация прошлой цены
   PriceStep=ne*point; // Шаг цены N пунктов.
   _Level=MathRound(bid/PriceStep)*PriceStep; // Круглый уровень
  LastBid=bid;
  return(_Level);
 }
Comment( GetUniversalLevel(50) );
 

Sergey Gritsay,Vitaly Muzichenko grazie.

Mi è stata suggerita anche la funzione MathFloor() - restituisce il valore numerico intero più vicino al fondo.

 
Vitalie Postolache:

Scavare MySQL.
Scavando... interessante... forse tra un paio di mesi starò ridendo delle mie attuali domande, ma ancora all'inizio del viaggio...

Sergey Gritsay:
Per questo scopo è necessario creare un server al di fuori del vostro computer locale e trasmettere i dati attraverso questo server. Per MT si dovrebbe scrivere un indicatore o un Expert Advisor per elaborare questi dati, o i terminali dovrebbero essere collocati su qualche server VPS e lì si dovrebbe impostare un copiatore di trade dal vostro conto ai conti dei vostri amici. Un'altra opzione è quella di copiare i tuoi trade eseguiti su determinati livelliattraverso il servizio disegnali. In generale, dovreste considerare le vostre capacità finanziarie per ordinare un software appropriato.


MosheDayan:

Lasciate che vi ricordi la preistoria. Ho un indicatore giornaliero che ottiene dati da csv e li visualizza (livelli orizzontali) su un grafico. Ho creato un server dal mio portatile di casa (è debole ma non ho bisogno di calcoli lì e mi darà dei csv e sono molto piccoli). Sul server per la connessione di prova ha versato il solito motore del forum - tutto sembra essere visibile dall'esterno. Aiuto con consigli. Che dovrebbe essere sul server per leggere da esso file csv indicatore? Cioè come comunica l'indicatore con il database csv? Può riempire il server fTP del motore o qualcos'altro e può per MT bisogno di aprire alcune porte speciali? O ho preso la direzione sbagliata in generale? Grazie


Amici, posso farvi un'altra domanda. È possibile non caricare un portatile di casa, ma usare, per collegare l'indicatore con i file csv, il cloud storage gratuito come, per esempio Yandex.Disk o Облако@mail.ru o Box.net ecc. Grazie
 
Vitaly Muzichenko:

Ecco la funzione del cercatore

dBid edPoint devono essere inseriti separatamente?