Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım 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
Lütfen kodunuzu eklemek için </> düğmesini kullanın.
Özür dilerim... İşte uygun formatta..
OrdersTotal() doğru değil...
OrdersTotal() kullanan ve doğru sonuçlar vermeyen (iki farklı broker ile gözlemlenen) kod dizisini döngüye sokarak şaşırdım.
WINE 3.0 çalıştıran bir Linux Ubuntu-MATE 16.04 masaüstünde MT4 sürüm 1090 kullanıyorum
İşte kullandığım şey ...
İşte burada:
İki farklı komisyoncuyla, OrdersTotal() değerinin MT4 komisyoncusunun 'Ticaret' sekmesinde gösterilenle her zaman uyuşmadığını fark ettim. Başlangıçta, OrdersTotal() işlevinin düzgün çalışmamasına neden olanın aracı olduğunu düşündüm. 2. aracıda fark ettiğimde, MT4'ün dahili bir 'sorunu' olup olmadığını veya kodumun yanlış olup olmadığını VEYA bunun MT4'ün sunucuyla düzgün bir şekilde senkronize edilmesiyle ilgili bir sorun olup olmadığını merak etmeye başladım....?
Bu forum ileti dizisini okuduktan sonra, for..loop'u şu şekilde değiştirerek daha iyi sonuçlar elde edip edemeyeceğimi merak ediyorum:
VEYA, OnTick() olayı sırasında OrdersTotal() öğesinin düzgün bir şekilde senkronize edilmesini sağlayacak bir bayrak veya kod satırı var mı?Bununla ilgili herhangi bir açıklama çok yardımcı olacaktır ve çok takdir edilecektir!
Bu, muhtemelen kısmen Expert Advisor Builder gibi çöplerden dolayı gördüğüm en yaygın hatalardan biri. Bu yüzden, ileride başvurmak üzere bağlantı kurulabilmesi için konuya adanmış bir iş parçacığının zamanının geldiğini düşündüm.
Sorun
Basit bir örnek verelim; EA'mız için tüm açık siparişleri kapatacak bir işlev istiyoruz, birçok örnek var ama hadi sıfırdan bir tane oluşturalım.
Bir döngüye ihtiyacımız var çünkü belirli bir EA için tüm siparişlerimizi kapatmak istiyoruz, bu döngü içinde siparişi seçmek için kodumuz, doğru sembol ve sihirli sayı olduğunu kontrol etmek için kodumuz ve son olarak siparişi kapatmak için kodumuz olacak:
Bu kod kötü. . . KULLANMAYIN . . . Nedenini bir sonraki bölümde açıklayacağım. . .
Açıklama
Yukarıdaki kod üzerinde çalışalım. . . satır satır, Siparişe Göre Sırala. . .
Kapatmak istediğimiz aşağıdaki Emirlere sahip olduğumuzu varsayalım, hepsinin EA'mız ile aynı sihirli sayı ve Sembolü var, bu yüzden kodumuzun hepsini kapatmasını istiyoruz:
1. döngü boyunca çalıştırın:
PositionIndex'in başlangıç değeri 0'dır, bu nedenle 0 pozisyonundaki emir seçilir, bilet numarası 111, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir:
2. döngü boyunca çalıştırın:
şimdi PositionIndex'in değeri 1'dir, bu nedenle 1. pozisyondaki emir seçilir, 333 numaralı bilet, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :
Döngü boyunca 3. çalıştırma:
şimdi PositionIndex'in değeri 2'dir, bu nedenle 2. pozisyondaki emir seçilir, bilet numarası 555, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :
4. döngü boyunca çalıştırın:
şimdi PositionIndex'in değeri 3'tür. OrderSelect(), 3. pozisyonda Sırayı seçmeye çalışır ve başarısız olur , devam, kodun yürütülmesini döngüdeki bir sonraki değere götürür. .
Döngü boyunca 5. ve son çalıştırma:
şimdi PositionIndex'in değeri 4'tür. OrderSelect(), 4. pozisyonda Sırayı seçmeye çalışır ve başarısız olursa , devam, kodun yürütülmesini döngüdeki bir sonraki değere götürür. . . döngü bitti.
Şimdi 2 Sipariş, 222 ve 444 numaralı biletler ile kapatılmış olması gereken ancak kapatılmayan kaldı. . . sonraki, bu sorunun nasıl çözüleceği.
Çözüm
Açık emirleri kapatırken veya bekleyen emirleri silerken aşağıdaki kod doğru yaklaşımdır. . .
Temel fark, döngünün ( TotalNumberOfOrders - 1 ) değerinden 0'a düşmesidir.
Bir kez daha yukarıdaki kod üzerinde çalışalım. . . satır satır, Siparişe Göre Sırala. . .
Daha önce olduğu gibi aynı siparişlere sahibiz:
1. döngü boyunca çalıştırın:
PositionIndex'in başlangıç değeri TotalNumberOfOrders - 1'dir ve bu 5 - 1 = 4'e eşittir, bu nedenle 4. pozisyondaki emir seçilir, bilet numarası 555, bu emir başarıyla silinir ve kalan Emirler pozisyonu aşağıdaki gibi değiştirir:
2. döngü boyunca çalıştırın:
şimdi PositionIndex'in değeri 3'tür, bu nedenle 3. pozisyondaki emir seçilir, 444 numaralı bilet, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :
Döngü boyunca 3. çalıştırma:
şimdi PositionIndex'in değeri 2'dir, bu nedenle 2. pozisyondaki emir seçilir, 333 numaralı bilet, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :
4. döngü boyunca çalıştırın:
şimdi PositionIndex'in değeri 1'dir , dolayısıyla 1 numaralı pozisyondaki emir seçilir, 222 numaralı bilet, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :
Döngü boyunca 5. ve son çalıştırma:
şimdi PositionIndex'in değeri 0 böylece 0 pozisyonundaki emir seçilir, bilet numarası 111, bu emir başarıyla silinir, 0 değeri döngü için geçerli olan son değerdir . . . döngü bitti.
Tüm eşleşen siparişlerimizi başarıyla sildik. . .
Bu konuya bağlantı: Döngüler ve Emirleri Kapatma veya Silme
Sipariş seçimi hakkında bu konuyu okudum. Aslında, işleri doğru yaptığına inandığım bir kodum var amaseçilen siparişin OpenPrice değerini okuyamadığım için seçim benim için çalışmıyor . Diğer her şey iyi çalışıyor, sağlanan kodun sadece bu kısmı. Neden olduğundan emin değilim.
Kodun tamamında, sipariş gönderildikten hemen sonra OrderOpenPrice'ı çağırmam gereken 4 bölüm var... OrderSend iyi çalışıyor, OrderSelect bana ihtiyacım olan sonuçları almayacak. Yardım edebilecekseniz kodun 1 bölümüne bakın.
Teşekkür ederim.
if (Protection_Step_One== 1 ) { while (Protective_Order< 0 ) { RefreshRates (); Protective_Order= OrderSend ( Symbol (), OP_SELL ,Protective_Lots, NormalizeDouble ( MarketInfo ( Symbol (), MODE_BID ), MarketInfo ( Symbol (), MODE_DIGITS )), 3 , 0 , 0 , "Intermediary" ,MN_Sell_Intermediary_Protection, 0 ,Cyan); } //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Addition for Clamp for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) { if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true ) { if ( OrderMagicNumber ()==MN_Sell_Intermediary_Protection) { RefreshRates (); Intermediary_OpenPrice_Sell= OrderOpenPrice (); } } } //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.. if (Protective_Order!=- 1 ) { Protection_Step_One= 0 ; RealTime_Drawing= 2 ; Protective_Mode_Activated= 1 ; Protective_Order=- 2 ; Defcon= 2 ;
Teşekkürler sevgili Simon Gniadkowski,
Yazınız gerçekten zamanımı kurtardı.
Piyasa emirlerini kapatmak için önerdiğim kod bu
Ve şunu öneriyorum, eğer bir for for döngüsü kullanılıyorsa doğru yol budur (ABD brokerlerinin FIFO Kurallarına uymak için)
İleri döngüde,
Döngüler ve Siparişleri Kapatma veya Silme - MQL4 programlama forumu
FIFO (ABD brokerleri) ve sizin (potansiyel olarak) sembol başına birden fazla sipariş işlemeniz için, en erken siparişi bulmanız, kapatmanız ve başarılı bir işlemde kalan tüm pozisyonları yeniden işlemeniz gerekir .
CloseOrders by FIFO Rules - Strategy Tester - MQL4 programlama forumu - Sayfa 2 #16
İşlev dönüş değerleri nelerdir? Onları nasıl kullanırım? - MQL4 programlama forumu
MQL4 Programlarında Sık Karşılaşılan Hatalar ve Bunların Önlenmesi - MQL4 Makaleleri
Bunun bana ne kadar yardımcı olduğunu anlayacaksın. Sadece üzerinde çalıştığım kodla değil, tamamen anlayışımla. Şimdi mükemmel çalışıyor ve bunu farklı şekillerde uygulama anlayışına sahibim.
Bu bilgiyi gerçekten takdir ediyorum.