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

 
Slava:
とはならないはずです。


1.ユニオンはいつから導入される予定ですか?

2.typedefも入力されるのでしょうか?

3.基本型へのポインターは導入される予定なのか?
 
Konstantin:


1.ユニオンはいつから導入される予定ですか?

2.unionでtypedefも導入されるのでしょうか?

3.基本型へのポインタの導入は予定されていますか?

1.もうすぐです。コンパイラの準備はすべて整ったので、今テストしているところです。テスト終了後、公開する予定です。

2.いつになるかは未定です。

3.いいえ、予定していません。

 

受信配列のサイズがコピーするサイズ より大きい場合でも、何らかの理由でCopyTime(またはそれに類するもの)は受信配列のサイズを変更 します。

皆さん、正常ですか?昔からこうだったのでしょうか?それともバグ?

例えば、こんな感じです。

static datetime TimeBuf[]; 

if (ArraySize(TimeBuf) == 0) ArrayResize(TimeBuf, 10);

CopyTime(_Symbol, _Period, 0, 1, TimeBuf);

CopyTime 関数は、TimeBuf 配列を 1 にリサイズします。

これは原理的に間違っています。

それは、データが配列の先頭にコピーされ、その結果、最適化のポイントがルートで失われてしまうということです。

 
Marat Sultanov:

受信配列のサイズがコピーするサイズ より大きい場合でも、何らかの理由でCopyTime(またはそれに類するもの)は受信配列のサイズを変更 します。

皆さん、正常ですか?昔からこうだったのでしょうか?それともバグ?

例えば、こんな感じです。

CopyTime 関数は、TimeBuf 配列を 1 にリサイズします。

これは原理的に間違っています。

それは、データが配列の先頭でコピーされるため、最適化のポイントがルートで失われてしまうことです。

あなたの配列はダイナミックですね。つまり、サイズが可変であること。寸法を角括弧で指定していないため。

staticは、Expert Advisorがロードされるときにこの配列のオブジェクトが構築され、アンロードされるときに破棄されることを意味します。

 
Slava:

あなたの配列はダイナミックですね。つまり、サイズが可変であること。その寸法を角括弧で指定していないため

staticは、この配列のオブジェクトがEAのロード時に構築され、アンロード時に破棄されることを意味します。

申し訳ありませんが、的外れなことを言っています。

グローバルスコープで配列を宣言させる

datetime _TimeBuf[]; 

void OnTick()
{}

それから。

1) 初回は、何本目のバーがあるかを配列にコピー(CopyTime)します。

datetime _TimeBuf[];
int      _BarsCountReserveSize;

void OnTick()
{
   int BarsCount = Bars(_Symbol, _Period);
   
   if (ArraySize(_TimeBuf) == 0)
   { 
      if (_BarsCountReserveSize <= BarsCount) _BarsCountReserveSize = (int)ceil(BarsCount*1.3);

      ArrayResize(_TimeBuf, BarsCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, BarsCount, _TimeBuf);
   }
}

2) 最適設計によると、新しいバーが 現れたら、すべてのバーをコピーしたくないですよね?そこで、最後の2つの変更された小節だけをコピーすることにしました。

datetime _TimeBuf[];
int      _BarsCountReserveSize;

void OnTick()
{
   int BarsCount = Bars(_Symbol, _Period);
   
   if (ArraySize(_TimeBuf) == 0)
   { 
      _BarsCountReserveSize = (int)ceil(BarsCount*1.3);

      ArrayResize(_TimeBuf, BarsCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, BarsCount, _TimeBuf);
   }
   else
   {
      int RequiredCount = BarsCount - ArraySize(_TimeBuf) + 1;
      
      ArrayResize(_TimeBuf, RequiredCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, RequiredCount, _TimeBuf);
   }
}

3) 結局、私たちの最適化はうまくいきません。なぜなら、CopyTimeは 配列のサイズを変更し、サイズ =RequiredCountと し、さらに予備サイズも失うからです(CopyTimeは それを意識していません)。

 

CopyTimeが 配列の終端から始端に直接コピーした場合は、このような事態は起こりません。

をその場で確認することができます。

_TimeBuf[0] = D'2017.01.01';
_TimeBuf[1] = D'2017.01.02';
_TimeBuf[2] = D'2017.01.03';

それを

const int ArrSize = ArraySize(_TimeBuf);

_TimeBuf[ArrSize-3] = D'2017.01.01';
_TimeBuf[ArrSize-2] = D'2017.01.02';
_TimeBuf[ArrSize-1] = D'2017.01.03';
 

コピー関数は常に動的配列の サイズを変更してきました。大きいサイズにも、小さいサイズにも。しかし、クエリーの結果として与えられるレコードの数とは、常に明確な対応関係があった。

あなたの場合、元のクエリを動的にリサイズ可能な配列に変更しました。一度に1つの要素を要求する他のすべてのリクエストは、あらかじめ定義されたサイズの配列(datetime _TimeBuf1[1])で行うため、再分配は行われない。受信した要素を大きな動的配列に自己再配置する。

 

だから、いつもそうで、当たり前なんです。なるほど。ご返信ありがとうございました

拡大することは意識していましたが、要求されたデータのサイズに縮小することは意識していませんでした。これでわかる!ありがとうございます。

 

MT4ビルド1065

USDJPY TF M15のテスト

を結果ログから削除してください。

406 2014.11.28 20:30 sell 18 5.50 118.641 0.000 117.015 0.00
521 2014.12.09 17:15 t/p 18 5.50 118.386 0.000 118.386-148.95

損失はどのようにして発生するのでしょうか?
 
-Aleks-:

損失はどのようにして発生するのでしょうか?

スワップする。