MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1877

 
Maksim Emeliashin statik ad dizileri ve bu dizide bir dize araması gibi bisikletlere ihtiyaç vardır.

MQL için işlev düzgün çalışmayacak

 template < typename T>
bool StringToEnum( const string i_str, T &o_val)
{
   for ( int i = 0 ; i < 256 ; i++)
      {
         o_val = (T)i;
         if ( StringCompare ( EnumToString (o_val), i_str, false ) == 0 )
             return ( true );
      }
   o_val = WRONG_VALUE ;
   return ( false );
}

https://www.mql5.com/ru/docs/strings/stringcompare

Seçenekler

dize1

[içinde] İlk satır.

dize2

[içinde] İkinci satır.

büyük/küçük harfe duyarlı=doğru

[içinde] Harf büyük/küçük harf duyarlı mod. Değer doğruysa, "A">"a". Değer false ise, "A"="a" . Parametrenin varsayılan değeri doğrudur.

Enum'da iki sabit, örneğin ENUM1 ve enum1 varsa, o zaman i_str: " enum1 " ile işlev, ENUM1 sabitinin değerini döndürebilir. Ve neden StringCompare ? Bunu şu şekilde yapabilirseniz:

 template < typename T>
bool StringToEnum( const string i_str, T &o_val)
{
   for ( int i = INT_MIN ; i <= INT_MAX && ! IsStopped (); i++) // перебор всех возможных значений int
      {
         o_val = (T)i;
         if (i_str == EnumToString (o_val))
             return ( true );
      }
   o_val = WRONG_VALUE ;
   return ( false );
}
 
Amon1953 bir pozisyonu kapatma nedenini nasıl öğreneceğimi anlamıyorum.

Bundan sonra ne yapılacağına karar vermek için bu gereklidir.

MT5 terminalinde, geçmiş penceresinde bir anlaşma, sipariş veya pozisyon seçebilirsiniz.

DEAL_REASON değeri DEAL_REASON_SL'ye eşit olan bir DEAL için işlem geçmişine bakmanız gerekir.


Eklendi: Her şeyi basitleştirmek mümkündür - OnTradeTransaction'da TRADE_TRANSACTION_DEAL_ADD işlemini yakalamak ve bu işlemi oluşturan DEAL'e bakmak için işlem geçmişine başvurmak yeterlidir. Ve sonra aynı tarif: ... DEAL_REASON, DEAL_REASON_SL'ye eşittir

 
Mihail Matkovskij # :

MQL için işlev düzgün çalışmayacak

https://www.mql5.com/ru/docs/strings/stringcompare

Enum'da iki sabit, örneğin ENUM1 ve enum1 varsa, o zaman i_str: " enum1 " ile işlev, ENUM1 sabitinin değerini döndürebilir. Ve neden StringCompare ? Bunu şu şekilde yapabilirseniz:

Ve daha hızlı bir sürüm:

 template < typename T>
bool StringToEnum( const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for ( int i = i_min_enum; i <= i_max_enum && ! IsStopped (); i++) 
      {
         o_val = (T)i;
         if (i_str == EnumToString (o_val))
             return ( true );
      }
   o_val = WRONG_VALUE ;
   return ( false );
}

bool StringToEnum( const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN , INT_MAX ); } // медленный вариант
 
Alexey Viktorov # :

Ve tüm bunlar neden gerekli? ENUM_TIMEFRAMES sayısal değerlerini kendi değerlerinizle değiştirmek ister misiniz? Ya da ne?

Pekala, şu anda, veri tabanına göstergelerin ve EA parametrelerinin ayarlarını kaydetmem gerekiyor. Aynı zamanda, sahip olmak isterim:

1. insan tarafından okunabilir kayıtlar

2. makine tarafından okunabilir kayıtlar

3. Özel numaralandırmalarınıza yeni değerler eklemeye karşı direnç ve mutlaka sonunda değil.

Yazma ile ilgili herhangi bir sorun yok - EnumToString, ancak geliştiriciler diğer tüm türlerin aksine ters işlevi yapmadı.

 
Mihail Matkovskij # :

Ve daha hızlı bir sürüm:

Büyük/küçük harf karşılaştırmasına katılıyorum, kendim için daha genelleştirilmiş bir bisiklet yazdım, kendi numaralandırmalarım için küçük harf kullanmadım.

Ancak ENUM_TIMEFRAMES için bu seçeneği çalıştırırsanız:

 bool StringToEnum( const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN , INT_MAX ); } // медленный вариант
örneğin PERIOD_MN1 için, o açarken kahve içmek için zamanınız olabilir :)
 
Valeriy Yastremskiy # :

Her bir çubuktaki düz çizgilerden fiyatları alın ve farklılıkların kesişme işaretlerinin değiştiği yerlerde karşılaştırın veya farkı bulun) Bu arada çubukta eşitlikler olmayabilir.

Bunun için hangi işlev kullanılır? mqlrate? Ve eğer ObjectGet aracılığıyla, o zaman orada nesnenin özelliğini belirtmeliyim, eğer OBJPROP_PRICE alırsak, o zaman fiyatı mevcut çubuğa nasıl getireceğini.
 
12345678902003 # :
Lütfen bana yardım edin, iki Gann çizgisi çiziyorum ve bunlar belirli bir noktada kesişiyorlar, bu çizgilerin kesişme noktasının koordinatlarını bulmam gerekiyor.
Gann hattının ikinci noktasının fiyatını belirleyebilirseniz, KimIV size daha fazla yardımcı olacaktır.
 
Maksim Emeliashin # :

Büyük/küçük harf karşılaştırmasına katılıyorum, kendim için daha genelleştirilmiş bir bisiklet yazdım, kendi numaralandırmalarım için küçük harf kullanmadım.

Ancak ENUM_TIMEFRAMES için bu seçeneği çalıştırırsanız:

örneğin PERIOD_MN1 için, o açarken kahve içmek için zamanınız olabilir :)

ENUM_TIMEFRAMES içinde minimum ve maksimum değerler bilinmektedir. Bu nedenle, açıkça belirtilebilirler.

Numaralandırmaların geri kalanıyla, yaklaşık değer aralıklarını bilmek yeterlidir. Enum bildiriminde herhangi bir sabit belirtilmemişse, buradaki değerler genellikle 0'dan başlar. i_max_enum herhangi bir iki basamaklı veya üç basamaklı sayıya ayarlanabilir: 50, 100, 255.

 
Maksim Emeliashin # :

Pekala, şu anda, veri tabanına göstergelerin ve EA parametrelerinin ayarlarını kaydetmem gerekiyor. Aynı zamanda, sahip olmak isterim:

1. insan tarafından okunabilir kayıtlar

2. makine tarafından okunabilir kayıtlar

3. Özel numaralandırmalarınıza yeni değerler eklemeye karşı direnç ve mutlaka sonunda değil.

Yazma ile ilgili herhangi bir sorun yok - EnumToString, ancak geliştiriciler diğer tüm türlerin aksine ters işlevi yapmadı.

Hiç bir numaralandırma yazdırmayı denediniz mi?

 Print ( PERIOD_M5 );

Sizce ne basılacak?


Ancak programlı olarak bir numaralandırma oluşturmak için ... bu, evet. İlginç olurdu.

 
x572intraday # :
Peki, girdi -parametreleri neden bir döngü içinde sıralanamıyor? Neden bizi böyle cezalandırıyorsun?
Bu elbette bir koltuk değneği, ama ben kullanıyorum: belirli bir ayırıcı aracılığıyla, gerekli tüm verileri string girdi değişkenine girin ve ardından onları bir diziye geçmek için StringSplit'i kullanın .