エラー、バグ、質問 - ページ 1525

 
Yuri Evseenkov:

MT4です。ここでもう一度、グローバル プログラム変数の初期化に関する 特殊性に注目していただきたい。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

スラワ さん 2016.02.24 07:34

キューに入れます。アプリケーションはまだ2時間しか経っていない。

一般的に、このような質問はフォーラムで行うべきものです。多くの人が影響を受ける可能性があるからです。勝手に引用して即答します

これは計画的な行動です。実際、ドキュメントに明示的に 記述されています。

アップロードとダウンロードは、すべてを完全に再初期化する必要があります。

5では、あなたが正しくお気づきのように、状況は似ています。

確かに、歴史的に4ではそうでしたし、新しいMQL4に変更する際に、最初はこの動作を変更しました(エキスパートと同じように、つまり期待通りの動作をさせるために)。しかし、この初期設定に基づく旧来の指標には、多くの疑問が生じました。帰らざるを得なくなった

5では、アーキテクチャの関係ですぐにそうなった。パラメータを変更すると、古いパラメータを持つ古いインジケータは破棄され、変更されたパラメータを持つ新しいインジケータが作成されます。


 
Alexey Kozitsyn:

ありがとうございます。結論 - ドキュメントからの引用: "... 定義済み関数OnInit(), その目的は、プログラムのすべてのグローバル 変数と静的 変数を正しく初期化することです".

そのため、OnInit() では、すべてのグローバル変数や配列をゼロにするか、デフォルトにします。

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
 

1.フォームの配列を作成しています。

CArrayString list[5];

2.<Ctrl+Space>でメソッドリストを呼び出そうとします。

list[0].
メソッドのリストが表示されない。こんなんでいいのか?
 
Andrey Voytenko:

1.フォームの配列を作成しています。

2.コード内のメソッド一覧を<Ctrl+Space>で呼び出そうとするのですが。

メソッドのリストが表示されない。こんなんでいいのか?

推測してみる。メソッド/メンバが指定されていないこと以外にもコードにエラーがある場合、必ずしもリストが表示されるとは限りません。

試してみました。いや、前提が違う。しかし、何度かコンビにを繰り返し押すことで効果がありました。

 

Alexey Kozitsyn:

しかし、何度かコンビにを繰り返し押すことで効果がありました。

残念ながら、あなたのレシピではうまくいきません。
 
Andrey Voytenko:
残念ながら、あなたのレシピではうまくいきません。
いや、その通り、コードにエラーがあると、開いているメンバー/メソッドのリストが表示されないんだ。でも、エラーが出なければ...。の後、トラブル。
 

1.シンプルなコードです。

uint a=50;
int b=-20;
Print(fmax(a,b));

結果:50

2.モディファイ入力の追加。

input uint  a=50;
int b=-20;
Print(fmax(a,b));

結果:4294967276

50の結果を期待。どこが間違ってるんだろう?

 
Andrey Voytenko:

1.シンプルなコードです。

結果:50

2.モディファイ入力を追加しています。

結果:4294967276

50という結果を期待していたのですが。どこが間違ってるんだろう?

fmaxは2つの倍数を比較する。つまり、こんな感じです。

//+------------------------------------------------------------------+
//|                                                         Test.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.01"
#property script_show_inputs
//---
input uint a=50;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//uint a=50;
   int b=-20;
   Print("\"uint a=50\" as double:",DoubleToString((double)a,8));
   Print("\"int b=-20\" as double:",DoubleToString((double)b,8));
   Print(DoubleToString(fmax((double)b,(double)a),8));
  }
//+------------------------------------------------------------------+

と結果が出ました。

2016.03.03 16:00:24.821 Test (EURUSD,D1)        "uint a=50" as double:50.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        "int b=-20" as double:-20.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        50.00000000
ファイル:
Test.mq5  2 kb
 
Karputov Vladimir:

fmaxは2つの倍数を比較する。つまり、こんな感じです。

MQLでは、暗黙の型変換が宣言され、実行されます。特にuint -> double。

問題は、なぜ入力変数 で正しく動作しないかです。

 
Andrey Voytenko:

1.シンプルなコードです。

結果:50

2.インプットモディファイヤーを追加する。

結果:4294967276

50という結果を期待していたのですが。どこが間違ってるんだろう?

フルコードを教えてください。

ここには2つの可能性があり、どちらも間違っています。

1.コードは関数の外側で実行されます。

2. 入力変数が関数内部で宣言されて いる

理由: