Errori, bug, domande - pagina 1702

 
Capisco. Grazie.
 
Dmytro Zelenskyy:

OK, come convertire correttamente double in int con il segno intatto (il numero non importa, se è fuori dal limite allora limitatelo a int)

Convertire in lungo.
 
fxsaber:
Rispondi e poi chiudilo immediatamente.

Avevo bisogno di essere in grado di cancellare me stesso (l'indicatore) nel caso in cui ci fosse anche solo una copia in esecuzione, anche se con parametri di input diversi. Per fare questo avevo bisogno di scoprire il manico di me stesso. Purtroppo, all'epoca non sapevo che in MQL è impossibile nel 100% dei casi. Ho quindi deciso di provare un trucco poco intelligente.

Ho esaminato tutte le maniglie. Se coincide con il random che ho scritto nel mio indicatore prima di controllare, significa automaticamente che il manico appartiene a me e posso cancellarmi, se necessario.

È da queste considerazioni che è stato scritto un codice così innocuo, che ha causato una reazione così ambigua, ma ovviamente negativa da parte degli sviluppatori. Vedete, non potete farlo. Che cosa hai fatto? Bene, ho letto il valore del mio buffer attraverso il CopyBuffer. È illegale?!

Non c'è niente come "non puoi farlo" nella risposta degli sviluppatori. Non c'è scritto da nessuna parte che sia "illegale".

Se pensate di avere assolutamente bisogno di questo "codice innocuo", usatelo. Basta aggiungere IndicatorRelease(handle)) a OnCalculate() dopo aver letto il buffer. Non hai bisogno di controllare ad ogni spunta che sia il "tuo" indicatore, vero?

È così che l'indicatore risolve il tuo problema e smette di essere "invisibile":

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];

int handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   ::SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   handle=ChartIndicatorGet(0,1,ChartIndicatorName(0,1,0));
  }

#define  TOSTRING(A) #A + " = " + (string)A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(handle!=INVALID_HANDLE)
     {
      Buffer[rates_total-1]=MathRand();

      double BufferCopy[];

      if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
         Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
         
      if(IndicatorRelease(handle)) 
         handle=INVALID_HANDLE;
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   if(handle!=INVALID_HANDLE)
      IndicatorRelease(handle);
   return;
  }


Che la comunità sia consapevole che è possibile creare in questo modo un'esecuzione incontrollata in background di qualsiasi codice anche sul terminale senza grafici. Qui c'è una piccola punta di piedi. Se considerarlo o meno un bug è probabilmente una questione di terminologia. La mia comprensione è che gli sviluppatori non sono in grado di cambiare nulla a livello architettonico qui. Ecco perché c'è tanta rabbia. Non posso spiegare questa reazione in nessun altro modo.

Non c'è "rabbia" nella risposta di Servicedesk. C'è un malinteso sulla vostra motivazione per esagerare regolarmente i problemi che incontrate.

Gli sviluppatori sono in grado di cambiare le cose. Ma di solito sono molto attenti ai suggerimenti di "togliere e proibire" anche un comportamento non documentato se non è inequivocabilmente dannoso. Questo "hack" è piuttosto specifico, ma forse qualcuno lo sta usando.

Forse ci saranno ancora modifiche al terminale su questo, ma certamente non è un problema gigantesco e la priorità di questo problema è minima.

Nessuno parlerà comunque. Un tale rastrellamento sarebbe ben riflesso nell'Aiuto.

Si scopre che siete ben consapevoli che questo "grave bug" del terminale interessa solo voi.

Chiudiamo la questione a questo punto. I dettagli tecnici sono stati tutti discussi, mentre le emozioni non sono necessarie in questo thread.

 
Anton:

Non c'è niente come "non è permesso" nella risposta degli sviluppatori. Non c'è scritto da nessuna parte che è "illegale".

Se pensate che questo "codice innocuo" sia assolutamente necessario per voi, usatelo. Basta aggiungere IndicatorRelease(handle)) a OnCalculate() dopo aver letto il buffer. Non hai bisogno di controllare ad ogni spunta che sia il "tuo" indicatore, vero?

No, naturalmente, non c'è questo bisogno.

È così che l'indicatore risolve il tuo problema e cessa di essere "invisibile":

Su questo argomento ho ricevuto recentemente una risposta dal suo collega

Forum sul trading, sistemi di trading automatico e test di strategia

Errori, bug, domande

Slawa, 2016.09.07 17:17

fxsaber:

IndicatorRelease dopo iCustom dovrebbe essere fatto?

Per quale motivo?

Non farlo. Non fare nemmeno dopo IndicatorCreate

Non ho avuto una risposta.

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2016.09.07 17:27

Dopo non significa immediatamente. Ma se non è necessario, quando si dovrebbe?

Non c'è "rabbia" nella risposta di Servicedesk. C'è un malinteso sulla vostra motivazione per esagerare regolarmente i problemi che affrontate.

La motivazione è puramente egoistica. Voglio che tutto funzioni in modo prevedibile, secondo la documentazione. I bug sono fastidiosi, questo è il risultato.

Gli sviluppatori sono in grado di cambiare. Ma di solito sono molto cauti sui suggerimenti di "togliere e vietare" anche un comportamento non documentato, a meno che non sia chiaramente dannoso. Questo "hack" è piuttosto specifico, ma forse qualcuno lo sta usando.

Potrebbero esserci ancora modifiche al terminale su questo, ma non è certo un problema gigantesco e la priorità di questo problema è minima.

Sono d'accordo sulla priorità.

Si scopre che siete ben consapevoli che questo "grave bug" del terminale è interessante solo per voi.

Finiamo la domanda a questo punto. Tutti i dettagli tecnici sono discussi, ma le emozioni non sono necessarie in questo thread.

No, non commentano per un altro motivo. Non importa quanto fosse grave il bug. La mia "serietà" riguardava gli insetti che si possono già fare e mettere nello stesso Mercato. Per poi trovarsi di fronte al fatto che il VPS non ha abbastanza risorse di calcolo. Comunque, avete capito bene.
 
Vladimir Pastushak:

Non ne ho bisogno in questo modo, sto cercando di fare un sacco di lavoro per rendere la mia vita più facile in futuro.

Ho risolto il mio problema in questo modo nel genitore tutto proteced e l'eredità va sotto proteced poi override.

Se il genitore è tutto protetto, allora non c'è bisogno di fare l'ereditarietà della protezione (puoi anche lasciare pubblico). Solo che ora non è chiaro cosa volevi dall'inizio. Se hai bisogno di nascondere i metodi del genitore all'interno della classe (e non fuori come pensavo), allora qual è il punto della protezione? Hai bisogno di una primitiva qui.
 
Alexey Navoykov:
Solo che ora non è più chiaro cosa volevi in origine.
Sembra che ci si sbarazzi solo dei metodi non disponibili nell'elenco a comparsa.
 
Sergei Vladimirov:
Sembra che ci si sbarazzi solo dei metodi non disponibili nell'elenco a comparsa.
Quindi quelli inaccessibili non appaiono, vero?
 
Sergei Vladimirov:
Sembra che basti sbarazzarsi dei metodi non disponibili nell'elenco a comparsa.

Non solo, ho riscritto le classi degli oggetti grafici per me e da una classe in cui sono descritte tutte le proprietà degli oggetti, ora faccio facilmente e comprensibilmente (almeno per me) i discendenti di tipo Button.

Inoltre, da questi elementi semplici posso costruire elementi più complicati con la minima probabilità di errore, la massima velocità e semplicità (almeno per me).

Forse mi darete un calcio amichevole e direte che la libreria standard ha tutto, ma ve lo dico subito, non è tutto ed è tutto incomprensibile. Sono abituato a lavorare con quello che capisco completamente, e per capire come funziona il tutto bisogna provare da soli...

 
Alexey Navoykov:
Quindi quelli inaccessibili non appaiono, vero?

No, lo fanno.

A proposito, è lo stesso in studio.

 
Sergei Vladimirov:

No, lo fanno.

Allora Metakvots dovrebbe prestare attenzione a questo. Perché mostrare metodi inaccessibili. Dopo tutto, tutto è nascosto per la sezione protetta come dovrebbe essere. Quindi dovrebbe essere lo stesso qui.
Motivazione: