MQL5'te her zaman kahramanlığa yer vardır! ;) - sayfa 3

 
mql5 :
Kısaca.
x86 (32 bit) işlemleri için sistem kitaplığı işlevleri, bunların x64'e geçirildiği, yürütüldüğü ve x86'ya geri döndürüldüğü özel bir sarmalayıcıya sahiptir.

64 bit Windows'un bir SysWOW64 klasörü vardır. Bu klasör, 64 bit işletim sistemi üzerinde çalışan 32 bit uygulamalar için tasarlanmıştır, System32 klasörü ise normal 64 bit kitaplıkları ve sürücüleri depolar. Program 32-bit olarak başlatılırsa, System32 klasörüne yapılan çağrılar SysWOW64'e yönlendirilir.

kısaca değilse, MT5'te 32/64 bit sorunu akut hale geldi.

Soru çok önemli ve çözmenin zamanı geldi.

veya terminalin kendisinin de nereden alınacağını anlaması için library64 klasörünü ekleyin
veya DLL'yi System32 / SysWow64 Windows klasörlerine dağıtmanın bir yolunu verin
veya #ifdef ver

https://www.mql5.com/ru/forum/6729#comment_199764

not.
SD #381730'da uygulama

 
MetaDriver :

Bir dizi keyfi boyut (kesinlik için, diyelim ki ^16 ile sınırlayacağız).

Boyut, sıradan dizilerde olduğu gibi, oluşturma sırasında parametre sayısına göre ayarlanır.

XXArray  xx2(5,7),  xx5(12,12,16,16,8);

Dizin oluşturucular tüm boyutlar için çalışmalıdır ( A[i][j][k][n][m]....)

Eh, topluluk sessiz kaldığı için devam edeceğim ...

N boyutlu (çift) bir dizi sınıfının bir taslağı ve onu doğrulamak için bir test.

Boyut, yapıcıda bir (int) dizisi ile tanımlanır.

 //+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
Dosyalar:
 

N boyutlu (çift) dizinin ikinci versiyonu. Dizi yapısı, yapıcıda başka bir (int) dizisi tarafından da ayarlanır.

Bu seçenek öncekinden biraz daha hızlıdır. Ve bu varyantta alt dizilerle işlemler oluşturmak daha kolaydır.

 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 :

N boyutlu (çift) dizinin ikinci versiyonu. Dizi yapısı, yapıcıda başka bir (int) dizisi tarafından da ayarlanır.

Bu seçenek öncekinden biraz daha hızlıdır. Ve bu varyantta alt dizilerle işlemler oluşturmak daha kolaydır.

Yuri, harikasın. Birkaç gündür forumdan biraz uzaklaştım, bu yüzden zaten birkaç seçeneği anladınız.

Teksas. İlk izlenimde - ilk seçenek, daha az sayıda dizine sahip hatalı bir çağrı olması durumunda aksaklıklarla doludur: yani. örneğin double x=A[i][j][k]; Dört boyutlu bir dizi için "üç boyutlu çağrı", hiçbir şey olmamış gibi, ancak aynı zamanda kullanıcının hayalini kurduğu dizinin konumundan iki katına çıkar. Ayrıca, bu tür hataların ne şekilde izleneceği ve işleneceği de net değildir. Ancak ilk uygulamanın tartışılmaz avantajı bellek tasarrufudur. İkinci seçenek çok daha savurgan. Ancak, haklı olarak belirttiğiniz gibi, içindeki alt dizilere ulaşmaya çalışabilirsiniz ve yol boyunca tüm zorluklar tamamen aşılabilir.

Başka bir şey düşünmen gerekiyor. Fikirlerim var ama bugün oraya gidersem bu akşama kadar boş vaktim olmayacak. Ama konuyu bitireceğiz, söz veriyorum. :)

--

Ana fikir: "sol dizin denetleyicisi" gibi başka bir sınıf kullanmanız ve en sağdaki dizini ana sınıfla (çalışırsa, değilse, doğru dizin için başka bir sınıf) kullanmanız gerekir. Bu durumda, temel çift dizi (tek boyutlu ve benzersiz), ana CNArray sınıfının bir üyesi yapılmalıdır. Bunun gibi bir şey.

 
MetaDriver

Teksas. İlk izlenimde - ilk seçenek, daha az sayıda dizine sahip hatalı bir çağrı olması durumunda aksaklıklarla doludur: yani. örneğin double x=A[i][j][k]; Dört boyutlu bir dizi için "üç boyutlu çağrı", hiçbir şey olmamış gibi, ancak aynı zamanda kullanıcının hayalini kurduğu dizinin konumundan iki katına çıkar. Ayrıca, bu tür hataların ne şekilde izleneceği ve işleneceği de net değildir.

Yurich'ten ilk yöntemi büktük, dizinin sıralamasını şu şekilde kontrol edebilirsiniz:

 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); } //+------------------------------------------------------------------+
 

Görev:

- EA'dan göstergeye bir dizi sayı aktarın.


Koşullar.

veri iletimi için kullanmayın
- grafik olayları,
- Dosyalar,
- global değişkenler (dosyalardır),
- dll

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

Görev:

- EA'dan göstergeye bir dizi sayı aktarın.


Koşullar.

- veri aktarımı için grafik olaylarını, dosyaları, dll'yi kullanmayın

Global terminal değişkenleri çalışacak mı?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Sonra adlandırılmış borular vardır.
 
sandex :
Sonra adlandırılmış borular vardır.
sunucu kim?
 
sergeev :

Görev:

- EA'dan göstergeye bir dizi sayı aktarın.


Koşullar.

veri iletimi için kullanmayın
- grafik olayları,
- Dosyalar,
- global değişkenler (dosyalardır),
- dll

Pekala, istismarlar için kimseyi döndürme :)

Sonra başka bir seçenek sunacağım - bir alt çizelge ve ChartSetString () ve ChartGetString () işlevlerini kullanmak.