basit soru

 

Hepinize selamlar. Piyasa emirlerini kapatmak için (diğer kodları değiştirerek) bir kod oluşturdum.



int l_pos_44 = 0;

if (Önce Kontrol OP(OP_BUY) > 1) {

for (l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {

OrderSelect(l_pos_44, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) devam ediyor;

çift Fiyat = OrderOpenPrice();

if (NormalizeDouble(MathAbs(Teklif - Fiyat), Digits) < NormalizeDouble(Dist, Digits)) {

Dist = MathAbs(Teklif - Fiyat);

int Bilet = OrderTicket();

çift Parti = OrderLots();

OrderClose(Ticket, Lot, Bid, 3);

}

}


(satış pozisyonlarını kapatmak için aynı kod (tabii ki OP_BUY yerine OP_SELL değişkeni ile))


int CheckFirstOP(int a_cmd_0) {

int l_count_4 = 0;

for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {

if (OrderSelect(l_pos_8, SELECT_BY_POS)) {

if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {

if (OrderType() == a_cmd_0) {

l_count_4++;

kırmak;

}

}

}

}

dönüş (l_count_4);

}


Tip için 1'den fazla açık pozisyon olduğunda uzun veya kısa pozisyonları kapatmak için bir koda ihtiyacım var...böylece toplamda 2 pozisyon tutmak için (1 alış ve 1 satış)...Ayrıca en son açılan pozisyonu tutmam gerekiyor. yani bu durumda alış pozisyonu için daha yüksek açık fiyatı olan ve satış pozisyonu için daha düşük olan açık fiyatı olan. Sorun şu ki, kod pozisyonları kapatmıyor...hiçbirini kapatmıyor.


ne zaman: "if (CheckFirstOP(OP_BUY) == 1)" ise kod, açıldıktan hemen sonra ilk pozisyonları kapatır...yani bir alış ve satış emri açıldıktan sonra bir sonraki tik ile kapatılır. Ve ne zaman: "if (CheckFirstOP(OP_BUY) > 1)" pozisyonların hiçbiri kapalı değildir. Neyi yanlış yaptığımı bilmiyorum.

Lütfen birisi bana yardım edebilir mi?

 

I forgot:


çift Dist = 1000000.0;

 
Aljohin :

Lütfen birisi bana yardım edebilir mi?

1. Bu, kodunuzun yalnızca bir parçasıdır, örneğin bize CheckFirstOP() işlevini gösterin.

2. For döngüsü artıyor. Döngüdeki siparişleri kapatırsanız bu düzgün çalışmayacaktır, lütfen bkz. -> https://www.mql5.com/en/forum/119840 .

3. Değişken adlandırma kuralınız... o kadar iyi değil.

4. Lütfen kodunuzu göndermek için SRC düğmesini kullanın, böylece biçimlendirmeyi koruyacaktır. Kodunuzu bu şekilde okumak çok zor.

 
gordon :

1. Bu, kodunuzun yalnızca bir parçasıdır, örneğin bize CheckFirstOP() işlevini gösterin.

2. For döngüsü artıyor. Döngüdeki siparişleri kapatırsanız bu düzgün çalışmayacaktır, lütfen bkz. -> https://www.mql5.com/en/forum/119840 .

3. Değişken adlandırma kuralınız... o kadar iyi değil.

4. Lütfen kodunuzu göndermek için SRC düğmesini kullanın, böylece biçimlendirmeyi koruyacaktır. Kodunuzu bu şekilde okumak çok zor.


 double Dist = 1000000.0 ;
if ( CheckFirstOP ( OP_BUY ) > 1 ) {
       for ( l_pos_44 = 0 ; l_pos_44 < OrdersTotal ( ) ; l_pos_44 + + ) {
           OrderSelect ( l_pos_44 , SELECT_BY_POS , MODE_TRADES ) ;
           if ( OrderSymbol ( ) ! = Symbol ( ) | | OrderMagicNumber ( ) ! = MagicNumber | | OrderType ( ) ! = OP_BUY ) continue ;      
           double Price = OrderOpenPrice ( ) ;
           if ( NormalizeDouble ( MathAbs ( Bid - Price ) , Digits ) > NormalizeDouble ( Dist , Digits ) ) {               
             Dist = MathAbs ( Bid - Price ) ;                  
             int Ticket = OrderTicket ( ) ;            
             double Lot = OrderLots ( ) ;                           
             OrderClose ( Ticket , Lot , OrderClosePrice ( ) , 3 ) ; 
         }     
       }    
   }

int CheckFirstOP ( int a_cmd_0 ) {
   int l_count_4 = 0 ;
   for ( int l_pos_8 = 0 ; l_pos_8 < OrdersTotal ( ) ; l_pos_8 + + ) {
       if ( OrderSelect ( l_pos_8 , SELECT_BY_POS ) ) {
         if ( OrderMagicNumber ( ) = = MagicNumber & & OrderSymbol ( ) = = Symbol ( ) ) {
             if ( OrderType ( ) = = a_cmd_0 ) {
               l_count_4 + + ;
               break ;
             }
         }
       }
   }
   return ( l_count_4 ) ;
} 
my fault...i'm very new to this stuf...
 
gordon :

3. Değişken adlandırma kuralınız... o kadar iyi değil.

bir kod çözücü isim kuralına benziyor ...

"o bu işlerde yeni"

 
meikel :

bir kod çözücü isim kuralına benziyor ...

"o bu işlerde yeni"

muhtemelen evet...Satın aldığım bir EA'yı değiştirmek istiyorum...bana kodu da gönderdiler (yanlışlıkla söylediler)...şimdi bu garip adlandırmanın nedenini anlıyorum...dediğim gibi' Yeniyim (bu sitedeki MQL4 kitabını yeni okudum) ve en azından başlangıçta pek çok şeyi değiştirmek istemedim, bu yüzden isimleri bulduğum gibi verdim.

 
Ais

Merhaba

Seçilen sipariş şu ifade ile tamamen kapatılabilir: " OrderClose ( OrderTicket() , OrderLots() , OrderClosePrice() , 0 ) ;"

Saygılarımla

sorunumu çözmüyor...

 
gordon :

2. For döngüsü artıyor. Döngüdeki siparişleri kapatırsanız bu düzgün çalışmayacaktır, lütfen bkz. -> https://www.mql5.com/en/forum/119840 .

neden artırma çalışmıyor? MQL4 kitabında bundan bahsedilmiyor (sanırım)... Neyse denedim:


 if ( CheckFirstOP ( OP_BUY ) > 1 ) {
       for ( int i = OrdersTotal ( ) - 1 ; i > = 0 ; i - - ) {
           OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ;
           if ( OrderSymbol ( ) ! = Symbol ( ) | | OrderMagicNumber ( ) ! = MagicNumber | | OrderType ( ) ! = OP_BUY ) continue ;      
           double Price = OrderOpenPrice ( ) ;
           if ( NormalizeDouble ( MathAbs ( Bid - Price ) , Digits ) > NormalizeDouble ( Dist , Digits ) ) {               
             Dist = MathAbs ( Bid - Price ) ;                  
             int Ticket = OrderTicket ( ) ;            
             double Lot = OrderLots ( ) ;                           
             OrderClose ( Ticket , Lot , OrderClosePrice ( ) , 3 ) ; 
         }     
       }    
   } 
it doesn't work, don't know why
 
Ais

sadece şimdi bu satırda emin ol

Evet tabi denedim ve hiçbir şey değişmiyor... Bu programlama ile garip şeyler :) Basit bir kapanış emri yazmak zor olmaz diye düşündüm...

 
it doesn't work, don't know why
Emir indeksi 5'i kapattığınızda, emir indeksi 6 indeks 5 olur, 7 6 olur, vb. Saydıkça, diğer tüm açık emirleri kaçırırsınız.
 
WHRoeder :
Emir indeksi 5'i kapattığınızda, emir indeksi 6 indeks 5 olur, 7 6 olur, vb. Saydıkça, diğer tüm açık emirleri kaçırırsınız.

ah tamam, anlaşıldı... neyse kod sadece bir açık emir tutmak ve 2 emir açıldığında hemen çalışmaya başlamak ve hepsini seçip analiz ettikten sonra birini kapatmak (yani 2 emir)... yani Sıra seçimi yaparken arttırmanın büyük bir hata olduğunu düşünmüyorum... Neyse azaltma yöntemini denedim sonuç alamadım...belki yanlış bir şekilde deniyorum...bilmiyorum...olabilir mi? biri benim kodumu deneyin ve işlemleri gerçekten kapatıp kapatmadığını görün... veya herhangi biri bir önceki açılan emri seçmek ve kapatmak için basit bir kod yazabilir mi (yani alım için daha yüksek ve satış için daha düşük açılış fiyatı olan)?

teşekkür ederim

Neden: