初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1151

 
Maksym Mudrakov:

小数点以下の桁数に誤りがある可能性があります。


これはエラーではなく、ヒストリー上でデータが計算されず、シンボルが作成された 瞬間から全てが正しく計算されるため、ヒストリー計算機能が正しく動作していない、つまりバグではないかと推測しています。
 
こんにちは、皆さん。

MT5を始めたばかりで、MT4からインジケータを移行しているのですが、問題が発生しました。iMAを1行で使い、ある特定のインデックスの値を取得する必要があります。フォーラムでのメッセージを見て、iMAGet機能(同様のiATRGet等も)を使用しています。このような場合、iMAの値を1つだけ取得する方法を教えてください。上記のような機能を使ってやって みました。

NormalizeDouble(iMAGet(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW), shift), Digits())

チェックしないとまずいのは分かっていますが、古いMT4のコードを移植しなければならないので、もっとシンプルにする方法が他に思いつきませんでした(何十ものウィザードがあり、それらはすべて異なるタイムフレームで動作しています)。oninitでウィザードを初期化できないのは、コードが3段階ネストしているためで、トラブルなく必要なウィザードを呼び出すことができない。つまり、私の目標は、「回す」ことです。

これは:

NormalizeDouble(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW, shift), Digits())

MT5で思い切ったジェスチャーをせずに動くものに。

 
Olga Miakhovich:
こんにちは、皆さん。

MT5を始めたばかりで、MT4からインジケータを移行する際に問題があります。iMAを1行で使い、ある特定のインデックスの値を取得する必要があります。フォーラムでのメッセージを見て、iMAGet機能(同様のiATRGet等も)を使用しています。このような場合、iMAの値を1つだけ取得する方法を教えてください。上記のような機能を使ってやって みました。


チェックしないとまずいのは分かっていますが、古いMT4のコードを移植しなければならないので、もっとシンプルにする方法が他に思いつきませんでした(何十ものウィザードがあり、それらはすべて異なるタイムフレームで動作しています)。oninitでウィザードを初期化できないのは、コードが3段階ネストしているためで、トラブルなく必要なウィザードを呼び出すことができない。つまり、私の目標は、「回す」ことです。

これは:

MT5で思い切ったジェスチャーをせずに動くものに。

kodobaseの例をご覧ください。https://www.mql5.com/ru/code/27161

基本:OnInit()でインジケータハンドルを作成する

handle_iMA_High=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                       Inp_MA_ma_method,PRICE_HIGH);
//--- if the handle is not created
   if(handle_iMA_High==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator (\"Price High\") for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }

そして、必要な要素をクリップボードにコピーし、それを使って作業します

if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());

https://www.mql5.com/ru/docs/series/copybuffer

 
Vitaly Muzichenko:

コドベースで例を調べてみてください。例えば、こちらです。https://www.mql5.com/ru/code/27161

基本的にはOnInit()でインジケータハンドルを作成します。

そして、必要な要素をバッファにコピーし、それを使って作業します

https://www.mql5.com/ru/docs/series/copybuffer

すでに書いたように、OnInitでの初期化は私には不向きです。私はすべてのタイムフレームを同時に扱うので、各TFですべてのマスクを初期化し、コードで何らかの値を使用して、次のようにします。

if(timeframe = PERIOD_M5)
        CopyBuffer(handle_ma_m5, ...)
if(timeframe = PERIOD_M15)
        CopyBuffer(handle_ma_m15, ...)
...

そうして、それぞれのリストバンドを呼び出すたびに。コードが混乱した下痢に変わるだけです。

そして、新しいバーのたびに、何らかの形でアップデートする必要があるのでは?

CopyBufferのような関数で、配列ではなく、必要なインデックスで1つの値をコピーするものはありますか?

 
Olga Miakhovich:

すでに書いたように、OnInitでの初期 化は私には不向きです。私はすべてのタイムフレームを同時に扱うので、各TFですべてのマスクを初期化し、コードで何らかの値を使用して、次のようにします。

そうして、それぞれのリストバンドを呼び出すたびに。

そして、新しいバーができるたびに、それを更新する何らかの方法が必要になるのでしょうか。

CopyBufferのような関数で、配列ではなく単一の値を正しいインデックスでコピーするものはありますか?

OnInit()でハンドルの配列を作り、それを使って動作させる。

CopyBuffer(...)を関数化し、インジケータハンドルと配列から必要なインデックスを与えれば、関数が価格を返すようになります。

 
Vitaly Muzichenko:

OnInit()でハンドルの配列を作り、それを使って動作させる。

CopyBuffer(...)を使いやすいように関数に変換し、インジケータハンドルと配列から必要なインデックスを渡せば、関数が価格を返します。

不便極まりない)

 
Olga Miakhovich:

(気まずいけど))

どちらかというと違和感がある )))

 
Vitaly Muzichenko:

OnInit()でハンドルの配列を作り、それを使って動作させる。

コピーバッファ(...)を関数にすると、使い勝手がよくなります。そこで、インジケータのハンドルと配列から必要なインデックスを与えると、関数が価格を返します。

CopyBufferのもう一つの問題は、それ自身のためにインジケータ・バッファを 必要とすることです。全部で100個のインジケータがあり、それらを計算で使って1つのインジケータを取得しています。これらの値を格納するために、100個のバッファを作成する必要がありますか?

 
Olga Miakhovich:

CopyBufferのもう一つの問題は、それ自身のために必然的にインジケータ・バッファを 必要とすることです。全部で100個弱のインジケーターがあり、それらを計算で使って1つのインジケーターを出しています。これらの値を格納するために、100個のバッファを作成する必要がありますか?

scriptorのCodeBaseにコード例がありますので、そちらをご覧ください。
実は、どのバーでもMAを計算することができるのです。
 
以下の問題を解決するための例が必要です。チャートにインジケータ¹1があり、12個のグラフィカルバッファ(wavecapsや他のものではない)があり、地下のインジケータ¹2はインジケータ¹1からいくつかのバッファを取り、地下にすでにヒクソグラムとして(方法は問わない)表示する必要があります。MT5用、よろしくお願いします。
理由: