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:
for ( int cc = 0 ; cc < OrdersTotal (); cc++)
{
if (! OrderSelect (cc, SELECT_BY_POS , MODE_TRADES ) ) continue ;
if ( OrderSymbol () != Symbol () ) continue ;
if ( OrderType () > 1 ) continue ; //--ignore pending trades
OpenTradecnt++; //--counts up for every live position of that symbol that existsPrint ( "count of the open trades of this symbol is: " , OpenTradecnt);
İ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:
for ( int cc = OrdersTotal () - 1 ; cc >= 0 ; cc--)
{
if (! OrderSelect (cc, SELECT_BY_POS , MODE_TRADES ) ) continue ;
if ( OrderSymbol () != Symbol () ) continue ;
if ( OrderType () > 1 ) continue ; //--ignore pending trades
OpenTradecnt++; //--counts up for every live position of that symbol that existsPrint ( "count of the open trades of this symbol is: " , OpenTradecnt);
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:
Konum
Bilet numarası
0
111
1
222
2
333
3
444
4
555
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:
Konum
Bilet numarası
0
222
1
333
2
444
3
555
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 emirbaşarıylasilinir ve kalan Emirleraşağıdaki gibi pozisyon değiştirir :
Konum
Bilet numarası
0
222
1
444
2
555
Döngü boyunca 3. çalıştırma:
şimdiPositionIndex'in değeri 2'dir, bu nedenle 2. pozisyondaki emir seçilir, bilet numarası 555,bu emirbaşarıylasilinir ve kalan Emirleraşağıdaki gibi pozisyon değiştirir :
Konum
Bilet numarası
0
222
1
444
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:
şimdiPositionIndex'in değeri 4'tür. OrderSelect(), 4. pozisyonda Sırayı seçmeye çalışır vebaş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.
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:
Konum
Bilet numarası
0
111
1
222
2
333
3
444
4
555
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:
Konum
Bilet numarası
0
111
1
222
2
333
3
444
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 emirbaşarıylasilinir ve kalan Emirleraşağıdaki gibi pozisyon değiştirir :
Konum
Bilet numarası
0
111
1
222
2
333
Döngü boyunca 3. çalıştırma:
şimdiPositionIndex'in değeri 2'dir, bu nedenle 2. pozisyondaki emir seçilir, 333 numaralı bilet,bu emirbaşarıylasilinir ve kalan Emirleraşağıdaki gibi pozisyon değiştirir :
Konum
Bilet numarası
0
111
1
222
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 emirbaşarıylasilinir ve kalan Emirleraşağıdaki gibi pozisyon değiştirir :
Konum
Bilet numarası
0
111
Döngü boyunca 5. ve son çalıştırma:
şimdiPositionIndex'in değeri 0böylece 0 pozisyonundaki emir seçilir, bilet numarası 111,bu emirbaşarıylasilinir, 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
Merhaba kodlayıcılar, Sipariş seçimi hakkında bu konuyu okudum. Aslında, işleri doğru yaptığına inandığım bir kodum var amaseçilen siparişinOpenPrice 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.
int MagicNo= 1234 ;
int Slippage= 10 ;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseOrdersBackward()
{
for ( int i= OrdersTotal ()- 1 ; i>= 0 && !IsStopped() ; i--)
{
if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
{
Print ( "Order Select failed, order index: " ,i, " Error: " , GetLastError ());
continue ;
}
if (OrderSymbol()== Symbol () && OrderMagicNumber()==MagicNo && OrderType()<=OP_SELL)
{
if (!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage))
Print ( "Order Close failed, order ticket: " ,OrderTicket(), " Error: " , GetLastError ());
}
}
}
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)
int MagicNo= 1234 ;
int Slippage= 10 ;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseOrdersForward()
{
for ( int i= 0 ; i< OrdersTotal () && !IsStopped(); i++)
{
if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
{
Print ( "Order Select failed, order index: " ,i, " Error: " , GetLastError ());
continue ;
}
if (OrderSymbol()== Symbol () && OrderMagicNumber()==MagicNo && OrderType()<=OP_SELL)
{
if (OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage))
{
i--;
}
else
{
Print ( "Order Close failed, order ticket: " ,OrderTicket(), " Error: " , GetLastError ());
}
}
}
}
İleri döngüde,
OrderTotal() işlevi, dizinin dizi aralığı dışında kalmasını önlemek için her döngü yinelemesinde kalan açık sipariş sayısını güncellemek için for döngüsü içinde kullanılır.
Bazı siparişlerin atlanmasını önlemek için i endeksi, kapatılan her siparişle birlikte azaltılır.
amrali : Bazı emirleri atlamamak için i indeksi kapanan her emirle birlikte düşürülür.
Mevcut işlemin (kapanış, silme, değiştirme) tamamlanmasını beklerken birden fazla emrin (bir EA çoklu grafik, birden fazla EA, manuel ticaret) varlığında, diğer emirlerde herhangi bir sayıda başka işlem aynı anda gerçekleşmiş olabilir ve konum indekslemeyi değiştirdi:
ve (potansiyel olarak) birden fazla siparişi işlerseniz, bir sonraki sipariş / sunucu çağrısında, Ön Tanımlı Değişkenleri ( Bid/Ask ) veya (yönden bağımsız olun ve kullanın) kullanmak istiyorsanız, sunucu çağrılarından sonra RefreshRates() öğesini çağırmalısınız . OrderClosePrice( ) .
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.
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.