Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 137

 
Игорь Васильев :

Gösterge kodunda alım satım komutları gördüğünde derleyicinin bunu bildirmemesi garip.

Şimdi ticaret bölümünü, ICustom() aracılığıyla ona bağlayarak göstergeden Expert Advisor'a çekmemiz gerekecek.

"Bir kısrakta kuyruk dikmeyin ve yanda bir yay dikmeyin" gibi görünüyor.

Derleyici yalnızca sözdizimini kontrol eder. Ortaya çıkan programın nasıl çalışacağını (ya da çalışmayacağını) belirlemek onun işi değildir. Alım satım komutlarının çalışamazlığı, yalnızca program yürütme aşamasında açıklığa kavuşturulabilir. Yani, bir çalışma zamanı hatası alınacaktır.

 

Merhaba! Lütfen aşağıdakileri yapmanın mümkün olup olmadığını bana bildirin.

Şöyle bir yapı var:
// bazı olayların yapısı
MyStruct yapısı
{
intNumber;
tarihsaatDTm;
çift Değer;
stringType;
}

MyStruct türünde dinamik bir yapı dizisi ilan ediyorum:
MyStructDataEvents[];

Belirli bir işlevde bir dizi oluşturur ve doldururum, örneğin:
void GetDataEventsTest(MyStruct& DataEvents[], int countEvent=5)
{
MathSrand(GetTickCount());
ArrayResize(DataEvents, countEvent);
int ben = 0;
while(i<countEvent)
{
DataEvents.Number = i;
DataEvents.DTm = TimeCurrent();
DataEvents.Value = (çift)MathRand();
if( MathMod(i, 2)>0 ) DataEvents.Type = "Yukarı"; başka DataEvents.Type = "Dn";
ben = ben + 1;
}
}

Bir yerde diziyi GetDataEventsTest()'i çağırarak doldururuz:
GetDataEventsTest(DataEvents);

Örneğin, dizi öğeleri aralığının ortasında, dizin 2'de bir yerde MyStruct türünde yeni bir öğe eklemek için bir ihtiyaç vardı.
Mantık aşağıdaki eylemleri önerir:
ArrayResize(DataEvents, ArraySize(DataEvents)+1);
ve bunun gibi bir şey:
int iNew = 2;
int i = ArraySize(DataEvents) - 2;
while(i>=iNew)
{
// DataEvents[i+1] = DataEvents[i]; // dizi öğesinin işaret ettiği adreslerle çalışmanız gerektiğinden doğal olarak çalışmaz.
// Dizi öğesini DataEvents[i+1] ile yaz = onu dizi öğesini işaret edecek şekilde yaz DataEvents[i];
ben = ben - 1;
}
... sonra DataEvents[iNew] dizi öğesini verilerle dolduruyorum.


Soru şu ki, bunu mql4'teki yapılarla yapmak mümkün mü?

 
GitSM :

Soru şu ki, bunu mql4'teki yapılarla yapmak mümkün mü?

Evet mümkün. Eğer yapı karmaşık bir veri türü olmasaydı (burada string buna dahil edilmiştir), o zaman her şey hemen işe yarardı. Ve yapıda veri boyutu zamanla değişebilen veri türleri olduğunda , atama operatörünü aşırı yüklemeniz gerekir:

 struct MyStruct
{
     int Number;
     datetime DTm;
     double Value;
     string Type;

     void operator = ( const MyStruct &stMyStruct)
    {
      Number = stMystruct.Number;
      DTm = stMyStruct.DTm;
      Value = stMyStruct.Value;
      Type = stMyStruct.Type;
    }
}
 
Ihor Herasko :

Evet mümkün. Eğer yapı karmaşık bir veri türü olmasaydı (burada string buna dahil edilmiştir), o zaman her şey hemen işe yarardı. Ve yapıda veri boyutu zamanla değişebilen veri türleri olduğunda , atama operatörünü aşırı yüklemeniz gerekir:

Bahşiş için teşekkürler!
 

Yine soru, önceki örnekte olduğu gibi aynı yönde ortaya çıktı.
Yapı karmaşıksa ve diğer yapıların dizilerini içerebilir. Örneğin, şöyle bildirimler yapıyorum:

// özelliklere sahip eleman
struct ItemProperty
{
çift Düşük;
çift yüksek;
çift Orta;
çift aralık;
çift alan;
stringType;

void operatörü = (const ItemProperty &SourceItemProperty)
{
Düşük = SourceItemProperty.Low;
Yüksek = SourceItemProperty.Yüksek;
Orta = SourceItemProperty.Middle;
Aralık = SourceItemProperty.Range;
Alan = SourceItemProperty.Area;
Tür = SourceItemProperty.Type;
}
}

// istatistiksel özelliklere sahip elemanlar
struct ItemsProperty;
{
çift MinDüşük;
çift MaxYüksek;
çift AvgRange;
çift AvgArea;
dizi Aşaması;

Öğe Öğeleri[];

void operatörü = (const ItemProperty &SourceItemsProperty)
{
MinLow = SourceItemsProperty.MinLow;
MaxHigh = SourceItemsProperty.MaxHigh;
AvgRange = SourceItemsProperty.AvgRange;
AvgArea = SourceItemsProperty.AvgArea;
Aşama = SourceItemsProperty.Phase;

// Öğeler = SourceItemProperty.Items; // Birkaç dizi değişkeninin bellekte aynı fiziksel diziye işaret edebilmesi için nasıl yapılır?
}
}

// element analizine dayalı bazı olayların yapısı
yapı EventProperty
{
intNumber;
tarihsaatDTm;
çift Değer;
stringType;

çift Seviye[];
int ağırlıklar[];

ItemsProperty ItemsProp[];

void operatörü = (const ItemProperty &SourceEventProperty)
{
Sayı = SourceEventProperty.Number;
DTm = SourceEventProperty.DTm;
Değer = SourceEventProperty.Value;
Tür = SourceEventProperty.Type;

// Düzeyler = SourceEventProperty.Levels; // buraya tak
// Ağırlıklar = SourceEventProperty.Weigths; // ehhh

// ItemsProp = SourceEventProperty.ItemsProp; // burada da sorunlar var

}
}

Dinamik bir olay dizisi ilan ediyorum:
EventPropertyMyEvents[];

Bazı işlevlerde olay dizisinin verilerini dolduruyorum.
void GetEventsProperty(EventProperty& MyEvents)
{
// kodu doldur
}

ve bir yerlerde MyEvents dizisinin öğelerini ekleyerek veya kaldırarak değiştirmeye ihtiyaç vardır.

int iNew = 2;
int i = ArraySize(MyEvents) - 2;
while(i>=iNew)
{
// MyEvents[i+1] = MyEvents[i]; // ve sonra dur
ben = ben - 1;
}

Bunu MT4'te bir dizi yapı ile yapmak mümkün müdür? Farklı referans değişkenlerinden bellekteki yapılar dizisinin aynı elemanına başvurmak, onları oluşturmak ve silmek gerekli olduğu ortaya çıktı.
Bir dizi yapı referansıyla çalışmak mümkün müdür?

 
GitSM :

Bunu MT4'te bir dizi yapı ile yapmak mümkün müdür? Farklı referans değişkenlerinden bellekteki yapılar dizisinin aynı elemanına başvurmak, onları oluşturmak ve silmek gerekli olduğu ortaya çıktı.

Bir dizi yapı referansıyla çalışmak mümkün müdür?

Teoride şöyle olmalı:

 struct ItemsProperty;
{
     double MinLow;
     double MaxHigh;
     double AvgRange;
     double AvgArea;
     string Phase;
    
    Item Items[];
    
     void operator = ( const ItemProperty &SourceItemsProperty)
    {
        MinLow = SourceItemsProperty.MinLow;
        MaxHigh = SourceItemsProperty.MaxHigh;
        AvgRange = SourceItemsProperty.AvgRange;
        AvgArea = SourceItemsProperty.AvgArea;
        Phase = SourceItemsProperty.Phase;
 
         int nTotal = ArraySize (SourceItemProperty.Items);
         ArrayResize (Items, nTotal);
         for ( int i = 0 ; i < nTotal; ++i)
           Items[i] = SourceItemProperty.Items[i];
    }
}

Ve diğer tüm dizilerle aynı. Soru:

Birkaç dizi değişkeninin bellekteki aynı fiziksel diziye işaret edebilmesi için nasıl yapılır?

anlamadı.

Not Kodu eklemek için "</>" simgesini veya Alt+S'yi kullanın.

 

Как сделать так чтобы на один и тот же физический массив в памяти могло указывать несколько переменных массива?

anlamadı.

Üzgünüm, sorumu doğru ifade edemedim. Doğru anlarsam, bir yapı dizisi esasen, her biri bellekteki bazı fiziksel adresleri işaret eden, veri yapısına göre belirli bir şekilde dağıtılan dizi dizinleri tarafından bir bağlantı adresidir. "Birden çok dizi değişkeninin bellekte aynı fiziksel diziye işaret etmesini nasıl mümkün hale getirebilirim?" örneğin MyEvents[2] ve MyEvents[5]'in bellekteki aynı yapıya işaret etme yeteneği anlamına geliyordu, yani MyEvents[2] ve MyEvents[5] iki özdeş yapıya işaret etmemelidir, ancak şunu göstermelidir tek ve aynı yapı.

Aynı operatörün aşırı yüklenmesi yapının bir kopyasını oluşturur. Veri yapıları çok ağır olabilir veya birçoğu olabilir ve bunları kopyalamaya gerek yoktur, ancak dizide veri yapısına adreslemenin bir indeksten diğerine atlaması yeterlidir. Bunun gibi bir şey *MyEvents[2] = *MyEvents[1]. Burada belki pointerları yanlış kullandım, o yüzden bu şekilde açıklayacağım. Adresi MyEvents[2]'ten almanız ve MyEvents[1]'den adresle değiştirmeniz gerekir.

Ve sonra, veri yapıları ne kadar karmaşık ve ağır olursa olsun, pratik olarak bilgi işlem kaynaklarının maliyeti olmadan, gerekli herhangi bir sırayla dizide "karıştırılabilir". Sonuçta, bir bellek adresini bir yerden diğerine kopyalamak çok daha kolaydır, büyüklük sıraları daha hızlıdır ve dizini değiştirmek için karmaşıklığı büyük ölçüde değişebilen yapıların tam bir kopyasını yapmaktan daha fazla bellek almanıza gerek yoktur. bu yapıya başvurulan dizi.

Распределенные вычисления в сети MQL5 Cloud Network
Распределенные вычисления в сети MQL5 Cloud Network
  • cloud.mql5.com
Большую часть времени современные компьютеры простаивают и не используют всех возможностей процессора. Мы предлагаем задействовать их с пользой. Вы можете сдавать мощности вашего компьютера другим участникам нашей сети для выполнения разнообразных...
 
Anladığım kadarıyla, bir dizideki yapılara referansları "karıştırmak" için böyle bir mekanizma uygulamak için bu yapıların sınıflar aracılığıyla uygulanması gerekecek.
Bu örneği denedim ve işe yarıyor gibi görünüyor. new aracılığıyla oluşturulan sınıf nesnelerinin silinmesini izlemenin yine de gerekli olacağını anlıyorum.
Değişkenlerin bildiriminde, bir test sınıfını ve dinamik bir işaretçi dizisini (anladığım kadarıyla, aslında aynı bağlantıları) sınıflara tanımladım:
 class MyClassTest
{
         public :
         int a;
         double b;
         string c;
};

MyClassTest* arrayRefsMyClassTest[];
Ve aşağıdaki kontrolleri yaptı:
 Print ( "Тест операций над массивом ссылок на классы: начало" );

// создаём объекты классов и сохраняем ссылки на них в массиве ссылок.
i = 0 ;
while ( i< 5 )
{
         ArrayResize (arrayRefsMyClassTest, i+ 1 );
        arrayRefsMyClassTest[i] = new MyClassTest();
        arrayRefsMyClassTest[i].a = i;
        arrayRefsMyClassTest[i].b = 3.14 +i;
        arrayRefsMyClassTest[i].c = "testclass" + i;
        i = i + 1 ;
}

i = 0 ;
while ( i< ArraySize (arrayRefsMyClassTest) ) { if ( CheckPointer (arrayRefsMyClassTest[i])!= POINTER_INVALID ) Print ( "arrayRefsMyClassTest[" + i + "]: a = " + arrayRefsMyClassTest[i].a, ", b = " + arrayRefsMyClassTest[i].b + ", c = " + arrayRefsMyClassTest[i].c); i = i + 1 ; }

Print ( "Изменяем размер массива ссылок на классы" );
ArrayResize (arrayRefsMyClassTest, ArraySize (arrayRefsMyClassTest)+ 2 );

i = 0 ;
while ( i< ArraySize (arrayRefsMyClassTest) ) { if ( CheckPointer (arrayRefsMyClassTest[i])!= POINTER_INVALID ) Print ( "arrayRefsMyClassTest[" + i + "]: a = " + arrayRefsMyClassTest[i].a, ", b = " + arrayRefsMyClassTest[i].b + ", c = " + arrayRefsMyClassTest[i].c); i = i + 1 ; }

Print ( "Присваиваю последнему элементу ссылку во втором элементе" );
i =   ArraySize (arrayRefsMyClassTest) - 1 ;
arrayRefsMyClassTest[i] = arrayRefsMyClassTest[ 2 ];

i = 0 ;
while ( i< ArraySize (arrayRefsMyClassTest) ) { if ( CheckPointer (arrayRefsMyClassTest[i])!= POINTER_INVALID ) Print ( "arrayRefsMyClassTest[" + i + "]: a = " + arrayRefsMyClassTest[i].a, ", b = " + arrayRefsMyClassTest[i].b + ", c = " + arrayRefsMyClassTest[i].c); i = i + 1 ; }

Print ( "Присваиваю 2 элементу ссылку в 5 элементе" );
arrayRefsMyClassTest[ 1 ] = arrayRefsMyClassTest[ 5 ];

i = 0 ;
while ( i< ArraySize (arrayRefsMyClassTest) ) { if ( CheckPointer (arrayRefsMyClassTest[i])!= POINTER_INVALID ) Print ( "arrayRefsMyClassTest[" + i + "]: a = " + arrayRefsMyClassTest[i].a, ", b = " + arrayRefsMyClassTest[i].b + ", c = " + arrayRefsMyClassTest[i].c); i = i + 1 ; }

Print ( "\nТест операций над массивом ссылок на классы: конец" );
Günlükte aşağıdaki sonuçları aldım:
Тест операций над массивом ссылок на классы: начало
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 0 ]: a = 0 , b = 3.14 , c = testclass0
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 1 ]: a = 1 , b = 4.14 , c = testclass1
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 2 ]: a = 2 , b = 5.14 , c = testclass2
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 3 ]: a = 3 , b = 6.14 , c = testclass3
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 4 ]: a = 4 , b = 7.14 , c = testclass4
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: Изменяем размер массива ссылок на классы
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 0 ]: a = 0 , b = 3.14 , c = testclass0
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 1 ]: a = 1 , b = 4.14 , c = testclass1
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 2 ]: a = 2 , b = 5.14 , c = testclass2
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 3 ]: a = 3 , b = 6.14 , c = testclass3
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 4 ]: a = 4 , b = 7.14 , c = testclass4
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: Присваиваю последнему элементу ссылку во втором элементе
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 0 ]: a = 0 , b = 3.14 , c = testclass0
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 1 ]: a = 1 , b = 4.14 , c = testclass1
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 2 ]: a = 2 , b = 5.14 , c = testclass2
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 3 ]: a = 3 , b = 6.14 , c = testclass3
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 4 ]: a = 4 , b = 7.14 , c = testclass4
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 6 ]: a = 2 , b = 5.14 , c = testclass2
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: Присваиваю 2 элементу ссылку в 5 элементе
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 0 ]: a = 0 , b = 3.14 , c = testclass0
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 1 ]: a = 4 , b = 7.14 , c = testclass4
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 2 ]: a = 2 , b = 5.14 , c = testclass2
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 3 ]: a = 3 , b = 6.14 , c = testclass3
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 4 ]: a = 4 , b = 7.14 , c = testclass4
0        21 : 59 : 14.658      2018.02 . 01 00 : 00 : 00   Tester3 EURUSD,M5: arrayRefsMyClassTest[ 6 ]: a = 2 , b = 5.14 , c = testclass2
Тест операций над массивом ссылок на классы: конец
Olması gerektiği gibi çalıştı gibi görünüyor. Bu durumda, anladığım kadarıyla verilerin ekstra kopyaları oluşturulmaz. Eğer yanılıyorsam lütfen beni düzeltin. Herhangi bir yorumunuz veya açıklamanız var mı?
 
MQL5'te (veya WinAPI kullanarak) bir grafiği tam ekrana nasıl genişletebilirim ???
 
GitSM :
Anladığım kadarıyla, bir dizideki yapılara referansları "karıştırmak" için böyle bir mekanizma uygulamak için bu yapıların sınıflar aracılığıyla uygulanması gerekecek.

Evet, maalesef MQL'deki yapılara işaretçi yapamazsınız. Sınıflarla mümkünse neden böyle bir kısıtlama yapıldığı belli değil. Sonuçta, yapılar sınıflardan çok farklı değil.

Neden: