Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 137
Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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ü?
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:
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:
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
// ItemsProp = SourceEventProperty.ItemsProp; // burada da sorunlar var// Ağırlıklar = SourceEventProperty.Weigths; // ehhh
}
}
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?
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ı:
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.
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:
Ve aşağıdaki kontrolleri yaptı:
Günlükte aşağıdaki sonuçları aldım:
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ı?
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.