mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 23

 

どの端末(MT4/MT5)でコードを実行しているかを知るにはどうしたらよいですか?

1つの真偽の変数で十分です

 
Igor Makanu:

どの端末(MT4/MT5)でコードを実行しているかを知るにはどうしたらよいですか?

1つの真偽の変数で十分です

bool is_mt5=(TerminalInfoString(TERMINAL_NAME)=="MetaTrader 5");
 
Artyom Trishkin:

OK、でもマクロの中を見たい、単純なものである可能性が高いです。

UPDです。

#ifdef __MQL5__
  #define  mql5 true
#else
  #define  mql5 false 
#endif

bool isMQL5 = mql5;
 
Igor Makanu:

OK、でもマクロの中を見たい、単純なものである可能性が高いです。

UPDです。

神聖な意味とは?

 
Artyom Trishkin:

神聖な意味とは何でしょうか?

コンパイラをチェックし、それが「正しいコンパイラ」であれば、コンパイル段階で不要なものをすべて捨ててくれるはずです。

#ifdef __MQL5__
  #define  mql5 true
#else
  #define  mql5 false 
#endif

const bool isMQL5 = mql5;

const string txt_1000symbols = "Язык MetaQuotes Language 5 (MQL5) является объектно-ориентированным языком программирования высокого уровня и предназначен для написания"
                               "автоматических торговых стратегий, пользовательских технических индикаторов для анализа разнообразных финансовых рынков. Он позволяет не только писать разнообразные"
                               "экспертные системы, предназначенные для работы в режиме реального времени, но и создавать собственные графические инструменты, помогающие принимать торговые решения."
                               "MQL5 основан на концепции широко распространенного языка программирования С++, по сравнению с MQL4 в нем добавлены перечисления, структуры, классы и обработка событий."
                               " Благодаря расширению числа встроенных основных типов, взаимодействие исполняемых программ на MQL5 с другими приложениями "
                               "посредством dll максимально облегчено. Синтаксис языка MQL5 подобен синтаксису С++, и это позволяет легко переносить на него программы из современных языков "
                               "программирования. Для целей изучения языка все темы сгруппированы по следующим разделам.\n";
//+------------------------------------------------------------------+
void OnStart()
  {
   if(isMQL5) Print(txt_1000symbols);
   Print("end");
  }
//+------------------------------------------------------------------+

をコンパイルして、.ex5 のサイズに注目してください ;)

SZY: if() の中にisMQL5 ,mql5 , const 修飾子を削除することができます - 一般的に、それは正しいコンパイラ です。

 

そのようなコードがあるのです。

#import "mydll.dll"
#import

mt4は2つのEAから呼び出された場合、メモリ内にdllの新しいコピーを作成しない、私はdll自体を編集したくない(それは100%満足している)、それは5回mydll.dllファイルをコピーする方が簡単です。

以下のようなマクロが必要です。

#define  dllnum 02

#import "mydll02.dll"
#import

しかし、私はマクロ、dllnumがない場合、それは "mydll.dll " になることを確認したい。



UPDです。

これで解決

#define  dllnum 2

#define  DEF_QUOTES(arg) #arg

#ifdef  dllnum
   #define  DEF_DLL_NAME(a,b) DEF_QUOTES(a##0##b.dll)
#else
   #define  DEF_DLL_NAME(a,b) DEF_QUOTES(a.dll)
#endif 

   
string s =  DEF_DLL_NAME(mydll,dllnum);


UPD2:解決していない((。

'mydll02.dll' - グローバルスコープでの式は許可されていません。

 
Igor Makanu:

そのようなコードがあるのです。

mt4は2つのEAから呼び出された場合、メモリ内にdllの新しいコピーを作成しない、私はdll自体を編集したくない(それは100%満足している)、それは5回mydll.dllファイルをコピーする方が簡単です。

以下のようなマクロが必要です。

しかし、私はマクロ、dllnumがない場合、それは "mydll.dll " になることを確認したい。



UPDです。

これで解決


UPD2:解決していない((。

'mydll02.dll' - グローバルスコープでの式は許可されていません。

うまくいかないんだろうな。

DEF_QUOTES(a##0##b.dll)

ここでは有効なトークンが得られない。一般に、mclは以下のことができるはずです。

#import "jkjfkj"".dll"

が、残念なことに、よく言われるように、あなたはC++でここにいないのです))

 
Vict:

うまくいかないんだろうな。

では有効なトークンが得られません。実は、mclは、以下のことができるはずです。

が、残念ながら、よく言われるように、これはC++ではないのです))

むむ

少なくとも、トークンをマクロでインクルードしようとしたのですが...また失敗しました。

#define  FNAME <mylib.mqh>

#include  FNAME

'#include' - 二重引用符または角括弧 < が必要です。

'#include' - グローバルスコープでの表現は禁止されています。


 
Igor Makanu:

何のためにロウソクを燃やしているのか、わからないんです。そういうことなんでしょうね。

#define  LIB "kjkjkjk.dll"
#import  LIB

修正されるコンフィグがある場合に便利なのは認めますが。

追記:もし、まだ本当にやりたいのなら、name_dll(ドットなし)を試してみてください、多分、それは離陸するでしょう。
 
Vict:

だから、うまくいくんでしょうね。

然うは問屋が卸さない

#import はファイル名を想定しています。

ビクト

何のためにロウソクを燃やしているのか、わからないんです。

dllのコネクションマネージャーをやりたくないのですが、MT4ではなぜか2つのEAから2回dllを呼び出すと、新しいdllコピーがメモリに作成されません(dllには静的オブジェクト、.Net上のラッパー、1つのdllを実行するとクラッシュ、2種類のファイルは問題なく実行できます)。

というわけで、早速ですが、mylib.dllファイルをmylib02.dllにコピーするだけで、すべて問題なく動作します...。が、マクロ置換をグローバルに宣言したい