Kütüphaneler: IsNewBar

 

IsNewBar:

Bir çubuk değişikliğinin ne zaman gerçekleştiğini belirlemek için CIsNewBar sınıfı.

Author: Nikolay Kositsin

 
Profesyonel değilim ama bu kodun yanlış olduğunu düşünüyorum. Recount değişkeni her zaman doğrudur. Bu nedenle, her tik yeni bir çubuk olarak ele alınacaktır. Bu değişken neden orada? Neden CopyClose çağrılıyor? Gönderilen kodlar doğru işlem için kontrol edildi mi? Eğer yanılıyorsam, lütfen düzeltin ve açıklayın.
 
lordlev:
Profesyonel değilim ama bu kodun yanlış olduğunu düşünüyorum. Recount değişkeni her zaman doğrudur. Bu nedenle, her tik yeni bir çubuk olarak ele alınacaktır. Bu değişken neden orada? Neden CopyClose çağrılıyor? Gönderilen kodlar doğru işlem için kontrol edildi mi? Eğer yanılıyorsam, lütfen düzeltin ve açıklayın.
Her şeyi tekrar kontrol ettim ve bir hata buldum. Ekli dosyanın kendisinde Recount'un false olarak atanması yok, ancak örnek kodda her şey doğru.
 
lordlev:
Her şeyi tekrar kontrol ettim ve bir hata buldum. Ekli dosyanın kendisinde Recount'un false olarak atanması yok, ancak örnek kodda her şey doğru.
Peki, düzeltilebilir!
 

Belki yanılıyorum ama bence doğru yol bu.

if(TNew>m_TOld)

Aksi takdirde sayfalama (geçmiş düzenleme) sırasında yanlış olacaktır.

Bunun ne olduğunu ve bu kontrolün neden eklendiğini açıklayabilir misiniz?

if(...  && TNew)

Ben anlamadım. Bu koşul ne zaman doğru, ne zaman yanlıştır? Teşekkür ederim

 
Prival:

Bunun ne olduğunu ve bu kontrolün neden eklendiğini açıklayabilir misiniz?

Bunu anlamıyorum. Bu koşul ne zaman doğru ve ne zaman yanlıştır? Teşekkür ederim

Imho, TNew'nin m_TOld'a eşit olmadığını ve aynı zamanda sıfıra eşit olmadığını kontrol eder (yani D'1970.01.01.01 00:00:00:00')....

İkinci koşul, yine imho, fonksiyonun

datetime TNew=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));

sıfırdan farklı bir şey döndürdü...

Şimdi betiği bu fonksiyonla çalıştırdım - bana tam olarak 0 döndürdü. Belki de hafta sonu olduğu içindir.

 
Prival:

Bunun ne olduğunu ve bu kontrolün neden eklendiğini açıklayabilir misiniz?

Bunu anlamıyorum. Bu koşul ne zaman doğru ve ne zaman yanlış? Teşekkür ederim.

Sıfır kontrolü, başlangıçta ve koşulun ilk kontrolünde yeni bir çubuğun başlangıcını (açılışından bu yana ne kadar zaman geçmiş olursa olsun) almaktan kaçınmak için gereklidir.
 
Prival:

Belki yanılıyorum ama bence doğru yol bu.

Aksi takdirde, sayfalama (geçmiş düzenleme) sırasında çalışma yanlışlığı olacaktır.

Bunun ne olduğunu ve bu kontrolün neden eklendiğini açıklayabilir misiniz?

Anlamıyorum. Bu koşul ne zaman doğru, ne zaman yanlış? Teşekkür ederim.

Bunu bir önlem olarak yapmanın daha mantıklı olacağını düşünüyorum.

if(TNew>m_TOld && TNew)

TNew geçmiş değiştirildiğinde hala sıfır olmasına rağmen. TNew değişkenine herhangi bir zamanda sıfır girebilir, bu nedenle her zaman sıfır olup olmadığını kontrol etmelisiniz.

 
Automated-Trading:

IsNewBar:

Yazar Nikolay Kositsin

Sınıfınızda küçük bir hata var( kodu gördüğümçoğu fonksiyonda olduğugibi ). IsNewBar yöntemini ilk kez çağırdığınızda, gerçek bir yeni çubuğunvarlığına bakılmaksızın her zaman true değerini döndürüyor .

Ancak böyle bir fonksiyon statik bir değişken içerir ve bu nedenle bu fonksiyonun birkaç çağrısını kullanamayız.

Son çubuğun açık kalma süresini tutmak için iki boyutlu bir dizi de kullanılabilir.

 
Herhangi bir statik değişken olmadan CIsNewBar'ın alternatif bir versiyonunu yaptım. Sadece Tick.time_msc'yi idempotent bir fonksiyon yapmak için kullandım:


class CIsNewBar{
private:
   long checkedMs;
   datetime lastBarOpenedAt;
   bool lastValue;
   CTickUtils tickUtils;
public:
   CIsNewBar(){}
   ~CIsNewBar(){}

   bool isNewBar(){
      MqlTick tick;
      SymbolInfoTick(_Symbol, tick);
      long tickMs = tick.time_msc;

      
      if(checkedMs >= tickMs){ //bu işlevi bu tik üzerinde zaten işlediniz mi?
         return lastValue;     //so, tamponlanmış değeri döndür
      }

      datetime time[1];
      CopyTime(_Symbol, _Period, 0, 1, time);


      if(lastBarOpenedAt != time[0]){
         lastBarOpenedAt = time[0];
         lastValue = true;
      } else {
         lastValue = false;
      }

      checkedMs = tickMs;
      return lastValue;
   }
 

Bunun yukarıda belirtilen sorunları çözen hızlı ve hafif bir sınıf olduğunu düşünüyorum.

Bu sürüm:

  • .isNewBar() fonksiyonu ilk kez çağrıldığında yanlış uyarı vermeyecektir.
  • Statik değişkenler kullanmadan fonksiyonun her çağrılışında yeni değişkenlerin sürekli olarak yeniden oluşturulmasını ortadan kaldırır, bu da yürütmeyi hızlandırır.
  • çubuk başına yalnızca bir kez true döndürür.
  • hafif bir bellek ayak izine sahiptir.
class CIsNewBar{
        private:
                datetime lastBarOpenedAt;
                datetime time[1];
        public:
                CIsNewBar(){CopyTime(_Symbol, _Period, 0, 1, time);lastBarOpenedAt = time[0];}
                ~CIsNewBar(){}
                bool isNewBar(){
                        CopyTime(_Symbol, _Period, 0, 1, time);
                        if(lastBarOpenedAt < time[0]){
                                lastBarOpenedAt = time[0];
                                return(true);
                                }
                        else { return(false);}
                        }
        };

Sınıfı uygulamak için:

CIsNewBar someName;

void OnTick(){
        if(someName.isNewBar()){
                /// Yeni çubuk olay işleyicisini çağır veya
                /// Yeni çubuk için çalışma yapın. 
                }
        }
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5