Uzman Danışmanların uygulanmasının tartışılması. - sayfa 2

 
Georgiy Merts :

Nasıl çalıştığını ANLAMADIM. Ayrıca, bu forum üyesi kendisine sorulduğunda artık hatırlamadığını, sadece bu kodun zaten birçok kez test edildiğini ve kendisine güvenilebileceğini söyledi.

Pekala ... Bu aptal "soruları" normal if ifadeleriyle değiştirmeyi başarırsam, nasıl ve ne olduğunu çözeceğim ... Şimdiye kadar - yani ...

Bu arada, bugün bu dehşetin analizini yaptım.

İşte ne anlama geldiği:

 ENUM_ORDER_TYPE_FILLING otfMyRes  = WRONG_VALUE ;   

if (iFillingMode == 0 || (otfFilingType >= ORDER_FILLING_RETURN ) || ((iFillingMode & (otfFilingType + 1 )) != otfFilingType + 1 ))
	{
         if (steExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE || steExeMode == SYMBOL_TRADE_EXECUTION_INSTANT )
                otfMyRes = ORDER_FILLING_RETURN ;
         else    
                 if (iFillingMode == SYMBOL_FILLING_IOC )
                        otfMyRes = ORDER_FILLING_IOC ;
                 else
                        otfMyRes = ORDER_FILLING_FOK ;
        }
   else       
        otfMyRes = otfFilingType;

return(otfMyRes);  

Benim düşünceme göre, bu "sorular" olmadan, if'ler ve girintilerle - çok daha anlaşılır. Bununla birlikte, kodun verimliliği tamamen aynıdır.

Bu arada, yazarın bence iyi bir uygulama olmayan iFillingMode ve otfFilingType'ın sayısal değerlerine takılıp kaldığı hemen belli oluyor.

 
Georgiy Merts :

Bu arada, bugün bu dehşetin analizini yaptım.

İşte ne anlama geldiği:

Benim düşünceme göre, bu "sorular" olmadan, if'ler ve girintilerle - çok daha anlaşılır. Bununla birlikte, kodun verimliliği tamamen aynıdır.

Bu arada, yazarın bence iyi bir uygulama olmayan iFillingMode ve otfFilingType'ın sayısal değerlerine takılıp kaldığı hemen belli oluyor.

Benim lib'imde şöyle:

 #ifdef __MQL5__
   ENUM_ORDER_TYPE_FILLING COrder::GetFilling(ENUM_FILLING_MODE mFilling){
       if (!_fillingMode) return ORDER_FILLING_RETURN ;
       else if (mFilling==FILLING_AUTO||mFilling==FILLING_FOK) return !(_fillingMode& SYMBOL_FILLING_FOK )? ORDER_FILLING_IOC : ORDER_FILLING_FOK ;
       else return   !(_fillingMode& SYMBOL_FILLING_IOC )? ORDER_FILLING_FOK : ORDER_FILLING_IOC ;}
#endif

_fillingMode, bu alanın referansını kaldırmak için genişleyen bir makrodur

fillingMode=( int ) SymbolInfoInteger (symbol, SYMBOL_FILLING_MODE );
 
Georgiy Merts :

Yani bu başka bir konu.

Tahmin, bazen kendi koduma bakıyorum ve neden burada bu şekilde yazıldığını anlamıyorum. Bu nedenle bu tür yerleri çok detaylı bir şekilde yorumlamaya, tüm inceliklerinden bahsetmeye çalışıyorum. Aynı zamanda, her neyse, düzenli olarak bazı noktaları dikkate almadığımı görüyorum.

Ayrıca - Çok yetkili bir forum üyesi tarafından yazılan aşağıdaki kodu (yürütme türünü belirlemek için) kullanıyorum:

Nasıl çalıştığını ANLAMADIM. Ayrıca, bu forum üyesi kendisine sorulduğunda, artık hatırlamadığını, sadece bu kodun zaten birçok kez test edildiğini ve güvenilir olabileceğini söyledi .

Pekala ... Bu aptal "soruları" normal if ifadeleriyle değiştirmeyi başarırsam, nasıl ve ne olduğunu çözeceğim ... Şimdiye kadar - yani ...

Sarı - Bir kişinin kendisinin yazdığı önemsiz kodu hemen anlayamaması çok garip.

Kırmızı - Çok tembel değildim ve tekrar kontrol ettim, piyasada yürütürken ORDER_FILLING_RETURN yapamazsınız , bu sadece borsa ile (rıhtımlarda bir hata var) ve bu tam olarak saygın forum üyesinin geri döneceği şey )))

 
Vladimir Simakov :

Sarı - Bir kişinin kendisinin yazdığı önemsiz kodu hemen anlayamaması çok garip.

Kırmızı - Çok tembel değildim ve tekrar kontrol ettim, piyasada yürütürken ORDER_FILLING_RETURN yapamazsınız , bu sadece borsa ile (rıhtımlarda bir hata var) ve bu tam olarak saygın forum üyesinin geri döneceği şey )))

Bilmiyorum. bu kod böyle bir kayıtta "önemsiz" olduğu sürece. Çalışmasının mantığını anlamam en az 15 dakikamı aldı ve ancak if'leri planladıktan sonra benim için netleşti.

Ve "rıhtımlarda bir hata" hakkında - daha ayrıntılı olarak mümkün mü?

 
Georgiy Merts :

Bilmiyorum. bu kod böyle bir kayıtta "önemsiz" olduğu sürece. Çalışmasının mantığını anlamam en az 15 dakikamı aldı ve ancak if'leri planladıktan sonra benim için netleşti.

Ve "rıhtımlarda bir hata" hakkında - daha ayrıntılı olarak mümkün mü?

Değişim yürütme ile

 SymbolInfoInteger (symbol, SYMBOL_FILLING_MODE )

0 döndürür, ancak piyasa ile (Alpari'de test edilmiştir)

 SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK

, 0x3'e eşittir. bunu denersen

 MqlTradeRequest::filling_mode=ORDER_FILLING_RETURN

, açılmıyor.

 
Vladimir Simakov :

açılmayacak.

Orijinal işlevi kontrol edildi.

 #include <MT4Orders.mqh>

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

void OnTick ()
{
   if (! OrdersTotal ())
  {
     OrderSend ( _Symbol , OP_BUY, 0.1 , Ask, ORDER_FILLING_FOK , 0 , 0 );    
     OrderSend ( _Symbol , OP_BUY, 0.1 , Ask, ORDER_FILLING_IOC , 0 , 0 );    
     OrderSend ( _Symbol , OP_BUY, 0.1 , Ask, ORDER_FILLING_RETURN , 0 , 0 );    
  }  
}

İşler.

 
fxsaber :

Orijinal işlevi kontrol edildi.

İşler.

Borsada değil , piyasanın yürütülmesini deneyin)

UPD: değişiklik, derhal yürütme için,

SYMBOL_TRADE_EXECUTION_INSTANT

 
Vladimir Simakov :

Borsada değil , piyasanın yürütülmesini deneyin)

UPD: derhal yürütme için değişiklik,

SYMBOL_TRADE_EXECUTION_INSTANT

Yukarıdaki test danışmanı. Denemek.

 
Vladimir Simakov :

Borsada değil , piyasanın yürütülmesini deneyin)

UPD: derhal yürütme için değişiklik,

SYMBOL_TRADE_EXECUTION_INSTANT

Bu, örneğin, A-ri'deki standart türdeki hesaplar, değil mi?

Ve işlem yapan komisyoncular her zaman bu tür bir uygulamaya sahiptir, değil mi?

bu yüzden açıklama için yazdı.

 

Neden bu kadar acı çekiyorsun?

Standart sınıfları kullanın ve herhangi bir yapıyı ( MqlTradeRequest ) doldurmanız gerekmez ve herhangi bir Fillings ve Instants bilmeniz gerekmez:


 #include<Trade\SymbolInfo.mqh>
#include<Trade\AccountInfo.mqh>
#include<Trade\Trade.mqh>

CTrade  
CAccountInfo 
CPositionInfo