Fehler, Irrtümer, Fragen - Seite 696

 

Helfen Sie mir hier aus

Multithreading versuchen, aber Terminal stürzt ab

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

Ich habe eine C++ dll geschrieben.

Hier ist der 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);
}

Und das Drehbuch

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

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

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


Wenn Sie den Code der Dll wie folgt ändern

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

}

Ich habe die Zahl 10 auf dem Bildschirm an der Stelle des Kommentars (sollte es sein) und dann bekomme ich msgbox und 2 Tasten

Das Terminal stürzt erst ab, wenn ich eine der Tasten drücke.

Sobald ich die Taste drücke, erscheint die Meldung, die erklärt, warum der Absturz aufgetreten ist und wie man ihn beheben kann...

 
papaklass:

Meine Herren, hat irgendjemand Multi-Währung im Modus der Visualisierung des Eröffnungskurses mit Bezug auf andere TFs betrieben?

Hier ist das Tagesdiagramm:


Das Diagramm wurde sortiert und korrigiert. Danke für das Beispiel.
 
olyakish:

Das Terminal stürzt erst ab, wenn ich mindestens eine der Tasten drücke.

Sobald ich die Taste drücke, erscheint eine Meldung über die Suche nach der Absturzursache und wie man sie beheben kann...

Bitte beachten Sie, dass das MQL5-Skript nach Abschluss von OnStart automatisch entladen wird, einschließlich Ihrer DLL.

Das heißt, Sie haben einen Thread mit einem modalen Fenster erstellt, das im Speicher hängt, und der Hocker wurde unter ihm weggekickt. Nach dem Schließen des modalen Fensters kehrt es ins Leere zurück.

In Ihrem Fall müssen Sie ausdrücklich warten, bis alle DLL-Threads auf normale und garantierte Weise beendet sind, bevor Sie das MQL5-Skript beenden.

 
Renat:

Beachten Sie, dass das MQL5-Skript nach Abschluss von OnStart automatisch entladen wird, einschließlich Ihrer DLL.

Das heißt, es gibt einen Thread mit einem modalen Fenster, das im Speicher hängt und unter dem der Hocker weggekickt wurde. Nachdem das modale Fenster geschlossen wurde, kehrt es ins Leere zurück.

In Ihrem Fall müssen Sie vor der Beendigung des MQL5-Skripts explizit warten, bis alle DLL-Threads normal und garantiert beendet sind.

Danke, jetzt verstehe ich es.
 
Wenn es in einer Reihe von Geschäften keinen einzigen Verlust gibt, nehmen der GEWINNFAKTOR und der ANTEILSVERHÄLTNIS einige unrealistische/extreme Werte an. Ist das ein Fehler oder sollten solche Momente berücksichtigt und irgendwie verarbeitet werden? Wie macht man es richtig?
 
tol64:
Wenn es in einer Reihe von Geschäften keinen einzigen Verlust gibt, nehmen der GEWINNFAKTOR und der ANTEILSVERHÄLTNIS einige unrealistische/extreme Werte an. Ist das ein Fehler oder sollten solche Momente berücksichtigt und irgendwie verarbeitet werden? Wie macht man es richtig?

EMPTY_VALUE (wie DBL_MAX)

Natürlich können Sie einige nicht definierte Nan anwenden, aber dann können Sie keine Vergleiche anstellen.

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

EMPTY_VALUE (wie DBL_MAX)

Sie können natürlich einige undefinierte nan verwenden, aber dann können Sie keine Vergleiche anstellen.

Eigentlich kommen solche Momente nicht so oft vor, also setze ich sie einfach auf Null, damit die Tabellen nicht verrückt werden. ))
 
tol64:
Wenn es in einer Reihe von Geschäften keinen Verlust gibt, nehmen die Werte von PROFIT FACTOR und SHARPE RATIO einige unrealistische/extreme Werte an. Ist das ein Fehler oder sollten solche Momente berücksichtigt und irgendwie verarbeitet werden? Wie macht man es richtig?

Offensichtlich liegt hier ein Fehler vor, denn der Gewinnfaktor sollte nicht mit negativen Werten berechnet werden, so wie in diesem Fall mit dem Fehlen von negativen Trades.

Wenn wir einfach die Formel global nehmen (Bruttogewinn/Bruttoverlust), dann erhalten wir in Abwesenheit von negativen Geschäften eine Division durch Null, und wenn der Bruttoverlust höher ist, erhalten wir eine Zahl kleiner als 1, was für die weitere Analyse auch nicht korrekt ist, weil der Unterschied zwischen zwei positiven Gewinnfaktoren um ein Vielfaches größer ist als der Unterschied zwischen zwei konventionell negativen.

 
Urain:

Offensichtlich liegt ein Fehler vor, da der Gewinnfaktor nicht mit negativen Werten berechnet werden sollte, und wie in diesem Fall mit keinen negativen Trades.

Es wurde bereits zwei Beiträge weiter oben gesagt, dass dies kein Fehler ist, sondern ein Zeichen dafür, dass es unmöglich ist, diesen Indikator zu berechnen.
 
Rosh:
Es wurde bereits zwei Beiträge weiter oben gesagt, dass dies kein Fehler ist, sondern ein Zeichen dafür, dass es unmöglich ist, diesen Indikator zu berechnen.
Der Fragesteller hat keinen bestimmten Verbotswert angegeben, daher nahm ich an, dass es sich um #IND handelt. Und im Falle von DBL_MAX ist es ganz logisch, wenn man es nicht berechnen kann.
Obwohl Sie einen Trick anwenden können, fügen Sie bei jeder Berechnung 1 Cent sowohl zum Bruttoporofit als auch zum Bruttoverlust hinzu.
Dann würde die Vorwärtsformel lauten ((Bruttoporofit+0,01)/(Bruttoverlust+0,01))
Die Formel zur Berechnung des reziproken Wertes (wenn der Bruttoverlust größer ist)
Zu tun -((Bruttoverlust+0,01)/(Bruttoporofit+0,01))
Nun, es ist klar, dass Bruttoverlust und Bruttoporofit Module sind.

Dann ist die Linie auf beiden Seiten symmetrisch, was gut für GA ist, und es gibt überhaupt keine unberechenbaren Situationen.

Aber es wird wahrscheinlich nicht für Sie nützlich sein, sondern für die Leute, die ihre eigenen Optimierungskriterien schreiben.