Errori, bug, domande - pagina 696

 

Aiutami qui

prova il multithreading ma il terminale va in crash

Time        : 2012.03.27 14:38 (0:00:22)
Program     : Client Terminal
Version     : 500.607 (09 Mar 2012)
Revision    : 40583
OS          : Windows 7 Professional (Build 7600)
Processors  : 4 x Intel Core i5-2410 M  @ 2.30 GHz
Memory      : 1551 free of 4003 Mb
Virtual     : 1188 free of 2047 Mb
CrashMD5    : 83 B4200991F2E548704A4F35763F5DAD
Exception   : C0000005 at 400067 A4 read to 400067 A4

Modules     : 00400000 00 E38000 terminal.exe (5.0.0.607)
            : 0 F000000 00006000 detoured.dll
            : 72640000 0003 D000 nvd3d9wrap.dll (8.17.12.9573)
            : 72610000 0002 F000 nvdxgiwrap.dll (8.17.12.9573)
            : 72 F60000 00027000 wlidnsp.dll (7.250.4225.0)
            : 10000000 00265000 mql5.dll (5.0.0.607)
            : 51660000 0002 C000 pdm.dll (7.0.9466.0)
            : 51580000 0002 B000 msdbg2.dll (7.0.9466.0)
            : 013 F0000 0000 B000 borlndmm.dll

75 B73665:00012 [75 B73677] AcquireSRWLockExclusive (kernel32.dll)
77 B89F8F:00063 [77 B89FF2] RtlInsertElementGenericTableAvl (ntdll.dll)
77 B89F8F:00036 [77 B89FC5] RtlInsertElementGenericTableAvl (ntdll.dll)

Registers   : EAX=75 B73665  EIP=400067 A4  EFLGS=00010246  ES=002 b
            : EBX=32 E44168  ESP=3313 FF8C  EBP=3313 FF94    FS=0053
            : ECX=00000000  ESI=00000000  CS=0023         GS=002 b
            : EDX=400067 A4  EDI=00000000  DS=002 b         SS=002 b

Ho scritto una dll C++.

Ecco il codice

//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TMyThread : public TThread
        {
                private:
                protected:
                        void __fastcall Execute();
                public:
                        __fastcall TMyThread(bool CreateSuspended);
        };
//---------------------------------------------------------------------------

TMyThread *Thr = new TMyThread(true);


__fastcall TMyThread::TMyThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{

        FreeOnTerminate = true;
        for (int i=0;i<1000;i++)
                {}
}


//---------------------------------------------------------------------------
extern "C" __declspec(dllexport)    int __stdcall GetIntValue()
{
        Thr->Resume();
        return (10);
}

E lo script

#import "Project1.dll"
  int GetIntValue();
#import 

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   Comment(GetIntValue());
  }
//+------------------------------------------------------------------+


Se cambiate il codice della dll in questo

void __fastcall TMyThread::Execute()
{
        //---- Place thread code here ----
        FreeOnTerminate = true;
        for (int i=0;i<1000;i++)
                {

                }
        MessageBox(NULL,"Ïðèâåò!","Äàé ïÿòü",MB_YESNO | //Äà íåò (êíîïêè)
        MB_DEFBUTTON1 | //Âûäåëåíàÿ êíîïêà
        MB_ICONEXCLAMATION | //Òèï èêîíêè
        MB_DEFAULT_DESKTOP_ONLY);

}

Ho il numero 10 sullo schermo al posto del commento (dovrebbe essere così) e poi ho msgbox e 2 pulsanti

il terminale non si blocca finché non premo uno dei pulsanti.

appena lo premo, appare il messaggio che spiega perché il crash si è verificato e come risolverlo...

 
papaklass:

Signori, qualcuno ha eseguito la multi-valuta in modalità di visualizzazione del prezzo di apertura con riferimento ad altri TF?

Ecco il grafico giornaliero:


Il grafico è stato risolto e sistemato. Grazie per l'esempio.
 
olyakish:

Il terminale non si blocca finché non premo almeno uno dei pulsanti.

Appena lo premo, appare il messaggio su come trovare la causa del crash e come risolverlo...

Si prega di notare che lo script MQL5 viene automaticamente scaricato dopo il completamento di OnStart, inclusa la vostra DLL.

Cioè, avete creato un thread con una finestra modale appesa in memoria, e lo sgabello è stato fatto cadere da sotto. Dopo aver chiuso la finestra modale torna al nulla.

Nel vostro caso, è necessario attendere esplicitamente che tutti i thread della DLL siano terminati in modo normale e garantito prima di terminare lo script MQL5.

 
Renat:

Si noti che lo script MQL5 viene automaticamente scaricato dopo il completamento di OnStart, compresa la vostra DLL.

Cioè, c'è un thread con una finestra modale appesa nella memoria, e lo sgabello è stato fatto cadere da sotto. Dopo che la finestra modale viene chiusa, torna nel nulla.

Nel vostro caso, prima di terminare lo script MQL5, è necessario attendere esplicitamente che tutti i thread della DLL terminino normalmente e siano garantiti.

Grazie, ora lo capisco.
 
Se non c'è una sola perdita in una serie di scambi, il PROFIT FACTOR e lo SHARPE RATIO prendono dei valori irrealistici/estremi. È un errore o questi momenti devono essere considerati e in qualche modo elaborati? Come farlo correttamente?
 
tol64:
Se non c'è una sola perdita in una serie di scambi, il PROFIT FACTOR e lo SHARPE RATIO prendono dei valori irrealistici/estremi. È un errore o questi momenti devono essere considerati e in qualche modo elaborati? Come farlo correttamente?

EMPTY_VALUE (come DBL_MAX)

Certo, si possono applicare dei nan indefiniti, ma allora non si possono fare confronti.

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы - Документация по MQL5
 
stringo:

EMPTY_VALUE (come DBL_MAX)

Naturalmente si possono usare dei nan indefiniti, ma allora non si possono fare confronti.

In realtà questi momenti non si verificano così spesso, quindi li azzererò in modo che i grafici non impazziscano. ))
 
tol64:
Se non ci sono perdite in una serie di scambi, i valori di PROFIT FACTOR e SHARPE RATIO assumono valori irrealistici/estremi. È un errore o questi momenti devono essere considerati e in qualche modo elaborati? Come farlo correttamente?

Apparentemente c'è un errore, perché il Fattore di Profitto non dovrebbe essere calcolato con valori negativi, così come in questo caso con assenza di trade negativi.

Semplicemente, se prendiamo la formula globalmente (Profitto lordo/Perdita lorda) allora in assenza di trade negativi otteniamo la divisione per zero, e quando la Perdita lorda è più alta otteniamo un numero inferiore a 1, che non è nemmeno corretto per ulteriori analisi, perché la differenza tra due fattori di profitto positivi sarà molte volte maggiore della differenza tra due convenzionalmente negativi.

 
Urain:

Apparentemente c'è un errore, poiché il fattore di profitto non dovrebbe essere calcolato con valori negativi, e come in questo caso con nessun trade negativo.

È già stato detto due post sopra che questo non è un errore, ma un segno di impossibilità di calcolare questo indicatore.
 
Rosh:
È già stato detto due post sopra che questo non è un errore, ma un segno di impossibilità di calcolare questo indicatore.
Non ha specificato un valore particolare, quindi ho supposto che fosse #IND. E nel caso di DBL_MAX, è abbastanza logico che non si possa calcolare.
Anche se potete fare un trucco, ad ogni calcolo aggiungete 1 centesimo sia a Gross Porofit che a Gross Loss.
Allora la formula forward sarebbe ((Porofit lordo+0,01)/(Perdita lorda+0,01))
La formula per calcolare il valore reciproco (quando la perdita lorda è maggiore)
Per fare -((Perdita lorda+0,01)/(Porofit lordo+0,01))
È chiaro che Gross Loss e Gross Porofit sono moduli.

Allora la linea sarà simmetrica su entrambi i lati, il che è un bene per GA e non ci saranno affatto situazioni non calcolabili.

Ma molto probabilmente sarà utile non per voi, ma per le persone che stanno scrivendo i loro criteri di ottimizzazione.

Motivazione: