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

 
Alexander Nikolaev:
MT4ターミナルで直接作成した最近作成したデモ口座に、Metaquotesデモサーバーでアクセスできないのはなぜか、ご存知の方はいらっしゃいますか?1週間前に作成しました。最初の2日間はうまくいくのですが、しばらくするとパスワードがおかしくなったのか、アカウントが消えてしまい(コピーしたものですが、間違って入力することはできませんでした)、Expert Advisorをテストするためにアカウントを再度開く必要があります。毎週新しいアカウントを作成する必要があるのでしょうか?
このような場合、新しいアカウントを作成し、心配する必要はありません。
 
Denis Sartakov:

最近、こんな感じの関数を書いてみたので、自分で考えてみてください。

うまくいかなかったら、説明します。

しゃい

 

をもう一つ質問します。

CHART_IS_MAXIMIZEDCHART_IS_MINIMIZED の説明には、これらのプロパティが読み取り専用であるとは書かれていませんが、 ChartSetInteger(ChartID(),CHART_IS_MAXIMIZED,true); は機能しません。

 

なぜコンパイルができないのか?

template <typename T>
void f(T &t)
{
   t.f();
}

void OnStart()
{
   class Q
   {
   public:
      void f() {}
   }q;
   
   f(q);
}

古いバージョンのコンパイラは、そのような構造をうまく食べて、有効な以前のコードとエラーを再コンパイルするためにかかった。事故なのか、それとも意図的に折れたのか?

 
pavlick_:

なぜコンパイルができないのか?

古いバージョンのコンパイラはそのような構成でも問題なかったのですが、以前有効だったコードを再コンパイルしたらエラーになりました。事故なのか、それとも意図的に折れたのか?

が、言語仕様にしたがって、関数の中にクラスを作ることはできるのでしょうか?

 
Konstantin:

が、言語仕様に従って関数の中にクラスを作ることができるのか?

言語仕様とは?Mclは全く文書化されていないが、c++ではリファレンスからして普通である。

ローカルクラス

クラス宣言は、名前空間内(通常のクラスを定義する場合)、他のクラス定義の内部(ネストした クラスを定義する場合)、関数本体の内部(ローカル クラスを定義する 場合)に現れることができます。このようなクラスの名前は、関数スコープ内にのみ存在し、外部からはアクセスできない。

http://en.cppreference.com/w/cpp/language/class

 

答えは、いつものように沈黙です。実はこの問題を回避するのは簡単で、関数内にエレガントな配置をする代わりに、外側に威圧的な名前 internal__Chart_bar_shift_Comp を付けました。しかし、ポイントは別にあり、そのような構図を切っただけなのです。つまり、私のコードが明日コンパイルされるという保証はないのです。例えば、std=mql18のように、キーを使って何とか方言を選択することができます。でも、後方互換性なんて気にするなよ。一部のgccで可能とは考えにくいですね。

取引プラットフォームとしては、シンプルなスクリプトのmql4で十分だったのではないでしょうか。あるいは、スクリプト/エキスパートでプラグインを(ダイナミックライブラリで)インポート するのがよいでしょう。しかし、そうではなく、自分自身の、ここではよく言われるように「インフラ」が必要なのです。そこでは、自分は大きく、重要な存在なのです。

 
pavlick_:

どの言語仕様による。Mclは全然ドキュメントが充実していませんが、c++ではリファレンスブックから、普通に行われています。

ローカルクラス

クラス宣言は、名前空間内(通常のクラスを定義する場合)、他のクラス定義の内部(ネストした クラスを定義する場合)、関数本体の内部(ローカル クラスを定義する 場合)に現れることができます。このようなクラスの名前は、関数スコープ内にのみ存在し、外部からはアクセスできない。

http://en.cppreference.com/w/cpp/language/class

mql5の仕様では想定されていないという話をどこかで聞いたことがあるのですが、フォーラムで調べてみると、ランバについても想定されていないという話が出てきました。

 
pavlick_:

答えは、いつものように沈黙です。実はこの問題を回避するのは簡単で、関数内にエレガントな配置をする代わりに、外側に威圧的な名前 internal__Chart_bar_shift_Comp を付けました。しかし、ポイントは別にあり、そのような構図を切っただけなのです。つまり、私のコードが明日コンパイルされるという保証はないのです。例えば、std=mql18のように、キーを使って何とか方言を選択することができます。でも、後方互換性なんて気にするなよ。どこかのgccで可能とは到底思えません。

おそらく、取引プラットフォームとしては、シンプルなmql4スクリプトで十分だったのでしょう。あるいは、スクリプト/エキスパートでプラグインを(ダイナミックライブラリで)インポートするのがよいでしょう。しかし、そうではなく、自分自身の、ここではよく言われるように「インフラ」が必要なのです。そこでは、自分は大きく、重要な存在なのです。

正直なところ、なぜそのようなことをするのか理解できません。 すべての補助エンティティをソースコードの別のリスト、たとえば util.mqh に配置する方が簡単です。

 
Konstantin:

正直なところ、その理由はよくわかりません。すべての補助エンティティをソースコードの別のリスト、たとえばutil.mqhに置く方が簡単です。

これはバイナリサーチの述語で、普遍的ではなく、関数の中で一度だけ使われるものですが、なぜどこかに置く必要があるのでしょうか?例えば、構造体の配列(比較演算子がない、<で不器用に比較できない、比較条件が非常にやっかい)があり、二項探索で要素を見つけたい場合。plusライブラリでは、アルゴリズム関数はファンクタ(便利なことにラムダとして渡される)を受け取り、その内部で配列要素を 比較する。とてもエレガントなソリューションだと思います。

int main()
{
    typedef pair<int, double> myPair; // typedef to shorten the type name
    vector <myPair> vec(5);

    myPair low_val; // reference value (set this up as you want)
    auto it = lower_bound(vec.begin(), vec.end(), low_val, 
        [](myPair lhs, myPair rhs) -> bool { return lhs.second < rhs.second; });
}

しかし、µlの制限により、述語クラスのインスタンスを作成しました。