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

 
WhooDoo22 :

Tamamlamamı tavsiye ettiğiniz kodlama alıştırması için "geçersiz bilet" hatasını düzelttim. Kişisel görüntülemeniz için uzman danışmanın bir kopyasını ekledim.

Bu alıştırmanın OrderClose() fonksiyon bölümünün tamamlanmış olduğuna inanıyorum.

Print() fonksiyon bölümü bu alıştırmanın tamamlanmış olduğuna inanıyorum.

Geriye sadece üçüncü bölüm olan OrderModify() işlevi kaldığına inanıyorum.

Teşekkür ederim.

Sorunu çözmediniz, bunun üzerinde çalıştınız, bu, sorunun anlaşılmadığı durumlarda normaldir. Daha önce de söylediğim gibi, semptomu değil sebebi düzeltin. . .

Hala USDJPY Bilet numarasını yazdırmıyorsunuz, lütfen orijinal gereksinimi kontrol edin .

MarketInfo() çağrılarınız işe yarasalar bile yanlış. . .

 

Simon,

OrderModify() işlevi hatasız yürütülür.

OrderPrint() işlevi hatasız yürütülür.

OrderClose() işlevi hatasız yürütülür.

Lütfen yanıtınızı gönderin.

Teşekkür ederim.

Dosyalar:
 
WhooDoo22 :


Lütfen yanıtınızı gönderin.


Raptorİngiltere :

Sorunu çözmediniz, bunun üzerinde çalıştınız, bu, sorunun anlaşılmadığı durumlarda normaldir. Daha önce de söylediğim gibi, semptomu değil sebebi düzeltin. . .

Hala USDJPY Bilet numarasını yazdırmıyorsunuz, lütfen orijinal gereksinimi kontrol edin.

MarketInfo() çağrılarınız işe yarasalar bile yanlış. . .

Ve buna ek olarak . . .

daha önce olduğu gibi aynı durumdaysanız, USDJPY emri olmadığında OrderStopLoss(), OrderTakeProfit(), OrderSelect() ve OrderType() çağrılarında başarısız olursunuz

bu ne anlama geliyor? Bu kod satırından beklentiniz nedir? Lütfen belgelerine bakmadan cevap verin.

 GetLastError ();

Son kod bloğunda, neden bu kod satırını yürütmek istiyorsunuz? . . .

   if (OrderType()==OP_BUY){bid_ask=MarketInfo( "USDJPY" ,MODE_BID);}

Yalnızca . . .

   if ((OrderStopLoss()!= 0 )&&(OrderTakeProfit()!= 0 ))       

ancak TP ve SL'den bağımsız olarak her zaman bu kod satırını ve onu takip eden tüm kodu yürüteceksiniz?

   if (OrderType()==OP_SELL){bid_ask=MarketInfo( "USDJPY" ,MODE_ASK);} 

MarketInfo() çağrılarınız hala yanlış. . . nedenini öğrenmek için belgelere bakın.

 

Simon,


Sorunu çözmedin, üzerinde çalıştın...

Hangi sorunu henüz çözmediğimi düşünüyorsun?


Hala USDJPY Bilet numarasını yazdırmıyorsunuz...

Bilet numarası sipariş edin.



MarketInfo() çağrılarınız işe yarasalar bile yanlış. . .

MetaEditor sözlüğü MarketInfo() fonksiyon örneği:

Örneklem:

 // MarketInfo() function example;

   double bid   = MarketInfo( "EURUSD" ,MODE_BID);
   double ask   = MarketInfo( "EURUSD" ,MODE_ASK);
   double point =MarketInfo( "EURUSD" ,MODE_POINT);
   int     digits=MarketInfo( "EURUSD" ,MODE_DIGITS);
   int     spread=MarketInfo( "EURUSD" ,MODE_SPREAD);

İşte OrderClose() fonksiyon kodu bloğumun bir örneği:

 // OrderClose() function code block example;

   if ((OrderStopLoss()!= 0 )&&(OrderTakeProfit()!= 0 ))       
   if (OrderType()==OP_BUY){bid_ask= MarketInfo( "USDJPY" ,MODE_BID); }
   if (OrderType()==OP_SELL){bid_ask= MarketInfo( "USDJPY" ,MODE_ASK); }           
   if (( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)== true )&&(OrderSymbol()== "USDJPY" ))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask, 3 , CLR_NONE );
       Print (OrderCloseTime());
       GetLastError ();
     }

OrderClose() işlev kodu örnek biçimimde neyin yanlış olduğuna inanıyorsunuz? MetaEditor sözlüğü tarafından sağlanan 'MarketInfo()' örneğiyle neredeyse aynı görünüyor.


Ve buna ek olarak . . .


bu ne anlama geliyor? Bu kod satırından beklentiniz nedir? Lütfen belgelerine bakmadan cevap verin.

 GetLastError ();

GetLastError() işlevi, testleri çalıştırırken 'Uzmanlar' sayfasına bir hata yazdırır. İşlev hata bulamazsa sıfır (0) yazdırılır. Yukarıda verdiğim anlık görüntüde basılan sıfıra dikkat edin.


Son kod bloğunda, neden bu kod satırını yürütmek istiyorsunuz? . . .

 if (OrderType()==OP_BUY){bid_ask=MarketInfo( "USDJPY" ,MODE_BID);}

Yalnızca . . .

 if ((OrderStopLoss()!= 0 )&&(OrderTakeProfit()!= 0 ))

ancak TP ve SL'den bağımsız olarak her zaman bu kod satırını ve onu takip eden tüm kodu yürüteceksiniz?

 if (OrderType()==OP_SELL){bid_ask=MarketInfo( "USDJPY" ,MODE_ASK);}


Evet, bunu gündeme getirmenize sevindim çünkü bunu yapmanın ardındaki mantığı açıklayacağım.

"/* - */" çok satırlı yorumlar kullanılarak program yürütmesinden diğer tüm kod blokları çıkarılırsa ve Start() ve Return(0) işlevleri içinde kalan yalnızca iki kod bloğu...

   int i;
   double bid_ask,
          OM_Param_3,
          OM_Param_4;

// code block 1;   

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

// code block 2;

   if ((OrderStopLoss()== 0 )&&(OrderTakeProfit()== 0 ))
   if (( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)== true )&&(OrderSymbol()== "USDJPY" ))   
     {
       Print (OrderTicket());     
       GetLastError ();
     }

ikinci kod bloğunun altında işlev çağrısı bulunur:

     {
       Print (OrderTicket());     
       GetLastError ();
     }

Print() işlevi, sayıyı uzmanlar bölmesine süresiz olarak yazdırmaya devam eder ve yazdırmaya devam eder. Eklersem inanırdım...

 if ((OrderStopLoss()== 0 )&&(OrderTakeProfit()== 0 ))

Print() işlevi yalnızca bir kez yürütülecektir, çünkü bunun hemen altındaki OrderModify() işlevi yürütüldüğünde, SL ve TP artık sıfır olmayacak ve Print() işlevinin yüklenmesine neden olacaktır.

Şimdi, bir programın nasıl yürütüldüğü nedeniyle durumun böyle olmadığını anlıyorum. Bir programın yukarıdan aşağıya yürütüldüğünü anlıyorum, bu nedenle program tüm döngüsünü ilk kez bitirdiğinde yukarıdan aşağıya yeniden yürütmeye çalışacak ve olmadığı için bileti 'Uzmanlar' bölmesine yazdıramayacaktır. USDJPY döviz çiftinde bir emir.


Teşekkür ederim.

 
WhooDoo22 :

Simon,


Sorunu çözmedin, üzerinde çalıştın...

Hangi sorunu henüz çözmediğimi düşünüyorsun?

while döngünüzü kodlama şeklinizden kaynaklanan temel sorun. . . OrderClose işlevi için Geçersiz bilete ve OrderModify için Bilinmeyen bilet 2'ye neden olan sorunu çözmediniz, çünkü belirtiyi ele aldınız.

VayDoo22 :

MarketInfo() çağrılarınız işe yarasalar bile yanlış. . .

MetaEditor sözlüğü MarketInfo() fonksiyon örneği:


Üzgünüm, benim hatam, bu sorunu düzelttiniz. . . Bahsettiğim sorunun ne olduğunu biliyor musun?

VayDoo22 :

Simon,

bu ne anlama geliyor? Bu kod satırından beklentiniz nedir? Lütfen belgelerine bakmadan cevap verin.

GetLastError() işlevi, testleri çalıştırırken 'Uzmanlar' sayfasına bir hata yazdırır. İşlev hata bulamazsa sıfır (0) yazdırılır. Yukarıda verdiğim anlık görüntüde basılan sıfıra dikkat edin.


Hayır, GetLastError() günlüğe yazdırmaz. . . "İşlev son oluşan hatayı döndürür, ardından son hata kodunun saklandığı özel last_error değişkeninin değeri sıfırlanır. Böylece GetLastError() için bir sonraki çağrı 0 döndürür."

Resminizdeki 0 muhtemelen . . .

 Print (OrderCloseTime());

. . . ve artık Emir havuzunda olmadığı için Emir artık seçilmediğinden bir hatadır, çünkü artık kapatılmıştır ve Geçmiş havuzundadır. yapmaya çalıştığınız şeyi yapmak için böyle bir şeye ihtiyacınız olacak. . .

   if ((OrderStopLoss()!= 0 )&&(OrderTakeProfit()!= 0 ))       
   if (OrderType()==OP_BUY){bid_ask=MarketInfo( "USDJPY" ,MODE_BID);}
   if (OrderType()==OP_SELL){bid_ask=MarketInfo( "USDJPY" ,MODE_ASK);}           
   if (( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)== true )&&(OrderSymbol()== "USDJPY" ))
     {
       int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask, 3 , CLR_NONE );
      
       OrderSelect (ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

       Print (OrderCloseTime());
       GetLastError ();
     }

. . . . bu iki satırı ekleyin ve deneyin.

VayDoo22 :

Print() işlevi, sayıyı uzmanlar bölmesine süresiz olarak yazdırmaya devam eder ve yazdırmaya devam eder. Eklersem inanırdım...

 if ((OrderStopLoss()== 0 )&&(OrderTakeProfit()== 0 ))

Print() işlevi yalnızca bir kez yürütülecektir, çünkü bunun hemen altındaki OrderModify() işlevi yürütüldüğünde, SL ve TP artık sıfır olmayacak ve Print() işlevinin yüklenmesine neden olacaktır.

Şimdi, bir programın nasıl yürütüldüğü nedeniyle durumun böyle olmadığını anlıyorum. Bir programın yukarıdan aşağıya yürütüldüğünü anlıyorum, bu nedenle program tüm döngüsünü ilk kez bitirdiğinde yukarıdan aşağıya yeniden yürütmeye çalışacak ve olmadığı için bileti 'Uzmanlar' bölmesine yazdıramayacaktır. USDJPY döviz çiftinde bir emir.

Sanırım amacımı kaçırıyorsun. . . biraz parantez eklersem belki daha net olur. . . bunu yaptın . . .

   if ((OrderStopLoss()!= 0 )&&(OrderTakeProfit()!= 0 ))       
       {
       if (OrderType()==OP_BUY){bid_ask=MarketInfo( "USDJPY" ,MODE_BID);}
       }

   if (OrderType()==OP_SELL){bid_ask=MarketInfo( "USDJPY" ,MODE_ASK);}           
   if (( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)== true )&&(OrderSymbol()== "USDJPY" ))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask, 3 , CLR_NONE );
       Print (OrderCloseTime());
       GetLastError ();
     }

. . . bunu mu yapmak istedin

   if ((OrderStopLoss()!= 0 )&&(OrderTakeProfit()!= 0 ))       
       {
       if (OrderType()==OP_BUY){bid_ask=MarketInfo( "USDJPY" ,MODE_BID);}
       if (OrderType()==OP_SELL){bid_ask=MarketInfo( "USDJPY" ,MODE_ASK);}           
       if (( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)== true )&&(OrderSymbol()== "USDJPY" ))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask, 3 , CLR_NONE );
         Print (OrderCloseTime());
         GetLastError ();
         }
       )
 
WhooDoo22 :

Simon,

Hala USDJPY Bilet numarasını yazdırmıyorsunuz...


İhtiyaç şuydu. . . "Bilet numarasını "USDJPY için bilet numarası = "" biçimindeki günlüğe yazdırın

 

Simon,


while döngünüzü kodlama şeklinizden kaynaklanan temel sorun. . . OrderClose işlevi için Geçersiz bilete ve OrderModify için Bilinmeyen bilet 2'ye neden olan sorunu çözmediniz, çünkü belirtiyi ele aldınız.

Bu konuyu sizinle en ince ayrıntısına kadar tartışmak istiyorum, düşüncelerimi başka noktalardan uzaklaşmadan sorunu çözmeye odaklamama izin veriyor.


Üzgünüm, benim hatam, bu sorunu düzelttiniz. . . Bahsettiğim sorunun ne olduğunu biliyor musun?

Evet, gündeme getirdiğiniz için teşekkürler!


"İşlev son oluşan hatayı döndürür, ardından son hata kodunun depolandığı özel last_error değişkeninin değeri sıfırlanır. Böylece GetLastError() için bir sonraki çağrı 0 döndürür."

MetaEditor sözlüğü şunları okur:

int GetLastError ( )
İşlev, en son oluşan hatayı döndürür, ardından son hata kodunun saklandığı özel last_error değişkeninin değeri sıfırlanır. Bu nedenle, GetLastError() için sonraki çağrı 0 döndürür.

Bu fonksiyon en son oluşan hatayı döndürür , ardından son hata kodunun saklandığı özel son hata değişkeninin değeri sıfırlanır...

Yeşil anlaşılır , sarı anlaşılmaz .


. . . . bu iki satırı ekleyip deneyin.

   if ((OrderStopLoss()!= 0 )&&(OrderTakeProfit()!= 0 ))       
   if (OrderType()==OP_BUY){bid_ask=MarketInfo( "USDJPY" ,MODE_BID);}
   if (OrderType()==OP_SELL){bid_ask=MarketInfo( "USDJPY" ,MODE_ASK);}           
   if (( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)== true )&&(OrderSymbol()== "USDJPY" ))
     {
       int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask, 3 , CLR_NONE );
      
       OrderSelect (ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

       Print (OrderCloseTime());
       GetLastError ();
     }

Yapacak.


Sanırım amacımı kaçırıyorsun. . . biraz parantez eklersem belki daha net olur. . . bunu yaptın . . .

Bunu yapmak istediğime inanıyorum...

   if ((OrderStopLoss()!= 0 )&&(OrderTakeProfit()!= 0 ))       
       {
       if (OrderType()==OP_BUY){bid_ask=MarketInfo( "USDJPY" ,MODE_BID);}
       if (OrderType()==OP_SELL){bid_ask=MarketInfo( "USDJPY" ,MODE_ASK);}           
       if (( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)== true )&&(OrderSymbol()== "USDJPY" ))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask, 3 , CLR_NONE );
         Print (OrderCloseTime());
         GetLastError ();
         }
      }

Çünkü bu şartı diledim...

 if ((OrderStopLoss()!= 0 )&&(OrderTakeProfit()!= 0 ))

kodun parantez içindeki bölümüne (" { } ") uygulanacak.


İhtiyaç şuydu. . . "Bilet numarasını "USDJPY için bilet numarası = "" biçimindeki günlüğe yazdırın

Yapılabilir.


Teşekkür ederim.

 
WhooDoo22 :


"İşlev son oluşan hatayı döndürür, ardından son hata kodunun depolandığı özel last_error değişkeninin değeri sıfırlanır. Böylece GetLastError() için bir sonraki çağrı 0 döndürür."

MetaEditor sözlüğü şunları okur:

int GetLastError ( )
İşlev, en son oluşan hatayı döndürür, ardından son hata kodunun saklandığı özel last_error değişkeninin değeri sıfırlanır. Bu nedenle, GetLastError() için sonraki çağrı 0 döndürür.

Bu fonksiyon en son oluşan hatayı döndürür , ardından son hata kodunun saklandığı özel son hata değişkeninin değeri sıfırlanır...

Yeşil anlaşılır , sarı anlaşılmaz .

Tamam, Belgelerden de görebileceğiniz gibi GetLastError() hiçbir şey yazdırmaz. . . sadece hata numarasını döndürür . . . yani onu kullanmak için onunla bir şeyler yapmalısın. . .

 Print ( "The last error was error number: " , GetLastError ());

//  or . . .

int ErrorNumber = GetLastError ();

//  or . . .

if ( GetLastError () == 130 )

GetLast Error()'u çağırdığınızda, hatayı döndürür ve ardından son hatayı tutmak için dahili olarak kullandığı değişkeni sıfırlamak için siler. . . yani bunu yaptıysanız. . .

OrderDelete(- 1 );   //  should produce an error 4108 or 3

Print ( "Last error was number " , GetLastError ());     //  should print - Last error was number 4108

Print ( "Last error was number " , GetLastError ());     //  should print - Last error was number 0  the previous call cleared the GetlastError internal variable
 

GetLastError()'a yapılan 2. çağrı, ilk çağrı hata numarasını tutan değişkeni sıfırladığı için 0 döndürür. . . ayrıca yalnızca en son hatanın tutulduğunu unutmayın.

 
WhooDoo22 :


Sanırım amacımı kaçırıyorsun. . . biraz parantez eklersem belki daha net olur. . . bunu yaptın . . .

Bunu yapmak istediğime inanıyorum...

Çünkü bu şartı diledim...

kodun parantez içindeki bölümüne (" { } ") uygulanacak.

Ama yapmadın. . . tasarımınızda gözden kaçırdınız, kodladığınızda kaçırdınız, sonra kodunuzu okuduğunuzda kaçırdınız ve demek istediğinizi yapıp yapmadığını kontrol ettiniz, sonra test ettiğinizde kaçırdınız. . . . Diş telleri, avucunuzun içi gibi bilmeniz gereken temel şeylerden biridir.

Bunu neden kaçırdığınızı anlamanız ve bu sorunu çözmeniz gerekir. . . Sizin yerinize kodlamaları için onlara ödeme yapmak istemediğiniz sürece, başka hiç kimse bunu sizin için yapamaz.

 

Simon,


Resminizdeki 0 muhtemelen . . .

 Print (OrderCloseTime());


Hayır! ;)

Dokümantasyon şeridinde bir yolculuğa çıkalım mı? Hahaha.

tarihsaat OrderCloseTime ( )
Halihazırda seçili olan sipariş için kapanış zamanını döndürür. Emir kapanış saati 0 değilse emir seçilmiş ve kapatılmış ve hesap geçmişinden alınmıştır. Açık ve bekleyen emirlerin kapanma süresi 0'a eşittir.

Not: Sıra, OrderSelect() işlevi tarafından önceden seçilmelidir.


İlk olarak, ikimiz de son zamanlarda kodladığım OrderClose() fonksiyon kod bloğuna bir göz atalım...

   if ((OrderStopLoss()!= 0 )&&(OrderTakeProfit()!= 0 ))       
   if (OrderType()==OP_BUY){bid_ask=MarketInfo( "USDJPY" ,MODE_BID);}
   if (OrderType()==OP_SELL){bid_ask=MarketInfo( "USDJPY" ,MODE_ASK);}
   if (( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)== true )&&(OrderSymbol()== "USDJPY" ))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask, 3 , CLR_NONE );
       Print (OrderCloseTime());
     }

Ardından, 'Uzmanlar' bölmesinin bir anlık görüntüsünde gösterilen sonuca bir göz atalım...

&#39;Uzmanlar&#39; bölmesi sonucu.

Aaah, elimizde ne var? :)


Lütfen yeni eklenen uzman danışman için bir yanıt gönderin. Henüz egzersizinizin içerdiği tüm kriterleri karşılıyor mu?


while döngünüzü kodlama şeklinizden kaynaklanan temel sorun. . . OrderClose işlevi için Geçersiz bilete ve OrderModify için Bilinmeyen bilet 2'ye neden olan sorunu çözmediniz, çünkü belirtiyi ele aldınız.

Bu konuyu sizinle en ince ayrıntısına kadar tartışmak istiyorum, düşüncelerimi başka noktalardan uzaklaşmadan sorunu çözmeye odaklamama izin veriyor.


Teşekkür ederim.