記事"新しいレールへの第一歩: MQL5内のカスタムインディケーター"についてのディスカッション

 

新しい記事 新しいレールへの第一歩: MQL5内のカスタムインディケーター はパブリッシュされました:

新しいターミナルと言語のすべての可能性と特徴をリストすることはしません。それらはあまりにも多くありすぎ、新規の特徴によっては別の記事で説明するに値します。またここにはオブジェクト指向プログラミングで書かれたコードがありません。開発者にとってさらに有利になる点として、ただ単に言及するにはあまりにも真剣なトピックです。本記事ではインディケーターとその構造・図面・タイプ・プログラミング の詳細についてMQL4と比較しながら考察します。初心者にも経験のある開発者にも本記事が有益となる事を願います。おそらく何か新しく学べることがあると思います。

作者: Комбинатор

 

インジケーターに別の期間のHighとLowを持たせるには、2つのバッファを作らなければならないのでしょうか?


そして記事中の

CopyHigh


関数が正しく動作しないのはなぜですか?

//+------------------------------------------------------------------+
//| 指定されたバー番号の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));
  }
//+------------------------------------------------------------------+

これは私が得たもので、すべてを正しく示しています。



 
Rosh   :

間違っている」とはどういう意味ですか? 一般的に「すべてが悪い」と言うのではなく、具体的な例を挙げるべきです。

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));
  }
//+------------------------------------------------------------------+
 
zfs   :


主張が具体的でないことをお詫びします。

関数を書けば、それが異なるパラメータのもとでも機能することが暗示されているように私には思える。そうでなければ意味がない。

TimeFrameパラメータを追加してみよう。そして、別のパラメータ、例えば、現在のパラメータと等しいパラメータ、つまり、例えば、日足チャートの PERIOD_D1 と等しいパラメータの下でプログラムをテストしてみましょう。



あなたの変種をチェックしました - それも正しく動作します。パラメーターH1とD1でD1タイムフレームでスクリプトとして実行しました。値は正しかった(私は最後の3つのバーをチェックした)。

ファイル:
 
Rosh   :


あなたのバリアントをチェックしました。私はパラメータH1とD1でD1タイムフレームでスクリプトとして実行しました。値は正しかった(私は最後の3つのバーをチェックした)。



はい、うまくいきます。どうやら私のせいのようです、つまり配列の方向です。しかし、なぜテスト中に異なるデータを得たのか、私には秘密のままです。ご清聴ありがとうございました。新しいことを始めるときは、いつも迷うものだ。
 

ダウンロードし、D:/MetaTrader 5/ MQL5/Indicators フォルダに入れた。

いくつかのインジケータは何も表示されません。

それとも何か間違ったことをしたのでしょうか?

CrossMa.mq5、Toned_WPR.mq5、HistogramSample.mq5が表示されません。

他は動作します。

 
Rosh:

間違っている」とはどういう意味ですか? 一般的に「すべてが悪い」と言うのではなく、具体的な例を挙げるべきです。

CopyHigh()の セクションの例を実行してみてください:

これは私が得たもので、すべてを正しく示しています。



データの配列全体をコピーするのですか?

1つの要素をコピーするのは非常に不経済だと思います。

 

Prival:

それとも、私が何か間違ったことをしたのだろうか?

こんにちは、セルゲイ。この記事は、最初の公開ビルドのために、その場の勢いで書いたものだ。あれから多くのことが変わり、おそらくいくつかの指標を改善する必要がある。

時間があればすぐに修正します。

削除済み  
添付のソース コードファイルとHTMLコード内のソースコードインセットは、お客様の便宜のために完全にポルトガル語に翻訳されました。
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
こんにちは、素晴らしい記事をありがとうございます:
iCustomの派生クラスで複数のINDICATOR_DATAフラグ付きバッファを定義した場合、最初のバッファを除く全てのINDICATOR_DATAフラグ付きバッファから(CopyBuffer/GetDataを使用して)データを取得しようとすると、常に-1が発生するという異常を経験しませんでしたか?

私は、INDICATOR_DATAフラグを付けたバッファを1つだけ定義し、他のバッファを全てINDICATOR_CALCULATIONSに移動させるだけで、この問題を解決することができました。この方法で、CopyBuffer/GetDataはターゲット配列に正しくコピーされたアイテムを返します。