Errori, bug, domande - pagina 2243

 
Vitaly Murlenko:

Il codice nell'indicatore mql4 ha smesso di funzionare. come posso sistemarlo?

L'editor dice 'ObjectSetInteger' - nessuno degli overload può essere applicato alla chiamata di funzione

Ha funzionato per anni e poi improvvisamente si è fermato. È un peccato, però.


else{// Иначе стрелка создана. Задаём её свойства
 ObjectSetInteger(ChartID(),Open_name,OBJPROP_ARROWCODE,OpenArrowCode);//код стрелки 232 // или 0 вместо ChartID() для текущего графика 
 ObjectSet(Open_name,OBJPROP_COLOR,ObjColor);//цвет стрелки
}

Ma perché ha mischiato due stili? Se usate la prima riga per specificare il codice della freccia, allora usate la seconda riga nello stesso stile:

ObjectSetInteger(0,Open_name,OBJPROP_COLOR,ObjColor); //цвет стрелки
 

Ho provato a caricare una nuova versione dell'indicatore sul mercato. Il test si è concluso con degli errori. Rapporto di errore come nell'immagine in appendice con il seguente contenuto:

test su EURUSD,H1 (netting) test su XAUUSD,D1 (netting) test su GBPUSD,M30 (netting) test su EURUSD,M1 (netting) 2016.05.31 21:45:00 Violazione di accesso a 0x00007FF7FD1CA04B letto a 0xFFFFFFFFFFFFFFFFFFFF 2016.05.31 21:45:00 00 00007FF7FD1CA010 4885D2 test rdx, rdx 2016.05.31 21:45:00 00 00007FF7FD1CA013 747B jz 0x7ff7fd1ca090 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00007FF7FD1CA015 53 push rbx 2016.05.31 21:45:00 00 00007FF7FD1CA016 4883EC20 sub rsp, 0x20 2016.05.31 21:45:00 00 00007FF7FD1CA01A 48897C2430 mov [rsp+0x30], rdi 2016.05.3131 21:45:00 00 00007FF7FD1CA01F 488BD9 mov rbx, rcx 2016.05.31 21:45:00 00 00007FF7FD1CA022 488B7AF8 mov rdi, [rdx-0x8] 2016.05.31 21:45:00 00 00007FF7FD1CA026 4881FF00004000 cmp rdi, 0x400000 2016.05.31 21:45:00 00 00007FF7FD1CA02D 730B jae 0x7ff7fd1ca03a 2016.05.31 21:45:00 00 00007FF7FD1CA02F 4883E980 sub rcx, 0x80 2016.05.31 21:45:00 00 00007FF7FD1CA033 E88852CAFF call 0x7ff7fce6f2c0 ; #2504 (metatester64.exe) 2016.05.31 21:45:00 00 00007FF7FD1CA038 EB37 jmp 0x7ff7fd1ca071 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00007FF7FD1CA03A 488D4AE8 lea rcx, [rdx-0x18] 2016.05.31 21:45:00 00 00007FF7FD1CA03E 488B52E8 mov rdx, [rdx-0x18] 2016.05.31 21:45:00 00 00007FF7FD1CA042 4885D2 test rdx, rdx 2016.05.3131 21:45:00 00 00007FF7FD1CA045 7408 jz 0x7ff7fd1ca04f 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00007FF7FD1CA047 488B4108 mov rax, [rcx+0x8]
Forse il problema è nel tester?
File:
 
Artyom Trishkin:

Ma perché hai mischiato i due stili? Se usate la prima linea per impostare il codice della freccia, allora usate la seconda linea nello stesso stile:

Grazie, mi ha aiutato.

2 stili? Non sapevo degli stili. È solo che prima si poteva fare questa sezione solo in quel modo. C'è stato un cambiamento. Ho programmato in MQL4 per più di 10 anni. E ora gli sviluppatori hanno cambiato il linguaggio e molti dei miei codici non funzionano più. Sono molto deluso. I cambiamenti non erano per il meglio. Significa che devo rifare una quantità enorme di codici. Anche se sono vecchi, sono stati molto usati.

 
Gennadiy Stanilevych:

Ho provato a caricare una nuova versione dell'indicatore sul mercato. Il test si è concluso con degli errori. Rapporto di errore come mostrato nell'immagine in appendice con il seguente contenuto:

Forse il problema è nel tester?

Si prega di creare una richiesta a servicedesk, troveremo una soluzione


UPD: Trovata la tua richiesta.
 
Artyom Trishkin:

Libera il buffer di qualsiasi array dinamico e imposta la dimensione della dimensione zero a 0.

Quando si scrivono script e indicatori, la necessità di utilizzare la funzione ArrayFree() può verificarsi raramente, poiché tutta la memoria utilizzata viene immediatamente rilasciata, e negli indicatori personalizzati il lavoro principale con gli array è rappresentato dall'accesso ai buffer degli indicatori, le cui dimensioni sono gestite automaticamente dal sottosistema esecutivo del terminale.

Se avete bisogno di gestire la memoria in condizioni dinamiche complesse nel vostro programma, la funzione ArrayFree() vi permetterà di liberare esplicitamente e immediatamente la memoria occupata da un array dinamico che non è più necessario.

Vedi? Inutile.

Naturalmente, una volta che la memoria viene liberata da essa, e poi la si alloca di nuovo assegnando una dimensione all'array, nessuno può garantire il suo contenuto.

Utilizzare l'inizializzazione dell'array: ArrayInitialize()

Cosa vuol dire che nessuno garantisce il contenuto? Se la memoria è stata liberata, non c'è più, quindi come si fa a metterci della spazzatura? O cancellare la memoria implica dare il permesso a quella memoria di essere usata da un'altra parte del programma, e non cancellarla del tutto?

 
Aleksey Vyazmikin:

Cosa vuol dire che nessuno garantisce il contenuto? Se la memoria è stata cancellata, non c'è più, quindi come fa ad avere dei rifiuti? O cancellare la memoria implica dare il permesso a quella memoria di essere usata da un'altra parte del programma, e non cancellarla del tutto?

ArrayResize non pulisce la memoria, ed è per questo che contiene spazzatura, dal precedente "consumatore".

Questo è fatto per la velocità, perché dopo che la memoria è assegnata a un array, nel 99,99(9)% dei casi, l'utente lo "riempirà" con i suoi dati.


 
Vitaly Murlenko:

Grazie, mi ha aiutato.

Due stili? Non sapevo degli stili. È solo che prima si poteva fare questa sezione solo in quel modo. C'è stato un cambiamento. Ho programmato in MQL4 per più di 10 anni. E ora gli sviluppatori hanno cambiato il linguaggio e molti dei miei codici non funzionano più. Sono molto deluso. I cambiamenti non erano per il meglio. Significa che devo rifare una quantità enorme di codici. Saranno anche vecchi, ma erano molto più utili.

Non è come il codice della freccia era impostato prima che fossero introdotte le funzioni ObjectSetXXX di mql4?

ObjectSet(Open_name,OBJPROP_ARROWCODE,OpenArrowCode);

Ho anche scritto in mql per circa 10 anni (forse di più - come vola il tempo...) - sto cominciando a dimenticare le funzioni strettamente quaternarie - scrivo codice multipiattaforma quando possibile.

 
Ilyas:

ArrayResize non cancella la memoria, ecco perché contiene spazzatura dal precedente "consumatore".

Questo è fatto per la velocità, perché dopo l'assegnazione della memoria a un array, nel 99,99(9)% dei casi, l'utente lo "riempirà" con i suoi dati.


Allora perché i valori numerici sono costanti "spazzatura", anche dopo aver riavviato il terminale?

Personalmente, mi sono bloccato con la semplice somma del contenuto delle celle in un altro array, e mi sono interrogato sul problema per molto tempo.

      for(int i=1;i<StrokTotal; i++)
        {
         for(int s=3;s<56+1; s++)
           {               
            SummArrA[s]=SummArrA[s]+ArrTest[i,s];
           }
        }     
 
Aleksey Vyazmikin:

Allora perché i valori numerici sono costanti "spazzatura", anche dopo aver riavviato il terminale?

Personalmente, mi sono bruciato su una semplice sommatoria del contenuto delle celle di un altro array, e mi sono chiesto cosa c'era di sbagliato per molto tempo.

Non importa che tipo di dati siano contenuti nell'array non inizializzato, in qualsiasi momento i dati possono cambiare, nessuno ne garantisce il valore.
Ecco perché l'uso di variabili non inizializzate (leggere la memoria) a volte porta a situazioni in cui ci vuole molto tempo per trovare la causa:

  1. Funziona su un computer, non sull'altro
  2. Funziona nel terminale, non nel tester
  3. Terminale/OS aggiornato e il programma si comporta diversamente
  4. La stampa aggiunta ha smesso di funzionare.
  5. ecc.

Posso solo dare qualche consiglio.
Dovreste prendere l'abitudine di inizializzare sempre i dati, in modo che in futuro non perdiate molto tempo a cercare errori legati alla mancanza di inizializzazione.

Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему отключить нельзя. Порядок обновления При подключении к торговому серверу происходит проверка наличия обновлений платформы. Если найдено обновление какого-либо из компонентов торговой платформы...
 
Aleksey Vyazmikin:

Cosa vuol dire che nessuno garantisce il contenuto? Se la memoria è stata cancellata, non c'è più, quindi come fa ad avere dei rifiuti? O cancellare la memoria implica dare il permesso a quella memoria di essere usata da un'altra parte del programma, e non cancellarla del tutto?

Cosa vuol dire "no"? Non si rimuove la memory stick dallo slot della scheda madre. E se la memoria è presente e viene liberata (non inizializzata con un valore, ma liberata), allora inizia ad essere usata per altre necessità del programma.

Motivazione: