インジケーターに別の期間のHighとLowを持たせるには、2つのバッファを作らなければならないのでしょうか?
そして記事中の
関数が正しく動作しないのはなぜですか?
//+------------------------------------------------------------------+
//| 指定されたバー番号のHighを取得する。|
//+------------------------------------------------------------------+
doubleiHigh(stringsymbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
intcopied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}.
間違っている」とはどういう意味ですか? 一般的に「すべてが悪い」と言うのではなく、具体的な例を挙げるべきです。
CopyHigh()の セクションの例を実行してみてください:
//+------------------------------------------------------------------+
//|HighAndLow.mq5
//| Copyright 2009, MetaQuotes Software Corp.
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property description "High[i]とLow[i]の値の出力例"
#property description 「無作為に選ばれたバーを対象とする」。
double High[],Low[];
//+------------------------------------------------------------------+
//|| 指定されたバー番号の安値を取得する。
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double low=0;
ArraySetAsSeries(Low,true);
int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
if(copied>0 && index<copied) low=Low[index];
return(low);
}
//+------------------------------------------------------------------+
//| 指定された小節番号の高値を取得する。
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
{
//--- 各ティックで、バーの高値と安値をインデックスと共に表示する、
//--- ティック到着の秒に等しい
datetime t=TimeCurrent();
int sec=t%60;
printf("High[%d] =%G Low[%d] =%G",
sec,iHigh(Symbol(),0,sec),
sec,iLow(Symbol(),0,sec));
}
//+------------------------------------------------------------------+
これは私が得たもので、すべてを正しく示しています。

間違っている」とはどういう意味ですか? 一般的に「すべてが悪い」と言うのではなく、具体的な例を挙げるべきです。
CopyHigh()の セクションの例を実行してみてください:
これは私が得たもので、すべてを正しく示しています。
主張が具体的でないことをお詫びします。
ある関数が書かれている場合、それは異なるパラメータのもとで動作することが暗示されているように私には思えます。そうでなければ意味がない。
TimeFrameパラメータを追加してみよう。例えば、日足チャートのPERIOD_D1と同じに設定する。
//+------------------------------------------------------------------+ //|HighAndLow.mq5 //| Copyright 2009, MetaQuotes Software Corp. //|https://www.mql5.com //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property description "High[i]とLow[i]の値の出力例" #property description 「無作為に選ばれたバーを対象とする」。 double High[],Low[]; input ENUM_TIMEFRAMES TimeFrame; //+------------------------------------------------------------------+ //|| 指定されたバー番号の安値を取得する。 //+------------------------------------------------------------------+ double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index) { double low=0; ArraySetAsSeries(Low,true); int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low); if(copied>0 && index<copied) low=Low[index]; return(low); } //+------------------------------------------------------------------+ //| 指定された小節番号の高値を取得する。 //+------------------------------------------------------------------+ double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index) { double high=0; ArraySetAsSeries(High,true); int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High); if(copied>0 && index<copied) high=High[index]; return(high); } //+------------------------------------------------------------------+ //| エキスパート・ティック機能| //+------------------------------------------------------------------+ void OnTick() { //--- 各ティックで、インデックスを持つバーの高値と安値を表示する、 //--- ティック到着の秒に等しい datetime t=TimeCurrent(); int sec=t%60; printf("High[%d] =%G Low[%d] =%G", sec,iHigh(Symbol(),TimeFrame,sec), sec,iLow(Symbol(),TimeFrame,sec)); } //+------------------------------------------------------------------+
主張が具体的でないことをお詫びします。
関数を書けば、それが異なるパラメータのもとでも機能することが暗示されているように私には思える。そうでなければ意味がない。
TimeFrameパラメータを追加してみよう。そして、別のパラメータ、例えば、現在のパラメータと等しいパラメータ、つまり、例えば、日足チャートの PERIOD_D1 と等しいパラメータの下でプログラムをテストしてみましょう。
あなたの変種をチェックしました - それも正しく動作します。パラメーターH1とD1でD1タイムフレームでスクリプトとして実行しました。値は正しかった(私は最後の3つのバーをチェックした)。
あなたのバリアントをチェックしました。私はパラメータH1とD1でD1タイムフレームでスクリプトとして実行しました。値は正しかった(私は最後の3つのバーをチェックした)。
ダウンロードし、D:/MetaTrader 5/ MQL5/Indicators フォルダに入れた。
いくつかのインジケータは何も表示されません。
それとも何か間違ったことをしたのでしょうか?
CrossMa.mq5、Toned_WPR.mq5、HistogramSample.mq5が表示されません。
他は動作します。
間違っている」とはどういう意味ですか? 一般的に「すべてが悪い」と言うのではなく、具体的な例を挙げるべきです。
CopyHigh()の セクションの例を実行してみてください:
これは私が得たもので、すべてを正しく示しています。
データの配列全体をコピーするのですか?
1つの要素をコピーするのは非常に不経済だと思います。
Prival:
それとも、私が何か間違ったことをしたのだろうか?
こんにちは、セルゲイ。この記事は、最初の公開ビルドのために、その場の勢いで書いたものだ。あれから多くのことが変わり、おそらくいくつかの指標を改善する必要がある。
時間があればすぐに修正します。
- 2010.02.25
- MetaQuotes Software Corp.
- www.mql5.com
私は、INDICATOR_DATAフラグを付けたバッファを1つだけ定義し、他のバッファを全てINDICATOR_CALCULATIONSに移動させるだけで、この問題を解決することができました。この方法で、CopyBuffer/GetDataはターゲット配列に正しくコピーされたアイテムを返します。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事 新しいレールへの第一歩: MQL5内のカスタムインディケーター はパブリッシュされました:
新しいターミナルと言語のすべての可能性と特徴をリストすることはしません。それらはあまりにも多くありすぎ、新規の特徴によっては別の記事で説明するに値します。またここにはオブジェクト指向プログラミングで書かれたコードがありません。開発者にとってさらに有利になる点として、ただ単に言及するにはあまりにも真剣なトピックです。本記事ではインディケーターとその構造・図面・タイプ・プログラミング の詳細についてMQL4と比較しながら考察します。初心者にも経験のある開発者にも本記事が有益となる事を願います。おそらく何か新しく学べることがあると思います。
作者: Комбинатор