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

 
ファイル名に#が含まれるファイルは、ストレージに追加することができません。これは正常な動作なのか、それともバグなのか?
 

FXの場合、ティックはあまり価格を変化させません(通常)。しかし、他の市場では、チックなアプローチで注文が深刻に滑ることがあります。私はまだ、ダニとダニの間で試してみることに賛成です。

試してみないと...。

 
ヒステリシスの作用...暗黙の代入コピー 演算子が構造体でどのように機能するかの例について。

#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
 
Sergey Dzyublik:
ヒステリシスの作用...は、暗黙のコピー演算子が構造体でどのように動作するかの例です。

おそらく、このようなことを発見するためには、自分のコードの誤りを探すために、「ここでは何もできないが、とにかく調べてみよう」という内的状態/バカになる必要があったのだろう。

 
fxsaber:

そのようなことを検出するためには、自分のコードのバグを探して「ここは何も問題ないだろう、でもとりあえず調べてみよう」という内部状態・バカになる必要があったのではないでしょうか。

このコードは、特定のプロトコルのバイトストリームをパースしていました。
解凍されたデータと解凍されたデータ(次のレベルのカプセル化のためのデータ)が一致しなかった。

 
Sergey Dzyublik:

このコードは、特定のプロトコルのバイトストリームをパースしていた。
解凍されたデータと解凍されたデータ(次のレベルのカプセル化のためのデータ)が一致しなかった。

そのような作業を察知するのは難しいことではありません。ラッキー。
 
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

 
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
}
 
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)は発生しない


 
Igor Zakharov:

特にストラテジーテスターでは、すべてのティックをカウントすることは、リソースを消費することになります。トレードイベントのみ、つまりオープンポジションのリストの何かが実際に変更されたときに再計算する方が正しいのではないでしょうか?OnTradeTransaction()を使えば、EAへのユーザーの介入を簡単に制御することができます。(前例があります :)

このロボットでは、次のスキームでグリッドを閉じる可能性をテストしていました:損失+利益> X 、そしてそれらの両方(通常は異なるシンボルで)を閉じます。しかし、クローズしているにもかかわらず、テスターがそれに気づかず、すでにクローズしているものと既存のものを誤って「ペアリング」して次のイテレーションに進んでしまうという失敗が発生するのである。つまり、閉じた後に再計算を追加する必要があったのです。

カウンターをリセットして、+1 / -1ではなく、すべてのオープンなものを最初に再計算しています。

そうですね、 OnTradeTransaction()最初に使うのは危険 でした。実際、私のリクエストが非同期 でない場合、私はこれを使うことを拒否するでしょう。

リスクはまったくありません。問題は、行動や出来事の順序を整理することだけである。愚か者の助言は正しい - ペアを閉じて、次のティックまでループを残す。次のティックでは、必ずしも価格が悪くなっているわけではありません。もしかしたら、もう少し後で閉じた方がいいかもしれませんが、何が何で閉じたのか混乱することはないでしょう。

2つ目の方法は、PositionsTotalではなく、あらかじめ作成した配列でループをアレンジする方法です。そして、いくつかのペアを閉じるときに、これらのチケットは配列から削除される必要があります。これにより、閉じたポジションを 再び閉じることができなくなります。一般的には、空想と行動の論理の飛行。