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

 
Ilyas:
つまり、端末に制御を戻さず、DLL内のFnの内部で「無限」ループで「ハングアップ」してしまったのですね。
正常終了ってどんなんだよ!?

このような動作が必要な場合は、DLL の Fn 内でループを持つ別のスレッドを実行し、別の関数 FnStop と DLL_PROCESS_DETACH で設定されるフラグで停止させる必要があります。

制御を取り戻せないということは、例えばwhileを別スレッドで実行し、mqlスレッドをブロックしないようにする必要があることは明らかです。
しかし、私は別のスレッドで実行中に同じ動作を得る、問題はDLL_PROCESS_DETACHで、この識別子が動作しない、既存のフラグDetachのためにです。
そう、このフラグを制御するために、別途エクスポートした関数を 作成する必要があることは、すでに書きました。
しかし、この例のように、DLL_PROCESS_DETACHのフラグが機能しない。
ターミナルでエラーが発生した場合、DLL_PROCESS_DETACHによってフラグが別の状態に移行されるのは論理的なことです。
whileループはこの状態を取得し、ループを抜け、途中で遭遇したものはすべて実行され、Fn()関数自体を終了させます。
この後、DLLをアンロードする必要があります。
しかし、これは起こらず、隠された端末のメカニズムによって何らかの早期DLLアンロードが発生し、クラッシュしてしまうのです。

 
TheXpert:

お前やフェドセーエフ等のような無能がバグや建前を論じることに巻き込まれるのは勘弁してほしい。

MQLでC++から丸ごと取り入れた構文や機構がC++と同じように見えるように、C++と同じように動作するように。

戯言だとわかっていても、口に出さなければならない。

別言語とか別スレとか迷惑だと愚痴ってるのはお前だろ。

自分と同調者のために別スレを立ててそこで愚痴ればいい。

もっと良いイメージがあったんですけどね。私のミスです。そうなるんです。猪突猛進で・・・。スマートではない

 
Roman:

これは、例えば、mqlのスレッドをブロックしないように、別のスレッドで実行する必要があるときに作られています。
私は別のスレッド中に起動したときに同じ動作を得る、問題はDLL_PROCESS_DETACHで、この識別子が動作しない、既存のフラグDetachのためにです。
そう、このフラグを制御するために、別途エクスポートした関数を 作成する必要があることは、すでに書きました。
しかし、この例のように、DLL_PROCESS_DETACHのフラグが機能しない。
ターミナルでエラーが発生した場合、DLL_PROCESS_DETACHによってフラグが別の状態に移行されるのは論理的なことです。
whileループはこの状態を取得し、ループを抜け、途中で遭遇したものはすべて実行され、Fn()関数自体を終了させます。
この後、DLLをアンロードする必要があります。
しかし、これは起こらず、隠された端末のメカニズムによって何らかの早期DLLアンロードが発生し、クラッシュしてしまうのです。

当ててみようか。dllから端末スレッドでループを開始するとハングアップし、別スレッドで実行するとdetach()で端末がエラーでクラッシュするのですが?
 
Roman:

制御を取り戻さないというのは単なる例で、スレッドをブロックしないようにwhileを別スレッドで実行すべきなのは明らかです

だから、ちゃんとした例をあげて、添付ファイルは放っておいて、スレッドの作成・削除は自分で明示的に管理する。
 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

セルゲイ・デジブリク, 2019.05.26 15:12

残念ながら、現時点ではMT4/MT5のファンクションポインタの種類は非常に限られており、いくつかの不具合があるため実用に耐えるものではありません。
#(MT5(build 2118)では修正されていません)"typedef 内で同じ関数シグネチャを繰り返し使用するとコンパイルエラーに なる".
#(MT5(build2118)では修正されて いません)"typedef で作業する場合、明示的に特殊化されたテンプレート関数を使用すると、そのテンプレート関数用のコードが生成されない".


名前空間の実装を想定して、不具合修正の一環として、次のC++でこの動作の サポートを実装することを検討してください。
//#include <iostream>

template<typename T>
class A{
public:
    typedef void (*callback)(T&);   //class namespace for function pointer type
    callback f_ptr;
    T data;
};

template<typename T>
class B{
public:
    typedef void (*callback)(T&);   //class namespace for function pointer type
    callback f_ptr;
};

template<typename T>
void func(T& value){
    ++value;
}


void OnStart(){
//int main(){
    A<int> a;
    B<int> b;
    
    a.f_ptr = func<int>;      // automatic code generation of templates functions
    b.f_ptr = a.f_ptr;        // assignment operation for function pointers with the same function signatures and different function pointer types.
    
    int x = 1;
    b.f_ptr(x);
    printf("%d\r\n", x);                  //2
    printf("%d\r\n", b.f_ptr == a.f_ptr); //1     // equal operation for function pointers with the same function signatures and different function pointer types.
}

MT5(ビルド2118)、typedef 機能のバグフィックスはいつまで待てばいいのでしょうか?
いくつかのナンセンス -typedefの 使用に関する原始的な例の左側にステップと、それはそれだ -バグの束は、さらなる発展をブロックする。

 
Vladimir Simakov:
当ててみようか。ターミナルのスレッドでdllからのループを実行するとハングするけど、detach()した別スレッドで実行するとターミナルがエラーでクラッシュするんだけど?

そうではありません。
ループの起動は問題なく動作します。
問題は、プログラムを強制的に停止し、ループにフラグを渡してループを終了し、実行中の関数を終了させる場合です。
しかし、ターミナルでは、ループを終了して実行中の関数を正しく終了させることができません。なぜなら、早期のDLLアンロードがすでにトリガーされているからです。ハングアップしてしまうんです。
フラグ状態が渡される前にDLLがアンロードされ、Fn関数が終了しない、早期アンロードはすべてを破壊する。

ブロッキングモードでは問題がよく見えるので、すべてのコードを書くのを避けるために、例えばターミナルスレッドで行いました。
ループフラグ用に別の関数を作成し、実行中のループは別のスレッドで実行していますが、同じ動作です。
そして、ロックされていないmqlのコードから、ループを終了する関数を通して、フラグを別の状態に切り替えようとしたとき。
の場合、端末は実行中のループが終了するのを待たず、ループが実行されている場所でFn関数を終了させます。
Fn機能の完了を待たずに、端末が即座にアーリーDLアンロードを実行します。これが問題なのです。

TheXpert です。
だから ちゃんとした例を挙げてよ アタシは放っておいて スレッドの作成と削除を 自分で管理しなさいよ。

ロックモードでは、問題がよくわかります。フラッグの状態がどう変わるかは、あまり重要ではありません。エントリーポイントや独立した機能で
ロックモードでは制御が引き渡されず、フラグ変更関数が呼び出せない ため、エントリポイントはロックモードの方が良い。 そのため、アタチデテチを例にしています。
アタチのデタッチャブルはそのままにして、アドバイス通り別機能にしてみましたがダメでした、ノンブロッキングモードで動いているプロジェクトでも同じ挙動です。
dllが早期にアンロードされ、whileループで実行中の関数が完了する時間がなく、ハングアップする。

 
Roman:

DLLが早期にアンロードされ、whileループで実行中の関数が終了する時間がなく、ハングアップが発生する。

ふつうの実装では、ハングアップはありえない

 

カスタムシンボルについて、以下のような問題に遭遇された方はいらっしゃいますか?CustomRatesUpdate関数は通常のクォートを受信しますが、実際には、チャートとデータウィンドウに何か奇妙なものが含まれています(この場合、終値と安値は合格の100倍以下です)。

また、並行してCustomTicksAddでシングルティックをログと同じ終値の値でエミュレートしています(CustomRatesUpdateの直前)、つまり、引用符の縮小値がどこから来ているのかが不明です。

UPDです。

私はUSDCADで "逆 "の状況を得ました - 書き込み後に相場が10倍になりました。これは私が取得しているログです。

2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32987 1.32987 1.32980 1.32987           457       48             0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) Retry: 1 0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]   [high]   [low]  [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32980 13.29730 1.32980 13.29730           457       52             0

最初のArrayPrintはCustomRatesUpdateで書き込んだもの、2番目のArrayPrintは書き込み直後の直近のバーからCopyRatesを使って読み込んだものです。まず、違いはオープンの下一桁ですが、それ以上にハイとクローズが10倍になっています。

 
Stanislav Korotky:

カスタムシンボルについて、以下のような問題に遭遇された方はいらっしゃいますか?CustomRatesUpdate関数は通常のクォートを受信しますが、実際には、チャートとデータウィンドウに何か奇妙なものが含まれています(この場合、終値と安値は合格の100倍以下です)。

また、ログと同じ終値の値(CustomRatesUpdateの直前)でCustomTicksAddを使用してシングルティックを並行してエミュレートしており、つまり、クォートで減少した値がどこから来るのかが不明です。

はい、私も遭遇したことがありますが、私のヌルが明確でなかっただけです。トゲの数が100倍になっているんですね。
ゼロチェックを追加でやってもダメで、動作がおかしくなって、それからこんなスパイクを描くようになったんです。
ほとんどの場合、この動作はプログラムの最初の起動時に確認され、最初の起動時に、存在しない日付で履歴ファイルが作成されました。
フォルダダニを掃除し、コードを修正し、どこにバグを見つけるために、退屈して、今のところ延期されたが、また、この問題に返す必要があります(()。
また、フォルダのカスタム履歴を確認すると、存在しない日付のファイルがあるかもしれません )))
一般に、バグは特定のそこに住んでいます。

このスレッドに問題を再現してください
そこではスラバがカスタムキャラクターを担当しているようですね。
問題を想起させること。
 

このエラーは以前から言われていたのでしょうか?見つからない。結論:キャッシュファイルから最適化結果を読み込むと、前方結果が不正に表示される。パラメータ値の桁数が間違っている。

最適化タブに移動するのです。Expert Advisorを選択します。前者の最適化のいずれかを選択します。バックテストは正常に読み込まれます。フォワードはこれを与える。



MT5、最新ビルド、x64。