MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1324

 
Yurij Kozhevnikov:

ありがとうございます、そのような実装も思いつきましたが、Value1自体がないため、ちょっと違いますね。つまり、私が作った例はもちろん極めて単純化されたものですが、これがクラスの主要な価値ではなく、このような価値はいくつもありうるし、それぞれについてこのような構成が記述できることを暗示しているのです。

あるいは、そのような実装の場合、オーバーロードを実装するクラスや構造体だけを別に記述し、そのクラス内に、作成した型の変数を記述することは可能でしょうか?しかし、クラスの他の変数が割り当て操作に関与している場合、再び、辻褄が合わなくなる。

実は、Let/Set/Getメソッドと 似たようなものをvbsで 実装したかったのです。

質問の意味がよくわからないのですが、C++ / MQLにはキープロパティがありません Property

たぶん、テンプレートクラスが必要ですhttps://www.mql5.com/ru/docs/basis/oop/class_templates


UPD: 同じことについてのHabraの記事ですhttps://habr.com/ru/post/121799/ 、 しかし、私はそれがMQLに「直接」当てはまるかどうか疑問です。

 

ありがとうございました。

C++を勉強したことがないので、ちょっと私の知識を超えていますが、まさに私が欲しかったものだと思われます。何とかしてみます。

 
Yurij Kozhevnikov:

ありがとうございました。

C++を勉強したことがないので、これは私の知識を超えていますが、まさに私が望んでいたことだと思われます。何とかしてみます。

このスレッドで質問を簡潔にまとめてみてください:https://www.mql5.com/ru/forum/85652

には、本当にクールなプログラマーがいて、そういう人たちがやっているんだ......。まあ、これで早く解決できるかもしれません。

 

はい、ありがとうございます。

私は、自分が使っていたことを思い出しながら、それがPropertyという名前であることを忘れていて、自分が欲しいものを説明するのに鈍感になっていました。

記事へのコメントでマクロ置換が使えると書かれていましたが、おそらく自分との厳密な構文一致を採用することで、それほど一般的ではないケースをより簡単に実装できるのではと考えさせられました。

 
class TestClass
{
  private:
    double cValue1;
    double cValue2;
    double cValue3;
    int cIndex;
    void _Set(double mValue);
  public:
    TestClass():cIndex(-1){}
    double Value1()
    {return cValue1;}

    TestClass* Value(int param)
    {
      cIndex=param;
      return &this;
    }
    void operator =(double mValue) {_Set(mValue);}
};
//---------------------------------------------
void TestClass::_Set(double mValue){
   switch(cIndex){
      case 1:  cValue1=mValue; break;
      case 2:  cValue2=mValue; break;
      case 3:  cValue3=mValue; break;
   }
   cIndex=-1;
}

void TestFunction()
{
  TestClass test;
  test.Value(1)=0.5;
  Print(test.Value1());
}

void OnStart(void)
  {
   TestFunction();
  }
そんな松葉杖が描かれることもある)
 
Vladimir Simakov:
こんな松葉杖が作れます)

ありがとうございます。この松葉杖は明らかにもっとシンプルですが、それでもまだすべてを理解しているわけではありません。

マクロの代入に任意の文字セットを入れることは不可能なのでしょうか?こんな感じ。

#define .<один любой набор символов>()=<второй любой набор символов> Set<один любой набор символов>(<второй любой набор символов>)
#define .<один любой набор символов>(par1)=<второй любой набор символов> Set<один любой набор символов>(par1,<второй любой набор символов>)
 
Aleksey Mavrin:

単に DoubleToString をオーバーロードして、もし文字列"EMPTY_VALUE" が返ってきたらそうでない場合は ::DoubleToString を呼び出します。

ここではわからない。

 
Fast235:

ここではわからない。

然もなくば

#define DoubleToString(value,digits)  (value!=EMPTY_VALUE?DoubleToString(value,digits):"EMPTY_VALUE") 
 
Aleksey Mavrin:

然もなくば

まれに、ソースを作って削除し、二度と見ないようにする)


バッファがインジケータバッファの場合、EMPTY_VALUEに 置き換えることができます。

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

が、バッファの数は不明
 

午後atr インジケータから読み取ったストップロスを 自分のEAに取り付けようとしています。入力変数は以下の通りである。

  extern   ENUM_TIMEFRAMES   PeriodForWork_sl        =  PERIOD_H4;           // ТФ РАСЧЁТА ЗНАЧЕНИЙ СТОП ЛОСА ПО АТР
  extern double sl= 14; // ПЕРИОД АТR СТОП ЛОССА

atrの値をストップロス用の変数に追加しています。

sl=iATR( NULL,PeriodForWork_sl,sl,1);// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА

そして、このように注文を開けるようにしています。


OrderSend(Symbol(),OP_BUY,lot,Ask,slippages,Bid-sl*Point,Bid+tp*Point,"ДИВЕРГЕНЦИЯ НА БАЙ АО"); // ОТКРЫВАЕМ БАЙ ОРДЕР

しかし、何一つうまくいきません。Stop Loss変数の値を印刷しましたが、その値は0であると報告されました。どこが悪いのか、どこを直せばいいのか、どこをいじればうまくいくのか。