mql5言語の特徴、微妙なニュアンスとテクニック - ページ 138 1...131132133134135136137138139140141142143144145...247 新しいコメント Igor Makanu 2019.07.08 07:00 #1371 fxsaber: // Некоторые возможности структур, которых нет у классов. hm、面白いですね、constフィールドのアイデアは本当に好きです。constは一度だけ初期化されます。 Andrey Barinov 2019.07.08 09:01 #1372 Igor Makanu: hm、面白いですね、constフィールドを使ったアイデアが好きです、constは一度だけ初期化されます。 というように、ロットの正規化ができるようになりました。 クラス内でも定数メンバを 宣言することができます。 Igor Makanu 2019.07.08 09:41 #1373 Andrey Barinov: また、クラス内で定数メンバを 宣言することも可能です。 まあ、そうなんですが、ここですべての修飾語をきちんと使っていないから、感心してしまったわけで、チェックしたら、今度は、コンパクトに書きたかっただけなのに、難読化してしまいました ))) #property strict //+------------------------------------------------------------------+ class NL { #ifndef SID #define SID(v) SymbolInfoDouble(_Symbol,v) private: const class sl { public:double s,b,l;int d;sl():s(SID(SYMBOL_VOLUME_STEP)),b(SID(SYMBOL_VOLUME_MAX)),l(SID(SYMBOL_VOLUME_MIN)){;long i=10000000,k=long(s/0.0000001);d=0;while(d<7 && k%i>0){i/=10;d++;}}#endif } param; public: double Lot(double value){return(NormalizeDouble(fmax(fmin(param.s*round(value/param.s),param.b),param.l),param.d));} } Normalize; //+------------------------------------------------------------------+ void OnStart() { double l = 0.0; for(int i=0;i<10;i++) { l+=0.005; Print(Normalize.Lot(l)); } } //+------------------------------------------------------------------+ ZS:MEの折りたたみは、本当に物足りないです- マウスホイールをあちこち転がすのが疲れる(((^^;) Alexey Navoykov 2019.07.09 00:13 #1374 MQLによるconstructfor eachの 私の実装です。 1) 通常の mql-array; 2) [](int) 演算子が定義され、グローバルなArraySize 関数が オーバーロードされたカスタム配列クラス。 構文です。 foreach(element_var, array) { ... } 配列は変数としても式としても定義できる。だから庭を作る必要があったんだ)。式は一度実行され,配列へのポインタが格納され,そのポインタにアクセスする. #define TEMPL(T) template<typename T> enum E_TRUE { __TRUE=1 }; enum E_FALSE { __FALSE=0 }; TEMPL(T) E_TRUE __IsMqlArray(T&[], int) { return true; } TEMPL(T) E_FALSE __IsMqlArray(T&, int) { return false; } TEMPL(T) E_FALSE __IsMqlArray(T, uint) { return false; } #define IS_MQL_ARRAY(var) ( typename(__IsMqlArray(var, 0))==typename(E_TRUE) ) static class __CForeachHelper { public: TEMPL(T) class __CDummyArr { public: T data[]; }; TEMPL(T) struct __TValue { public: T data; __TValue(T value) { data= value; } }; TEMPL(T) T* Ptr(T* a) { return a; } TEMPL(T) T* Ptr(T& a) { return &a; } TEMPL(T) __CDummyArr<T>* Ptr(const T&[]) { return NULL; } TEMPL(T) __TValue<T> Obj(const void* p, T) { return (T)p; } TEMPL(T) __CDummyArr<T>* Obj(const void* p, __CDummyArr<T>*) { return (__CDummyArr<T>*)p; } } __foreachhelper; #define __ARR_ITEM(ptr, array, i) (IS_MQL_ARRAY(array) ? array[i] : __foreachhelper.Obj(ptr, 0 ?__foreachhelper.Ptr(array) : NULL).data[i]) #define __ARR_SIZE(ptr, array) (IS_MQL_ARRAY(array) ? ArraySize(array) : ArraySize(__foreachhelper.Obj(ptr, 0 ?__foreachhelper.Ptr(array) : NULL).data)) #define CONCAT(a, b) a##b #define CONCAT2(a, b) CONCAT(a, b) #define __FORVAR(var) CONCAT2(__for##var, __LINE__) #define foreach(element, array) \ if (0) { class __CForeachArrCheck \ // Проверка наличия конструктора у элемента mql-массива { public: TEMPL(T) void f(T&){} TEMPL(T) void f(T*){} TEMPL(T) void f(T*const&[]){} TEMPL(T) void f(T const&[]) { T arr[1]; } \ } _fcheck; _fcheck.f(array); \ } \ else \ for (int __FORVAR(state)=1; __FORVAR(state)==1; ) \ for (const void* __FORVAR(ptr)=__foreachhelper.Ptr(array); __FORVAR(state)==1; ) \ for(int __FORVAR(i)=0, __FORVAR(count)=__ARR_SIZE(__FORVAR(ptr), array); __FORVAR(state)--==1 && __FORVAR(i)<__FORVAR(count); __FORVAR(i)++) \ for (element=__ARR_ITEM(__FORVAR(ptr), array, __FORVAR(i)); __FORVAR(state)==0; __FORVAR(state)=1) 使用例 template<typename T> class CArr { public: T data[]; T operator[](int i) const { return data[i]; } void operator=(T const &arr[]) { int size=ArraySize(arr); ArrayResize(data, size); for (int i=0; i<size; i++) data[i]=arr[i]; } }; template<typename T> int ArraySize(const CArr<T> &arr) { return ArraySize(arr.data); } class A { public: double value; A(double val=0) { value=val; } }; CArr<int>* GetArr() { Print("Get Array"); static int arr[]={10,20,30}; static CArr<int> Arr= arr; return &Arr; } void OnStart() { Print("Test 1"); double arr[]= { 10, 20, 30 }; foreach(double val, arr) Print(val); Print("Test 2"); CArr<double> arr2 = arr; foreach(double val, arr2) Print(val); Print("Test 3"); A _a(10), _b(20), _c(30); A* arr3[3]; arr3[0]=&_a; arr3[1]=&_b; arr3[2]=&_c; foreach(A* a, arr3) Print(a.value); Print("Test 4"); CArr<A*> arr4 = arr3; foreach(A* a, arr4) Print(a.value); Print("Test 5"); foreach(int a, GetArr()) Print(a); } fxsaber 2019.07.09 11:23 #1375 Alexey Navoykov: 使用例です。 少し書き直し //void operator=(T const &arr[]) { int size=ArraySize(arr); ArrayResize(data, size); for (int i=0; i<size; i++) data[i]=arr[i]; } void operator=(T const &arr[]) { ArrayResize(data, ArrayCopy(data, arr)); } fxsaber 2019.07.09 11:33 #1376 Alexey Navoykov: MQLによるconstructfor eachの 私の実装です。 1) 通常の mql-array; 2) [](int) 演算子が定義され、グローバルなArraySize 関数が オーバーロードされているカスタム配列クラス。 かっこいいですねー。そのようなバリエーションを作ることは可能でしょうか? void OnStart() { MqlTick Ticks[3]; for (int i = 0; i < ArraySize(Ticks); i++) Ticks[i].bid = i + 1; foreach(MqlTick Tick, Ticks) Print(Tick.bid); // OK foreach(MqlTick Tick[1], Ticks) ArrayPrint(Tick); // 'Tick' - invalid array access } Alexey Navoykov 2019.07.09 12:01 #1377 fxsaber: かっこいいですねー。これのバージョンは可能でしょうか? 配列を変数で初期化することはMQLではサポートされていません。配列の要素に 代入することはできます。foreach(Ticks[0], Ticks) ArrayPrint(Ticks[0].bid); fxsaber 2019.07.09 12:18 #1378 Alexey Navoykov: 配列の変数による初期化はMQLではサポートされていません。配列の要素への 代入は 可能です。 実装は考えていないが、そのようなやり方をする意味はないだろう。 これは動作しません void f( const int &Array[] ) { foreach(int val, Array) Print(val); } Alexey Navoykov 2019.07.09 13:17 #1379 fxsaber: このバリアントは動作しません はい、そうです。調べてみると、面白い特長があることがわかりました。定数型(例えばconst int)の引数をテンプレートに渡すと、単純に:T = intと受け取られるが、何らかの形で定数も考慮されるため、混乱が生じる。 template<typename T> class B { }; template<typename T> void f(T & a) { B<const T> b; // OK. Значит T==int const T arr[]={}; // Тоже всё ОК. T arr2[]; // 'arr2' - 'const' variable must be initialized. wtf? } void OnStart() { const int a=0; f(a); } 最初はMQLの機能かと思いましたが、C++でも同じです。 TheXpert 2019.07.09 13:32 #1380 Alexey Navoykov: 最初はMQLの機能かと思ったのですが、C++でも同じなんですね。 型が const int であるため,テンプレート内で const を前面に出しても問題ないというだけのことです しかし、c++では簡単な操作で型からconstを取り除くことができるのに、mqlではそれができない。 1...131132133134135136137138139140141142143144145...247 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
// Некоторые возможности структур, которых нет у классов.
hm、面白いですね、constフィールドのアイデアは本当に好きです。constは一度だけ初期化されます。
hm、面白いですね、constフィールドを使ったアイデアが好きです、constは一度だけ初期化されます。
というように、ロットの正規化ができるようになりました。
クラス内でも定数メンバを 宣言することができます。
また、クラス内で定数メンバを 宣言することも可能です。
まあ、そうなんですが、ここですべての修飾語をきちんと使っていないから、感心してしまったわけで、チェックしたら、今度は、コンパクトに書きたかっただけなのに、難読化してしまいました )))
ZS:MEの折りたたみは、本当に物足りないです- マウスホイールをあちこち転がすのが疲れる(((^^;)MQLによるconstructfor eachの 私の実装です。
1) 通常の mql-array; 2) [](int) 演算子が定義され、グローバルなArraySize 関数が オーバーロードされたカスタム配列クラス。
構文です。
配列は変数としても式としても定義できる。だから庭を作る必要があったんだ)。式は一度実行され,配列へのポインタが格納され,そのポインタにアクセスする.
使用例
使用例です。
少し書き直し
MQLによるconstructfor eachの 私の実装です。
1) 通常の mql-array; 2) [](int) 演算子が定義され、グローバルなArraySize 関数が オーバーロードされているカスタム配列クラス。
かっこいいですねー。そのようなバリエーションを作ることは可能でしょうか?
かっこいいですねー。これのバージョンは可能でしょうか?
foreach(Ticks[0], Ticks) ArrayPrint(Ticks[0].bid);
配列の変数による初期化はMQLではサポートされていません。配列の要素への 代入は 可能です。
実装は考えていないが、そのようなやり方をする意味はないだろう。
これは動作しません
このバリアントは動作しません
最初はMQLの機能かと思いましたが、C++でも同じです。
最初はMQLの機能かと思ったのですが、C++でも同じなんですね。
型が const int であるため,テンプレート内で const を前面に出しても問題ないというだけのことです
しかし、c++では簡単な操作で型からconstを取り除くことができるのに、mqlではそれができない。