Errori, bug, domande - pagina 1439

 
George Merts:

Come dimostra la mia esperienza, se il programmatore scrive qualcosa in un array contenente 10 elementi con indice 20, molto probabilmente significa che ha fatto un errore e il programma dovrebbe generare un errore invece di aumentare la dimensione dell'array, nascondendo così un'azione discutibile.

Tutti quegli "array che regolano le dimensioni" sono molto più fastidiosi in termini di nascondere potenziali errori che di convenienza. Inoltre, non dover tenere traccia della dimensione di un array è anche una pratica potenzialmente pericolosa, che porta a bug difficili da risolvere.

Sono io, o non hai lavorato con le lingue in questione? Non è necessario specificare un indice da aggiungere: viene assegnato automaticamente e viene anche aumentata la dimensione dell'array. Il programmatore non ha la possibilità di fare un errore con l'indice durante questa operazione.

Potete implementare un comportamento simile con le classi, aggiungere le relative funzioni pop, shift, unshift, ecc. E trascinare un carro di classi da un codice all'altro, con ogni codice che usa %10...20 funzioni da esso. Vi sembra una buona soluzione? Un esempio di soluzione giusta secondo me è aggiungere alla funzione ObjectsDeleteAll la possibilità di cancellare per prefisso - questo è un altro micron verso la programmazione di livello superiore - e la maggior parte dei codificatori è volata nel cestino così autocostruito. Ahimè, difficilmente lo vedremo con gli array...

 

И таскать телегу классов из кода в код, при том что в каждом коде из неё используются %10..20 функций.

Non hai mai sentito parlare dei file include mqh?
 

Non c'è bisogno di scrivere classi "smart array", sono già presenti nella libreria standard MetaQuotes, vedi la famiglia di classi Arry

 
Salve, sto cercando di usare MT5 per lavorare con i futures tramite il broker "Otkritie".
Quando si accede alla funzione SymbolInfoTick si è scoperto che gli ultimi due parametri della struttura MqlTick
- time_msc, flag mancano. È possibile risolvere questo problema? Per esempio, prendete MT5 da questo sito,
provare a collegarlo al server del broker. Oppure è possibile ottenere le informazioni richieste in un altro modo.
Mi interessa: chi ha iniziato la transazione, il venditore o il compratore?
 
Alexander Puzanov:

Sono solo io, o non hai lavorato con le lingue in questione? Non è necessario specificare un indice per l'elemento aggiunto, esso viene assegnato automaticamente e anche la dimensione dell'array viene aumentata. Il programmatore non ha la possibilità di fare un errore con l'indice durante questa operazione

Uhhhh... Che possibilità ha il programmatore di fare un errore? Vi sbagliate a pensare di poter prendere in considerazione tutte le varianti di qualsiasi programma complesso.

Tutte queste "azioni predefinite" devono essere proprietà di oggetti complessi. Gli oggetti semplici, come le variabili, gli array e le strutture semplici, devono avere il minor numero possibile di proprietà "predefinite".

Per esempio, alla creazione - devono memorizzare un valore indefinito, non zero.

Potete implementare un comportamento simile con le classi, aggiungere funzioni correlate pop, shift, unshift ecc. E trascinare un carro di classi da un codice all'altro, con ogni codice che usa %10...20 funzioni da esso. Vi sembra la soluzione giusta?

È la soluzione giusta in termini di logica. Quando si lavora con tali classi - il loro comportamento è trasparente.

E che dire del "trascinare una carrettata di classi" - quando si codifica non le si trascina, si inserisce solo la libreria. E quando si compila, un normale linker non dovrebbe mettere in un eseguibile tutti i metodi della libreria, ma solo quelli che sono usati.

Esempio di soluzione giusta secondo me - aggiungere alla funzione ObjectsDeleteAll la cancellazione per prefisso - questo è un altro micron verso la programmazione di livello superiore - e la maggior parte dei codificatori hanno cestinato questa funzione autocostruita. Ahimè, questo è improbabile che accada con gli array...

Secondo me, anche questo è un approccio sbagliato, per la stessa ragione. La funzione viene caricata con compiti che non sono tipici di essa e non seguono la logica della sua applicazione.

La soluzione corretta, mi sembra, è di avere un gestore di oggetti di classe sul grafico che mantiene una lista di essi, e rimuove quelli necessari quando le funzioni vengono chiamate. I prefissi dei nomi, mi sembra, dovrebbero servire unicamente a rendere chiare ad una persona alcune informazioni sull'oggetto. E la cancellazione - non dovrebbe essere basata sul nome dell'oggetto in alcun modo, ma sul salvataggio di quel nome in un array.

 
Demal:
Ciao, sto cercando di usare MT5 per lavorare con i futures tramite il broker "Otkritie".
Quando si accede alla funzione SymbolInfoTick si è scoperto che gli ultimi due parametri della struttura MqlTick
- time_msc, flag mancano. È possibile risolvere questo problema? Per esempio, prendete MT5 da questo sito,
provare a collegarlo al server del broker. Oppure è possibile ottenere le informazioni richieste in un altro modo.
Mi interessa: chi ha iniziato la transazione, il venditore o il compratore?
  1. Quale build del terminale avete ora?
  2. Si collega a un server demo o reale?
 
versione 5.0 build 1150, demo
 
Demal:
versione 5.0 build 1150, demo

Aggiorna il tuo terminale (devi connetterti al server MetaQuotes-Demo). Costruzione attuale:

Terminal        MetaTrader 5 build 1210 started (MetaQuotes Software Corp.)

Questo è lo script:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2015, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlTick last_tick;
//--- 
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Print("time = ",last_tick.time,"; bid = ",last_tick.bid,
            "; ask = ",last_tick.ask,"; volume = ",last_tick.volume,
            "; time_msc = ",last_tick.time_msc,"; flag = ",last_tick.flags);
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
//+------------------------------------------------------------------+

Dà questo risultato:

Test (RTS-12.15,H1)     time = 2015.11.26 09:42:57; bid = 88360.0; ask = 88400.0; volume = 2; time_msc = 1448530977000; flag = 0

File:
Test.mq5  2 kb
 
Karputov Vladimir:

Aggiorna il tuo terminale (devi connetterti al server MetaQuotes-Demo). Costruzione attuale:

Questo è lo script:

Dà questo risultato:

Grazie, sapete perché la bandiera ha un valore di 0, come se non fosse cambiato nulla?
 
Demal:
Grazie, sai perché la bandiera ha un valore di 0, come se non fosse cambiato nulla
UsateCopyTicks e sarete felici. ESymbolInfoTick probabilmente non sa ancora come lavorare con la nuova struttura di tick.
File:
CopyTicks.mq5  4 kb