MQL5では、常に悪用される可能性があるのです。 ;) - ページ 3 123456789 新しいコメント --- 2012.05.23 10:00 #21 mql5: 簡単に説明すると x86(32ビット)プロセス用のシステムライブラリの関数は、特別なラッパーを経由してx64に渡され、実行されてx86に戻される。64bit版Windowsには、SysWOW64というフォルダがあります。このフォルダは、64ビットOSで起動する32ビットアプリケーション用で、通常の64ビットライブラリやドライバはSystem32フォルダに格納されます。 32ビットとして起動した場合、System32フォルダへの参照はSysWOW64にリダイレクトされます。簡単に説明すると、MT5で32/64ビットの問題が深刻化しました。これは非常に重要な 問題であり、 そろそろ対処されるべきだと思います。 または、libraries64 フォルダを追加して、ターミナルがどこからライブラリを取得するかわかるようにします。 または、DLLをsystem32/SysWow64 フォルダに分散させる方法を追加 または #ifdef を 使うhttps://www.mql5.com/ru/forum/6729#comment_199764ZSです。 SD#381730に応募する Yury Kulikov 2012.05.28 10:37 #22 MetaDriver:任意の次元の配列(わかりやすくするために、^16とする)。 次元数は、通常の配列と同様に、生成時にパラメータの数で設定される。 XXArray xx2(5,7), xx5(12,12,16,16,8);インデクサはすべての次元(A[i][j][k][n][m]...)で機能する必要があります。さて、コミュニティが沈黙しているので、続けますが......。N次元(double)配列クラスの概要と、それをテストするためのテストです。次元数はコンストラクタで(int)配列で記述する。//+------------------------------------------------------------------+ class CNXdouble { double value[]; int size[]; int index; int ivalue; public: CNXdouble(const int &n[]); ~CNXdouble() { ArrayFree(value); ArrayFree(size);} double operator[] (long x_); CNXdouble *operator[] (int x_) { ivalue+=x_*size[index++]; return(GetPointer(this));} void operator= (double d) { value[ivalue]=d; index=0; ivalue=0;} }; //+------------------------------------------------------------------+ CNXdouble::CNXdouble(const int &n[]) { int m=1, k=ArraySize(n); ArrayResize(size,k); size[k-1]=1; for(int i=k-2; i>=0; i--) size[i]=n[i+1]*size[i+1]; for(int i=0; i<k; i++) m*=n[i]; ArrayResize(value,m); index=0; ivalue=0; } //+------------------------------------------------------------------+ double CNXdouble::operator[] (long x_) { index=0; int i=ivalue; ivalue=0; return(value[i+(int)x_]); } //+------------------------------------------------------------------+ void OnStart() { int n[]={2,3,4,2}; //описание 4-х мерного массива int a1=n[0], a2=n[1], a3=n[2], a4=n[3]; CNXdouble d2(n); //запись в массив int c=0; for(int i=0; i<a1; i++) for(int j=0; j<a2; j++) for(int x=0; x<a3; x++) for(int y=0; y<a4; y++) d2[i][j][x][y]=(double)c++; //чтение из массива string s=""; for(int i=0; i<a1; i++) for(int j=0; j<a2; j++) for(int x=0; x<a3; x++) for(long y=0; y<a4; y++) s+=(string)d2[i][j][x][y]+" "; Print(s); } //+------------------------------------------------------------------+ ファイル: test-n-array.mq5 2 kb Yury Kulikov 2012.05.30 02:58 #23 2番目のバリエーションはN次元(double)配列である。また、コンストラクタでは、別の(int)配列でその構造を指定する。このバリエーションは、従来のものよりも少し高速化されています。そして、このバリアントでは、サブアレイを使った演算を簡単に作成することができます。class CNArray { CNArray *array[]; double value[]; bool last; int ivalue; public: CNArray(const int &n[]); ~CNArray(); double operator[] (long x); CNArray* operator[] (int x); void operator= (double d) { if(last)value[ivalue]=d;} }; //+------------------------------------------------------------------+ CNArray::CNArray(const int &n[]) { int k=ArraySize(n); if(k>1) { ArrayResize(array,n[0]); int n1[]; ArrayResize(n1,k-1); for(int i=0; i<k-1; i++) n1[i]=n[i+1]; for(int i=0; i<n[0]; i++) array[i]=new CNArray(n1); ArrayFree(n1); last=false; }else if(k==1) { ArrayResize(value,n[0]); last=true; } } //+------------------------------------------------------------------+ CNArray::~CNArray() { if(!last) { int n=ArraySize(array); for(int i=0; i<n; i++) delete array[i]; ArrayFree(array); }else ArrayFree(value); } //+------------------------------------------------------------------+ double CNArray::operator[](long x) { if(last) return(value[(int)x]); else return(0); } //+------------------------------------------------------------------+ CNArray* CNArray::operator[](int x) { if(last) { ivalue=x; return(GetPointer(this)); }else return(array[x]); } Vladimir Gomonov 2012.05.30 15:12 #24 Yurich:2番目のバリエーションはN次元(double)配列である。また、コンストラクタでは、別の(int)配列でその構造を指定する。このバリエーションは、従来のものよりも少し高速化されています。そして、このバリアントでは、サブアレイを使った演算が作りやすくなっています。Yurichさん、かっこいいですね。 数日前から掲示板から気が抜けていましたが、もう何種類もバリエーションを作っているんですね。第一印象 - 最初のバリエーションは、少ないインデックス数での誤呼出しに不具合があります。例えば、double x=A[i][j][k];4次元配列に対する「3次元呼び出し」は、大したことなく、ユーザが望む配列の他の位置からdoubleを返します。また、そのようなエラーをどのように追跡し、処理するかは明らかではありません。 しかし、最初の実装の議論の余地のない利点はメモリの節約です。 2番目の方法ははるかに無駄です。 しかし、あなたが正しく気づいたように、その中でサブアレイに通じてみることができ、この場合すべての困難はかなり管理可能であります。アイデアはあるのですが、自由な時間が取れるのは前日の夜まで、全く取れないんです。でも、必ずたどり着けるはずです。:)--基本的なアイデア:「left indexes controller」のようなクラスをもう一つ使い、右端のインデックスをメインクラスで処理します(うまくいく場合。)その際、ベースとなる配列double(一次元で唯一)をメインクラスCNArrayのメンバにする必要があります。こんな感じ。 Igor Makanu 2012.08.24 17:30 #25 MetaDriverTx. 第一印象 - 最初の変形は、少ないインデックス数での不正な呼び出しで不具合が生じます。例えば、 double x=A[i][j][k]; 4次元配列に対する「3次元呼び出し」は、何もなかったかのように double を返しますが、同時にユーザが望む配列位置からです。 さらに、このようなエラーを追跡して処理する方法は、どのように見えるものでもありません。Yurichの最初のメソッドをいじってみたところ、この方法で配列のランクを制御することが可能なようです。class DinArr_Double{ double value[]; int size[]; int index; int ivalue; int range; bool checkerror; public: DinArr_Double(const int &n[]); ~DinArr_Double() { ArrayFree(value); ArrayFree(size);} double operator[](long x_); DinArr_Double* operator[](int x_); void operator= (double d) { value[ivalue]=d; index=0; ivalue=0;} }; //+------------------------------------------------------------------+ DinArr_Double::DinArr_Double(const int &n[]){ int m=1, k=ArraySize(n); range = ArraySize(n); ArrayResize(size,k); size[k-1]=1; for(int i=k-2; i>=0; i--) size[i]=n[i+1]*size[i+1]; for(int i=0; i<k; i++) m*=n[i]; ArrayResize(value,m); index=0; ivalue=0; checkerror = false; } //+------------------------------------------------------------------+ double DinArr_Double::operator[](long x_){ index=0; int i=ivalue; ivalue=0; return(value[i+(int)x_]); } //+------------------------------------------------------------------+ DinArr_Double* DinArr_Double::operator[](int x_){ ivalue+=x_*size[index++]; if(index!=range)checkerror = true; else checkerror = false; return(GetPointer(this)); } //+------------------------------------------------------------------+ void OnStart(){ int n[]={2,3,4,2}; //описание 4-х мерного массива int a1=n[0], a2=n[1], a3=n[2], a4=n[3]; DinArr_Double d2(n); //запись в массив int c=0; for(int i=0; i<a1; i++) for(int j=0; j<a2; j++) for(int x=0; x<a3; x++) for(int y=0; y<a4; y++) d2[i][j][x][y]=(double)c++; //чтение из массива string s=""; for(int i=0; i<a1; i++) for(int j=0; j<a2; j++) for(int x=0; x<a3; x++) for(long y=0; y<a4; y++) s+=(string)d2[i][j][x][y]+" "; Print(s); } //+------------------------------------------------------------------+ --- 2013.12.14 19:42 #26 タスク- Expert Advisorからインジケータに数値の配列を渡すこと。必要条件使用しないでください。 - チャートイベント - のファイルです。 - グローバル変数(ファイルとも呼ばれる)。 - ダル Документация по MQL5: Основы языка / Переменные / Глобальные переменные www.mql5.com Основы языка / Переменные / Глобальные переменные - Документация по MQL5 Alexander Bereznyak 2013.12.14 19:45 #27 sergeev:タスク- Expert Advisorからインジケータに数値の配列を渡す場合。必要条件- チャートイベント、ファイル、DLLをデータ転送に使用しないでください。 端末のグローバル 変数は動作しますか? Документация по MQL5: Основы языка / Переменные / Глобальные переменные www.mql5.com Основы языка / Переменные / Глобальные переменные - Документация по MQL5 Alexander Bereznyak 2013.12.14 19:55 #28 すると、名前のあるチャンネルが残る。 --- 2013.12.14 19:58 #29 sandex: すると、名前のあるチャンネルが残る。 サーバーは誰ですか? Yury Kulikov 2013.12.19 11:34 #30 sergeev:タスク- Expert Advisorからインジケータに数値の配列を渡す場合。条件使用しないでください。 - チャートイベント - のファイルです。 - グローバル変数(別名ファイル)です。 - ダル やる人がいないんです :)そこで、もう一つの方法として、サブチャートとChartSetString()およびChartGetString() 関数を使用することを提案します。 123456789 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
簡単に説明すると
x86(32ビット)プロセス用のシステムライブラリの関数は、特別なラッパーを経由してx64に渡され、実行されてx86に戻される。
簡単に説明すると、MT5で32/64ビットの問題が深刻化しました。
これは非常に重要な 問題であり、 そろそろ対処されるべきだと思います。
または、libraries64 フォルダを追加して、ターミナルがどこからライブラリを取得するかわかるようにします。
または、DLLをsystem32/SysWow64 フォルダに分散させる方法を追加
または #ifdef を 使う
https://www.mql5.com/ru/forum/6729#comment_199764
ZSです。
SD#381730に応募する
任意の次元の配列(わかりやすくするために、^16とする)。
次元数は、通常の配列と同様に、生成時にパラメータの数で設定される。
XXArray xx2(5,7), xx5(12,12,16,16,8);
インデクサはすべての次元(A[i][j][k][n][m]...)で機能する必要があります。
さて、コミュニティが沈黙しているので、続けますが......。
N次元(double)配列クラスの概要と、それをテストするためのテストです。
次元数はコンストラクタで(int)配列で記述する。
2番目のバリエーションはN次元(double)配列である。また、コンストラクタでは、別の(int)配列でその構造を指定する。
このバリエーションは、従来のものよりも少し高速化されています。そして、このバリアントでは、サブアレイを使った演算を簡単に作成することができます。
2番目のバリエーションはN次元(double)配列である。また、コンストラクタでは、別の(int)配列でその構造を指定する。
このバリエーションは、従来のものよりも少し高速化されています。そして、このバリアントでは、サブアレイを使った演算が作りやすくなっています。
Yurichさん、かっこいいですね。 数日前から掲示板から気が抜けていましたが、もう何種類もバリエーションを作っているんですね。
第一印象 - 最初のバリエーションは、少ないインデックス数での誤呼出しに不具合があります。例えば、double x=A[i][j][k];4次元配列に対する「3次元呼び出し」は、大したことなく、ユーザが望む配列の他の位置からdoubleを返します。また、そのようなエラーをどのように追跡し、処理するかは明らかではありません。 しかし、最初の実装の議論の余地のない利点はメモリの節約です。 2番目の方法ははるかに無駄です。 しかし、あなたが正しく気づいたように、その中でサブアレイに通じてみることができ、この場合すべての困難はかなり管理可能であります。
アイデアはあるのですが、自由な時間が取れるのは前日の夜まで、全く取れないんです。でも、必ずたどり着けるはずです。:)
--
基本的なアイデア:「left indexes controller」のようなクラスをもう一つ使い、右端のインデックスをメインクラスで処理します(うまくいく場合。)その際、ベースとなる配列double(一次元で唯一)をメインクラスCNArrayのメンバにする必要があります。こんな感じ。
Tx. 第一印象 - 最初の変形は、少ないインデックス数での不正な呼び出しで不具合が生じます。例えば、 double x=A[i][j][k]; 4次元配列に対する「3次元呼び出し」は、何もなかったかのように double を返しますが、同時にユーザが望む配列位置からです。 さらに、このようなエラーを追跡して処理する方法は、どのように見えるものでもありません。
Yurichの最初のメソッドをいじってみたところ、この方法で配列のランクを制御することが可能なようです。
タスク
- Expert Advisorからインジケータに数値の配列を渡すこと。
必要条件
使用しないでください。
- チャートイベント
- のファイルです。
- グローバル変数(ファイルとも呼ばれる)。
- ダル
タスク
- Expert Advisorからインジケータに数値の配列を渡す場合。
必要条件
- チャートイベント、ファイル、DLLをデータ転送に使用しないでください。
すると、名前のあるチャンネルが残る。
タスク
- Expert Advisorからインジケータに数値の配列を渡す場合。
条件
使用しないでください。
- チャートイベント
- のファイルです。
- グローバル変数(別名ファイル)です。
- ダル
やる人がいないんです :)
そこで、もう一つの方法として、サブチャートとChartSetString()およびChartGetString() 関数を使用することを提案します。