MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 614
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
Eh, kritik hatalar göstermedin.
İşlev nasıl çalışır, kendinize cevap verdiniz:
Test cihazında normal. Bu aslında böyle oluyor.
Peki, bu durumda, kodla ilgilenmeniz, tüm değerleri yazdırmanız ( Print (...) ) ve hatanın nereden geldiğini görmeniz gerekir.
Test cihazında normal. Bu aslında böyle oluyor.
Sana cevap verdiler:
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
MQL4, yardım ve algoritmalar ve kodlar hakkında herhangi bir acemi sorusu
Alexey Viktorov , 2018.09.06 21:00
Düşünülmesi gereken yön: Kar sıfırdan küçükse... sıralama sırasında dizi ne boyutta olacak???
Ve hiç sipariş olmazsa dizinin boyutu ne olacak???Tünaydın! Expert Advisor'a roly-poly denir, ancak planlandığı gibi çalışmaz. lot kırmızıda kapanırsa ikiye katlanır, ancak müteakip TP kapanışı nedense daha önce kapatılan eksi işlemlerin geri dönüşüne izin vermez. Bana neyin yanlış olduğunu söyle, çözemiyorum. Cevap veren herkese şimdiden teşekkürler.
Bu işlevin tam olarak ne yaptığını gerçekten anlamıyorum. Ancak yazarın dediği gibi, görev, semboller arasında kârlı olmayan siparişleri kârlı olanlarla kapatmaktır. işlevi düzeltmeme ve anlamama yardım ederseniz sevinirim
Siz anlamıyorsunuz ve ben de bu fonksiyonun ne yaptığını anlamak istemiyorum. Onu kullanmak için. Onu kendin için seçtin. Ne için olduğunu anlamadan bir şeyi nasıl kullanabilirsin?
Ben sadece hatanın nerede, hangi nedenle oluştuğunu söyledim.
Bir açıklama daha:
1. Bir dizi bildirildi. Kodda yeşil renkle vurgulanmıştır. Birinci boyutta sıfır uzunluk olduğu sürece. Maviyle vurgulanan satırın nedeni açık değil. Dizinin boyutunu sıfırlarsanız, bunun için ArrayFree() vardır.Fakat yeni bildirilen dinamik dizi sıfır uzunluğa sahip olduğundan bu işlev bile işe yaramaz.
2. Herhangi bir emir yoksa, kırmızı ile vurgulanan kod yürütülmeyecektir. Buna göre, dizinin boyutu sıfır kalacaktır.
3. Dizinin sıralaması her tik üzerinde sağlanır. Bu, koddan kaynaklanmaktadır... Ve boş bir cepte ne sıralanabilir??? 2 bıldırcın yumurtası mı...
Ve işte hatanın metni ... Peki, ne diyebilirim? Geliştiriciler, birinin boş bir diziyi sıralamaya çalışabileceğini öngörmedi. Bunun için özel bir mesaj yok.
Siz anlamıyorsunuz ve ben de bu fonksiyonun ne yaptığını anlamak istemiyorum. Onu kullanmak için. Onu kendin için seçtin. Ne için olduğunu anlamadan bir şeyi nasıl kullanabilirsin?
Ben sadece hatanın nerede, hangi nedenle oluştuğunu söyledim.
Bir açıklama daha:
1. Bir dizi bildirildi. Kodda yeşil renkle vurgulanmıştır. Birinci boyutta sıfır uzunluk olduğu sürece. Maviyle vurgulanan satırın nedeni açık değil. Dizinin boyutunu sıfırlarsanız, bunun için ArrayFree() vardır.Fakat yeni bildirilen dinamik dizi sıfır uzunluğa sahip olduğundan bu işlev bile işe yaramaz.
2. Herhangi bir emir yoksa, kırmızı ile vurgulanan kod yürütülmeyecektir. Buna göre, dizinin boyutu sıfır kalacaktır.
3. Dizinin sıralaması her tik üzerinde sağlanır. Bu, koddan kaynaklanmaktadır... Ve boş bir cepte ne sıralanabilir??? 2 bıldırcın yumurtası mı...
Ve işte hatanın metni ... Peki, ne diyebilirim? Geliştiriciler, birinin boş bir diziyi sıralamaya çalışabileceğini öngörmedi. Bunun için özel bir mesaj yok.
Alexis doğru değil. ArrayFree(), bu diziye artık ihtiyaç duyulmadığında bir diziden bellek boşaltmak için kullanılır, ki bu çok nadiren gereklidir ve bu durumda kesinlikle gerekli değildir.
Bir diziyi sıfırlamak için ZeroMemory(a), ArrayInitialize(a,xxx) kullanmanız ve ilk boyuttaki boyutu ArrayResize(a,xxx) değiştirmeniz gerekir.
Ancak, bu değişiklik muhakemenizin gidişatını etkilemez - bunlar doğrudur.
Alexis doğru değil. ArrayFree(), bu diziye artık ihtiyaç duyulmadığında bir diziden bellek boşaltmak için kullanılır, ki bu çok nadiren gereklidir ve bu durumda kesinlikle gerekli değildir.
Bir diziyi sıfırlamak için ZeroMemory(a), ArrayInitialize(a,xxx) kullanmanız ve ilk boyuttaki boyutu ArrayResize(a,xxx) değiştirmeniz gerekir.
Ancak, bu değişiklik muhakemenizin gidişatını etkilemez - bunlar doğrudur.
belgelere göre
Dizi Ücretsiz
Herhangi bir dinamik dizinin arabelleğini serbest bırakır ve boş boyutun boyutunu 0 olarak ayarlar.
belgelere göre
Belki kendimi yeterince iyi ifade edemedim ve sen beni yanlış anladın.Ve daha sonra:
Not
Komut dosyaları ve göstergeler yazarken, ArrayFree() işlevini kullanma ihtiyacı genellikle ortaya çıkmayabilir: komut dosyası sona erdiğinde, kullanılan tüm bellek hemen serbest bırakılır ve özel göstergelerde, dizilerle yapılan ana çalışma, gösterge arabelleklerine erişimdir, boyutları, yürütme terminali alt sistemi tarafından otomatik olarak kontrol edilir.
Programın karmaşık dinamik koşullarda belleği bağımsız olarak yönetmesi gerekiyorsa, ArrayFree() işlevi, zaten gereksiz olan bir dinamik dizi tarafından işgal edilen belleği açıkça ve hemen serbest bırakmanıza olanak tanır.
Herhangi bir dinamik dizinin arabelleğini serbest bırakır ve boş boyutun boyutunu 0 olarak ayarlar
Anlamak? İkinci bölümü okudunuz, ancak ilk önemli bölümü kaçırdınız mı? Dizi için ayrılan belleği serbest bırakır. Hepsi bu ... hayır ... Dizi için ayrılan bellek alanı serbest bırakılır ve daha sonra başka veriler tarafından işgal edilebilir. Bu dizi altındaki belleği yeniden tahsis etmek için işlevdeki bir girişte her seferinde ne olur? Sonuçta, onu serbest bırakmayı teklif ediyorsun. Ve yalnızca boyutu değiştirmeniz gerekir - ArrayResize() veya diziyi sıfırlamanız - ArrayInitialize(), ZeroMemory(). Bu durumda, dizi için bellek alanı serbest bırakılmayacak ve program bitene kadar bu dizi için ayrılmış olarak kalacaktır.
Ve daha sonra:
Not
Komut dosyaları ve göstergeler yazarken, ArrayFree() işlevini kullanma ihtiyacı genellikle ortaya çıkmayabilir: komut dosyası sona erdiğinde, kullanılan tüm bellek hemen serbest bırakılır ve özel göstergelerde, dizilerle yapılan ana çalışma, gösterge arabelleklerine erişimdir, boyutları, yürütme terminali alt sistemi tarafından otomatik olarak kontrol edilir.
Programın karmaşık dinamik koşullarda belleği bağımsız olarak yönetmesi gerekiyorsa, ArrayFree() işlevi, zaten gereksiz olan bir dinamik dizi tarafından işgal edilen belleği açıkça ve hemen serbest bırakmanıza olanak tanır.
Herhangi bir dinamik dizinin arabelleğini serbest bırakır ve boş boyutun boyutunu 0 olarak ayarlar
Anlamak? İkinci bölümü okudunuz, ancak ilk önemli bölümü kaçırdınız mı? Dizi için ayrılan belleği serbest bırakır. Hepsi bu ... hayır ... Dizi için ayrılan bellek alanı serbest bırakılır ve daha sonra başka veriler tarafından işgal edilebilir. Bu dizi altındaki belleği yeniden tahsis etmek için işlevdeki bir girişte her seferinde ne olur? Sonuçta, onu serbest bırakmayı teklif ediyorsun. Ve yalnızca boyutu değiştirmeniz gerekir - ArrayResize() veya diziyi sıfırlamanız - ArrayInitialize(), ZeroMemory(). Bu durumda, dizi için bellek alanı serbest bırakılmayacak ve program bitene kadar bu dizi için ayrılmış olarak kalacaktır.
Peki, peki... Ve eğer işleve yapılan her çağrıda veya en olası olmayanı, her onayda yerel bir dizi bildirilirse... dizi için bellek her dizi bildiriminde tahsis edilir. Değil mi? Ve hafızayı boşaltmak ya da boşaltmamak ne fark eder, ama her seferinde hafızayı yeniden tahsis etmek ...
Ana mesaj, bunu yapmanız gerekmediğiydi... ve yaparsanız, bunu ArrayFree() ile yapmak daha iyidir.
İlginç olan şudur: Bir işlev her çağrıldığında yerel bir dizi bildirilirse, her seferinde bunun için bellek ayrılır. Ve böylece hangi adresler kullanılıyor??? Dizinin ilk bildirimiyle aynı, yoksa ne olacak?
Tünaydın! Expert Advisor'a roly-poly denir, ancak planlandığı gibi çalışmaz. lot kırmızıda kapanırsa ikiye katlanır, ancak müteakip TP kapanışı bir nedenden dolayı daha önce kapatılan negatif işlemlerin geri dönüşüne izin vermez. Bana neyin yanlış olduğunu söyle, çözemiyorum. Cevap veren herkese şimdiden teşekkürler.
İlk parti boyutundan daha önce ikiye katlamayı kontrol etmeye çalışın. Kapanış saatlerine bakın.