[ÇÖZÜLDÜ] Göstergeler, farklı çalışma zaman çerçevesine sahip bir Göstergeden çağrıldıklarında/oluşturulduklarında düzgün şekilde başlatılmıyor. - sayfa 3
Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Örnek bir kodla daha spesifik bir soru gönderin. Buggy olabilir. Yaklaşım benim için çalışıyor.
İşte başarısız gösterge erişiminin bir kod örneği. Döngü, yenileme, beklemeden sonra bile (iki farklı bekleme yöntemi).
//| THROWAWAY.mq5 |
//| nicholishen |
//| www.reddit.com/u/nicholishenFX |
//+------------------------------------------------------------------+
#property copyright "nicholishen"
#property link "www.reddit.com/u/nicholishenFX"
#property version "1.00"
#property indicator_chart_window
#include <Indicators\Trend.mqh>
#include <errordescription.mqh>
CiMA ima;
int m_bufferSize = - 1 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
static int iCnt = 0 ;
//--- indicator buffers mapping
Print ( "-----------------------" , TimeCurrent (), "--------------------------" );
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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[])
{
static int tickCnt = 0 ;
tickCnt++;
//---
if (rates_total != prev_calculated || m_bufferSize < 1 ){
ResetLastError ();
datetime createTime = TimeCurrent ();
ima.Create( _Symbol , PERIOD_H1 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
ima.Refresh(); //no wait time!
CIndicatorBuffer *buff = ima.At( 0 );
m_bufferSize = buff.Total();
int call = 0 ;
int sleep = 200 ;
// try with Sleep function ...
while (buff.Total() <= 0 && call < 10 ){
Sleep (sleep);
ima.Refresh(); // Refreshed 10x since create
m_bufferSize = buff.Total();
call++;
Print ( __LINE__ , " " , __FUNCTION__ , " " ,buff.Name(),
" Buffer size = " ,m_bufferSize, " | Call (" ,
call, ")" , " Sleep(" ,sleep, ")"
);
sleep+= 100 ;
}
// try wait with looping
if (buff.Total() <= 0 ){
datetime waitTime = timeLoop(createTime);
Print ( "Time Between Create and Refresh() = " , TimeToString (waitTime, TIME_SECONDS ));
ima.Refresh();
m_bufferSize = buff.Total();
}
if (m_bufferSize < 1 ){
Print (ErrorDescription( GetLastError ()));
return (rates_total);
} else {
for ( int i= 0 ;i<m_bufferSize;i++){
if (i> 2 ) return (rates_total);
else {
Print ( __LINE__ , " " , __FUNCTION__ ,buff.Name(),
" Buffer size = " ,m_bufferSize,
" | " ,ima.PeriodDescription(), " iMA(" ,i, ") value = " ,
DoubleToString (ima.Main(i), _Digits ),
" | Tick-count = " ,tickCnt
);
}
}
}
}
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){
}
datetime timeLoop( datetime timeIn){
int cnt = 0 ;
while ( TimeCurrent () - timeIn < 10 && ! IsStopped ()){
Comment ( "Time looping i = " ,cnt);
cnt++;
}
return TimeCurrent () - timeIn;
}
Ve işte çıktı:
--------------------------2017.01.31 23:48:03----------------------- -------
60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (1) Uyku(200)
60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (2) Uyku(300)
60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (3) Uyku(400)
60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (4) Uyku(500)
60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Ara (5) Uyku(600)
60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Ara (6) Uyku(700)
60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (7) Uyku(800)
60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (8) Uyku(900)
60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Ara (9) Uyku(1000)
60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Ara (10) Uyku (1100)
Oluştur ve Yenile () Arasındaki Süre = 00:00:11
İstenen veri bulunamadı
81 OnCalculateMAIN_LINE Tampon boyutu = 1024 | H1 iMA(0) değeri = 113.227 | Kene sayısı = 2
81 OnCalculateMAIN_LINE Tampon boyutu = 1024 | H1 iMA(1) değeri = 113.269 | Kene sayısı = 2
81 OnCalculateMAIN_LINE Tampon boyutu = 1024 | H1 iMA(2) değeri = 113.313 | Kene sayısı = 2
İşte başarısız gösterge erişiminin bir kod örneği. Döngü, yenileme, beklemeden sonra bile (iki farklı bekleme yöntemi).
Uyku bir gösterge üzerinde çalışmayacak; arayüz dizisini kesemezsiniz.
Bunun yerine OnTimer() ile deneyin.
Uyku bir gösterge üzerinde çalışmayacak; arayüz dizisini kesemezsiniz.
Bunun yerine OnTimer() ile deneyin.
Bu kadar! Çözüm bu! Seni öpebilirim adamım!
Bu, OnInit()'in platforma dönmesini ve OnTimer()'ın platformu atlayıp ikinci geçişi çağırmasını sağlar. EventSetMillisecondTimer'ı sadece 1ms'ye ayarladım ve sadece bir kez aradım ve şimdi çalışıyor.
//| THROWAWAY.mq5 |
//| nicholishen |
//| www.reddit.com/u/nicholishenFX |
//+------------------------------------------------------------------+
#property copyright "nicholishen"
#property link "www.reddit.com/u/nicholishenFX"
#property version "1.00"
#property indicator_chart_window
#include <Indicators\Trend.mqh>
#include <errordescription.mqh>
CiMA ima;
int m_bufferSize = - 1 ;
bool timedEvent = false ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
int waitMS = 1 ;
Print ( "-----------------------" , TimeCurrent (), "--------------------------" );
ima.Create( _Symbol , PERIOD_H1 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
EventSetMillisecondTimer (waitMS);
Print ( "OnTimer set to " ,waitMS, " ms" );
//---
return ( INIT_SUCCEEDED );
}
void OnTimer ()
{
//---
ima.Refresh();
EventKillTimer ();
timedEvent = true ;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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[])
{
static int tickCnt = 0 ;
tickCnt++;
if (!timedEvent) return rates_total;
//---
if (rates_total != prev_calculated || m_bufferSize < 1 ){
ResetLastError ();
CIndicatorBuffer *buff = ima.At( 0 );
m_bufferSize = buff.Total();
if (m_bufferSize <= 0 ) ima.Refresh();
// try wait with looping
if (m_bufferSize < 1 ){
Print (ErrorDescription( GetLastError ()));
} else {
for ( int i= 0 ;i<m_bufferSize;i++){
if (i> 2 ) break ;
else {
Print ( __LINE__ , " " , __FUNCTION__ ,buff.Name(),
" Buffer size = " ,m_bufferSize,
" | " ,ima.PeriodDescription(), " iMA(" ,i, ") value = " ,
DoubleToString (ima.Main(i), _Digits ),
" | Tick-count = " ,tickCnt
);
}
}
}
}
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
Çıktı:
--------------------------2017.02.01 01:31:01----------------------- -------
OnTimer 1 ms'ye ayarlandı
75 OnCalculateMAIN_LINE Tampon boyutu = 1024 | H1 iMA(0) değeri = 113.142 | Kene sayısı = 2
75 OnCalculateMAIN_LINE Tampon boyutu = 1024 | H1 iMA(1) değeri = 113.181 | Kene sayısı = 2
Bu kadar! Çözüm bu! Seni öpebilirim adamım!
Bu kadar! Çözüm bu! Seni öpebilirim adamım!
Güzel!
Zamanlayıcı kullanmanızı önerdim. Senin için işe yaramadığını söyledin. Denediklerinden bir örnek istedim. Ancak, zaten olduğundan daha fazla ayrıntı gönderemeyeceğinizi söylediniz.
Şimdi başka bir adam sana zamanlayıcıyı önerdi ve sen bundan memnun görünüyorsun. ;-)
Güzel!
Zamanlayıcı kullanmanızı önerdim. Senin için işe yaramadığını cevapladın. Denediklerinden bir örnek istedim. Ancak, zaten olduğundan daha fazla ayrıntı gönderemeyeceğinizi söylediniz.
Şimdi başka bir adam sana zamanlayıcıyı önerdi ve sen bundan memnun görünüyorsun. ;-)
Güzel!
Zamanlayıcı kullanmanı önerdim. Senin için işe yaramadığını cevapladın. Denediklerinden bir örnek istedim. Ancak, zaten olduğundan daha fazla ayrıntı gönderemeyeceğinizi söylediniz.
Şimdi başka bir adam sana zamanlayıcıyı önerdi ve sen bundan memnun görünüyorsun. ;-)
Sorun değil, banka transferlerini ve tüm kredi kartlarını kabul ediyorum... 100$ değil mi?
100 dolar mı?! ...daha fazlasını teklif ettiğimi sanıyordum...
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
[MQL5 HATA] [ÇÖZÜLDÜ]Göstergeler, farklı çalışma zaman çerçevesine sahip bir Göstergeden çağrıldıklarında/oluşturulduklarında doğru şekilde başlatılmıyor.
Stanislav Korotky , 2017.02.01 09:27
Güzel!
Zamanlayıcı kullanmanızı önerdim. Senin için işe yaramadığını cevapladın. Denediklerinden bir örnek istedim. Ancak, zaten olduğundan daha fazla ayrıntı gönderemeyeceğinizi söylediniz.
Şimdi başka bir adam sana zamanlayıcıyı önerdi ve sen bundan memnun görünüyorsun. ;-)
Üzgünüm, şimdiye kadar bununla ne demek istediğini anlamadım. Sizi düzenbazla ortak olarak kabul edeceğim ve kimse çalışan bir model yayınlamadığından, ödülün %50 olacağına hükmedeceğim - ikiye bölün: Yani bu...mm...ikisini taşıyın... İkinize de bira ısmarlamaya ne dersiniz? Cidden, bana bir BTC adresi PM atarsan ikinizin de tazminatını ödeyeceğinden emin olurum :)
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
[MQL5 HATA] [ÇÖZÜLDÜ]Göstergeler, farklı çalışma zaman çerçevesine sahip bir Göstergeden çağrıldıklarında/oluşturulduklarında doğru şekilde başlatılmıyor.
Alain Verleyen , 2017.02.01 10:36
Ve şimdi bir MT5 hatası düzeltildi...Tüm yardımlarınız için özellikle teşekkür etmek istiyorum... lütufkarlığınız olmasaydı, çabalamak için motivasyonu nerede bulurdum bilmiyorum! /s
Cidden, bana bir BTC adresi PM atarsan ikinizin de tazminatını ödeyeceğinden emin olurum :)