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

 
Vitalii Ananev :

Kapat[2] yerine göstergenin değerini ikinci çubuğa koyun (örneğin iRSI(.......,2) ) ve Kapat[1] yerine göstergenin değerini ilk çubuğa koyun. Ve uroven seviye değerleridir .

Gerisi zaten size söylendi.

Teşekkür ederim.
 
Söyleyin bana, belki birisi MT5 için tablonun sağından günün yan hacmine rastladı, MT4 için buldu burada https://www.mql5.com/en/code/9777 . İki seçenek vardır: ya içindeki değişkenleri yeniden yazın ya da hazır bir tane bulun. peki, ya da sıralamadaki noktayı göremiyorum,,,,,,, bir denge teorisini kontrol etmeniz gerekiyor ,,,, MT5 için bu çalışma için veritabanında bulundu, burada dünün profilini soldan çiziyor , ancak bugün yaşananları çekmeyen önemli bir dezavantaj var . Bu yüzden, şu anki ticaret anında neler olduğu hakkında bilgi içeren grafik şablonunu tamamlamak istiyorum.
Рыночный профиль ( Market Profile)
Рыночный профиль ( Market Profile)
  • oylar: 6
  • 2006.10.11
  • Collector
  • www.mql5.com
Рыночный профиль ( Market Profile) использует альтернативное представление информации как о горизонтальном, так и о вертикальном движении рынка.
 
Maria Baburina :

Koşul:


ProfitSellDBL burada hesaplanır

Profit_Upgr = 0.01

Tral_Start__Upgr, int türünde bir harici değişkene ayarlanır ve 5'e eşittir.

Tral_Size__Upgr benzer şekilde 4'e eşittir

TV - onay değeri, =10

ToplamSatışDBL = 0.04

Onu okurum. Tral_Start__Upgr, Tral_Size__Upgr ve bunların dış değişkenlerini double olarak tanımlarsak nasıl çalışacağına baktım. Onlar. ne zaman döküm ve veri kaybı olmadan her şey aynı tipte olacak. Sonuç aynı. Neyi yanlış anladım?
 
Maria Baburina :
Onu okurum. Tral_Start__Upgr, Tral_Size__Upgr ve bunların dış değişkenlerini double olarak tanımlarsak nasıl çalışacağına baktım. Onlar. ne zaman döküm ve veri kaybı olmadan her şey aynı tipte olacak. Sonuç aynı. Neyi yanlış anladım?

Kör ve sağır arasında geçen bir konuşma. Birinin kontrol edebilmesini istiyorsanız - başka bir makinede derlenebilecek ve kontrol edilebilecek mümkün olan minimum koda ihtiyacınız var. Kod yok - konuşacak bir şey yok.

Eklendi: hata ayıklamayı kullanın ( Hata Ayıklama ) :

Ön ayar

Kesme noktaları

Hata ayıklamaya başlayın

Gözlemlenen ifadeler

Çağrı yığını görünümü

Adım adım hata ayıklama

Hata ayıklamayı duraklatın, sürdürün ve sonlandırın

Geçmişte hata ayıklama

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

comp , 2016.04.03 18:21

Çalışma hatası

 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

class CLASS
{
public :
   double Buffer[];
  
  CLASS( void )
  {
     SetIndexBuffer ( 0 , this .Buffer);
  }
};

CLASS* Class;

void OnInit ( void )
{
  Class = new CLASS;
    
   delete Class;

  Class = new CLASS;

  Class.Buffer[ 0 ] = 0 ; // array out of range
  
   delete Class;
  
   return ;
}

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{  
   return (rates_total);
}

Dördünde, bu bir patlama ile yuvarlandı! İlk beşte - bir serseri. Bu, dörtlü ile karşılaştırıldığında başka bir mimari sınırlama mı? Bunun tartışmasına bir bağlantı verin, kendim bulamadım.


 
Gösterge arabelleklerine yalnızca terminalin kendisi tarafından (manuel olarak değil) OnCalculate'in ilk çağrısından sonra bir şey atamanın mümkün olduğunu doğru anlıyor muyum?
 
comp :
Gösterge arabelleklerine yalnızca terminalin kendisi tarafından (manuel olarak değil) OnCalculate'in ilk çağrısından sonra bir şey atamanın mümkün olduğunu doğru anlıyor muyum?

OnCalculate()'i çağırdıktan sonra gösterge arabelleklerine erişebilirsiniz. Bu durumda, gösterge arabelleğinin kendisi küresel değişkenler alanında bildirilmelidir :

 //+------------------------------------------------------------------+
//|                                                  Accelerator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright    "2009, MetaQuotes Software Corp."
#property link          "http://www.mql5.com"
#property description "Accelerator/Decelerator"

//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots    1
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  Green,Red
#property indicator_width1   2
#property indicator_label1   "AC"
//--- indicator buffers
double ExtACBuffer[];
double ExtColorBuffer[];
double ExtFastBuffer[];
double ExtSlowBuffer[];
double ExtAOBuffer[];
double ExtSMABuffer[];
//--- handles for MAs
int     ExtFastSMAHandle;
int     ExtSlowSMAHandle;
//--- bars minimum for calculation
#define DATA_LIMIT 37
 

Görünüşe göre aradığımı buldum, ancak kodun antik döneminden bir hata veriyor

düzeltmeye yardım et ...... kolaysa

ve ekranın sağ tarafına yerleştirmeye yardımcı olursanız, genellikle süper olur

Dosyalar:
 
Karputov Vladimir :

OnCalculate()'i çağırdıktan sonra gösterge arabelleklerine erişebilirsiniz.

Anlaşıldığı üzere, yanılıyorsunuz. Yalnızca CAM terminali OnCalculate'i çağırdığında erişilebilir. Aynı zamanda, MT4'te durum daha esnektir, çünkü sadece OnCalculate'i bir kez çağırmak yeterlidir. Ve MT5'te - SetIndexBuffer'dan sonra her seferinde terminalin ITSELF tarafından OnCalculate çağrısını beklemeniz gerekir. Kanıt

 #property strict

#property indicator_chart_window
#property indicator_buffers 1

#ifdef __MQL5__
   #property indicator_plots 1
#endif   

#ifdef __MQL5__
   #define TRUE true
   #define FALSE false
#endif   

class CLASS
{
public :
   double Buffer[];
  
  CLASS( void )
  {
    :: SetIndexBuffer ( 0 , this .Buffer);
  }

   #define TIMESERIES(X)                                                  \
     :: ArraySetAsSeries (X, TRUE );                                        \
     Size = :: MathMin (Copy ##X(::Symbol(), :: Period (), 0 , bars, X), Size);  

   static int FullOnCalculate( void )
  {
     int Spread[];
     long RealVolume[];
    
     int Size = INT_MAX ;
    
     #ifdef __MQL4__
       const int bars = :: Bars ;
     #endif

     #ifdef __MQL5__
       const int bars = :: Bars (:: Symbol (), :: Period ());
     #endif

     TIMESERIES(Spread)
    TIMESERIES(RealVolume)
    
     #ifdef __MQL4__
       return (:: OnCalculate (Size, 0 , Time , Open , High , Low , Close , RealVolume, Volume , Spread));
     #endif

     #ifdef __MQL5__
       datetime Time [];
       double Open [];
       double High [];
       double Low [];
       double Close [];
       long TickVolume[];
  
      TIMESERIES( Time )
      TIMESERIES( Open )
      TIMESERIES( High )
      TIMESERIES( Low )
      TIMESERIES( Close )
      TIMESERIES(TickVolume)
    
       return (:: OnCalculate (Size, 0 , Time , Open , High , Low , Close , RealVolume, TickVolume, Spread));
     #endif    
   }  
};

CLASS* Class;

bool FirstRunOnCalculate = TRUE ; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буфер

void OnChartEvent ( const int id, const long & lparam, const double & dparam, const string & sparam )
{
   if (id == CHARTEVENT_CHART_CHANGE )
  {
     Print ( __FUNCTION__ );
    
    :: OnDeinit ();
    
    ::Class = new CLASS;
        
   if (!FirstRunOnCalculate)    
    CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
  }
  
   return ;
}

void OnDeinit ( const int Reason = 0 )
{
   if (:: CheckPointer (::Class) == POINTER_DYNAMIC )
     delete ::Class;

   return ;
}

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{  
   Print ( __FUNCTION__ );  

   if (FirstRunOnCalculate)
    FirstRunOnCalculate = FALSE ;
  
   if (:: CheckPointer (::Class) != POINTER_INVALID )
    ::Class.Buffer[ 0 ] = 0 ; // array out of range - MT5-ERROR!!!

   return (rates_total);
}

MT4'te bu gösterge sorunsuz bir şekilde sürülür, MT5'te hemen bir hatayla çökecektir. Görünen o ki, MT4'te ITSELF terminali tarafından OnCalculate'e yapılan ilk çağrıyı beklemek ve ardından SetIndexBuffer aracılığıyla yeniden tanımlamaları da dahil olmak üzere tamponlarla istediğinizi yapmak yeterlidir. Ancak MT5'te, HER SetIndexBuffer'dan sonra, KENDİNDEN terminali tarafından OnCalculate'e yapılan ilk çağrı için tekrar beklemeniz gerekir.

Bu özellik, belgelerin hiçbir yerinde ele alınmamıştır. Ve "acemi" tanımına uymuyor.

MT5'in MT4 ile aynı davranışa sahip olmasını bekleyebilir miyiz? Onlar. Böylece ITSELF terminali tarafından OnCalculate'e yapılan ilk çağrıdan sonra, SetIndexBuffer'ı sorunsuz bir şekilde çağırmak mümkün olacak mı?

 
comp :

Anlaşıldığı üzere, yanılıyorsunuz. Yalnızca CAM terminali OnCalculate'i çağırdığında erişilebilir. Aynı zamanda, MT4'te durum daha esnektir, çünkü sadece OnCalculate'i bir kez çağırmak yeterlidir. Ve MT5'te - SetIndexBuffer'dan sonra her seferinde terminalin ITSELF tarafından OnCalculate çağrısını beklemeniz gerekir. Kanıt

MT4'te bu gösterge sorunsuz bir şekilde sürülür, MT5'te hemen bir hatayla çökecektir. Görünen o ki, MT4'te ITSELF terminali tarafından OnCalculate'e yapılan ilk çağrıyı beklemek ve ardından SetIndexBuffer aracılığıyla yeniden tanımlamaları da dahil olmak üzere tamponlarla istediğinizi yapmak yeterlidir. Ancak MT5'te, HER SetIndexBuffer'dan sonra, terminalin KENDİSİ tarafından OnCalculate'e yapılan ilk çağrı için tekrar beklemek gerekir.

Bu özellik, belgelerin hiçbir yerinde ele alınmamıştır. Ve sanki "acemi" tanımına uymuyor.

MT5'in MT4 ile aynı davranışa sahip olmasını bekleyebilir miyiz? Onlar. Böylece ITSELF terminali tarafından OnCalculate'e yapılan ilk çağrıdan sonra, SetIndexBuffer'ı sorunsuz bir şekilde çağırmak mümkün olacak mı?

Sözlü konuşmalara girmeyin - doğal olarak, OnCalculate'i çağırmak, terminalin kendisi tarafından yapılan bir çağrı anlamına gelir, çünkü
OnCalculate() işlevi, yalnızca Calculate olayına dayalı gösterge değerlerinin hesaplanması gerektiğinde özel göstergelerde çağrılır . Bu genellikle, göstergenin hesaplandığı sembol için yeni bir onay işareti geldiğinde olur. Bu durumda, göstergenin bu sembolün herhangi bir fiyat tablosuna eklenmesi gerekmez.