错误、漏洞、问题 - 页 696

 

帮帮我吧

尝试多线程,但终端崩溃了

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

我写了一个C++ dll。

以下是代码

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

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

而剧本

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

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

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


如果你把dll的代码改成这样

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

}

我在屏幕上看到数字10在评论的位置(应该是),然后我得到msgbox和2个按钮。

直到我按下其中一个按钮,终端才会崩溃。

一旦我按下它,就会出现信息,解释为什么会发生崩溃,以及如何修复它...。

 
papaklass:

先生们,有没有人在开盘价可视化模式下参照其他TFs运行多币种?

这里是日线图。


该图表已被整理和修复。谢谢你的例子。
 
olyakish:

直到我按下至少一个按钮,终端才会崩溃。

一旦我按下它,就会出现一条关于寻找崩溃原因和如何修复的信息......。

请注意,在OnStart完成后,MQL5脚本 会自动卸载,包括你的DLL。

也就是说,你在内存中创建了一个挂着模态窗口的线程,而凳子已经从它下面被打掉了。关闭模态窗口后,它又回到了原地。

在你的情况下,你需要明确地等待,直到所有的DLL线程都以正常和保证的方式终止,然后再终止MQL5脚本。

 
Renat:

注意,在OnStart完成后,MQL5脚本 会自动卸载,包括你的DLL。

也就是说,一个带有模态窗口的线程挂在内存中,而一个凳子从它下面被打掉了。模态窗口关闭后,它又回到了原处。

在你的案例中,在终止MQL5脚本之前,你需要明确地等待所有的DLL线程正常终止并得到保证。

谢谢你,我现在明白了。
 
如果在一系列的交易中没有一次亏损,那么PROFIT FACTORSHARPE RATIO 就会出现一些不现实的/极端的数值。这是一个错误,还是应该考虑并以某种方式处理这样的时刻?如何正确操作?
 
tol64:
如果在一系列的交易中没有一次亏损,那么PROFIT FACTORSHARPE RATIO 就会出现一些不现实的/极端的值。这是一个错误,还是应该考虑并以某种方式处理这样的时刻?如何正确地做到这一点?

EMPTY_VALUE(与DBL_MAX相同)

当然,你可以应用一些未定义的南,但那样你就不能进行比较了。

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

EMPTY_VALUE(与DBL_MAX相同)

当然,你可以使用一些未定义的nan,但那样你就不能做比较了。

其实这样的时刻并不经常出现,所以我就把它们归零,这样图表就不会疯掉。))
 
tol64:
如果在一系列的交易中没有损失,那么PROFIT FACTORSHARPE RATIO 的值就会出现一些不现实的/极端的值。这是一个错误,还是应该考虑并以某种方式处理这样的时刻?如何正确地做到这一点?

显然这是个错误,因为利润系数不应该用负值来计算,在这种情况下,没有负值的交易也是如此。

简单地说,如果我们在全球范围内采用公式(毛利润/毛亏损),那么在没有负数交易的情况下,我们会得到除以0 的结果,而当毛亏损较高时,我们会得到小于1的数字,这对于进一步分析也是不正确的,因为两个正数利润因素之间的差异会比两个传统的负数之间的差异大很多倍。

 
Urain:

显然有一个错误,因为利润系数不应该以负值计算,而在这种情况下,没有负的交易。

上面两个帖子已经说过,这不是一个错误,而是一个不可能计算这个指标的标志。
 
Rosh:
上面两个帖子已经说过,这不是一个错误,而是一个不可能计算这个指标的标志。
提问者没有指定一个特定的禁止值,所以我认为是#IND。而在DBL_MAX 的情况下,如果你不能计算它,那就很符合逻辑了。
虽然你可以做一个诀窍,在每次计算时,在毛利润和毛损失中都加1美分。
那么远期公式将是((毛利润+0.01)/(毛损失+0.01))。
计算互换值的公式(当总损失较大时)
要做的是-((毛损失+0.01)/(毛利润+0.01))
很明显,毛损失和毛门槛是模块。

那么这条线将在两边对称,这对GA来说是好事,而且根本不会有不可计算的情况。

但它很可能不是对你有用,而是对那些正在编写自己的优化标准的人有用。