mql5言語の特徴、微妙なニュアンスとテクニック - ページ 111

 
pavlick_:

...

メッセージ入力フィールドの上にメニューがあり、そこにすべてがあります。そして、ホットキーもそこに記述されています。

あなたの「引用」を修正しました。

 
pavlick_:

どう同じなのでしょうか?自動コピーコンストラクタがあり、すべての操作はビューを持つことになります。

... 
ar.Add(new(q));


これで、MQLに自動コピーコンストラクタが無いという話だったことがはっきりしました。

 
問題点

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

バグ、バグ、質問

fxsaber さん 2018.12.21 10:23

どうしても分からないので、ヒントを求めてください。そのような時間の取得があります

int GetHandle() { return(0); }

bool SelectHandle( int ) { return(true); }
  
int NewHandle = 0;  
int PrevHandle = GetHandle();    

datetime time = SelectHandle(NewHandle) ? TimeCurrent() : 0;  
SelectHandle(PrevHandle);


同じことをするマクロの書き方

time = MACROS(NewHandle, TimeCurrent()); // Макрос


問題は、マクロ内のPrevHandleが作成できないことです。

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

バグ、バグ、質問

fxsaber さん 2018.12.21 22:15

NewHandle - は定数にすることができることを明確にしましょう。すなわち、次のような有効なコールです。
time = MACROS(0, TimeCurrent()); // TimeCurrent из 0-хендла.
time = MACROS(1, TimeCurrent()); // TimeCurrent из 1-хендла.

MACROS(0, SymbolInfoTick(_Symbol, Tick)); // SymbolInfoTick из 0-хендла.

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
Price = MACROS(3, Bid); // Bid из 3-хендла.


解決方法

template <typename T>
T Memory( const T NewValue, const bool SetFlag = true )
{
  static T PrevValue;
  
  if (SetFlag)
    PrevValue = NewValue;
 
  return(PrevValue); 
}

template <typename T1, typename T2>
T2 MacrosFunc( const T1, const T2 Value, const T1 )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), B, SelectHandle(Memory(A)))


 
fxsaber:

解決方法

...
template <typename T1, typename T2>
T2 MacrosFunc( const T1, const T2 Value, const T1 )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), B, SelectHandle(Memory(A)))


他とは関係なく、必ず式Bが 計算されて返されます。

 
Alexey Navoykov:

B 式は、他と関係なく、常に計算されて返されます。

補助関数の入力パラメータを逐次(右から左へ)計算するものがある。

 
fxsaber:

補助関数の入力パラメータを逐次(右から左へ)計算するものがある。

これにより何が変わるかというと、マクロは常に値Bを返します。
 
Alexey Navoykov:
マクロは常にBを返します。

判定に反論してみる。エラーが表示されないのですが。


まずNewHandleに切り替わり、次にBを取り、そして前のハンドルに切り替わります。

 
fxsaber:

まずNewHandleに切り替わり、次にBを取り、そして前のハンドルに切り替わります。

そして、本来のタスクはこんな感じ。

SelectHandle(NewHandle) ? TimeCurrent() : 0; SelectHandle(PrevHandle);

すなわち、条件を満たす必要があります。
 
Alexey Navoykov:

そして、当初の問題はこれでした。

これも同じです。

template <typename T1, typename T2>
T2 MacrosFunc( const T1 NewHandle, const T2 Value )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), SelectHandle(Memory(A)) ? B : 0)


SymbolInfoTickとSymbolInfoDoubleなど、問題をある程度まとめたコメントを出した後。

 

ちなみに、一般的なケースとして、関数の戻り値の型が絶対型である場合、この問題はMQLでは解決できないという結論に達しました。 ここにはないdecltypeが必要なのです。

理由: