Alexander Puzanov: グラフィックを多用した重いインジケータには、最適なソリューションではありません。解決方法は簡単で、prev_calculatedの代わりに、staticやglobalなどの独自の変数を使用することです。しかし、それは松葉づえであり、私たちは他のものを求めているのです。
Alexander Puzanov: グラフィックを多用した重厚なインジケーターとしては、ベストとは言えません。いや、解決策は簡単で、prev_calculatedの代わりに、staticや globalといった独自の変数を使用することです。しかし、それは松葉づえであり、私たちは他のものを求めているのです。
0の時にインジケータ全体を再計算するのはどうでしょうか?私には最適なソリューションのように思えます。
:)それが私の仕事です...。
グラフィックを多用した重いインジケータには、最適なソリューションではありません。解決方法は簡単で、prev_calculatedの代わりに、staticやglobalなどの独自の変数を使用することです。しかし、それは松葉づえであり、私たちは他のものを求めているのです。
松葉づえ」という言葉を使う人。
グラフィックを多用した重厚なインジケーターとしては、ベストとは言えません。いや、解決策は簡単で、prev_calculatedの代わりに、staticや globalといった独自の変数を使用することです。しかし、それは松葉づえであり、私たちは他のものを求めているのです。
また、履歴が入れ替わったということは、今まで見逃されていた、あるいは計算されていなかった新しいバーが あるかもしれない、つまりインジケーターの読みが既に間違っていることになります。
prev_calculated=0の場合、完全な再計算が必要であることを意味する。この場合、すべての標準指標は完全に再計算されます。
すべてクリアしているのですが、残念なことに、これをキャンセルすることができないのです。
これはすべて便利ですが、直接の目的である「前の呼び出しで処理されたバー」の数を表示するために使用することはできません - prev_calculated
指標は様々で、計算のためのバーを全く必要としないもの、ライブティックのみを必要とするもの、変換深度に制限があるもの(履歴の中で次に何が変わったかを気にしない)、グラフィックオブジェクトを追跡する必要があるものなど様々です。prev_calculatedに付随する履歴の変更を追跡するための追加関数は必要なく、この「前の呼び出しで処理されたバー」だけが必要なのです。必要ないんです。
とにかく、プログラマーさん、参加者の「イベントのキャッチボール」から目を逸らさないでください。
単純にインジケータ全体を0で再計算するとどうなるのでしょうか?私としては、それがベストソリューションだと考えています。
ベストソリューションとは言いません。少なくとも、まだです。
現在のドローダウンを口座に登録するインジケータを書く ことにしたので、履歴で何も再計算する必要はない。1行目は最初このような感じでした。
ベストソリューションとは言いません。少なくとも、まだです。
現在のドローダウンを口座に登録するインジケータを書く ことにしたので、履歴で何も再計算する必要はない。最初、1行目はこんな感じだった。
"...起源不明のある価格..." - は、インジケータバッファ配列の UNINITIALIZED 要素のゴミです。何をすべきか。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
バグ、バグ、質問
アレクセイ・ビクトロフ, 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);
}
//+------------------------------------------------------------------+
誰も誰かに借りがあるわけではありません。そのため、バインド後、配列の全要素を自分で初期化するまでは、インジケータバッファにゴミが残ってしまいます。
追加されました。
これから例を作ってみます...。
//| 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);
}
//+------------------------------------------------------------------+
間違った質問に答える驚くべき能力・・・。
では、もしもの時のために説明してください。
1.100本のバーをカウントし、0から99までのバッファに入力(方向を時系列で考える)値1.03
2.突然ヒストリーが読み込まれ、prev_calculatedが0になる
どのバーから1.03になるのでしょうか?