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

 

ArrayInitializeが 動作しないコードが添付されていますが、ループのコメントを解除すると、すべてうまくいきます。

また、クラス内の変数とグローバルレベルのインジケータを同じ名前で宣言した場合、警告が表示されます。

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Line1
#property indicator_label1  "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Line2
#property indicator_label2  "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         Line1Buffer[];
double         Line2Buffer[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Line1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Line2Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Line1Buffer,true) ;
   ArraySetAsSeries(Line2Buffer,true) ;
   ArrayInitialize(Line1Buffer,EMPTY_VALUE) ;
   ArrayInitialize(Line2Buffer,EMPTY_VALUE);
   return(0);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
      ArraySetAsSeries(price,true) ;
      int i ;
     /* for(i=0; i<rates_total;i++)
         {
            Line1Buffer[i]=EMPTY_VALUE;
            Line2Buffer[i]=EMPTY_VALUE ;
         }*/
      for(i=0;i<100;i++)
         {
            Line1Buffer[i]=price[i] ;
         }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

週末、ティックがない間に、私はデモ口座でこのインディケータをデバッグし、MT5ターミナルの2つのインスタンスの最後のビルドで実行しました。設定はどこでも同じです。念のため、オフラインで確認しましたので、ティック要素は除外しています。

問題は、「アンダー・インディケータ」の最も単純なコード(本格的で複雑なインディケータは言うに及ばず)が、各社の端末によって異なる数値を表示することである。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];
int handle;

int OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=iFractals(_Symbol,PERIOD_CURRENT);
   if(handle==INVALID_HANDLE) return(-1);

   return(0);
  }

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[])
  {
   Print(1);

   return(rates_total);
  }

1.EGlobal。2.メタクォーツEGグローバルメタクォーツ

念のため、両端末を完全にアンロードし(メモリプロセスでタスクマネージャで確認)、再度ロードして両コードを再コンパイルしました。結局、変更なし。

 
当たり前のこと、それが当たり前なんです。
 

MathRound() は4と5で動作が異なるので、同じにする必要があります。

4Pのコードです。

int start()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
  return(0);
}

5秒コード

void OnStart()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
}
 
joo:

MathRound()は4と5で動作が異なるので、同じにする必要があります。

4秒コード

5秒コード

問題はここなんです。

  double y=MathRound(-0.5);
  Print("Округление -0.5 до ",y);

この値は、4と5で丸め方が異なります。

 
Loky:
当たり前だ、それが当たり前なんだ。
さらに具体的には?
 

テストが中断された場合、MT5が注文履歴などを 保存しないのはなぜですか?MT4では保存されていました。

また、テストチャートからの注文履歴に位置決めがありません。チャートをクリックすることで、大きなドローダウンの領域の注文を見ることができ、便利でした。

 

こんばんは。

SLeep()メソッドがどのように機能するのか、教えてください。

Expert Advisor を一定時間、一時停止するはずですが、間違っていますか?


{for (int sleep=0;sleep<10000;sleep++)

if(BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)); break; }.else Sleep(100);}.

このコードでは、ある指標について計算されたバーの数がある値よりも大きい場合、ループが解除され、そうでない場合、次のコードの実行に100msの遅延が発生するという結果を期待しています。可能な合計遅延時間は100*10000ms...インジケータの計算には十分な時間です。あるいは、テスターでは、私が想定しているように、この機能は動作していません。分かりやすく説明していただき、ありがとうございました。

 
mi__x__an:

こんばんは。

SLeep()メソッドがどのように機能するのか、教えてください。

Expert Advisor を一定時間、一時停止するはずですが、間違っていますか?


{for (int sleep=0;sleep<10000;sleep++)

if (BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)); break; }.else Sleep(100);}.

このコードでは、ある指標について計算されたバーの数がある値よりも大きい場合、ループが解除され、そうでない場合、さらにコードの実行に100msの遅延が発生するという結果を期待しています。可能な合計遅延時間は100*10000ms...インジケータの計算には十分な時間です。あるいは、テスターでは、私が想定しているように、この機能は動作していません。分かりやすく説明していただき、ありがとうございました。

スリープは インジケータでは機能しない
 

例えばCopyBufferの ドキュメントを見ると、「インジケータ値の一部を(インジケータバッファ ではない)別の配列にコピーしたい場合は、必要な値がコピーされている中間配列をこの目的に使用する必要があります」とあり、脳がガタガタになってしまうのだそうです。そして、すでにこの中間配列から、必要な数の値を要素ごとに受信配列の適切な位置にコピーしています。"

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   [...]
   );

buffer_num が明示的に参照される場合、SetIndexBuffer を用いて、受信配列と指示バッファの間に一つまたは複数のシーケンス番号を事前バインドする必要があることを確実に示唆 する。しかし、「インジケータのいくつかの値を(インジケータバッファではない)別の配列にコピーしたい場合」、buffer_numは インジケータではないので、定義上、何も接続していないので、話に ならないのです。

矛盾?

曖昧さ?

それとも、完全にプログラムされているのだろうか?

インジケータ・バッファの明確な定義を探したのですが、失敗しました。SetIndexBufferで リンクされた任意のバッファなのか、それともそれだけでは不十分で、INDICATOR_DATA 識別子を持つ配列でなければならないのか?