Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 115

 

İnsanların böyle bir sorusu var - bir değişkenin değerlerini tek boyutlu bir diziye nasıl koyabilirim?

Yardıma göndermeyin - benzer bir görev için HİÇBİR örnek yoktur.


Diyelim ki belirli koşullar altında değişen bir a değişkeni var.

Diziye yazılması için bu değişkenin son 3 değerine ihtiyacım var. mql4'te nasıl uygulanır?


int mas[3] yazıyorum;

kütle[]=a; bir değişikliğin olduğu koşuldan sonra döngü içinde,

ama mantıklı olması gerektiği halde nifiga çalışmıyor. derleyici ']' - ifade bekleniyor, parantez içindeki mas[]=a içine bilinmeyen bir ifade koymamı istiyor.

MQL4'te, döngünün her yinelemesinde diziyi değişkenin değeriyle dolduracak herhangi bir işlev var mı?


 
Igor Makanu :

Yazışmanın başlangıcını bulamadığım için özür dilerim, ancak bunlarda karmaşık koşullardan ve hesaplamalardan kaçınmanızı derhal tavsiye etmek istiyorum - bu, kodu okunamaz hale getirir ve sonuç olarak mantıksal hataları aramayı zorlaştırır, bunun gibi kod:

Neyin tehlikede olduğunu anlıyorsanız o zaman verdiğim kodu biraz daha değiştirebilirsiniz, onu ayrı bir duruma taşımaktan bahsediyorum if ( OrderType () == OP_BUY....

o zaman mantıksal hataları bulmak çok daha kolay olacak, IMHO

Her OrderSend'den sonra ekle => iade

veya switch ile bir seçim yapın:

 switch ( OrderType () )
{ OP_BUY : { if ( 1 ) { .... break ; }
             if ( 2 ) { .... break ; }
           }
   OP_SELL : { if ( 3 ) { .... break ; }
               if ( 4 ) { .... break; }
            }
}
 
Vladimir Tkach :

deniyorum ve çalışmıyor.

özel gösterge çağrısında birkaç giriş parametreniz var - Morning Flat göstergesinde kaç tane harici değişken olduğunu sayın? (harici) - bu, iCustom'u kullanırken iletmeniz gereken aynı sayıda parametredir

 
John Smith :
.....

int mas[3]=a; bir değişikliğin olduğu koşuldan sonra döngü içinde,

ama mantıklı olması gerektiği halde nifiga çalışmıyor.

Tüm eylemleri bir kerede değil, adım adım yapmayı öğrenin.

Misal :

 int mas[ 3 ]={ 0 }; // инициализация масива 

.....           // основной код
if ( найдена новая величина а )
{ mas[ 2 ]=mas[ 1 ];   // самая старая величина а
  mas[ 1 ]=mas[ 0 ];
  mas[ 0 ]=a;       // новая величина а
}
.....           // основной код
 
Igor Makanu :

özel gösterge çağrısında birkaç giriş parametreniz var - Morning Flat göstergesinde kaç tane harici değişken olduğunu sayın? (harici) - bu, iCustom'u kullanırken iletmeniz gereken aynı sayıda parametredir

Hepsini çoktan geçtim.

Sorunu farklı bir şekilde çözdü. Göstergeden fiyat hesaplama kodunu Expert Advisor'a ekledim.

 
Igor Makanu :

tam olarak budur - kodun mantığı aynıdır, sadece koşulları bölerseniz, mantıksal hatanın nerede olduğunu çabucak bulacaksınız, sizin durumunuzda, eğer çıkarırsanız:

ayrı bir koşulda, kod optimizasyonu elde ederiz - koşul, örneğinizdeki gibi 4 kez değil, bir kez kontrol edilecektir.

Çıktıyı uzman günlüğüne şu şekilde gönderin:

kodun hangi bölümünün yürütüldüğünü ve hangi parametrelerle yürütüldüğünü görmek için günlükler yazmak

Cevap için teşekkürler. Koşulları sınırına kadar ezdim. Mantığını yorumlarla kontrol ettim. İlk açık pozisyonu kapatma şartlarına göre pozisyonların kapatıldığı ortaya çıktı. Yani, önce kapanma koşulu 1 olan bir AL veya HÜCRE açtıysanız ve ardından ikinci bir benzer pozisyon açıldı, ancak kapanma koşulu 2 ile bu kapatma koşulu yok sayılır ve diğer sihire rağmen ikinci konum yok sayılır. , ayrıca koşul 1'e göre kapalıdır Ve ne yapmalı?

 
Vladimir Tkach :

Hepsini çoktan geçtim.

Sorunu farklı bir şekilde çözdü. Göstergeden fiyat hesaplama kodunu Expert Advisor'a ekledim.

peki, demek oluyor ki, iCustom() öğesini doğru bir şekilde çağırmadığınızı fark ettim, şöyle olmalıydı:

min= iCustom ( Symbol (), 0 , "Morning Flat" ,StartHour,EndHour,TargetLevel,UpColor,DnColor,TargetUpColor,TargetDnColor, 1 , 0 );

Göstergeyi çağırırken 7 parametreyi geçiyorum ve sen 3 parametre ile aradın

Gösterge çağrısını bırakırdım, ancak göstergenin kendisini değiştirirdim - gösterge kodundaki gereksiz harici değişkenleri ve grafik nesneleri kaldırırdım


novichok2018 :

Mantığını yorumlarla kontrol ettim. İlk açık pozisyonu kapatma şartlarına göre pozisyonların kapatıldığı ortaya çıktı.

tebrikler! Doğru yoldasınız, ancak hata ayıklama aşamasında bir yorum (Cometn() ) yerine günlüğe çıktı almak (Print()) daha iyidir

kodu göster

 
Igor Makanu :

peki, demek oluyor ki, iCustom() öğesini doğru bir şekilde çağırmadığınızı fark ettim, şöyle olmalıydı:

Göstergeyi çağırırken 7 parametreyi geçiyorum ve sen 3 parametre ile aradın

Gösterge çağrısını bırakırdım, ancak göstergenin kendisini değiştirirdim - gösterge kodundaki gereksiz harici değişkenleri ve grafik nesneleri kaldırırdım


tebrikler! Doğru yoldasınız, ancak hata ayıklama aşamasında bir yorum (Cometn() ) yerine günlüğe çıktı almak (Print()) daha iyidir

kodu göster

 int total= OrdersTotal ();
       for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
         {
         if ( TimeCurrent ()> OrderOpenTime ()+ 100 )
           { 
             if ( OrderType ()== OP_BUY )
              {
               if ( OrderMagicNumber == 101 )
                 {
                 if ( MathAbs (WPR1)< 5 )
                 rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_BID ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow); 
                 }
               if ( OrderMagicNumber == 111 )
                 {
                   if ( MathAbs (WPR1)< 20 ) 
                  rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_BID ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow);
                 }
              }
                 
             if ( OrderType ()== OP_SELL )
              {
               if ( OrderMagicNumber == 222 )
                 {
                   if ( MathAbs (WPR1)> 97.55 )
                  rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_ASK ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow); 
                 }
               if ( OrderMagicNumber == 201 )
                 {
                   if ( MathAbs (WPR1)> 96 )
                  rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_ASK ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow);
                 } 
              }
            }               
         }
       continue ;  
      }   

Kaldırılan baskılar.

 
novichok2018 :

Kaldırılan baskılar.

Kodunuzun tüm mantığını bilmiyorum, ancak her sipariş kapanışından sonra kesinlikle döngüden çıkmanız gerekiyor; ve bir sonraki onay işaretinde, koşullarınız için siparişleri tekrar kontrol edin - Sipariş kapatıldıktan sonra OrderSelect()'in nasıl davrandığını bilmiyorum - sipariş kapalıysa, o zaman aynı seçilen nedir? yoksa bir hata mı olacak?

Burada, prensipte sorununuz, her şeyi bir kerede kontrol etmek ve kapatmak istemenizdir, birkaç çözüm vardır:

değiştirmek()

veya bir fonksiyonda sipariş kapanışını düzenleyin (siparişler için hazır fonksiyonlar vardır https://www.mql5.com/en/forum/131859/page2#434206)

veya kodunuzdaki bir siparişi kapattıktan sonra ara kullanın

Полезные функции от KimIV
Полезные функции от KimIV
  • 2008.03.11
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 
Igor Makanu :

Kodunuzun tüm mantığını bilmiyorum, ancak her sipariş kapanışından sonra kesinlikle döngüden çıkmanız gerekiyor; ve bir sonraki onay işaretinde, koşullarınız için siparişleri tekrar kontrol edin - Sipariş kapatıldıktan sonra OrderSelect()'in nasıl davrandığını bilmiyorum - sipariş kapalıysa, o zaman aynı seçilen nedir? yoksa bir hata mı olacak?

Burada, prensipte sorununuz, her şeyi bir kerede kontrol etmek ve kapatmak istemenizdir, birkaç çözüm vardır:

değiştirmek()

veya bir fonksiyona sipariş kapatma işlemi yapın (siparişler için hazır fonksiyonlar vardır https://www.mql5.com/ru/forum/107476 )

veya kodunuzdaki bir siparişi kapattıktan sonra ara kullanın

Teşekkür ederim. mola yardımcı gibi görünüyordu. Bakalım bundan sonra ne olacak.