エラー、バグ、質問 - ページ 1781

 

不安定な性能

  • インジケーター位置のパス。 \୧⃛(๑⃙⃘◡̈๑⃙⃘)
  • Expert Advisorの保存先パス: \ExpertsTest.ex5
  • スクリプトの場所パス。 \♪♪~

ステップの順序Test_s.ex5'スクリプトをM15チャート(EURUSDシンボル)に複数回接続します。

結果

2017.02.05 15:17:59.076 OnStart 1回目装着時
2017.02.05 15:18:03.293 OnStart 2回目を装着しました。
2017.02.05 15:18:07.760 OnStart 3回目の参加です。
2017.02.05 15:18:07.778 OnInit
2017.02.05 15:18:07.781 OnDeinit:1
2017.02.05 15:18:16.891 OnStart 4回目の参加となりました。

結合の結果が違うのです。OnInitOnDeinitの行は1回目から表示されることもあれば、10回目から表示されることもあり、結果はランダムです。

//Test_i.mq5 //Индикатор
void OnInit()                    { Print( __FUNCTION__ ); }
void OnDeinit( const int reason ) { Print( __FUNCTION__, ":", reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }
//Test_s.mq5 //Скрипт
#import "..\\Experts\\Test.ex5"
        void OnInit();
#import
void OnStart()
{
        Print( __FUNCTION__ );
        OnInit();
}

エキスパートファイル添付(実際にはライブラリとして使用)、コードはこちらhttps://www.mql5.com/ru/forum/1111/page1801#comment_4059227

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
ファイル:
Test.mq5  1 kb
 

このエラーが私のものなのか、それとも端末のものなのか理解できません。

5桁目にて
void OnStart()
  {

double A=1.11111;
double B=1.11111;
double C=1.11111;

long CalcX=
NormalizeDouble(A,Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(B,Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(C,Digits)*MathPow(10,(Digits+1)*1-1);

Print ("CalcX=",CalcX);  
  }

印刷 CalcX=111111111111111104 期待値 CalcX=1111111111111111111

 
A100:

チャート周期変更時の関数呼び出し順が正しくない。

  • Indicator location path: \IndicatorsTest_i.ex5
  • Expertの場所: {ExpertsTest.ex5

アクションのシーケンス。

  1. Test.ex5' Expert AdvisorをM5チャート(シンボルはGBPUSD)にアタッチします。
  2. チャート期間をM15に変更
  3. チャート周期をM30に変更
  4. チャートからExpert Advisorを削除します。

ログを表示します。時間軸がわかるように。

なお、チャートへのインジケータの 追加とチャートからのインジケータの削除は非同期操作であることをここに付け加えておきます。

また、タイムフレームを変更した場合、このタイムフレームからすぐにインジケータがアンロードされるわけではありません。そして、新しいタイムフレームにインジケータの新しいコピーを作成します。コンストラクタ-デストラクタのプリントを拝見しましたが、デストラクタはすぐに呼び出されるのでしょうか?いいえ、それは誤解です。デストラクタはインジケータがアンロードされるときに呼び出され、インジケータが削除された後の数秒間のみアンロードされます
 
Slawa:
ログを表示する。だから、タイミングがわかるんです。
なお、チャートへのインジケータの 追加とチャートからのインジケータの削除は非同期操作であることを付記しておきます。
また、タイムフレームを変更しても、このタイムフレームからすぐにインジケータがアンロードされるわけではありません。そして、新しいタイムフレームにインジケータの新しいコピーを作成します。コンストラクタ-デストラクタのプリントを拝見しましたが、デストラクタはすぐに呼び出されるのでしょうか?いいえ、それは誤解です。デストラクタはインジケータがアンロードされたときに呼び出され、インジケータを削除してから数秒後にアンロードされます

ステップ間に十分な時間があることが前提(グラフの周期が変化する)

2017.02.05 19:49:49.984 I::I->M5 #step1: join
2017.02.05 19:49:49.984 OnInit->M5

2017.02.05 19:51:39.853 I::I->M15 #step2:期間変更M5→M15
2017.02.05 19:51:39.853 OnInit->M15
2017.02.05 19:53:29.813 OnDeinit->M15:3 #step3: 期間変更 M15->M30
2017.02.05 19:53:29.813 I::~I->M15
2017.02.05 19:53:29.864 I::I->M30
2017.02.05 19:53:29.864 OnInit->M30

2017.02.05 19:54:03.245 OnDeinit->M30:3 #step4: 期間変更 M30->H1
2017.02.05 19:54:03.245 i::~i->m30
2017.02.05 19:54:03.286 i::i->h1
2017.02.05 19:54:03.286 OnInit->H1
2017.02.05 19:55:02.984 I::I->H4 #step5: H1 ->H4 期間変更
2017.02.02.05 19:55:02.984 OnInit->H4
2017.02.05 19:55:02.984 OnDeinit->H1:3
2017.02.05 19:55:02.984 I::~I->H1

2017.02.05 19:55:50.697 I::I->D1 #step6:H4→D1期間変更
2017.02.05 19:55:50.697 OnInit->D1
2017.02.05 19:55:50.697 OnDeinit->H4:3
2017.02.05 19:55:50.697 i::~i->h4
2017.02.05 19:56:11.122 OnDeinit->M5:1#step7: 削除
2017.02.05 19:56:11.122 I::~I->M5

2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 I::~I->D1

同時性がないのは、ステップ内の関数呼び出しの順序の違いにのみ影響する(ステップ#3、#5に見られるように)

ご覧のように、最初の1回(step#2:2本の出力線)を除いて、その後のチャート周期の変更はすべて予想通りです(step#3:4本の出力線と同様です)。また、なぜ最初のチャート期間の変更が、他のすべてのチャート期間と異なる必要があるのでしょうか?どのように良くなった/悪くなったのか?ステップ#2(とその1つだけ)の出力行が2つ欠けていたのが、なぜステップ#7(赤で強調表示)に移動したのでしょうか?

 
-Aleks-:

このエラーが私のものなのか、それとも端末のものなのか理解できません。

印刷 CalcX=111111111111111104 期待値 CalcX=1111111111111111111

doubleの有効桁数が >DBL_DIG=15 の場合、通常のルールは機能しない
 
A100:

ステップ間に十分な時間があることが前提(グラフの周期が変化する)

2017.02.05 19:49:49.984 I::I->M5 #step1: join
2017.02.05 19:49:49.984 OnInit->M5

2017.02.05 19:51:39.853 I::I->M15 #step2:期間変更M5→M15
2017.02.05 19:51:39.853 OnInit->M15
2017.02.05 19:53:29.813 OnDeinit->M15:3 #step3: 期間変更 M15->M30
2017.02.05 19:53:29.813 I::~I->M15
2017.02.05 19:53:29.864 I::I->M30
2017.02.05 19:53:29.864 OnInit->M30

2017.02.05 19:54:03.245 OnDeinit->M30:3 #step4: 期間変更 M30->H1
2017.02.05 19:54:03.245 i::~i->m30
2017.02.05 19:54:03.286 i::i->h1
2017.02.05 19:54:03.286 OnInit->H1
2017.02.05 19:55:02.984 I::I->H4 #step5: H1 ->H4 期間変更
2017.02.02.05 19:55:02.984 OnInit->H4
2017.02.05 19:55:02.984 OnDeinit->H1:3
2017.02.05 19:55:02.984 I::‾I->H1

2017.02.05 19:55:50.697 I::I->D1 #step6:期間変更 H4 ->D1
2017.02.05 19:55:50.697 OnInit->D1
2017.02.05 19:55:50.697 OnDeinit->H4:3
2017.02.05 19:55:50.697 i::~i->h4
2017.02.05 19:56:11.122 OnDeinit->M5:1 #step7: 削除
2017.02.05 19:56:11.122 I::~I->M5

2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 I::~I->D1

同時性がないのは、ステップ内の関数呼び出しの順番が異なる場合のみ(ステップ#3と#5に見られるように)

見てわかるように、最初の期間変更(ステップ#2)を除いて、その後のチャートの期間変更はすべて予想通りに行われます(ステップ#3と同様)。なぜ、最初のピリオド変更は他のものと違うのですか?どのように良くなった/悪くなったのか?

もう一度説明します。

M5チャートには、何らかの指標があります。タイムフレームをM5からM15に変更すると、同じインジケータの2つ目のコピーが作成されます。コマンドは両方のインジケータに送信されます。最初のインジケータはM5 Deinitに、2番目のインジケータはM15 Initに送信されます。同時に、どのコマンドが先に実行されるかは分からない。つまり、異なるスレッド間で古典的な競合が発生しているのだ。

その後、最初のインジケーターの使用量カウンターを減少させます。使用量カウンターがゼロになってから数秒後に、インジケーターはチャートからアンロードされます。このとき、このインジケータのグローバル・オブジェクトのデストラクタが呼び出されます。
 
Slawa:
もう一度説明します。

M5チャートには、ある指標があります。タイムフレームをM5からM15に変更すると、同じインジケータの2つ目のコピーが作成されます。コマンドは両方のインジケータに送信されます。最初のインジケータはM5 Deinitに、2番目のインジケータはM15 Initに送信されます。同時に、どのコマンドが先に実行されるかは分からない。つまり、異なるスレッド間で古典的な競合が発生しているのだ。

その後、最初のインジケーターの使用量カウンターを減少させます。使用量カウンターがゼロになってから数秒後に、インジケータはチャートからアンロードされます。このインジケータのグローバルオブジェクトのデストラクタが

タイムフレームがM5からM15に変更されたとき、M5 Deinitコマンドは最初のインジケーターに(そしてそれだけに-この場合はM5)送られず、ユーザーがEAを削除するまでチャートからアンロードされないと主張します(そしてそれをチェックすることを提案します)。

Test_i.ex5'のstruct Iを除外すると(効果なし)、出力が簡略化されます。


2017.02.05 20:49:06.842 OnInit->M5

2017.02.05 20:49:21.253 OnInit->M15(*) 期間変更 M5 -> M15: M5指標はアンロードされていない
2017.02.05 20:56:40.001 OnDeinit->M15:3 期間変更 M15 -> M30:M15 指標を 直ちに アンロード
2017.02.05 20:56:40.132 OnInit->M30

(*)から5分以上経過しているが、M5インジケーターがアンロード されていない場合

チャートからExpert Advisorを削除する

2017.02.05 20:57:35.176 OnDeinit->M5:1 Expert Advisorを削除して初めてM5インジケータがアンロードされる
2017.02.05 20:57:35.177 OnDeinit->M30:1

削除済み  
Slawa:
もう一度説明します。

M5チャートには、ある指標があります。タイムフレームをM5からM15に変更すると、同じインジケータのコピーが2つ作成されます。コマンドは両方のインジケータに送信されます。最初のインジケータはM5 Deinitに、2番目のインジケータはM15 Initに送信されます。同時に、どのコマンドが先に実行されるかは分からない。つまり、異なるスレッド間で古典的な競合が 発生しているのだ。

その後、最初のインジケーターの使用量カウンターを減少させます。使用量カウンターがゼロになってから数秒後に、インジケーターはチャートからアンロードされます。その際、このインジケータのグローバルオブジェクトのデストラクタは
どのスレッドのことなのか、説明していただけますか?1つのシンボルのインジケータはすべて1つのスレッドで動作しないのですか?
 
Vladimir Gribachev:

Bill Williamsインジケーター装着時の不具合について

フラクタルを入れてみました。

AOを設定する - ADXを設定する

ビルド1031

MQx/Indicatorsのディレクトリ構造を変更するとメニューが更新されないという何百年も前のバグ :-)バグはもう機能として認識されるくらい古いんだから慣れろ...使い勝手は四角いボルトでスレスレだけど、円周率という数字が一番早くカウントされる :-)
 
A100:
doubleの有効小数点以下の桁数 >DBL_DIG=15 の場合、通常のルールは機能しない

どれが効果的か?

ヘルプによると、longの最大値は9223372036854775807とありますが、明らかにそれに 達していません。