Errori, bug, domande - pagina 567

 
Quindi CTrade ha funzionato... È solo un file necessario per rifare tutto... Un elicottero sottomarino di nuovo... E ti ho detto che non so come, niente boom... :)
 

Sì... è tutto uguale in linea di principio...

 

La nuova build ha smesso di copiare strutture semplici nel loop. Ecco uno script di prova:

//+------------------------------------------------------------------+
//|                                             Test_Copy_Struct.mq5 |
//+------------------------------------------------------------------+
struct  trade_settings
  {
   int      reopened;
   int      reverse; 
   int      TrailingStop;
   int      WithoutlossLevel;
   int      WithoutlossProfit;
   double   LossToReverse;
   int      MAPeriod;
   int      MA_use;
   double   Lots;
   int      takeprofit; 
  };
trade_settings arr_tr_set_ini[3]={  
 {60,90,1000,100,900,2000.0,105,1,0.13,2700},   // EURUSD
 {130,1298,400,300,600,1000.0,130,1,0.1,2800},  // GBPUSD
 {110,140,200,600,800,1000.0,85,0,0.15,1700}};   // AUDUSD 
trade_settings symb_default={110,130,200,1300,1500,3000.0,100,1,0.1,1000};

class CTest_Copy_Struct
  {  
protected:
   trade_settings    m_tr_set;
public:
   void              Copy_tr_set(const trade_settings& tr_set){m_tr_set=tr_set;}
   void              Print_tr_set(){printf("Setting reopened=%u overpos=%u TrailingStop=%u WithoutlossLevel=%u WithoutlossProfit=%u" 
                        ,m_tr_set.reopened,m_tr_set.reverse,m_tr_set.TrailingStop,m_tr_set.WithoutlossLevel,m_tr_set.WithoutlossProfit);
                        printf("LossToReverse=%.2f MAPeriod=%u MA_use=%u Lots=%.2f takeprofit=%u"
                        ,m_tr_set.LossToReverse,m_tr_set.MAPeriod,m_tr_set.MA_use,m_tr_set.Lots,m_tr_set.takeprofit);}
   void              Zero(){ZeroMemory(m_tr_set);} 
  };

void OnStart()
  {
   CTest_Copy_Struct Test; 
   Test.Zero();
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[0]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[2]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(symb_default);
   Test.Print_tr_set();
   int total=ArraySize(arr_tr_set_ini);
   for(int i=0;i<3;i++)
     {
      Print("i=",i);
      Test.Copy_tr_set(arr_tr_set_ini[i]);
      Test.Print_tr_set();
     } 
  }
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
Valmars:

Risultato:

2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Violazione di accesso letto a 0x00000000209FFFAC in 'E:\Program Files\Championship_2011\MQL5\Scripts\Test_Copy_Struct.ex5'
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) i=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=3000.00 MAPeriod=100 MA_use=1 Lots=0.10 takeprofit=1000
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=110 overpos=130 TrailingStop=200 WithoutlossLevel=1300 WithoutlossProfit=1500
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=1000.00 MAPeriod=85 MA_use=0 Lots=0.15 takeprofit=1700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD, M15) Setting reopened=110 overpos=140 TrailingStop=200 WithoutlossLevel=600 WithoutlossProfit=800
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=2000.00 MAPeriod=105 MA_use=1 Lots=0.13 takeprofit=2700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=60 overpos=90 TrailingStop=1000 WithoutlossLevel=100 WithoutlossProfit=900
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=0.00 MAPeriod=0 MA_use=0 Lots=0.00 takeprofit=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=0 overpos=0 TrailingStop=0 WithoutlossLevel=0 WithoutlossProfit=0

 

https://www.mql5.com/ru/docs/basis/function/events dice alla fine:"Per una migliore comprensione sarà utile eseguire l'indicatore il cui codice è allegato qui sotto. "

Eseguire il codice. Durante il fine settimana. Non c'è stata una migliore comprensione - andava bene così com'era, credo, ma sono state aggiunte le peggiori impressioni. Non ci sono tick nel fine settimana, quindi prev_calculated = 0 in questo momento sempre, quando si passa da timeframe a timeframe:

Tuttavia, a un certo punto appare questo valore (nessun ricollegamento, onestamente nobile!):

e linee divertenti sul grafico:

O la metà del divertimento, come questo:

C'erano anche delle linee all'inizio della storia a forma di ZigZag (ahimè, ho dimenticato di fare uno screenshot e non ho potuto riprodurlo).

Le linee appaiono anche su altri TF, ma più raramente. Lo si può vedere facilmente da soli.

Era esattamente quello che gli autori volevano dire?

Perché il risultato di prev_calculated è almeno disuguale in assenza di tick, se non strano? C'è qualcosa che non funziona bene quando si salta da TF a TF?

Queste (o altre) linee avrebbero dovuto apparire fuori dalle zecche?

In casi rari, il salto relativamente frequente da TF a TF può generare una sorta di pseudotick che avvia il calcolo dei valori delle barre sulla storia, ecc.

Devo aspettarmi che il comportamento erratico del terminale venga eliminato? O devo imparare la matematica?

Forse sto cercando di fare qualcosa che non dovrei fare? In questo caso, giustificate il vostro punto di vista.

Ho un sacco di domande... ma questo è solo l'inizio...

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

Continua...

Sullo stesso link c'è una frase:"Nota: se la funzione OnCalculate restituisce un valore nullo, nessun valore dell'indicatore viene mostrato nella DataWindow del terminale client. "

Ecco il punto... Se necessario, accetto volentieri qualsiasi crescita del braccio e corro subito a raddrizzarlo se necessario. Ma. Negli indicatori semplici e di media complessità si può in qualche modo uscire da alcune situazioni di inciampo. Ma quando il codice diventa più complesso, qualsiasi funzione di Copy... () (sia prendendo un altro indicatore come argomento, sia senza) comincia a complicare la situazione, come penso personalmente, trattando la programmazione MQL una settimana fa. Qui arriva il punto in cui non si sa cos'altro può essere cambiato nel codice, perché tutto ciò che può essere cambiato è stato cambiato, e il resto, come mi sembra, non deve essere cambiato, perché non ha niente a che vedere con il problema. Oppure viene un pensiero assolutamente disarmante: cambiare l'intero algoritmo, perché non si è tenuto conto delle peculiarità e dei capricci del terminale. Dopo tutto, mentre si studia il MQL attraverso la documentazione, si ha a che fare con le sfumature, che gli sviluppatori hanno taciuto, molto probabilmente inavvertitamente. E il programmatore MQL non impara mai molte cose dopo aver studiato completamente la documentazione... E ciò che è più deludente, usando MQL, o non si possono correggere affatto molti dei capricci del terminale, o si possono usare stampelle dubbie e un giorno schiantarsi dolorosamente...

Bene... Oggi sono diventato un po' pazzo. È il fine settimana.

Ed ecco quello che volevo dirvi questa mattina...

https://www.mql5.com/ru/forum/1111/page570#comment_117425 - ho risolto completamente il problema principale dell'indicatore che non viene disegnato all'inizio del terminale (spero che nessuno obietterà che nulla dovrebbe impedire a un indicatore frattale di rendere correttamente su tutta la storia anche se non ci sono tick?)

Lo era:

            CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                    TimeUpBuffer[shift],
                                    exact_extremum);

sostituito da:

            if(CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                       TimeUpBuffer[shift],
                                       exact_extremum)<0) return(0);

Ammetto la mia disattenzione e il conseguente formalismo pernicioso.

Ma. Ha aiutato nel caso più semplice (ho volutamente semplificato l'indicatore iniziale). In un indicatore più complesso queste operazioni non erano utili - in un certo momento i cambiamenti non mostravano alcuna differenza, specialmente ora che ci sono molte funzioni di copia. E mi piacerebbe molto ricevere un'istruzione sensata su come e dove andare dopo. Dopo tutto, così tanto tempo è speso per qualcosa che funziona fuori dalla scatola. Finora non so nemmeno se è colpa mia o del terminale. E non sono sicuro che sia solo una mancanza di se e diritorni... Sembra sospetto qua e là, come altro, per esempio...

Invierò il codice agli sviluppatori nel mio personale, se necessario; posso anche allegare un codice simile, ma implementato in modo diverso e funziona senza problemi (anche se, non si adatta bene ai compiti e agli obiettivi che sto esplorando).

 
Il processo di registrazione delle funzioni di stampa nella scheda Esperti del terminale, così come nella RAM e nel file sul disco è un processo separato o no? Sembra essere separato, il terminale non si blocca, ma perché durante l'intenso processo di registrazione rallenta come se fosse carico di mattoni? C'è un modo per scaricarlo? Se ho deciso di emettere elementi di array di ArraySize piuttosto medi, i ritardi sono piuttosto evidenti, e mi dimenticherò di emettere valori di elementi di array di dimensioni maggiori in una volta sola.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 

C'è il forte sospetto che il terminale stia incasinando la cache (sono quasi fuori dal giro, quindi...). Peggio - anche MetaEditor influenza in qualche modo la gestione di ciò che sta succedendo nel terminale in quel momento.

Più di una volta ho incontrato un problema, quando ho modificato il codice del programma MQL (che stampa i dati di debug nel registro della scheda Expert Advisor), l'ho ricompilato, sono andato alla finestra del Terminale e ho visto ripetersi i risultati precedenti, anche se posso dire con certezza che non si tratta di una sorta di rielaborazione ritardata dell'esecuzione precedente del programma non completata. Quindi, compilo e mando il codice aggiornato a MetaEditor con F7, e nel frattempo il terminale riceve il comando per riprodurre il vecchio codice (dalla cache, o qualcosa come "fudging" delle pagine di memoria da parte del SO). È interessante notare che è possibile annullare/scaricare la versione precedente "bloccata nei denti" del codice .ex5 non solo scaricando completamente il processo terminal.exe, ma in alcuni rari casi - semplicemente chiudendo MetaEditor. Comprendetelo come volete, ho solo raccontato quello che ho osservato personalmente.

Recentemente, c'è stata una situazione in cui il design:

Print(1);
for(int e=0; e<ArraySize(Arr); e++)
{
   Print(Arr[e]);
}
Il grafico visualizza solo il valore della prima stampa, ma era inutile aspettare l'uscita degli elementi dell'array. Dopo la rimozione della prima stampa e la ricompilazione, l'output ciclico degli elementi dell'array è iniziato immediatamente. È una cospirazione segreta di Prints contro la comunità MQL5 o sono l'unico che ha questa sfortuna?

Inoltre, voglio sottolineare che questi strani casi di comportamento del terminale sono stati osservati non su un'istanza di MT5 sovraccarica di finestre grafiche, oggetti grafici e programmi MQL, ma con una singola finestra grafica pulita (senza contare il contorno di un indicatore in esecuzione).

 
x100intraday Dimentica i problemi - scrivilo in C o in qualsiasi altro linguaggio. Dopo tutto, tutto ciò di cui abbiamo bisogno dal terminale è ottenere quotazioni, informazioni sul conto ed eseguire ordini, e il resto può essere scritto in un ambiente di programmazione specializzato e collegato tramite libreria. Altrimenti, cambieranno qualcosa in un momento e non ci sarà una risposta sul perché non funziona, se il progetto è grande. Non hai bisogno di queste avventure :) E se l'Expert Advisor allo stesso tempo deve ricompilare e mettersi in pari con il mantenimento degli ordini correnti, perderai soldi, perché dovrai scoprire cosa e perché...
 
ivandurak:

1. Il codice ArrayInitialize non funziona, se il ciclo viene decommentato, tutto va bene.

E quando si dichiarano le variabili nella classe e l'indicatore a livello globale con lo stesso nome, appare un avviso.

1. Il PlotIndexSetDouble(z,EMPTY_VALUE) è usato per i buffer degli indicatori nell'inite.

2. Salta fuori. Allora bisogna fare qualcosa, si raccomanda di marcare i membri della classe con il prefisso "m_".

Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
  • www.mql5.com
Пользовательские индикаторы / PlotIndexSetDouble - Документация по MQL5