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

 
Vladimir Fionov:
通貨ペアの場合は、リミットを入れればすべて動くが、タイムフレームの場合は、h1インジケータに置いても動かない。

https://docs.mql4.com/ru/chart_operations/periodwindow

https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes

戻り値現在のグラフの期間(分)。

if(Period() != 60)  return(-1); // для H1

試してみてください、もしかしたらうまくいくかもしれません。

if(Period() != PERIOD_H1)  return(-1);

または、逆カンマを削除する。

Period - Документация на MQL4
  • docs.mql4.com
Period - Документация на MQL4
 
Vladimir Zubov:

https://docs.mql4.com/ru/chart_operations/periodwindow

https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes

戻り値現在のグラフの期間(分)。

試しに使ってみて、効果を実感してください。

ありがとうございました!!うまくいきました。
 
もう一つの質問ですが、#property strictを先頭に追加すると、array out of range in 'Indicator name' (100,41) というエラーが出ますが、これはどうすればいいのでしょうか?

 
Vladimir Fionov:
もう一つ質問ですが、#property strictのインジケータを最初に追加する際、array out of range in 'Indicator name' (100,41) というエラーが出ますが、どう対処すればいいのでしょうか?

配列が 範囲外になっているのを修正する必要があります。コード内の問題の特定:100行目、位置42の文字。
 
Vladimir Fionov:

どうしたんですか?

  1. フォーラムにコードを正しく貼り付ける
  2. ema[]」配列の制限を超えるというエラーを修正する必要があります。変数"limit"の計算が誤っているのでしょう。
 
Karputov Vladimir:
  1. フォーラムでコードを正しく挿入する
  2. ema[]」配列の制限を超えるというエラーを修正する必要があります。変数"limit"の計算が誤っているのでしょう。
すみません、コードの挿入についてはわかりませんでしたが、コードそのものについては、#property strictを挿入して、それがなくてもすべてがうまくいくのに、なぜこのようなことが起こるのでしょう
 
Vladimir Fionov:
すみません、コード挿入の件は知りませんでしたが、コード自体は、#property strictを挿入すると発生し、挿入しなくても全て動作するのはなぜでしょうか?

MetaEditorのヘルプはご覧になりましたか?

また、関数を使った作業、変数のスコープ、ローカル配列のメモリ解放も変更されています。この変更は非常に大きなものとなったため、MQL4プログラムを書く際の古いアプローチとの互換性を最大化するために、新しいプロパティ#property strictを 導入することにしました。MQL4 Wizardを使用して新しいMQL4プログラムを作成する場合、このプロパティは常にテンプレートに追加されます。

といった具合に。

コンパイラの違いによる一覧表。

旧MQL4コンパイラ

新MQL4コンパイラ

新しいMQL4コンパイラと#property strictの関係

init()、start()、deinit()の各エントリポイントは、任意のパラメータと任意の戻り値の型を持つことができる。

init()、start()、deinit()は互換性のために保持されています。

そして、新しいOnInit(),OnStart(),OnCalculate(),OnTick(),OnTimer(),OnChartEvent(),OnTester(),OnDeinit() はそれらの署名と完全に一致していなければなりません。

同じ

init()関数の戻り値は実行中のサブシステムでは一切解析されません

init()関数とOnInit()関数の戻り値は、実行中のサブシステムでは一切解析されません

OnInit()から0以外の値を返すと、エキスパートまたはインジケータが停止し、プログラムがアンロードされる

変数名には、特殊文字やフルストップを含む、ほぼすべての文字が使用可能です(予約語を除く)。

変数名には、特殊文字やフルストップは使用できません。

予約 語のリストが拡張され、short, long, const などの一般的な単語は名乗れなくなりました。

同じ

変数のスコープは、宣言から(ネストされたブロック内であっても)関数の終わりまでです。

同じ

変数の可視範囲 - 宣言から、その変数が宣言されているブロックの終わりまで。

すべての変数(グローバル、ローカルとも)をゼロで暗黙的に初期化する。

グローバル変数のみの初期化。ローカル変数から、文字列のみ暗黙のうちに初期化される

ローカル配列は,関数から離れると解放されません.

ローカル配列は,関数から抜けるときに解放されます.

ローカル配列は終了時に解放される{}。

Array out of range "エラーが 発生しても、クリティカルエラーにはならない*。

同じです。ただし、このエラーが重要な構造体の配列やクラスは除きます。

Array out of range "重大なエラーで、プログラムを停止 させます。

構造・クラスがない

構造があり、クラスが ある。追加のデータ型が表示されます。

同じ

文字列 - 1バイト。

datetime - 32ビット整数

定義済み変数 Volume の型は double です。

文字列 - unicode。

datetime - 64ビット整数

Volume は、long 型の定義済み変数である。

同じ

ArrayCopyRates() は、配列 double[][6] への仮想的なコピーを生成する。

ArrayCopyRates() は、MqlRates[] 配列への仮想的なコピーを生成する。互換性を保つため、配列 double[][6] へのコピーは残されていますが、このコピーは仮想ではなく、現実のものです。

また

関数は、型があっても値を返さないことがあります。このため、コンパイラは関数の末尾に自動的にreturn(0)を挿入しています。

同じです。

どのような型の関数も必ず値を返さなければならない

同時に開くファイル数 - 32

同時に開いているファイル数 - 64

同じ

ファイルは常に共有モードで開かれる **。

共有モードはFILE_SHARE_READとFILE_SHARE_WRITEで明示的に宣言する必要があります。

同じ

入力ウィンドウのスクリプトには、外部 変数名が表示されます

show_inputs モードのスクリプトでは、extern変数と入力 変数の名前が入力パラメーターウィンドウに表示されます。

show_inputs モードのスクリプトでは、入力ウィンドウにextern および入力変数 名の代わりに文字列コメントが表示されます。

* Array out of range" エラーに特別な注意を払う必要があります - 多くの古いカスタムインジケーターは、新しいコンパイラーでチャート上で実行すると、strict モードでこのエラーを発生します。原因を突き止め、解決することが望まれます。

** 新しいMQL4とMQL5では、FILE_SHARE_READとFILE_SHARE_WRITEフラグがファイル共有モードを担当します。

Препроцессор - Документация на MQL4
  • docs.mql4.com
Препроцессор - Документация на MQL4
 
Vladimir Fionov:
どうしたんですか?
  int idx;
  int counted = IndicatorCounted();
  if (counted < 0) return (-1);
  if (counted > 0) counted--;
  int limit = Bars - counted;
  if(counted == 0) limit-=1;
このような行を追加してみてください。
 
Vladimir Fionov:

ご迷惑でしたら申し訳ございませんが、現在このようなエラーが発生しています。

39位

同じエラー、配列が範囲外?
 
Vladimir Zubov:
同じエラー、配列が範囲外?
はい
理由: