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

 
Alexey Viktorov :

IntegerToString() ve DoubleToString() işlevleri, sayıyı yalnızca işleve iletilen bir dize olarak temsil eder. İşte örnekte

r sayısı bir dizgeye çevrildiğinde ve dizgiler "toplandığında" olan tam olarak budur. Ama ondan önce, r'nin değeri değişir.

Soruyu tam anlayamadım ama diziden sadece çift eleman seçmen gerekiyorsa döngü şu şekilde oluşturulmalı


Açıklama için teşekkürler.

 
Alexey Viktorov :

IntegerToString() ve DoubleToString() işlevleri, sayıyı yalnızca işleve iletilen bir dize olarak temsil eder. İşte örnekte

r sayısı bir dizgeye çevrildiğinde ve dizgiler "eklendiğinde " olan tam olarak budur. Ama ondan önce, r'nin değeri değişir.



Dize değişkenlerinin değerlerini "katlama" sürecini anlayamıyorum. Kodumda "katlama" dizeleri için 2 seçenek görüyorum.

1. Geçerli yinelemenin dize değişkeninin değeri, önceki yinelemeden aynı dize değişkeninin değeriyle eklenir.

2. Geçerli yinelemede, iki terim değişkeninin değerleri eklenir, yani IntegerToString (r) + DoubleToString(LoY[r],4)

Sanırım ilk seçeneği kastettin.

Ama sonra .... son yinelemede IntegerToString(r) değeri = "0" ve geçerli yinelemede = "1" . Eklemenin sonucu "01" olmalıdır.

Toplamadan önceki geçerli yinelemede IntegerToString(r) öğesinin değeri önceki 0 değerinden geçerli 1 değerine değişirse, sayının iki basamaklı dize temsili yine de elde edilir, yani "11".

DoubleToString(LoY[r],4) dize değişkeninin değerleri aynı algoritma kullanılarak eklenirse, iki dize eklemenin sonucu 1.61041.6105 türünde değerler olmalıdır.

Ama Print() nedense toplamanın sonuçlarını diğer sayılar olarak yazdırır (olması gerektiği gibi)
Ne anlamıyorum.
İşte string değişkenlerinin değerlerinin nasıl eklendiğine dair örneğiniz "...... ve eğer stringler eklerseniz   DoubleToString(2.3, 1)+   DoubleToString(3.6, 1) o zaman string olarak 2.33.6 olacaktır." Yani, toplamadan önce her bir değişkenin sayısının string temsili 2 karakterden oluşuyordu ve iki string değişkeni ekledikten sonra toplamanın sonucu oldu. 4 karakterlik bir dize temsili Sonuç olarak neden kodunuza iki kat daha fazla karakter içeren bir sayı almıyor?

 
Alexey Viktorov :


Soruyu tam olarak anlamadım ama diziden sadece çift elemanları seçmek için yapmanız gerekiyorsa, döngü bu şekilde oluşturulmalıdır.


Aslında demek istediğim buydu .... İşte BLOCK N 2 ile tamamlanan orijinal kod

 int P1= 0 ;
double LoY[ 31 ];
void OnTick ()
{
if (P1== 0 )
{
for ( int r= 0 ; r< 31 ;r++)
{
LoY[r]= 1.6104 +(r* 2 )* 0.0001 ;
Print ( "-------------------------------------LoY[r]--------------=" ,  LoY[r]);
P1= 1 ;
}
}
//*************************************************************  Б Л О К    N 2
for ( int x= 0 ; x< 31 ;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
ArraySort (LoY, WHOLE_ARRAY , 0 ,MODE_ASCEND);
Print ( "---LoY[0]--" ,  X, "---LoY[1]--" ,  X,   "---LoY[2]--" ,  X,   "---LoY[3]--" ,  X,   "---LoY[4]--" ,  X, ................   "---LoY[30]--" ,  X );
}
}
}

İkinci blokta, dizi öğelerinin değerleri artık birinci blokta olduğu gibi aynı delta ile birbirinden farklı değildir. Komşu elemanlar arasındaki delta farklı olabilir ve bu nedenle ilk bloktan ikinci bloğa dizeleri bağlama algoritması bana göründüğü gibi uygun değil.

SORU Hangi dil yapısıyla   MQL4'te   veya işlevler   MQL4'te , yukarıdaki kodun ikinci bloğunda , döngünün sonundaki Print() işlevi, bir satırda yer alacak olan dizi öğelerinin tüm değerleri doldurulmuş olarak yalnızca 1 kez yazdırılacaktır, yani, aşağıdaki formu alacak

Print("---LoY[0]--", X,   "---LoY[1]--"   , X ,     "---LoY[2]--"   , X ,     "---LoY[3]--"   , X ,     "---LoY[4]--"   , X , ................     "---LoY[30]--"   , X );

Beni sert bir şekilde yargılamayın, ancak kelimelerdeki açıklamaları anlayacağımdan emin değilim, çünkü ikinci blokta her şey ilkinden çok daha karmaşık .... bana göründüğü gibi.
Yardım için teşekkürler.

 

Programlama yaparken, en azından yolculuğun başlangıcında çok sayıda rutin çalışma vardır. Bir fikir düşünürsünüz, sonra kod yazarsınız ve sonra hata ayıklarsınız. Bazen hata ayıklama her şeyden daha uzun sürer.

Genellikle orijinal planın çalışmadığı görülür. Sırayla yukarıdan aşağıya bakmaya başlıyorsunuz ki bu doğru değil.

printf()'i her yere koyun ve beklediğiniz gibi olup olmadığına bakın. Böylece kodun nasıl çalıştığını ve nerede hata yaptığınızı hızlıca anlayacaksınız. Aksi takdirde, anlayış uzun bir süre gelecektir.


Beni ilgilendirmez ama güzel yazmaya çalışın. Kendiniz için bir stil seçin ve ona bağlı kalın. Parantez içindeki parantezler, eklerin görülebilmesi için basamaklara yerleştirilmelidir. İşlemler arasında boşluk kullanırsanız, bunları her yerde kullanın veya tam tersi, her yerde kullanmayın.

 for ( int x= 0 ; x< 31 ;x++)

if (Bid < LoY[x] )

O zaman kendi kodunuzu okumanız daha kolay olacaktır.

-----------------

ikinci blok için:

İkinci blokta küçük x ve büyük X farklı değişkenlerdir, kod istediğiniz gibi çalışmayacaktır.

Bir diziyi bir döngü içinde değil, dışında sıralamak istenir.

Print'te X'i birçok kez kullanırsınız, o kadar çok kez aynı numarayı yazdırırsınız.

-----------------

Kodla. Soruyu anlamak zor, nasıl anladığımı anlatayım.

Print'i bir döngüde yazarsanız, bu döngünün yaptığı yinelemeler kadar çıktı alırsınız. Bir kez çıktı almanız gerekiyorsa, Print'i döngüden sonra yerleştirin.

Aynı zamanda bilgi toplamak için her yinelemenin değerlerini yazacağınız bir değişken kullanın. Bir dizge değişkenimiz var, bu yüzden tüm sayıları bir dizgeye çevirin.

Yazdır işlevi bir dize kabul ettiği için bir dize değişkenimiz var.

Ne oluyor:

İlk geçiş. Döngüye ilk geçişten önce boş bir değişkenimiz var: string str= "" ;
Ardından, değişkene boş bir değer artı "--LoY[" + IntegerToString (r)+ "]--, " + DoubleToString (LoY[r], 4 )+ ", " ;
burada r 0 ve aslında birden çok satır ekliyoruz:

"--LoY["+

IntegerToString (0)+

"]--, "+

DoubleToString (LoY[0], 4 )+

", " ;

İkinci geçiş.

Sahip olduğumuz tüm bunlara ikinci öğe hakkında daha fazla bilgi ekliyoruz.

"--LoY[" + IntegerToString (1)+ "]--, " + DoubleToString (LoY[1], 4 )+ ", " ;

Böylece ilk elemandan gelen satır artık değişmez.



Amacı, nasıl yaptığınızla değil, neye ihtiyacınız olduğuyla açıklamak daha iyidir. Aksi takdirde, kodunuz hakkında çok uzun tartışabiliriz, ancak amacınızın başka bir şekilde çözülebileceği ortaya çıktı.

 
ANDREY :

Dize değişkenlerinin değerlerini "katlama" sürecini anlayamıyorum. Kodumda "katlama" dizeleri için 2 seçenek görüyorum.

1. Geçerli yinelemenin dize değişkeninin değeri, önceki yinelemeden aynı dize değişkeninin değeriyle eklenir.

2. Geçerli yinelemede, iki terim değişkeninin değerleri eklenir, yani IntegerToString (r) + DoubleToString(LoY[r],4)

Sanırım ilk seçeneği kastettin.

Ama sonra .... son yinelemede IntegerToString(r) değeri = "0" ve geçerli yinelemede = "1" . Eklemenin sonucu "01" olmalıdır.

Toplamadan önceki geçerli yinelemede IntegerToString(r) öğesinin değeri önceki 0 değerinden geçerli 1 değerine değişirse, sayının iki basamaklı dize temsili yine de elde edilir, yani "11".

DoubleToString(LoY[r],4) dize değişkeninin değerleri aynı algoritma kullanılarak eklenirse, iki dize eklemenin sonucu 1.61041.6105 türünde değerler olmalıdır.

Ama Print() nedense toplamanın sonuçlarını diğer sayılar olarak yazdırır (olması gerektiği gibi)
Ne anlamıyorum.
İşte string değişkenlerinin değerlerinin nasıl eklendiğine dair örneğiniz "...... ve eğer stringler eklerseniz   DoubleToString(2.3, 1)+   DoubleToString(3.6, 1) o zaman bir dize olarak 2.33.6 olacaktır." Yani, eklemeden önce, her bir değişkenin sayısının dize temsili 2 karakterden oluşuyordu ve iki dize değişkeni eklendikten sonra, toplamanın sonucu oldu. 4 karakterlik bir dize temsili Sonuç olarak neden kodunuza iki kat daha fazla karakter içeren bir sayı almıyor?

Aslında, herhangi bir metin yazmakla tamamen aynı şekilde gerçekleşir. İlk önce boş bir sayfamız var, ya da daha iyisi boş bir satır. Sonra ilk kelimeyi yazıyoruz, ikinci kelimeyi ona ekliyoruz vb.……… Ve metinde sayılar olduğunda satır karakteri olarak yazıyoruz. Yani 2 + 5 sayılarını toplarsak 7 elde ederiz ve sadece aynı sayıları yazarsak önce 2 yazarız sonra 5'in yanına ... arka arkaya yazılmış iki rakam 25 elde ederiz. Bunu daha kolay nasıl açıklayacağımı bilmiyorum.

Prensip olarak derleyici uyarılarına dikkat etmezseniz sizin örneğinizde r değerlerini stringe çevirmenize gerek yok. Bu iki seçeneğe göz atın.

 Print ( "Test 1 " + ( string ) 1 + ( string ) 2 );
Print ( "Test 2 " + 1 + 2 );
 
Aleksei Stepanenko :


Yardım ve tavsiye için teşekkürler.

 
Alexey Viktorov :

Aslında, herhangi bir metin yazmakla tamamen aynı şekilde gerçekleşir. İlk önce boş bir sayfamız var, ya da daha iyisi boş bir dize. Sonra ilk kelimeyi yazıyoruz, ikinci kelimeyi ona ekliyoruz vb.……… Ve metinde sayılar olduğunda satır karakteri olarak yazıyoruz. Yani 2 + 5 sayılarını toplarsak 7 elde ederiz ve sadece aynı sayıları yazarsak önce 2 yazarız sonra 5'in yanına ... arka arkaya yazılmış iki rakam 25 elde ederiz. Bunu daha kolay nasıl açıklayacağımı bilmiyorum.

Prensip olarak derleyici uyarılarına dikkat etmezseniz sizin örneğinizde r değerlerini stringe çevirmenize gerek yok. Bu iki seçeneğe göz atın.

her şey için teşekkürler

 
ANDREY :

Aslında demek istediğim buydu .... İşte BLOCK N 2 ile tamamlanan orijinal kod

İkinci blokta, dizi öğelerinin değerleri artık birinci blokta olduğu gibi aynı delta ile birbirinden farklı değildir. Komşu elemanlar arasındaki delta farklı olabilir ve bu nedenle ilk bloktan ikinci bloğa dizeleri bağlama algoritması bana göründüğü gibi uygun değil.

SORU Hangi dil yapısıyla   MQL4'te   veya işlevler   MQL4'te , yukarıdaki kodun ikinci bloğunda , döngünün sonundaki Print() işlevi, bir satırda yer alacak olan dizi öğelerinin tüm değerleri doldurulmuş olarak yalnızca 1 kez yazdırılacaktır, yani, aşağıdaki formu alacak

Print("---LoY[0]--", Х,   "---LoY[1]--"   , X ,     "---LoY[2]--"   , X ,     "---LoY[3]--"   , X ,     "---LoY[4]--"   , X , ................     "---Bel[30]--"   , X );

Beni sert bir şekilde yargılamayın, ancak kelimelerdeki açıklamaları anlayacağımdan emin değilim, çünkü ikinci blokta her şey ilkinden çok daha karmaşık .... bana göründüğü gibi.
Yardım için teşekkürler.

Diziyi neden döngünün her yinelemesinde sıralayasınız? Sonuçta, dizinin 0. öğesinin değerini değiştirirseniz ve sıralamadan sonra dizinin sonuna giderseniz, ilk olan değer sıfır olur ve ilk olan ikinci olur. Böylece dizinin ilk elemanının değeri atlanacak ve çöp elde edilmiş olacaktır. Genel olarak, tüm kodunuz bir şeye sahip bir şeydir.

Diziyi doldurduğunuz ilk bloğa neden ihtiyacınız var? Diziyi hemen istenen değerlerle doldurun ve doldurduktan sonra sıralayın. Doğru, satırı doldurmak ve yazdırmak için başka bir döngü çalıştırmanız gerekir. ArrayPrint()'in mql4'te uygulanmamış olması üzücü... Ama bunlar sizin deneyleriniz ve gerçekte dizi değerlerini yazdırmanız gerekmeyecek.

 
Aleksei Stepanenko :

Hedefi, nasıl yaptığınızla değil, neye ihtiyacınız olduğuyla açıklayın. Aksi takdirde, kodunuz hakkında çok uzun tartışabiliriz, ancak amacınızın başka bir şekilde çözülebileceği ortaya çıktı.

mql4'ü (ve aynı anda bazı mql5'leri ) öğrenme sürecinde çeşitli kodlar yazıyorum. Dizileri kullanan kodlar dahil. Genellikle bir dizinin öğelerinin değerlerini kodda bir yerde veya başka bir yerde kontrol etmeniz gerekir. Bunu nasıl yapacağımı Print()'i bir döngü içinde kullanarak öğrendim. Ancak bu durumda Print() her yinelemede yazdırılır. Çok sayıda yineleme olduğunda, hem program hem de okuma için elverişsizdir. Print() öğesinin döngünün dışına taşınması gerektiğini doğru söylediniz, böylece Print() dizi öğelerinin değerleriyle yalnızca bir kez yazdırılır . Bunu senin sözlerinden önce tahmin etmiştim.

Print()'i çok hızlı bir şekilde döngüden çıkarmayı öğrendim. Ve şimdi dizi elemanlarının tüm değerlerini tek bir satırda yazdırmak için Print()'i nasıl alacağımı öğrenmeye çalışıyorum.

Kodumun ilk bloğuyla ilgili olarak bunun nasıl yapıldığını bana açıkladılar. Genel anlamda, bu teknolojiyi anladım. Bu yöntemin ayrıntılarını anlamak için beynimi zorlamaya devam edeceğim.
Ama kodumun ikinci bloğunda bana ilk bloktan gelen yöntem uygun değil gibi geliyor çünkü birinci bloktan farklı olarak ikinci bloktaki dizi elemanlarının değerleri arasındaki delta farklı.
Eğer haklıysam ve ilk bloktaki yöntem ikinciye uymuyorsa, o zaman birinci blokta yapılanla aynı şeyin nasıl yapıldığını, ancak zaten ikinci blokla ilgili olarak gösterirseniz minnettar olacağım.

İkinci bloğu düzelttim. Print() ve ArraySort() döngünün dışına taşındı. Print() 'ten kaldırıldı   sizi yanıltmamak için X değişkeni.

 int P1= 0 ;
double LoY[ 31 ];
void OnTick ()
{
if (P1== 0 )
{
for ( int r= 0 ; r< 31 ;r++)
{
LoY[r]= 1.6104 +(r* 2 )* 0.0001 ;
P1= 1 ;
}
}
//*************************************************************  Б Л О К    N 2
for ( int x= 0 ; x< 31 ;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
}
}
ArraySort (LoY, WHOLE_ARRAY , 0 ,MODE_ASCEND);
Print ( "-LoY[0]-" , (знач.эл.масс с инд. 0 ), "---LoY[1]--" ,  (знач.эл.масс с инд. 1 ),   "---LoY[2]--" ,  (знач.эл.масс с инд. 2 ),   "---LoY[3]--" ,  (знач.эл.масс с инд. 3 ),................   "---LoY[30]--" ,  (знач.эл.масс с инд. 30 ) );
}
 
Print ( "-LoY[0]-" , DoubleToString (LoY[ 0 ], 4 ), "---LoY[1]--" , DoubleToString (LoY[ 1 ], 4 ), "---LoY[2]--" , DoubleToString (LoY[ 2 ], 4 ), "---LoY[3]--" , DoubleToString (LoY[ 3 ], 4 ),................   "---LoY[30]--" ,   DoubleToString (LoY[ 30 ], 4 ) );

veya ayrı bir dizi yazdırma işlevi yapın:

 void PrintArray( double &eArray)
   {
   string eStr= "" ;
   int eSize= ArraySize (eArray);
   for ( int i= 0 ; i<eSize; i++)
      {
      eStr+= IntegerToString (i)+ ": " + DoubleToString (eArray[i], 4 )+ ", " ;
      }
   Print (str);
   }

Ve her yerden arayın

PrintArray(LoY);
Neden: