MQL5では、常に悪用される可能性があるのです。 ;) - ページ 3

 
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_199764

ZSです。
SD#381730に応募する

 
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);
}
//+------------------------------------------------------------------+
ファイル:
 

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]);
}
 
Yurich:

2番目のバリエーションはN次元(double)配列である。また、コンストラクタでは、別の(int)配列でその構造を指定する。

このバリエーションは、従来のものよりも少し高速化されています。そして、このバリアントでは、サブアレイを使った演算が作りやすくなっています。

Yurichさん、かっこいいですね。 数日前から掲示板から気が抜けていましたが、もう何種類もバリエーションを作っているんですね。

第一印象 - 最初のバリエーションは、少ないインデックス数での誤呼出しに不具合があります。例えば、double x=A[i][j][k];4次元配列に対する「3次元呼び出し」は、大したことなく、ユーザが望む配列の他の位置からdoubleを返します。また、そのようなエラーをどのように追跡し、処理するかは明らかではありません。 しかし、最初の実装の議論の余地のない利点はメモリの節約です。 2番目の方法ははるかに無駄です。 しかし、あなたが正しく気づいたように、その中でサブアレイに通じてみることができ、この場合すべての困難はかなり管理可能であります。

アイデアはあるのですが、自由な時間が取れるのは前日の夜まで、全く取れないんです。でも、必ずたどり着けるはずです。:)

--

基本的なアイデア:「left indexes controller」のようなクラスをもう一つ使い、右端のインデックスをメインクラスで処理します(うまくいく場合。)その際、ベースとなる配列double(一次元で唯一)をメインクラスCNArrayのメンバにする必要があります。こんな感じ。

 
MetaDriver

Tx. 第一印象 - 最初の変形は、少ないインデックス数での不正な呼び出しで不具合が生じます。例えば、 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); } //+------------------------------------------------------------------+
 

タスク

- Expert Advisorからインジケータに数値の配列を渡すこと。


必要条件

使用しないでください。
- チャートイベント
- のファイルです。
- グローバル変数(ファイルとも呼ばれる)。
- ダル

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
sergeev:

タスク

- Expert Advisorからインジケータに数値の配列を渡す場合。


必要条件

- チャートイベント、ファイル、DLLをデータ転送に使用しないでください。

端末のグローバル 変数は動作しますか?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
すると、名前のあるチャンネルが残る。
 
sandex:
すると、名前のあるチャンネルが残る。
サーバーは誰ですか?
 
sergeev:

タスク

- Expert Advisorからインジケータに数値の配列を渡す場合。


条件

使用しないでください。
- チャートイベント
- のファイルです。
- グローバル変数(別名ファイル)です。
- ダル

やる人がいないんです :)

そこで、もう一つの方法として、サブチャートとChartSetString()およびChartGetString() 関数を使用することを提案します。