Erreurs, bugs, questions - page 696

 

Aidez-moi

essayez le multithreading mais le terminal se plante

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

J'ai écrit un dll C++.

Voici le code

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

#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);
}

Et le script

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

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

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


Si vous changez le code de la dll en ceci

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);

}

J'ai obtenu le nombre 10 sur l'écran à la place du commentaire (il devrait être comme ceci) et ensuite j'obtiens msgbox et 2 boutons

le terminal ne se plante pas tant que je n'appuie pas sur un des boutons.

Dès que j'appuie sur le bouton, un message apparaît expliquant pourquoi le crash s'est produit et comment le réparer...

 
papaklass:

Messieurs, est-ce que quelqu'un a fait fonctionner le multidevise en mode de visualisation du prix d'ouverture en référence à d'autres TF ?

Voici le graphique quotidien :


Le graphique a été réglé et corrigé. Merci pour l'exemple.
 
olyakish:

Le terminal ne se bloque pas tant que je n'appuie pas sur au moins un des boutons.

Dès que j'appuie dessus, le message concernant la recherche de la cause du crash et la façon de la réparer apparaît...

Veuillez noter que le script MQL5 est automatiquement déchargé après l'achèvement de OnStart, y compris votre DLL.

En d'autres termes, vous avez créé un fil de discussion avec une fenêtre modale en mémoire, et le tabouret a été renversé. Après la fermeture de la fenêtre modale, il n'y a plus rien.

Dans votre cas, vous devez attendre explicitement que tous les threads de la DLL soient terminés de manière normale et garantie avant de terminer le script MQL5.

 
Renat:

Notez que le script MQL5 est automatiquement déchargé après l'achèvement de OnStart, y compris votre DLL.

En d'autres termes, il y a un fil de discussion avec une fenêtre modale en mémoire, et le tabouret a été renversé sous elle. Après la fermeture de la fenêtre modale, il n'y a plus rien.

Dans votre cas, avant de terminer le script MQL5, vous devez attendre explicitement que tous les threads de la DLL se terminent normalement et soient garantis.

Merci, je comprends maintenant.
 
S'il n'y a pas une seule perte dans une série de transactions, le FACTEUR DE PROFIT et le RATIO DE PARTAGE prennent des valeurs irréalistes/extrêmes. S'agit-il d'une erreur ou ces moments doivent-ils être considérés et traités d'une manière ou d'une autre ? Comment le faire correctement ?
 
tol64:
S'il n'y a pas une seule perte dans une série de transactions, le FACTEUR DE PROFIT et le RATIO DE PARTAGE prennent des valeurs irréalistes/extrêmes. S'agit-il d'une erreur ou ces moments doivent-ils être considérés et traités d'une manière ou d'une autre ? Comment le faire correctement ?

EMPTY_VALUE (identique à DBL_MAX)

Bien sûr, vous pouvez appliquer un nan indéfini, mais alors vous ne pouvez pas faire de comparaisons.

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

EMPTY_VALUE (identique à DBL_MAX)

Vous pouvez bien sûr utiliser des nan indéfinis, mais alors vous ne pouvez pas faire de comparaisons.

En fait, ces moments ne se produisent pas si souvent, alors je vais simplement les mettre à zéro pour que les graphiques ne s'affolent pas. ))
 
tol64:
S'il n'y a pas de perte dans une série de transactions, les valeurs du FACTEUR DE PROFIT et du RATIO DE PARTAGE prennent des valeurs irréalistes/extrêmes. S'agit-il d'une erreur ou ces moments doivent-ils être considérés et traités d'une manière ou d'une autre ? Comment le faire correctement ?

Apparemment, il y a une erreur, car le facteur de profit ne devrait pas être calculé avec des valeurs négatives, comme dans ce cas avec l'absence de transactions négatives.

Simplement, si nous prenons la formule globalement (Profit brut/Perte brute), en l'absence de transactions négatives, nous obtenons une division par zéro, et lorsque la perte brute est plus élevée, nous obtenons un nombre inférieur à 1, ce qui n'est pas non plus correct pour une analyse plus approfondie, car la différence entre deux facteurs de profit positifs sera plusieurs fois supérieure à la différence entre deux facteurs négatifs conventionnels.

 
Urain:

Apparemment, il y a une erreur, car le facteur de profit ne devrait pas être calculé avec des valeurs négatives, et comme dans ce cas avec aucune transaction négative.

Il a déjà été dit deux posts plus haut que ce n'est pas une erreur, mais un signe d'impossibilité de calculer cet indicateur.
 
Rosh:
Il a déjà été dit deux posts plus haut que ce n'est pas une erreur, mais un signe d'impossibilité de calculer cet indicateur.
Il n'a pas spécifié de valeur particulière, donc j'ai supposé que c'était #IND. Et dans le cas de DBL_MAX, il est tout à fait logique que vous ne puissiez pas le calculer.
Bien que vous puissiez faire une astuce, à chaque calcul, ajoutez 1 cent à la fois au Porofit brut et à la Perte brute.
La formule d'avance serait alors ((Porofit brut+0,01)/(Perte brute+0,01)).
La formule pour calculer la valeur réciproque (lorsque la perte brute est plus importante)
Pour faire -((Perte brute+0,01)/(Porofit brut+0,01))
Il est clair que la perte brute et le porofit brut sont des modules.

La ligne sera alors symétrique des deux côtés, ce qui est bon pour GA, et il n'y aura pas du tout de situations non calculables.

Mais il sera très probablement utile non pas pour vous, mais pour les personnes qui rédigent leurs propres critères d'optimisation.