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

 
Artyom Trishkin:

Codice del problema.

Perché...? Se si tratta di raddoppiare la logica per ogni attraversamento della stessa linea, allora ovviamente tutta la logica (che non ho scritto) dovrebbe essere scritta direttamente dalla persona. Non conosco il suo obiettivo finale, forse vuole fare il conto di quante volte il prezzo attraversa ogni linea, purché la superi...

Ho capito che l'uomo non è riuscito ad ottenere un tale evento per i suoi scopi. Ora otterrà un tale evento, e poi sarà a sua discrezione.


Sarebbe logico rinominare la linea stessa in un certo formato al primo incrocio (o mettere qualche etichetta nella descrizione di questa figura). E quando tutti gli oggetti sono attraversati, controllare la linea per l'assenza di questo marchio.

Se stiamo parlando dell'inefficacia di provare tutti gli oggetti ad ogni tick, allora è un altro argomento.

 
Roman:

Cercate di utilizzare il valore restituito dalla variabile _Period per i periodi superiori a H1 nei vostri calcoli matematici.
Saprete immediatamente chi ha torto.

Nessuno sano di mente userebbe i valori delle costanti nominate per i calcoli matematici. Le costanti con nome sono lì per rendere più facile per voi capire a cosa vi state riferendo, o quale identificatore di proprietà state usando per recuperare i dati. Le costanti con nome sostituiscono il valore dell'identificatore di proprietà richiesto con una descrizione testuale.

Quando si recuperano dati da, ad esempio, SymbolInfoDouble(), si può usare il valore numerico dell'identificatore per indicare quale valore si vuole recuperare dalla funzione. Ma per fare questo, dovete ricordare quale valore di identificatore sostituire nella funzione. Le costanti enum nominate sono state introdotte per liberarvi dal riferimento costante o per evitare di memorizzare a memoria il valore di ogni identificatore di ogni funzione in MQL. Per ottenere il valore dell'attuale prezzo di Ask, dovete scrivere il valore dell'identificatore uguale a 4 quando richiedete i dati per il simbolo corrente: SymbolInfoDouble(NULL,4) o scrivere SymbolInfoDouble(NULL,SYMBOL_ASK);

Perché vi sta bene, e non causa dissonanza, che SYMBOL_ASK restituisca 4 e non l'attuale prezzo Ask?

Perché se la prende con gli identificatori del periodo del grafico, allora? Questo è quello che volevano gli sviluppatori. Per le loro ragioni interne. C'è un nome identificativo per voi, per esempio PERIOD_H4. Non dovrebbe importarvi quale valore numerico gli è stato assegnato dallo sviluppatore per una ragione o per l'altra. Vi è stato dato un nome (sostituzione testuale di un valore numerico) di una costante - usatelo per la vostra comodità. Ma usare il valore di questa costante nei vostri calcoli è, scusate, senza senso. Questa costante di nome è usata per indicare da quale grafico si vogliono ottenere i dati. Ma non restituisce il periodo del grafico. È usato per uno scopo dannatamente diverso - per rendervi la vita più facile, per dire alla funzione cosa dovrebbe restituire.

Se volete il numero di minuti nel periodo, ricavatelo dal numero di secondi nel periodo diviso per 60. E non chiamate qualcosa che non è una stampella. Le stampelle sono quello che stai facendo - cercare di usare i nomi dei numeri nei tuoi calcoli.

Che sfortuna...

 
Vadim Lin:

Perché...? Se si tratta di raddoppiare la logica per ogni attraversamento della stessa linea, allora ovviamente tutta la logica (che non ho scritto) dovrebbe essere scritta direttamente dalla persona. Non conosco il suo obiettivo finale, forse vuole fare il conto di quante volte il prezzo attraversa ogni linea, purché la superi...

Ho capito che l'uomo non è riuscito ad ottenere un tale evento per i suoi scopi. Ora otterrà un tale evento, e poi sarà a sua discrezione.


Sarebbe logico rinominare la linea stessa in un certo formato al primo incrocio (o mettere qualche etichetta nella descrizione di questa figura). E quando tutti gli oggetti sono attraversati, controllare la linea per l'assenza di questo marchio.

Se stiamo parlando dell'inefficacia di provare tutti gli oggetti ad ogni tick, questo è un altro argomento.

State usando funzioni antiche che stanno per scomparire nell'oblio. Il codice non è multipiattaforma per questo motivo, anche se si potrebbe facilmente farlo funzionare su qualsiasi piattaforma senza modifiche.

E rinominare è molto divertente. Hai solo bisogno di guardare i nomi delle linee date dall'indicatore, estrarre l'identificatore esplicito da essi e usarlo per trovare le linee giuste.

 
Vadim Lin:

Grazie mille! È statowchar_t che ha aiutato! Ho letto che memorizza 2 byte per carattere, a differenza del char.

Ma il parametro della funzione "str" non restituisce ancora il valore assegnatogli... Mi chiedo perché...

Probabilmente perché dovete restituire il valore di ritorno della funzione.

extern "C" __declspec(dllexport) wchar_t* __stdcall ToString(wchar_t* str)
{
   wchar_t wcs[256];
   wcscpy(wcs, str);

   wchar_t* addStr = L" --- Привет! ---";
   
   wchar_t* res = wcsncat(wcs, addStr, wcslen(addStr) + 1);
   
   return(res);
}
 
Artyom Trishkin:

State usando funzioni antiche che stanno per svanire nell'oblio. E il codice non è multipiattaforma, anche se si potrebbe facilmente farlo funzionare su qualsiasi piattaforma senza modifiche.

E rinominare è molto divertente. Basta guardare i nomi delle linee nell'indicatore, estrarre l'identificatore esplicito e usarlo per trovare le linee necessarie.

Grazie per la modifica!

Infatti, ho programmato in MQL4 piuttosto raramente, mentre non ho quasi mai usato MQL5. Quindi ammetto che alcuni metodi sono superati (ma sto lavorando comunque!).

Нужно просто поглядеть какие имена линий выдаёт индикатор, вычленить из них их явный идентификатор

Sicuramente, ma non tu o io - non conosciamo le peculiarità di denominazione di quelle linee. "Memorizzare" tali livelli è anche un'opzione, ma allora i risultati delle nostre "memorizzazioni" dovrebbero essere salvati da qualche parte in un file, e senza questo - con qualsiasi collasso del terminale il quadro di ciò che sta succedendo sarebbe abbastanza poco chiaro. Rinominare, almeno, risolverà questo problema, anche se questo metodo potrebbe non essere il migliore.

Potrei sbagliarmi, ma la persona ha scritto che vengono usate fino a 100 linee alla volta, e solo linee, e non c'è altro sul grafico. Tutte le linee, da quanto ho capito, devono essere monitorate per i crossover. Quindi cosa si intende "estrarre" dai nomi, non lo so))

 
Artyom Trishkin:


Il punto è che la variabile _Period dovrebbe restituire valori di timeframe.
E le costanti devono corrispondere a valori di periodo, non solo a costanti enum.
Altrimenti perdiamo il significato di questa variabile, che è appositamente progettata per ottenere rapidamente il valore del timeframe, senza conversione con funzioni aggiuntive.

 
Vadim Lin:

Grazie per la modifica!

Infatti, ho programmato in MQL4 relativamente raramente negli ultimi anni, e non ho quasi mai usato MQL5. Pertanto, ammetto che alcuni metodi sono superati (ma sto lavorando comunque!).

Sicuramente, ma non tu o io - non conosciamo le peculiarità di denominazione di quelle linee. "Memorizzare" tali livelli è anche un'opzione, ma allora i risultati delle nostre "memorizzazioni" dovrebbero essere salvati da qualche parte in un file, e senza questo - ogni volta che il terminale va in crash, il quadro di ciò che sta succedendo sarebbe molto poco chiaro. Rinominare, almeno, risolverà questo problema, anche se questo metodo potrebbe non essere il migliore.

Potrei sbagliarmi, ma la persona ha scritto che si usano fino a 100 linee alla volta, e solo linee, e non c'è altro sul grafico. Tutte le linee, da quanto ho capito, devono essere monitorate per i crossover. Quindi cosa "sceglierete" dai nomi, non lo so))

Se il terminale si blocca, dovrà essere riavviato. L'indicatore dovrà essere applicato di nuovo al grafico, o eseguire l'Expert Advisor che utilizza i dati di questo indicatore (allora l'EA caricherà questo indicatore stesso quando vi accede). In questo caso (e anche durante il normale riavvio del terminale con un caricamento automatico dei programmi installati sul grafico), l'indicatore disegnerà di nuovo tutte le sue linee - non è necessario salvare nulla. Queste linee possono essere rilette in seguito. Inoltre, devono essere letti comunque.

Affinché l'EA monitorizzi solo le linee create dall'indicatore, è sufficiente guardare i nomi delle linee create dall'indicatore e cercare di trovare la sottostringa ripetuta nei nomi - la stessa per tutte le linee. Queste sottostringhe sono usate per trovare le linee necessarie.

È semplice - basta guardare la lista degli oggetti quando l'indicatore è in esecuzione.

 
Roman:

Il punto è che la variabile _Period deve restituire valori temporali.
E le costanti devono corrispondere a valori di periodo, non solo a costanti enum.
Altrimenti perdiamo il significato di questa variabile, che è appositamente progettata per ottenere rapidamente il valore del timeframe, senza conversione con funzioni aggiuntive.

Ci sono persone e cavalli mescolati dappertutto... Non solo su questa questione. Se si fanno dei cambiamenti secondo i vostri suggerimenti, la metà di tutto ciò che ha funzionato finora morirà semplicemente.

Il solo fatto di equiparare una dimensione di tick a una dimensione di punto non vale niente...

 
Roman:

Cercate di utilizzare il valore restituito dalla variabile _Period per i periodi superiori a H1 nei vostri calcoli matematici.
Si vedrà immediatamente chi ha torto.

Lo uso in quasi tutti gli EA. Non è più divertente. Mi dispiace, è la prima volta che lo vedo.
 
Artyom Trishkin:

Ci sono persone e cavalli mescolati dappertutto... Non solo su questa questione. Se si fanno dei cambiamenti secondo i suoi suggerimenti, la metà di tutto ciò che finora ha funzionato si estinguerà semplicemente.

Basta equiparare la dimensione delle tacche alla sola dimensione del punto...

Perché c'è molta incoerenza con la realtà attuale.
E voi cercate di trovare delle scuse per queste incongruenze.
Al contrario, ho scritto che un tick non è uguale a un punto!
È il tuo punto interno, inventato.
In considerazione del fatto che Point corrispondeva esattamente a un punto, quando c'erano solo quattro cifre.
Ma dopo l'introduzione della quinta cifra, avete iniziato a inventare nomi con le vostre scuse.

Motivazione: