Errori, bug, domande - pagina 1699

 
Karputov Vladimir:
Non si può dare la colpa ai bug di ogni stile di programmazione sbagliato.

Che razza di SORPRESA è questa?! Faccio notare un bug ovvio e ricevo queste sciocchezze sullo "stile".

Sono lontano da A100 e Meat come la luna. Ti mostrano degli insetti, anche se non li capisco. Ma non voglio tirare in ballo il mio "stile".

 
fxsaber:
Non funziona.

Ecco il codice completo:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#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)
   if(prev_calculated!=0)
     {
      Buffer[rates_total-1]=MathRand();

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

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Print("#1 OnDeinit");
   if(handle!=INVALID_HANDLE)
     {
      Print("#2 OnDeinit");
      IndicatorRelease(handle);
      Print("#3 OnDeinit");
     }
   Print("#4 OnDeinit");
   return;
  }
//+------------------------------------------------------------------+

e una stampa:

2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 18992.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 12498.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       
... экономия бумаги :)
2016.09.23 12:34:31.804 2 (SBRF-12.16,M1)       
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 5343.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 17815.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #4 OnDeinit
File:
2.mq5  3 kb
 
Karputov Vladimir:

Ecco il codice completo:

e una stampa:

Non funziona per me - non arriva nemmeno a OnDeinit.

E notate che i miei numeri corrispondono nel registro, ma i vostri no. Il mio registro

PP      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
FE      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 13573.0
IQ      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 13573.0
CF      0       12:41:08.169    Test3 (RTS-12.16,H1)    
JO      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
QI      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 25434.0
NM      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 25434.0
MJ      0       12:41:08.169    Test3 (RTS-12.16,H1)    
DJ      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
QO      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 9469.0
HK      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 9469.0
CM      0       12:41:08.187    Test3 (RTS-12.16,H1)    
JF      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
OS      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 1887.0
NG      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 1887.0
Non ho un solo indicatore o EA in esecuzione nel mio terminale.
 
fxsaber:

Non funziona per me - non arriva nemmeno a OnDeinit.

E notate che i miei numeri corrispondono nel registro, ma i vostri no. Il mio registro

Non ho nessun indicatore o Expert Advisor in esecuzione nel mio terminale.

Ho questa configurazione:

2016.09.23 12:25:34.874 Terminal        MetaTrader 5 x64 build 1430 started (MetaQuotes Software Corp.)
2016.09.23 12:25:34.876 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 2446 / 8077 Mb, HDD: 40118 / 233310 Mb, GMT+02:00
2016.09.23 12:25:34.876 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

(Dopo aver riavviato la termica, scheda log, prime tre righe)

 
Karputov Vladimir:

Ho questa configurazione:

(Dopo aver riavviato la termica, scheda Log, prime tre righe)

2016.09.23 12:42:22.405 Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
2016.09.23 12:42:22.405 Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700 K  @ 3.50 GHz, RAM: 8098 / 16301 Mb, HDD: 6387 / 30000 Mb, GMT+02:00
2016.09.23 12:42:22.405 Terminal        BCS Broker MetaTrader 5 Terminal x64 build 1430 started (BCS Broker)
 
fxsaber:

Ambiguo. Sulla macchina x32:

2016.09.23 13:23:55.052 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
2016.09.23 13:23:55.052 Terminal        Windows 10 Home (X86 based PC), IE 11.00, UAC, Intel Atom  Z3740 @ 1.33 GHz, RAM: 607 / 1931 Mb, HDD: 20500 / 49784 Mb, GMT+02:00
2016.09.23 13:23:55.049 Terminal        MetaTrader 5 build 1430 started (MetaQuotes Software Corp.)


Non funziona.

 
Andrey Barinov:
Essi "cadono", ma ci sarà un errore di compilazione quando si cerca di chiamarli.

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 superato il mio problema in questo modo, nel genitore tutte le protezioni e le eredità vanno sotto la protezione e poi sotto l'override.

 
Karputov Vladimir:

Ambiguo. Sulla macchina x32:


Non funziona.

L'applicazione è stata fatta, anche se sono stanco di farlo così spesso.
 
fxsaber:

Come faccio a conoscere il mio manico su un grafico in un indicatore?ChartIndicatorName non è adatto, perché restituisce un nome breve. E con lo stesso nome può essere già in esecuzione lo stesso indicatore con diversi parametri di input.

Ho bisogno che sia in grado di rimuovere l'indicatore dal grafico e dai calcoli.

Forse l'avete già capito, ma lo chiarirò per sicurezza. L'handle dell'indicatore è in realtà solo il riferimento alla descrizione dell'indicatore all'interno del programma che lo ha creato (cioè, Expert Advisor, indicatore, script), possiamo considerarlo come una specie di "numero". Ciò significa che questo "numero" non ha alcun significato al di fuori del programma che ha creato l'indicatore (che ha ottenuto il suo handle). Anche il programma che chiama la funzione ChartIndicatorGet() non ottiene un manico di indicatore globale, crea solo la descrizione di questo indicatore e alloca il suo "numero" per l'indirizzamento. Non c'è una maniglia indicatore globale, unica in tutto il terminale.

L'uso del nome breve può essere visto negli esempi. Potete farlo:

   string short_name="unknown ma";
   switch(InpMAMethod)
     {
      case MODE_EMA :  short_name="EMA";  break;
      case MODE_LWMA : short_name="LWMA"; break;
      case MODE_SMA :  short_name="SMA";  break;
      case MODE_SMMA : short_name="SMMA"; break;
     }
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")");

Questo risolve il problema del " lo stessoindicatoreè già stato eseguito con diversi parametri di input".

E visivamente è più chiaro quale indicatore funziona:


 
Anton:

Forse l'avete già capito, ma lo chiarirò per sicurezza. L'handle dell'indicatore è in realtà solo un indirizzo alla descrizione dell'indicatore all'interno del programma che lo ha creato (cioè Expert Advisor, indicatore, script), possiamo considerarlo come una specie di "numero". Ciò significa che questo "numero" non ha alcun significato al di fuori del programma che ha creato l'indicatore (che ha ottenuto il suo handle). Anche il programma che chiama la funzione ChartIndicatorGet() non ottiene un manico di indicatore globale, crea solo la descrizione di questo indicatore e alloca il suo "numero" per l'indirizzamento. Non c'è una maniglia indicatore globale, unica in tutto il terminale.

Potete vedere l'uso di ShortName negli esempi. Si può fare così:

Questo risolve il problema del " lo stessoindicatoreè già stato eseguito con diversi parametri di input".

E visivamente è più facile capire quale indicatore funziona:

Grazie, è più o meno come me l'ha spiegato Stringo qualche tempo fa. Ho trovato diversi modi per determinare che la maniglia appartiene a "me":

  1. Cambio il valore estremo del buffer dell'indicatore e lo confronto con il valore corrispondente di CopyBuffer. Se corrisponde, sono "io". Questa è l'idea alla base dell'indicatore undeletable.
  2. Cambio ShortName e confronto con ChartIndicatorName.