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

 
Kos Mos :

bu yüzden tam olarak ne yapamayacağımı anlamaya çalışıyorum, kimsenin size bedavaya bir şey söylemesinin pek mümkün olmadığını anlıyorum - kapitalizm onun annesi.)) Buna karşı değilim, sadece neden anlaşmalar olduğunu anlamam gerekiyor. alış yönünde her mumda açılır.

sana cevap vermedim

Siz - kayakların gitmesi için - en azından bir sinyal alırken önemli olan değişkenlerin değerlerini yazdırmanız ve bunlarla birlikte çıkan günlüğe bakmanız gerekir.

 

(int i=0;i<ArrayRange(arr2,0);i++), için böyle bir döngü vardır, bu da ArrayRange(arr2,0) hesaplamasının kaç kez gerçekleştirildiğiyle ilgilendiğim anlamına gelir: bir kez ve makine değerleri hatırlıyor mu, yoksa döngü her döndüğünde ArrayRange (arr2,0) işlevinden bir değer mi döndürüyor? Misal:

1. seçenek.

i=0,i<(dönüş değeri), artış, sonra

i<(tekrar dönüş değeri), artış, ardından

i<(tekrar değeri döndürür), artırın, böylece ortaya çıkar,

2. seçenek.

ya da bu hesaplamadan bir kez değer dönüşü var ArrayRange(arr2,0) diyelim 5 döndü diyelim ve makine bu 5'i hatırlıyor ve bu şekilde çıkıyor

i=0,i<(dönüş değeri) yani i<5, artış, sonraki

i<5, artış, sonraki

i<5, arttır, öyle mi çıkıyor?

Neden soruyorum: Her şey ilk seçeneğe göre oluyorsa, bu değeri döngüden önce çıkarmak ve bir değişkende saklamak mantıklıdır, böylece döngünün her geçişinde program ArrayRange'ı (dizi2,0) hesaplamaz. işlev.

 
Seric29 :

(int i=0;i<ArrayRange(arr2,0);i++), için böyle bir döngü vardır, bu da ArrayRange(arr2,0) hesaplamasının kaç kez gerçekleştirildiğiyle ilgilendiğim anlamına gelir: bir kez ve makine değerleri hatırlıyor mu, yoksa eğirme döngüsü ArrayRange (arr2,0) işlevinden değer döndürdüğünde mi? Misal:

1. seçenek.

i=0,i<(dönüş değeri), artış, sonra

i<(tekrar dönüş değeri), artış, ardından

i<(tekrar değeri döndürür), artırın, böylece ortaya çıkar,

2. seçenek.

ya da bu hesaplamadan bir kez değer dönüşü var ArrayRange(arr2,0) diyelim 5 döndü diyelim ve makine bu 5'i hatırlıyor ve bu şekilde çıkıyor

i=0,i<(dönüş değeri) yani i<5, artış, sonraki

i<5, artış, sonraki

i<5, arttır, öyle mi çıkıyor?

Neden soruyorum: Her şey ilk seçeneğe göre oluyorsa, bu değeri döngüden önce çıkarmak ve bir değişkende saklamak mantıklıdır, böylece döngünün her geçişinde program ArrayRange'ı (dizi2,0) hesaplamaz. işlev.

genel durumda - 1. seçenek.

PS/2nd yalnızca, döngü içinde ArrayResize yoksa ArrayRange:=const ; Teorik olarak "yerel" işlevleri için mümkün olmasına rağmen, mql derleyicisinin kodu zaten çok derinden kazdığından emin değilim.

PPS/ ArrayRange() ile örnek tam olarak doğru değil, çünkü muhtemelen doğrudan bir fonksiyon çağrısı olmayacak, derleyici basitçe i'yi dahili bir dizi değişkeni ile karşılaştırmaya indirgemek zorundadır, çünkü diziler hakkında her şeyi bilir.

 
Maxim Kuznetsov :

genel durumda - 1. seçenek.

PS/2nd yalnızca, döngü içinde ArrayResize yoksa ArrayRange:=const ; Teorik olarak "yerel" işlevleri için mümkün olmasına rağmen, mql derleyicisinin kodu zaten çok derinden kazdığından emin değilim.

PPS/ ArrayRange() ile örnek tam olarak doğru değil, çünkü muhtemelen doğrudan bir fonksiyon çağrısı olmayacak, derleyici basitçe i'yi dahili bir dizi değişkeni ile karşılaştırmaya indirgemek zorundadır, çünkü diziler hakkında her şeyi bilir.

peki bu seçeneği alalım 5+5*5 şeklinde bir ifade olacak

1. seçenek.

i=0,i<(5+5*5), artır, sonra

i<(5+5*5), artır, sonra

i<(5+5*5), artış öyle çıkıyor ki,

2. seçenek.

ya da bu hesaptan 5+5*5 bir kez değerin dönüşü var diyelim 30 döndürdüler ve makine bu 30'u hatırlıyor ve şöyle çıkıyor

i=0,i<(dönüş değeri) yani i<30, artış, daha fazla (makine 30'u hiçbir yerde kaydetmediğim için makine otomatik olarak 30'u hatırlar)

i<30, artış, sonraki

i<30, öyle mi çıkıyor?

Anladığım kadarıyla 1. seçenek olacak? 5+5*5 döngünün her geçişinde bu ifade program bu ifadeyi hesaplayacaktır. Bu ifadeyi döngüden önce hesaplayabilir ve 30'u bir değişkende saklayabilir ve tabii ki bu 30k'yı otomatik olarak hesaplayıp kendisini hatırlamadığı sürece, makine için döngüde değiştirebilirsiniz.


İşlev çağrısı yoksa, derleyici i<5 mantıksal ifadesini kontrol edemez, bu da muhtemelen ilk seçeneğin yürütüleceği anlamına gelir.

 

İşlevin sonucu ( ArrayRange ) döngü içinde veya bir işlev tarafından değiştirilebilir.
Ve sabit ifade (5+5*5) her zaman aynı olacaktır.

Bu nedenle, fonksiyon her geçişte hesaplanacaktır.
Ve sabit değer, derleme sırasında derleyici tarafından kodun yerine geçecektir.

 
Taras Slobodyanik :

İşlevin sonucu ( ArrayRange ) döngü içinde veya bir işlev tarafından değiştirilebilir.
Ve sabit ifade (5+5*5) her zaman aynı olacaktır.

Bu nedenle, fonksiyon her geçişte hesaplanacaktır.
Ve sabit değer, derleme sırasında derleyici tarafından kodun yerine geçecektir.

5 + 5 * 5 de bir ifadedir ve her geçişte hesaplanması gerekir, işleve gelince, aynı sonucu vermesi gerekiyor, döngünün her geçişinde derleyicinin hala olacağı gerçeğinden bahsediyoruz. hem işlevi hem de 5 + 5 * 5 ifadesini hesaplayın. Yani ilk seçenek olacak - yani. hesaplama döngünün her geçişinde yapılır, bu nedenle döngüden önce bu değeri hesaplayıp bir değişkene kaydetmek ve değişkeni aynı statik değer olarak kullanmak, böylece döngünün her geçişinde hiçbir hesaplama yapılmaması mantıklıdır, bu sonuçta programın performansını etkileyebilir.

intk=5+5*5; //k=30  

for(int i=0;i<k;i++){}

burada k her zaman 30 veya

int k= ArrayRange (dizi2,0) //k=5  

for(int i=0;i<k;i++){}

burada k her zaman 5'tir.

 
Seric29 :

5 + 5 * 5 de bir ifadedir ve her geçişte hesaplanması gerekir, işleve gelince, aynı sonucu vermesi gerekiyor, döngünün her geçişinde derleyicinin hala olacağı gerçeğinden bahsediyoruz. hem işlevi hem de 5 + 5 * 5 ifadesini hesaplayın. Yani ilk seçenek olacak - yani. hesaplama döngünün her geçişinde yapılır, bu nedenle döngüden önce bu değeri hesaplayıp bir değişkene kaydetmek ve değişkeni aynı statik değer olarak kullanmak, böylece döngünün her geçişinde hiçbir hesaplama yapılmaması mantıklıdır, bu sonuçta programın performansını etkileyebilir.

intk=5+5*5; //k=30  

for(int i=0;i<k;i++){}

burada k her zaman 30 veya

int k= ArrayRange(dizi2,0) //k=5  

for(int i=0;i<k;i++){}

burada k her zaman 5'tir.

Döngüyü basitçe genişletebilir ve gereksiz değişkenler oluşturamazsınız.

 
Seric29 :

5 + 5 * 5 de bir ifadedir ve her geçişte hesaplanması gerekir, işleve gelince, aynı sonucu vermesi gerekiyor, döngünün her geçişinde derleyicinin hala olacağı gerçeğinden bahsediyoruz. hem işlevi hem de 5 + 5 * 5 ifadesini hesaplayın. Yani ilk seçenek olacak - yani. hesaplama döngünün her geçişinde yapılır, bu nedenle döngüden önce bu değeri hesaplayıp bir değişkene kaydetmek ve değişkeni aynı statik değer olarak kullanmak, böylece döngünün her geçişinde hiçbir hesaplama yapılmaması mantıklıdır, bu sonuçta programın performansını etkileyebilir.

Derleyici her zaman bir kez çalışır - metni koda derlerken.
(Hatırladığım kadarıyla MT4 de doğrudan koda derleniyor)

5+5*5 sabitleri olan bir ifadedir, yeniden hesaplanması gerekmez - bu nedenle derleme sırasında yalnızca bir kez hesaplanır ve sayı kodda 30 olur

5+5*5+i değişkenli bir ifadedir ve bu, her geçişte kodda 30+i olarak hesaplanacaktır.

ArrayRange işlevi, derleyicinin bu değerin ne olacağını bilmediği bir değer döndürür, bu nedenle, kodun yerine bir işlev çağrısı koyar ve her geçişte (kodda)işlev çağrılır.
 
Taras Slobodyanik :

Derleyici her zaman bir kez çalışır - metni koda derlerken.
(Hatırladığım kadarıyla MT4 de doğrudan koda derleniyor)

5+5*5 sabitleri olan bir ifadedir, yeniden hesaplanması gerekmez - bu nedenle derleme sırasında yalnızca bir kez hesaplanır ve sayı kodda 30 olur

5+5*5+i değişkenli bir ifadedir ve bu, her geçişte kodda 30+i olarak hesaplanacaktır.

ArrayRange işlevi bir değer döndürür, derleyici bu değerin ne olacağını bilmez, bu nedenle, işlev çağrısını kodla değiştirir ve her geçişte (kodda)işlev çağrılır

Açık. Teşekkür ederim. Soru kesinlikle ciddi değil, ancak nüanslar var.

 
Artyom Trishkin :

Döngüyü basitçe genişletebilir ve gereksiz değişkenler oluşturamazsınız.

benim durumumda 2 matematiksel ifade var 1. - ArrayRange(arr2,0) 2. 5+5*5 amacım derleyicinin daha az yükle çalışacağı koşullar yaratmak

for(int i=0;i<ArrayRange(arr2,0);i++) bu durumda her geçişte karşılaştırma değeri döndürülür

int k=ArrayRange(arr2,0)//k=5 for(int i=0;i<k;i++){} bu durumda karşılaştırma değeri 4 kez yerine 1 kez döndürülür, ancak bir değişken oluşturulur , yine de burada daha az yük, özellikle de binlerce veya milyonlarca söz konusu olduğunda.

Değişkenler oluşturmamak için döngünün nasıl genişletileceğini gösterin?

Neden: