エラー、バグ、質問 - ページ 2451 1...244424452446244724482449245024512452245324542455245624572458...3185 新しいコメント 削除済み 2019.05.03 09:24 #24501 ファイル名に#が含まれるファイルは、ストレージに追加することができません。これは正常な動作なのか、それともバグなのか? Igor Zakharov 2019.05.03 09:41 #24502 FXの場合、ティックはあまり価格を変化させません(通常)。しかし、他の市場では、チックなアプローチで注文が深刻に滑ることがあります。私はまだ、ダニとダニの間で試してみることに賛成です。 試してみないと...。 Sergey Dzyublik 2019.05.03 11:33 #24503 ヒステリシスの作用...暗黙の代入コピー 演算子が構造体でどのように機能するかの例について。#define PRINT(x) Print(#x, ":", string(x)) struct MyArray{ uchar data[]; }; void OnStart(){ MyArray tmp_arr; MyArray huge_arr; ArrayResize(huge_arr.data, 1000); ArrayInitialize(huge_arr.data, 0x8); MyArray small_arr; ArrayResize(small_arr.data, 10); ArrayInitialize(small_arr.data, 0x1); tmp_arr = small_arr; Print("\r\nTest with small_arr"); PRINT(ArraySize(tmp_arr.data)); PRINT(tmp_arr.data[0]); PRINT(tmp_arr.data[ArraySize(tmp_arr.data)-1]); tmp_arr = huge_arr; Print("\r\nTest with huge_arr"); PRINT(ArraySize(tmp_arr.data)); PRINT(tmp_arr.data[0]); PRINT(tmp_arr.data[ArraySize(tmp_arr.data)-1]); tmp_arr = small_arr; Print("\r\nTest with small_arr"); PRINT(ArraySize(tmp_arr.data)); PRINT(tmp_arr.data[0]); PRINT(tmp_arr.data[ArraySize(tmp_arr.data)-1]); } 結果2019.05.03 14:29:14.005 Test_push (EURUSD,H1) Test with small_arr 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) ArraySize(tmp_arr.data):10 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) tmp_arr.data[0]:1 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) tmp_arr.data[ArraySize(tmp_arr.data)-1]:1 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) Test with huge_arr 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) ArraySize(tmp_arr.data):1000 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) tmp_arr.data[0]:8 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) tmp_arr.data[ArraySize(tmp_arr.data)-1]:8 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) Test with small_arr 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) ArraySize(tmp_arr.data):1000 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) tmp_arr.data[0]:1 2019.05.03 14:29:14.005 Test_push (EURUSD,H1) tmp_arr.data[ArraySize(tmp_arr.data)-1]:8 fxsaber 2019.05.03 11:41 #24504 Sergey Dzyublik: ヒステリシスの作用...は、暗黙のコピー演算子が構造体でどのように動作するかの例です。おそらく、このようなことを発見するためには、自分のコードの誤りを探すために、「ここでは何もできないが、とにかく調べてみよう」という内的状態/バカになる必要があったのだろう。 Sergey Dzyublik 2019.05.03 12:40 #24505 fxsaber:そのようなことを検出するためには、自分のコードのバグを探して「ここは何も問題ないだろう、でもとりあえず調べてみよう」という内部状態・バカになる必要があったのではないでしょうか。このコードは、特定のプロトコルのバイトストリームをパースしていました。 解凍されたデータと解凍されたデータ(次のレベルのカプセル化のためのデータ)が一致しなかった。 fxsaber 2019.05.03 12:50 #24506 Sergey Dzyublik:このコードは、特定のプロトコルのバイトストリームをパースしていた。 解凍されたデータと解凍されたデータ(次のレベルのカプセル化のためのデータ)が一致しなかった。 そのような作業を察知するのは難しいことではありません。ラッキー。 A100 2019.05.03 14:08 #24507 Sergey Dzyublik: ヒステリシスの作用...構造体における暗黙のコピー演算子の動作の例。質問は何ですか? void OnStart() { int a[]; ArrayResize( a, 3 ); ArrayInitialize( a, 3 ); int b[]; ArrayResize( b, 2 ); ArrayInitialize( b, 2 ); MQLでは、条件付きエントリ // a = b; イコール ArrayCopy( a, b ); 結果 ArrayPrint( a ); } 2 2 3 Sergey Dzyublik 2019.05.03 15:00 #24508 A100:質問は何ですか? 私見ですが、代入コピー 演算子は、配列の要素 そのものだけでなく、その番号もコピーして、予約メモリの量を有効なままにしておくべきだと思います。そして今は、実質的に以下のような状態です。 int size; size = 4; // size == 4 size = 8; // size == 8 size = 4; // size == 8 ソースコードです。 struct MyArray{ uchar data[]; } MyArray GetArray(int i){ MyArray arr; if (i%2 == 0){ ArrayResize(arr.data, 8); ArrayInitialize(arr.data, 0x8); }else{ ArrayResize(arr.data, 4); ArrayInitialize(arr.data, 0x4); } return arr; } void OnStart(){ MyArray arr_1 = GetArray(1); ArrayPrint(arr_1.data); // 4 4 4 4 MyArray arr_2 = GetArray(2); ArrayPrint(arr_2.data); // 8 8 8 8 8 8 8 8 arr_2 = arr_1; ArrayPrint(arr_2.data); // 4 4 4 4 8 8 8 8 } A100 2019.05.03 15:17 #24509 Sergey Dzyublik: コピー演算子は配列の要素 そのものだけでなく、その番号もコピーする必要があり、予約メモリの量はそのまま残します。 ではなぜ struct MyArray { uchar data[]; }; void OnStart() { { uchar a[], b[]; a = b; } //(1) Error { MyArray a, b; a = b; } //(2) нормально } ではエラー、②では問題なし!?何が違うの? 違いは、配列のコピーが a = b ではなく、ArrayCopy( a, b ) という規則で行われることです。 a=bの法則では存在しないし、存在すればエラー(1)は発生しない Alexey Viktorov 2019.05.03 15:29 #24510 Igor Zakharov:特にストラテジーテスターでは、すべてのティックをカウントすることは、リソースを消費することになります。トレードイベントのみ、つまりオープンポジションのリストの何かが実際に変更されたときに再計算する方が正しいのではないでしょうか?OnTradeTransaction()を使えば、EAへのユーザーの介入を簡単に制御することができます。(前例があります :) このロボットでは、次のスキームでグリッドを閉じる可能性をテストしていました:損失+利益> X 、そしてそれらの両方(通常は異なるシンボルで)を閉じます。しかし、クローズしているにもかかわらず、テスターがそれに気づかず、すでにクローズしているものと既存のものを誤って「ペアリング」して次のイテレーションに進んでしまうという失敗が発生するのである。つまり、閉じた後に再計算を追加する必要があったのです。 カウンターをリセットして、+1 / -1ではなく、すべてのオープンなものを最初に再計算しています。 そうですね、 OnTradeTransaction() を最初に使うのは危険 でした。実際、私のリクエストが非同期 でない場合、私はこれを使うことを拒否するでしょう。リスクはまったくありません。問題は、行動や出来事の順序を整理することだけである。愚か者の助言は正しい - ペアを閉じて、次のティックまでループを残す。次のティックでは、必ずしも価格が悪くなっているわけではありません。もしかしたら、もう少し後で閉じた方がいいかもしれませんが、何が何で閉じたのか混乱することはないでしょう。 2つ目の方法は、PositionsTotalではなく、あらかじめ作成した配列でループをアレンジする方法です。そして、いくつかのペアを閉じるときに、これらのチケットは配列から削除される必要があります。これにより、閉じたポジションを 再び閉じることができなくなります。一般的には、空想と行動の論理の飛行。 1...244424452446244724482449245024512452245324542455245624572458...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
FXの場合、ティックはあまり価格を変化させません(通常)。しかし、他の市場では、チックなアプローチで注文が深刻に滑ることがあります。私はまだ、ダニとダニの間で試してみることに賛成です。
試してみないと...。
結果
ヒステリシスの作用...は、暗黙のコピー演算子が構造体でどのように動作するかの例です。
おそらく、このようなことを発見するためには、自分のコードの誤りを探すために、「ここでは何もできないが、とにかく調べてみよう」という内的状態/バカになる必要があったのだろう。
そのようなことを検出するためには、自分のコードのバグを探して「ここは何も問題ないだろう、でもとりあえず調べてみよう」という内部状態・バカになる必要があったのではないでしょうか。
このコードは、特定のプロトコルのバイトストリームをパースしていました。
解凍されたデータと解凍されたデータ(次のレベルのカプセル化のためのデータ)が一致しなかった。
このコードは、特定のプロトコルのバイトストリームをパースしていた。
解凍されたデータと解凍されたデータ(次のレベルのカプセル化のためのデータ)が一致しなかった。
ヒステリシスの作用...構造体における暗黙のコピー演算子の動作の例。
質問は何ですか?
MQLでは、条件付きエントリ
// a = b;
イコール
ArrayCopy( a, b );
結果
ArrayPrint( a ); }
2 2 3
質問は何ですか?
私見ですが、代入コピー 演算子は、配列の要素 そのものだけでなく、その番号もコピーして、予約メモリの量を有効なままにしておくべきだと思います。
そして今は、実質的に以下のような状態です。
ソースコードです。
コピー演算子は配列の要素 そのものだけでなく、その番号もコピーする必要があり、予約メモリの量はそのまま残します。
ではなぜ
ではエラー、②では問題なし!?何が違うの?
違いは、配列のコピーが a = b ではなく、ArrayCopy( a, b ) という規則で行われることです。
a=bの法則では存在しないし、存在すればエラー(1)は発生しない
特にストラテジーテスターでは、すべてのティックをカウントすることは、リソースを消費することになります。トレードイベントのみ、つまりオープンポジションのリストの何かが実際に変更されたときに再計算する方が正しいのではないでしょうか?OnTradeTransaction()を使えば、EAへのユーザーの介入を簡単に制御することができます。(前例があります :)
このロボットでは、次のスキームでグリッドを閉じる可能性をテストしていました:損失+利益> X 、そしてそれらの両方(通常は異なるシンボルで)を閉じます。しかし、クローズしているにもかかわらず、テスターがそれに気づかず、すでにクローズしているものと既存のものを誤って「ペアリング」して次のイテレーションに進んでしまうという失敗が発生するのである。つまり、閉じた後に再計算を追加する必要があったのです。
カウンターをリセットして、+1 / -1ではなく、すべてのオープンなものを最初に再計算しています。
そうですね、 OnTradeTransaction() を最初に使うのは危険 でした。実際、私のリクエストが非同期 でない場合、私はこれを使うことを拒否するでしょう。
リスクはまったくありません。問題は、行動や出来事の順序を整理することだけである。愚か者の助言は正しい - ペアを閉じて、次のティックまでループを残す。次のティックでは、必ずしも価格が悪くなっているわけではありません。もしかしたら、もう少し後で閉じた方がいいかもしれませんが、何が何で閉じたのか混乱することはないでしょう。
2つ目の方法は、PositionsTotalではなく、あらかじめ作成した配列でループをアレンジする方法です。そして、いくつかのペアを閉じるときに、これらのチケットは配列から削除される必要があります。これにより、閉じたポジションを 再び閉じることができなくなります。一般的には、空想と行動の論理の飛行。