事前計算された - ページ 2

 
Alexey Kozitsyn:
0の時にインジケータ全体を再計算するのはどうでしょうか?私には最適なソリューションのように思えます。
グラフィックを多用した重厚なインジケーターとしては、ベストとは言えません。いいえ、解決策は簡単です。prev_calculatedの代わりに、staticやglobalといった独自の変数を使用すればいいのです。しかし、それは松葉づえであり、私たちは他のものを求めているのです。
 
Alexey Kozitsyn:
:)それが私の仕事です...。
私は、あなたの質問を引用しただけで、本当はアレクサンダー・プザノフに答えて いるのだと、そう理解した。:)
 
Alexander Puzanov:
グラフィックを多用した重いインジケータには、最適なソリューションではありません。解決方法は簡単で、prev_calculatedの代わりに、staticやglobalなどの独自の変数を使用することです。しかし、それは松葉づえであり、私たちは他のものを求めているのです。

松葉づえ」という言葉を使う人。

  • は、ドキュメントを読むのが面倒なのか
  • とか、どうすれば正しいのかまだわからないとか。
唯一の正しい解決策:prev_calculate==0でインジケータを再計算する。

 
Alexander Puzanov:
グラフィックを多用した重厚なインジケーターとしては、ベストとは言えません。いや、解決策は簡単で、prev_calculatedの代わりに、staticや globalといった独自の変数を使用することです。しかし、それは松葉づえであり、私たちは他のものを求めているのです。
全く松葉づえではありません。それが私の やり方です。
 
Karputov Vladimir:
また、履歴が入れ替わったということは、今まで見逃されていた、あるいは計算されていなかった新しいバーが あるかもしれない、つまりインジケーターの読みが既に間違っていることになります。

スラワ

prev_calculated=0の場合、完全な再計算が必要であることを意味する。この場合、すべての標準指標は完全に再計算されます。

すべてクリアしているのですが、残念なことに、これをキャンセルすることができないのです。

アレクサンドル・プザノフ

これはすべて便利ですが、直接の目的である「前の呼び出しで処理されたバー」の数を表示するために使用することはできません - prev_calculated

指標は様々で、計算のためのバーを全く必要としないもの、ライブティックのみを必要とするもの、変換深度に制限があるもの(履歴の中で次に何が変わったかを気にしない)、グラフィックオブジェクトを追跡する必要があるものなど様々です。prev_calculatedに付随する履歴の変更を追跡するための追加関数は必要なく、この「前の呼び出しで処理されたバー」だけが必要なのです。必要ないんです。

とにかく、プログラマーさん、参加者の「イベントのキャッチボール」から目を逸らさないでください。

 
Alexey Kozitsyn:
単純にインジケータ全体を0で再計算するとどうなるのでしょうか?私としては、それがベストソリューションだと考えています。

ベストソリューションとは言いません。少なくとも、まだです。

現在のドローダウンを口座に登録するインジケータを書く ことにしたので、履歴で何も再計算する必要はない。1行目は最初このような感じでした。

if(prev_calculated == 0)  return(rates_total);
しかし、起動後、バッファが空でなく、ゼロになっていないことがわかりました。バッファの中に原因不明の値段がある。バッファを強制的にゼロにしなければならなかったのですが...。次に、もう一つの問題が発覚した。prev_calculateはゼロになり、指標は再計算され、それぞれ最後のバーまですべてのバッファをゼロにします。とにかく、今のところ諦めています。
 
Alexey Viktorov:

ベストソリューションとは言いません。少なくとも、まだです。

現在のドローダウンを口座に登録するインジケータを書く ことにしたので、履歴で何も再計算する必要はない。最初、1行目はこんな感じだった。

if(prev_calculated == 0)  return(rates_total);
しかし、起動後、バッファが空ではなく、ゼロになっていないことがわかりました。バッファーにどこから出てきたのかわからない値段がついている。バッファを強制的にゼロにしなければならなかった...。次に、もう一つの問題が発覚した。prev_calculateはゼロになり、指標は再計算され、それぞれ最後のバーまですべてのバッファをゼロにします。とにかく、今のところ諦めています。

"...起源不明のある価格..." - は、インジケータバッファ配列の UNINITIALIZED 要素のゴミです。何をすべきか。

  • prev_calculate==0 のとき、ループ内のインジケータバッファのすべての要素を通過し、それらに値を割り当てます。この場合、新しいバーが表示される(rates_totalからprev_calculateを引いた値が0より大きくなる)状況を監視する必要があります - それに応じてインジケータバッファが増加し、この新しい要素も初期化される必要があります。

 

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

バグ、バグ、質問

アレクセイ・ビクトロフ, 2016.10.17 09:58

自分の書いたものが理解できているのか?

ゴミの処分方法を説明する方が良い インジケーターのFIRST ラン。このゴミはどこから来るのだろう?バッファとアレイをリンクするときに初期化が必要なのでは? それとも初期化中にアレイに空間のゴミが入るのでしょうか?なんでmql4にはそんなゴミがないんだ?

余計なスタティック変数やグローバル 変数を使わずに、正常な値からゴミをふるいにかける方法を例として挙げてください。

みんな、ドキュメントを引用するくらいがちょうどいい。


 

誰も誰かに借りがあるわけではありません。そのため、バインド後、配列の全要素を自分で初期化するまでは、インジケータバッファにゴミが残ってしまいます。

追加されました。

これから例を作ってみます...。

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   if(prev_calculated==0)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
M1で実行する。右端のバーだけが再計算されるのがわかると思います。
ファイル:
 
Karputov Vladimir:

誰も誰かに借りがあるわけではありません。そのため、バインド後、配列の全要素を自分で初期化するまでは、インジケータバッファにゴミが残ってしまいます。

追加されました。

これから例を作ってみます...。

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   if(prev_calculated==0)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
M1で実行する。右端のバーだけが再計算されるのがわかると思います。

間違った質問に答える驚くべき能力・・・。

では、もしもの時のために説明してください。

1.100本のバーをカウントし、0から99までのバッファに入力(方向を時系列で考える)値1.03

2.突然ヒストリーが読み込まれ、prev_calculatedが0になる

どのバーから1.03になるのでしょうか?