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

 
ただ、アイアンを刺すのはやめましょう。
 
Alexey Viktorov:
これはドキュメントに書かれていないことです。結果的に、これは自由なテーマでのエッセイとなった。ちょうど、自動初期化についての私の発言と同じで、さらにクールです。少なくとも私のは免責事項が書かれていた...。

ドキュメントにすべてを記述することは不可能です。

prev_calculate==0 "の場合 -インジケータバッファ 全体を通過する必要があることを意味します。prev_calculate!=0 "の場合、右端のバーまたはいくつかの新しいバーだけが計算されます(ここではlimitを 使用します)。

                const int &spread[])
  {
//---
   if(prev_calculated==0)
     {
      Print("prev_calculated==0");
            for(int i=0;i<rates_total;i++)
              {
               //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
      
              }
      return(rates_total);
     }
//--- экономный пересчёт только самого правого бара или новых баров
   int limit=rates_total-prev_calculated+1;

//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
   for(int i=0;i<limit;i++)
     {
      ExtBuffer[i]=чевой-то там;
     }
 
Karputov Vladimir:

ドキュメントにすべてを記述することは不可能です。

prev_calculate==0 "の場合 -インジケータバッファ 全体を通過する必要があることを意味します。prev_calculate!=0 "の場合、右端のバーまたはいくつかの新しいバーだけが計算されます(ここではlimitを 使用します)。

                const int &spread[])
  {
//---
   if(prev_calculated==0)
     {
      Print("prev_calculated==0");
            for(int i=0;i<rates_total;i++)
              {
               //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
      
              }
      return(rates_total);
     }
//--- экономный пересчёт только самого правого бара или новых баров
   int limit=rates_total-prev_calculated+1;

//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
   for(int i=0;i<limit;i++)
     {
      ExtBuffer[i]=чевой-то там;
     }




その価値とは?一番右のバー以外の値は必要ない。しかし!!!そして、この一番右のものが左に移動したときに、このデータを保存しなければならない......。

バッファを全部書く必要はありませんが、私の希望を考慮して1つだけ書いてください。初回実行の場合は、すべての履歴が空のはずです。履歴のスワップの結果、prev_calculatedがリセットされた場合、バッファに入れられたすべての ものは変更されないままでなければなりません。たとえ、穴があっても。

 
Karputov Vladimir:

予備的な結論

1.インジケータは、OnInit()におけるインジケータ・アレイの初期 化に依存することはできません。

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
...
   ArrayInitialize(balance, 0.0);    // принудительная
   ArrayInitialize(equityMax, 0.0);  // инициализация
   ArrayInitialize(equityMaxB, 0.0); // всех
   ArrayInitialize(equityMin, 0.0);  // буферов
   ArrayInitialize(equityMinB, 0.0); // индикатора

...
//---
   return(INIT_SUCCEEDED);
  }

2.インジケータでは、OnCalculate()で配列全体または変更された要素のみを通過させることが義務付けられています。

何をバカなことを言ってるんだ?この初期化をOnCalculateで 実装すると、ループなしで初期化されます。しかし、prev_calculatedとすると、作業中に蓄積されたデータをすべてクリアしてしまう...。
 
Alexey Viktorov:
なぜ、くだらないことを言うのですか?この初期化をOnCalculateに入れると、何のサイクルもなくゼロになる。しかし、prev_calculatedをゼロにすると、演算中に蓄積されたデータがすべてクリアされてしまう...。
表現でお願いします。And look at examples of indicators from standard delivery: Data Catalogue (データカタログ), DataMQL5 Indicators (インジケーター), DataExamples.
 
Alexey Viktorov:

価値ってなんだ?一番右のバー以外の値は必要ない。しかし!!!そして、この一番右のものが左に移動したときに、そのデータを保存する必要がある...。

...

すでに方法は提案しています。

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

事前計算された

カルプトフ ウラジミール, 2016.10.18 15:11

返信が遅くなり申し訳ございません。ある時間枠の計算値を保存する唯一の方法は、ファイルに保存することです。ファイルから読み込むときに、データがそれぞれのバーに配置されるように、同期を取る必要があります。最も論理的な方法は、バーのオープン 時間と同期させることですが、ニュアンスが異なる場合があります。例えば、バーのオープン時間(ファイルに保存)は2016.09.05. 25:02 でしたが、現在チャートには2016.09.05. 25:01 と同じ時間のバーが表示されています。

インジケータはデータベースやリポジトリではありません。

したがって、インジケータがその後にヒストリー上で計算できないデータを表示する場合、インジケータバッファをファイルに保存し、(ヒストリースワップの場合)そのファイルとバーを読み込んで同期させるだけでよいのです。
 
Karputov Vladimir:

すでに方法は提案しています。

インジケータはデータベースやリポジトリではありません。

したがって、インジケータがデータを表示し、その後ヒストリー上で計算できない場合は、インジケータのバッファをファイルに保存し、(ヒストリースワップの場合)読み込みを実行してファイルとバーを同期させるだけでよいのです。

アレクセイ・ヴィクトロフ

...で、できればファイルに書き込まず、さらにGVにも書き込まない。

prev_calculated
prev_calculated
  • www.mql5.com
Форум трейдеров MQL5.community
 

Vladimirさん、このトピックはprev_calculatedに特化しているので、このトピックに役立つようにしてください。まず、この変数で通常発生する問題を指定する必要があります。これらの問題に馴染みのない方のために、定式化します。

---

a -- ヘルプに書いてあるにもかかわらず

prev_calculated  // обработано баров на предыдущем вызове

理由は(ヘルプに書いてある+開発者に聞いた)、チェックサムが変わると変数がゼロにリセットされるからで、通常はヒストリースワップが原因です。

---

b - 最初のonCalculate の実行 フラグとして prev_calculated == 0 を使用することもできません。同じ理由で

---

c - また、prev_calculated == 0 をヒストリのページングフラグとして使用することはできません。

---

ユーザーへの負担を減らすため、表現は簡潔かつ明確であるべきです。現在のOnCalculateの呼び出しで履歴ページングが起こっていない場合、prev_calculatedは前の呼び出しで処理されたバーの数を含んで います。発生した場合 - ゼロにリセットされます

---

この3つの問題は、松葉杖で解決することができます。しかし、MT5は定義上、松葉杖を持つことができないので、ウラジミールさん、この3つの問題に対して魅力的な解決策を作っていただけませんか?ブサイクはこんな感じ。

#property indicator_chart_window
#property indicator_buffers  0
#property indicator_plots    0


struct BROWNIE {
  int   i_Prew_Calculated;  // кол-во посчитанных баров
  bool  b_First_Run;        // флаг первого запуска
  bool  b_History_Updated;  // флаг обновления истории
  
  BROWNIE() {
    i_Prew_Calculated = WRONG_VALUE;
    b_First_Run = true;
    b_History_Updated = false;
  }
  
  void f_Reset(bool b_Reset_First_Run = true) {
    i_Prew_Calculated = WRONG_VALUE;
    if(b_Reset_First_Run) b_First_Run = true;
    b_History_Updated = false;
  }
  
  void f_Update(int i_New_Prew_Calculated = WRONG_VALUE) {
    if(i_New_Prew_Calculated > -1) {
      b_History_Updated = i_New_Prew_Calculated == 0 && i_Prew_Calculated > WRONG_VALUE;
      if(b_First_Run) b_First_Run = false;
      
      if(i_Prew_Calculated == WRONG_VALUE) i_Prew_Calculated = i_New_Prew_Calculated;
      else if(i_New_Prew_Calculated > 0) i_Prew_Calculated = i_New_Prew_Calculated;
    }
  }
};
BROWNIE go_Brownie;


int OnInit(void) {return(INIT_SUCCEEDED);}


void OnDeinit(const int reason) {
  go_Brownie.f_Reset(reason != REASON_CHARTCHANGE);
}



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 &TickVolume[],
    const long &Volume[],
    const int &Spread[]
) {
  if(go_Brownie.b_First_Run) {/* обработка 1го запуска */}
  if(go_Brownie.b_History_Updated) {/* обработка обновления истории */}
  go_Brownie.f_Update(prev_calculated);
  
  return(rates_total);
}

免責事項:コード - 単なるアイデアであり、チャートで試したわけではありません。

OnDeinitには、バッファを使用しないインジケータの処理サンプルがあり、TFやシンボルを気にせず、TF/シンボルが変わるたびに、ゼロから始める必要がありません。例えば、既存のグラフィック要素と連動し、アカウントの状態や注文などの情報を出力します。

---

ちなみに

Karputov Vladimir:

もし、インジケーターバッファをファイルに保存し、(ヒストリー読み込みの場合)ファイルとバーを読み込んで同期させる必要があるとしたら、どうすればよいでしょうか。

ディスクを破棄しなくても、チャートアイテムに保存することができます
 
Alexey Viktorov:
...で、できればファイルや、さらに言えばGVに書き込まないで欲しい。
それで いいのでしょうか?
 
Konstantin Gruzdev:
もしかしたら、これが お似合いかも?

詳しくは書きませんでしたが、これはこの行で解決します。配列をインデックスシフトして自分自身にコピーする。

double arr[5];
ArrayCopy(arr, arr, 0, 1, 4);
// и дальнейшее заполнение 4го индекса массива.
逆にして、ゼロのインデックスからコピーして、最初のインデックスからペーストしてもよい。すると、配列の0番目のインデックスが埋められます。そして、これは全く別物です...))