Döngü Operatörü 'için' soruları

 

Merhaba MQL4 topluluğu,


İlk referans: https://book.mql4.com/operators/for

İlk referansa göre, 'for' operatörünün bir biçim örneği şu şekilde yazılmıştır:

   for (Expression_1; Condition; Expression_2)         // Cycle operator header
      One operator , cycle body                     // Cycle body is one operator


İkinci referans: https://docs.mql4.com/basis/operators/for

İkinci referansa göre, 'for' operatörünün sağladığı örnek şu şekilde açıklanmıştır:

 for (Expression1; Expression2; Expression3)
   operator;


Neden bu ilk örnek ikinci parametre olarak bir "koşul" içeriyor, ikinci örnek ise ikinci bir parametre olarak "İfade2" içeriyor?

Bu çelişkinin anlamı nedir?

Hatta önemli mi?

Döngü operatörünü 'for' kullanacaksam, tüm parametrelerini keskin bir şekilde anlamam gerektiğine inanıyorum.

Teşekkür ederim.

 

Belki önce while döngüsünü anlayarak for döngüsünü daha iyi anlayabilirsiniz. . . for döngüsü, yalnızca başlangıç koşulu ve artışın yerleşik olduğu bir while döngüsüdür. . .

Bunun için belgelere bakın. . .

" for operatörü, aşağıdaki operatör dizisine eşdeğerdir: "

Expression1;
while (Expression2)
  {
   operator;
   Expression3;
  };


Özellikle sorunuzla ilgili olarak, " Bu ilk örnek neden   ikinci parametre olarak bir "koşul" içerirken ikinci örnek "Expression2" içerir   ikinci parametre olarak? " bir ifade bir koşul olabilir, bir koşul doğru veya yanlış bir değerle sonuçlanır, örneğin (a > b) veya (c || d) veya (OrdersTotal() >= 0) , ayrıca belgelerde . . . " Expression2 , döngü sonlandırması için koşullu testtir. "

 

Simon,

bir ifade bir koşul olabilir

Öyleyse, bir 'for' operatör başlığındaki ikinci parametre bir ifade VEYA koşulu olabilir mi? Expression_1 ve Expression_3'ün ifade olarak kalması ve koşullara doğru değişmemesi gerektiğini varsayıyorum? Neden 1 ve 3 ifadesinin de koşul olamayacağını anlamıyorum. Her iki ifade 1 ve 3 sadece doldurulacak parametrelerdir. (bir koşul olmak, alternatif olarak iki parametre, diğer bir deyişle Expression_2'nin amacı OLABİLİR)

Lütfen düşünceleri onaylayın.

İfadeler aritmetik işlemler (2+2=4), atama vb. olabilir (tümü MetaEditor Sözlüğünde listelenmiştir).

Koşul doğru || false (örnekler: a>b, a>=b, a==b, vb.).

İşlemler MetaEditor sözlüğünde de bulunur (örnekler: Break, Continue, Return, while, for, vb.).

Teşekkür ederim

 
WhooDoo22 :

Simon,

bir ifade bir koşul olabilir

Öyleyse, bir 'for' operatör başlığındaki ikinci parametre bir ifade VEYA koşulu olabilir mi? Expression_1 ve Expression_3'ün ifade olarak kalması ve koşullara doğru değişmemesi gerektiğini varsayıyorum? Neden 1 ve 3 ifadesinin de koşul olamayacağını anlamıyorum. Her iki ifade 1 ve 3 sadece doldurulacak parametrelerdir. (bir koşul olmak, alternatif olarak iki parametre, diğer bir deyişle Expression_2'nin amacı OLABİLİR)

Doğru iken nasıl kullanılacağını öğrenin. . . . for döngüsü, estetik açıdan daha hoş bir şekilde düzenlenmiş bir while döngüsüdür. O zaman ifadeler ve koşullar olayının tümü anlamlı olacaktır. . . kendinize bir iyilik yapın ve baş ağrıları için seçenekleri azaltın. . . . ders çalışırken

Belgeler - süre

Kitap - süre
 
WhooDoo22 : Yani, bir 'for' operatör başlığındaki ikinci parametre bir ifade VEYA koşul olabilir mi?
Herhangi bir ifade bir sayı ile sonuçlanır. Boole değerine dönüştürülen sayı bir koşuldur. Aynı şey. Diyorsun t uh - mey -toh ve ben de t uh - mah -toh diyorum
 

Simon, çalışırken kodda kullanma alıştırması yapacağım. kendine bir iyilik yap... Bunun sesini sevdim! :) Teşekkür ederim.

William, Boole değerine dönüştürülen sayı bir koşuldur... (1=true,0=false). Çok teşekkürler.

Teşekkür ederim.

 

Simon,

;) istediğiniz gibi yapabilmeniz gereken bir EA yazdım.

Bu EA'nın bir kombinasyonunu, Terminal'deki "Uzmanlar" sekmesinden alınan sonucun anlık görüntüsüyle birlikte paylaşıyorum.


EA, USDJPY sırasını seçebilecek ve bilgilerini Uzmanlar sekmesine yazdırabilecek gibi görünüyor. EA neden siparişi kapatmıyor ve siparişin bilgilerini yazdırmıyor?

Teşekkür ederim.

 
WhooDoo22 :

Simon,

;) istediğiniz gibi yapabilmeniz gereken bir EA yazdım.

Bu EA'nın bir kombinasyonunu, Terminal'deki "Uzmanlar" sekmesinden alınan sonucun anlık görüntüsüyle birlikte paylaşıyorum.


EA, USDJPY sırasını seçebilecek ve bilgilerini Uzmanlar sekmesine yazdırabilecek gibi görünüyor. EA neden siparişi kapatmıyor ve siparişin bilgilerini yazdırmıyor?

Teşekkür ederim.

Diş tellerini anladığını mı söyledin? https://www.mql5.com/en/forum/142732


Lütfen kodunuzu ve ne anlama geldiğini açıklayın. . . özellikle bu süre boyunca benimle konuş lütfen.
 

Simon,

Lütfen kodunuzu ve ne anlama geldiğini açıklayın. . . özellikle bu süre boyunca benimle konuş lütfen.

Kodu ve amacını açıklamak için elimden geleni yapacağım.


Kod Amacı:

1. Üç sipariş havuzundan USDJPY siparişini seçin.

2. USDJPY siparişinin TP ve SL'sini değiştirin.

3. OrderPrint() işlevini yürütün.

4. USDJPY siparişini kapatın.


Kod Açıklaması:

İlk olarak değişkenler tanımlanır.

   int i;
   double bid_ask;

İkinci olarak, 'while' döngüsü yürütülür.

'while' döngü mantığı:

OrderSelect() işlevi , 1,2,3, vb. sayının yerine 'i' değişkenini kullanır. (lütfen bunu aklınızda bulundurun)

Bu nedenle, OrderSelect() işlevi ve OrderSymbol() işlevi içindeki i değişkeni USDJP Y DEĞİLSE , i değişkenini 1 artırın ( i++; )

   while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")

         i++;

'while' döngüsü, OrderSelect() işlevi uygun sipariş biletini seçene VE OrderSymbol() işlevi bir USDJPY siparişi seçene kadar 'i' değişkenini artırır. Her iki amaç da gerçekleştirildiğinde, while döngüsü yanlış olur ve kontrol i++'ın altına geçer; (while döngüsü gövdesi).

Üçüncü olarak OrderModify() fonksiyonu çalıştırılır.

OrderModify(i,OrderOpenPrice(), 50 * Point , 50 * Point , 0 , CLR_NONE );

Dördüncü olarak OrderPrint() fonksiyonu çalıştırılır.

OrderPrint();

Beşinci olarak, kapatılacak emrin bir alış veya satış emri olup olmadığını anlamak için parametreler dahil edilmiştir.

         if (OrderType()==OP_BUY){bid_ask=Bid;}
         if (OrderType()==OP_SELL){bid_ask=Ask;}

Altıncısı , program emrin alış mı satış mı olduğunu ayırt ettiğinde OrderClose() fonksiyonunu çalıştırır.

OrderClose(i,OrderLots(),bid_ask, 3 , CLR_NONE );

Yedinci (ve son olarak), program, strateji test cihazında görsel testler sırasında bilet numarasının gerçekten USDJPY'deki bilet olduğunu doğrulamak için 'i' değişkenini gösterecek bir yorum içerir.

 Comment ( "i = " ,i);

Teşekkür ederim.

 
WhooDoo22 :

Simon,


'while' döngü mantığı:

OrderSelect() işlevi, 1,2,3, vb. sayının yerine 'i' değişkenini kullanır. (lütfen bunu aklınızda bulundurun)

Bu nedenle, OrderSelect() işlevi ve OrderSymbol() işlevi içindeki i değişkeni USDJP Y DEĞİLSE , i değişkenini 1 artırın ( i++; )

'while' döngüsü, OrderSelect() işlevi uygun sipariş biletini seçene VE OrderSymbol() işlevi bir USDJPY siparişi seçene kadar 'i' değişkenini artırır. Her iki amaç da gerçekleştirildiğinde, while döngüsü yanlış olur ve kontrol i++'ın altına geçer; (while döngüsü gövdesi).

Üzgünüm, kodunuzu yanlış okuyordum. . . Açıklama için teşekkürler, şimdi ne yaptığınızı anladım. Yaşadığınız problem çok basit. . . sadece gönderdiğiniz ekrandaki hata mesajına bakın. . . Sipariş numarası da dahil olmak üzere OrderPrint()'in ne ürettiğine bakın, ardından hataya bakın.

Dönüş değerlerinin kontrolünü ve hata raporlamayı dahil etmiş olsaydınız, muhtemelen probleminizi kendiniz görmüş olurdunuz.
 

Simon,

Ne gördüğünüzü anlamıyorum ama ;) Bu konuyu biraz aydınlatmak için hemen GetLastOrder() işlevini ekleyeceğim. GetLastOrder() işlevini kodla birlikte eklemeden bir soru gönderdiğimiz için özür dileriz.

Teşekkür ederim.