エラー、バグ、質問 - ページ 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:

皆さん、他のTFを参照して、始値可視化モードで多通貨を実行した方はいらっしゃいますか?

こちらは日足チャートです。


チャートは整理され、修正されました。例を挙げていただきありがとうございます。
 
olyakish:

少なくとも1つのボタンを押すまでは、端末がクラッシュしないのです。

押すとすぐに、クラッシュの原因究明と修正方法についてのメッセージが表示されるのですが...。

なお、OnStartの完了後、MQL5スクリプトは DLLを含めて自動的にアンロードされます。

つまり、メモリにモーダルウィンドウをぶら下げた状態でスレッドを作成し、その下からスツールをたたき出したということです。モーダルウィンドウを閉じると、どこにも戻りません。

あなたの場合、すべてのDLLスレッドが正常かつ保証された方法で終了するまで明示的に待機してからMQL5スクリプトを終了させる必要があるのです。

 
Renat:

なお、OnStartの完了後、MQL5スクリプトは DLLを含めて自動的にアンロードされます。

つまり、メモリにモーダルウィンドウをぶら下げたスレッドがあり、その下からスツールが叩き出されている。モーダルウィンドウを閉じた後、どこにも戻りません。

あなたの場合、MQL5スクリプトを終了する前に、すべてのDLLスレッドが正常に終了するのを明示的に待ち、保証される必要があります。

ありがとうございます、理解できました。
 
一連の取引で一度も損失がない場合、PROFIT FACTORと SHARPE RATIOは 非現実的な、または極端な値をとります。エラーなのか、そのような瞬間も考慮し、何らかの処理をすべきなのか。正しいやり方は?
 
tol64:
一連の取引で一度も損失がない場合、PROFIT FACTORと SHARPE RATIOは 非現実的な、または極端な値をとります。エラーなのか、そのような瞬間も考慮し、何らかの処理をすべきなのか。正しいやり方は?

EMPTY_VALUE(DBL_MAXと同じ)

もちろん、未定義のナンを適用することもできますが、そうすると比較はできません。

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

EMPTY_VALUE(DBL_MAXと同じ)

もちろん、未定義のナンを使うこともできますが、その場合、比較はできません。

実はそういう瞬間はそうそうないので、チャートが狂わないようにゼロにします。))
 
tol64:
一連の取引で損失がない場合、PROFIT FACTORと SHARPE RATIOの 値は非現実的な、または極端な値をとります。エラーなのか、そのような瞬間も考慮し、何らかの処理をすべきなのか。正しいやり方は?

プロフィットファクターは負の値で計算されるべきではなく、今回のように負の取引がない場合は計算されないため、どうやら間違いがあるようです。

単純に、グローバルに(Gross Profit/Gross Loss)の計算式をとると、マイナス取引がない場合はゼロで割り、Gross Lossが大きい場合は1より小さい数字になるが、これも分析上正しくない。なぜなら、二つのプラスの利益要素の差は、二つの従来からのマイナス要素の差より何倍も大きいからである。

 
Urain:

プロフィット・ファクターはマイナスの値では計算されないはずで、今回のようにマイナス取引がない場合は、どうやらエラーがあるようです。

これはエラーではなく、この指標の計算が不可能であることの表れであることは、すでに2つ上の記事で述べられています。
 
Rosh:
これはエラーではなく、この指標の計算が不可能であることの表れであることは、すでに2つ上の記事で述べられています。
質問者は特に禁止値を指定していなかったので、#INDとしました。また、DBL_MAXの 場合、計算できないとかなり理屈が通らない。
ただし、1回の計算でGross PorofitとGross Lossの両方に1セントずつ加算するのが1つのコツです。
そうすると、フォワードの計算式は、((グロス・ポロフィット+0.01)/(グロス・ロス+0.01))となります。
逆数の計算式(Gross Lossの方が大きい場合)
すること-((グロスロス+0.01)/(グロスポロフィット+0.01))
Gross LossとGross Porofitがモジュールであることは明らかである。

そうすると、GAにとって都合のいい左右対称の線になり、計算できない状況がまったくなくなります。

しかし、それはあなたにとってではなく、独自の最適化基準を書いている人々にとって役に立つ可能性が高いでしょう。