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

 
fxsaber:
天下り先も非公開にするのが良いと思います。より良い理解のために要するに、ポイントではないんです。
子孫に呼びかけるべき。)
 
Sergei Vladimirov:
子孫に召還されなければならないのです。)
要は、その必要がないってことなんです。私の例をご覧ください。
 
fxsaber:
要は、その必要がないってことなんです。私の例をご覧ください。
あなたの例とは異なりますが、ポイントは同じです - 子孫はベースクラスの仮想メソッドをオーバーライドします。なるほど、誰の目にも明らかですね。
 

インジケーターバッファの エラー

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

class BUFFER
{
public:
  double Buffer[];
  
  BUFFER()
  {
    ::SetIndexBuffer(0, this.Buffer);
  }
};

BUFFER* Buf;

void OnInit()
{
  Buf = new BUFFER;
}

void OnDeinit( const int Reason )
{
  delete(Buf);
}

void Restart()
{
  OnDeinit(REASON_PARAMETERS);
  OnInit();
}

#define  PRINT(A) Print(#A + " = " + (string)A);

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{
  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;
  
  PRINT(ArraySize(Buf.Buffer));
  
  Buf.Buffer[0] = 0; // array out of range
  
  return(rates_total);
}

ログ検索結果

2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      array out of range in 'Test.mq5' (56,13)
2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 0
2016.09.12 17:21:54.828 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 2067

デバッガは頑なにBuf.Buffer ALWAYS is dynamic array[0],I.と言っています。I.e.はインジケーターバッファーです。しかし、ゼロサイズであることが判明した。

デバッガーはリリースよりもログに書き込む量が多いことが判明しました。リリースでは、そのようなことは報告されていません

2016.09.12 17:25:08.706 Test (RTS-9.16,M1)      Indicator buffer #0  detached
MT5でインジケーターのバッファを一度だけ設定することは可能ですか?
 

秘密でもないのに、なぜ複雑なのか?もちろん、研究としての面白さは別としてね。

この代わりに(ちなみに、起動時だけでなく運用中も再初期化が必要な場合があるので、原理的には間違っています)。

  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;

ただ、このように。

if(prev_calculated == 0)
   ArrayInitialize(Buf.Buffer, 0.0);
 
Sergei Vladimirov:

秘密でもないのに、なぜ複雑なのか?もちろん、研究としての面白さは別としてね。

インジケーターバッファとして固定された動的配列が削除されるケースがあるのですが。その後、再度ダイナミック配列を作成し、インジケーターバッファーとして割り当てる必要があります。デバッガでは、割り当てられていることが表示されます。しかし、その大きさだけは0である。これはエラーです。

この問題は、結論から言うと、古い。

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

インジケーターバッファ#xが外れた」というメッセージを非表示にする方法

コンスタンチン・イワノフ さん 2015.02.17 21:18

私のインジケータでは、array-bufferをオブジェクトのインスタンスに格納しています。
OnDeinit()でオブジェクトを削除する際、バッファ(SetIndexBuffer())にリンクしている全ての配列に対してメッセージを表示するようにしました。

"インジケーターバッファ#xの切り離し"

このメッセージを出さずにバッファから配列を切り離すにはどうしたらよいですか?
または、このメッセージを非表示にする方法を教えてください。

http://forum.mql4.com/63975 のブランチを見つけましたが、提案されたグローバルコンテキストでバッファを保存するオプションは、私の場合うまくいき ません。


グローバルコンテキストでバッファを保存するオプションは、私にとっても機能しません。面白いことに、MT4で動作します。

 

article初心者のためのMQL5でEAを書くためのステップバイステップガイド コードがあります。


3桁で分割する必要はないのでしょうか?

 
Aleksey Rodionov:

article初心者のためのMQL5でEAを書くためのステップバイステップガイド コードがあります。


3桁で分割する必要はないのでしょうか?

EURUSD(5桁)、USDJPY(3桁)に残された初歩的なものです。間違いはありませんが、特に初心者はやらない方が無難です。
 
すべての継承されたクラスに対して単一のインターフェースを定義する必要があります。常にInitメソッドを持つ必要があります。しかし、Initはコンストラクタの複製のようなものなので、入力パラメータのバリアントを先に定義することはできません。そのようなインターフェースはどのように指定するのですか?
 
MKさん、インポートした関数には、以下のような構文を許容してはいかがでしょうか。
#import ...
 int send(SOCKET s, void &buf[], int len, int flags);
 int send(SOCKET s, void &buf, int len, int flags);
#import

今度は醜いものを作らなければならない。

#import ...
 int send(SOCKET s, char &buf[], int len, int flags);
 int send(SOCKET s, int &buf, int len, int flags);
 int send(SOCKET s, char &buf, int len, int flags);
 int send(SOCKET s, Cpoint &buf[], int len, int flags);
 ...
#import

内部のインライン関数にはお勧めしませんが、インポートされた関数には安全なはずです。