Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1332

 
Mikhail Tkachev :

Belgeler ve forum aracılığıyla kazıldı ...
Aşağıdaki satırla OnInit() içinde oluşturulmuşlarsa, nesne işaretçi türünün genel değişkenleri [var örneğinde] nasıl yapılır:

dahası, yapıcıların nesne ve parametrelerinin sayısı önceden bilinmez ve OnInit() ?

Kolayca.

CObj* var1 = NULL ;
CObj* var2 = NULL ;
CObj* var3 = NULL ;

int OnInit ()
{
   var1 = new CObj( p1, p2, p3 );
   var2 = new CObj( p1, p2, p3 );
   var3 = new CObj( p1, p2, p3 );
}
 

Merhaba

MT5'in artı düğmesi var

grafiğe tıkladığınızda kaç çubuk, kaç puan ve yüzde bilgisini gösterir.

robota bağlayabilmeniz için bu değeri doğru bir şekilde nasıl hesaplayacağınıza yardımcı olun

Teşekkür ederim

 
Artyom Trishkin :

Zaten yeni bir bar sınıfı var mı?

Ve giriş parametreleri tam olarak neye benziyor?

Sınıf şu siteden ödünç alınmıştır: https://www.mql5.com/en/code/768 , küçük değişiklikler yapılmıştır.

 //+------------------------------------------------------------------+
//|                                                     IsNewBar.mqh |
//|                               Copyright © 2011, Nikolay Kositsin |
//|                              Khabarovsk,   farria@mail.redcom.ru | 
//+------------------------------------------------------------------+ 
#property copyright "2011,   Nikolay Kositsin"
#property link        "farria@mail.redcom.ru"
#property version    "1.00"
//+------------------------------------------------------------------+
//|  Алгоритм определения момента появления нового бара              |
//| Для каждого таймфрейма каждого символа нужно создавать объект    |
//+------------------------------------------------------------------+  
#include <Object.mqh>

class CIsNewBar : public CObject // Сделан наследником класса для возможности работы с классом CArrayObj (из библиотеки)
// class CIsNewBar   // Первоначальная редакция
  {
   //----
public :

       //---- функция определения момента появления нового бара
   bool IsNewBar()
     {
       //---- получим время появления текущего бара
       datetime TNew= datetime ( SeriesInfoInteger (m_Symbol,m_TimeFrame, SERIES_LASTBAR_DATE ));

       if (TNew!=m_TOld && TNew) // проверка на появление нового бара
        {
         m_TOld=TNew;
         return ( true ); // появился новый бар!
        }
       //----
       return ( false ); // новых баров пока нет!
     };

   //---- конструктор класса    
                     CIsNewBar( const string &pSymbol, const ENUM_TIMEFRAMES pTimeFrame){
                        m_Symbol=pSymbol; m_TimeFrame=pTimeFrame;
                        m_TOld=- 1 ;};

protected :
   datetime           m_TOld;         // Время хранится 
   ENUM_TIMEFRAMES    m_TimeFrame;   //    для каждого таймфрейма
   string             m_Symbol;       //    каждого символа

   //---- 
  };
//+------------------------------------------------------------------+

Aşağıdaki şekilde uygulanması amaçlanmıştır:

 int OnInit ()
{
    // Переменная NB_M1 - объект для контроля нового бара по символу currSymbol для таймфрейма M1

    CIsNewBar* NB_M1= new CIsNewBar(currSymbol, PERIOD_M1 );
}

void OnTick ()
{
     if (NB_M1.IsNewBar())   // (1) Если появился новый бар M1
        {....}
    ......
}
 
Koldun Zloy :

Kolayca.

Cevap için teşekkürler)
İlk başta sadece bunu yaptım.
Böylece nesne, yapıcı tarafından parametrelerle birlikte, önce boş, sonra beklendiği gibi iki kez oluşturulur.
Ama ... Aynı zamanda, derleyici OnInit() içindeki satırda bir uyarı görüntüler:

'var1' bildirimi, OnInit() içindeki satır başına global değişkeni -> gizler
önceki 'var1' beyanına bakın

Yani yerel bir değişken global olanı gizler... ve ne olur?
O zaman başka bir işlev, örneğin OnTick() tarafından hangi değişken görülüyor? Global =NULL'umuz var, yerel olan doğru şekilde başlatıldı, ancak başka bir işlev onu göremiyor ...

 
Mikhail Tkachev :

Sınıf şu siteden ödünç alınmıştır: https://www.mql5.com/ru/code/768 , küçük değişiklikler yapılmıştır.

Aşağıdaki şekilde uygulanması amaçlanmıştır:

Giriş parametrelerinden tüm alt dizileri çıkarmanız, bunları sembollerin adlarını ve bunlara karşılık gelen zaman çerçevelerini yapmak için kullanmanız gerekir.

Ardından, bu listelerden yeni çubuk nesneleri oluşturun ve işaretçiyi, global düzeyde bildirilen CArrayObj'de oluşturulan her "Yeni çubuk" nesnesine yerleştirin.

Ayrıca - OnTimer()'da bu listedeki bir döngüde, içindeki bir sonraki nesneye bir işaretçi alın ve yeni bir çubuğun varlığını kontrol edin. Değilse bir sonrakine geçiyoruz, varsa yeni bir bar açarken yapılması gerekeni yapıyoruz.

Zamanlayıcıyı ihtiyaçlarınıza göre - milisaniye, saniye, dakika - genel olarak, geçerli olmayan bir sembol üzerindeki yeni bir çubuğa tepki vermek için yeterli olduğunu düşündüğünüz sıklıkta yapın.

 
Mikhail Tkachev :

Cevap için teşekkürler)
İlk başta sadece bunu yaptım.
Böylece nesne, yapıcı tarafından parametrelerle birlikte, önce boş, sonra beklendiği gibi iki kez oluşturulur.
Ama ... Aynı zamanda, derleyici OnInit() içindeki satırda bir uyarı görüntüler:

'var1' bildirimi, OnInit() içindeki satır başına global değişkeni -> gizler
önceki 'var1' beyanına bakın

Yani yerel bir değişken global olanı gizler... ve ne olur?
O zaman başka bir işlev, örneğin OnTick() tarafından hangi değişken görülüyor? Global =NULL'umuz var, yerel olan doğru şekilde başlatıldı, ancak başka bir işlev onu göremiyor ...

Yakından bak. Doğru yapmadın.

 
Artyom Trishkin :

Giriş parametrelerinden tüm alt dizileri çıkarmanız, bunları sembollerin adlarını ve bunlara karşılık gelen zaman çerçevelerini yapmak için kullanmanız gerekir.

Ardından, bu listelerden yeni çubuk nesneleri oluşturun ve işaretçiyi, global düzeyde bildirilen CArrayObj'de oluşturulan her "Yeni çubuk" nesnesine yerleştirin.

Ayrıca - OnTimer()'da bu listedeki bir döngüde, içindeki bir sonraki nesneye bir işaretçi alın ve yeni bir çubuğun varlığını kontrol edin. Değilse bir sonrakine geçiyoruz, varsa yeni bir bar açarken yapılması gerekeni yapıyoruz.

Zamanlayıcıyı ihtiyaçlarınıza göre yapın - milisaniye, saniye, dakika - genel olarak, geçerli olmayan bir sembol üzerindeki yeni bir çubuğa tepki vermek için yeterli olduğunu düşündüğünüz frekansı ayarlayın.

Bunun gibi bir şey yaptım, ancak ArrObj.At (0) 'da sınıfın üye işlevleri çağrılmıyor ...

 
Koldun Zloy :

Yakından bak. Doğru yapmadın.

zaten fark ettim)
Yani, çıkış yolu, küresel olarak boş nesneler ilan etmektir ....
Ve eğer önceden bilinmiyorsa, kaç tane olacak? Sadece "bir marjla" ilan etmek mi? :)
PS Yerleşik yardımda, nesneleri bildirmenin böyle bir yolunu bulamadım

CObj* var1 = NULL ;
 
Mikhail Tkachev :

zaten fark ettim)
Yani, çıkış yolu, küresel olarak boş nesneler ilan etmektir ....
Ve eğer önceden bilinmiyorsa, kaç tane olacak? Sadece "bir marjla" ilan etmek mi? :)

CarrayObj'a koyun.

ArrObj.At(0) işlevi , türetilmiş sınıfın üyeleri hakkında hiçbir şey bilmeyen temel sınıfa bir işaretçi döndürür.

Onlara erişmek için bir tür dönüşümü yapmanız yeterlidir.

CIsNewBar* newBar = (CIsNewBar*)ArrayObj.At( 0 );
newBar.method( parameter );
 
Koldun Zloy :

CarrayObj'a koyun.

ArrObj.At(0) işlevi , türetilmiş sınıfın üyeleri hakkında hiçbir şey bilmeyen temel sınıfa bir işaretçi döndürür.

Onlara erişmek için bir tür dönüşümü yapmanız yeterlidir.

Cevap için teşekkürler, hiç de kötü değilsin)
Şimdi belli oldu.)
UPD
Bu tasarım da işe yarıyor

CIsNewBar* newBar = ArrayObj.At( 0 );
newBar.method( parameter )