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
Ve 0 olduğunda tüm göstergeyi yeniden hesaplarsanız? Bana göre en iyi çözüm.
:) İşte bu yaptığım şey...
Tonlarca grafiğe sahip ağır bir gösterge için en iyisinden çok uzak. Hayır, çözüm basit - prev_calculated yerine kendi değişkeninizi (statik veya global) kullanın. Ama bu hala bir koltuk değneği, ama bir tane daha yakmak istedim
Koltuk değneği kelimesini kullanan kişi:
Tonlarca grafiğe sahip ağır bir gösterge için en iyisinden çok uzak. Hayır, çözüm basit - prev_calculated yerine kendi değişkeninizi, statik veya global kullanın. Ama bu hala bir koltuk değneği, ama bir tane daha yakmak istedim
Ve geçmiş pompalanırsa, atlanan veya daha önce hesaplanmayan yeni çubuklar olabilir - yani, gösterge okumaları zaten yanlış olacaktır.
prev_calculated=0 ise, tam bir yeniden hesaplama yapılması gerektiği anlamına gelir. Bu durumda tüm standart göstergeler tamamen yeniden hesaplanır.
Her şey açık, ama ne yazık ki bu, şunu reddetmez:
Hepsi faydalıdır, ancak amaçlanan amacı için kullanılamaz - önceki çağrıda kaç tane 'bar işlendiğini' göstermek için - prev_calculated'a izin verilmez
Göstergeler farklıdır, bazıları hesaplamalar için çubuklara ihtiyaç duymaz, diğerleri yalnızca canlı kenelere ihtiyaç duyar, diğerlerinin yeniden hesaplama derinliğinde bir sınırı vardır - tarihte neyin değiştiği, dördüncü iz grafik nesneleri vb. umurlarında değildir. Prev_calculated'a eklenen geçmişteki değişiklikleri izlemek için ek işlevlere ihtiyaçları yoktur, yalnızca buna ihtiyaçları vardır - 'önceki çağrıda işlenen çubuklar'. Bu değil
Genel olarak, uv programcıları, lütfen marangozun dikkatini 'olayını yakalamaktan' uzaklaştırmayın.
Ve 0 olduğunda tüm göstergeyi yeniden hesaplarsanız? Bana göre en iyi çözüm.
Bunun en iyi çözüm olduğunu söyleyemem. Her neyse, henüz en iyisi değil.
Hesaptaki mevcut düşüşü kaydeden bir gösterge yazmaya karar verdim, bu yüzden geçmişte hiçbir şeyi yeniden hesaplamama gerek yok. İlk satır böyle görünüyordu.
Bunun en iyi çözüm olduğunu söyleyemem. Her neyse, henüz en iyisi değil.
Hesaptaki mevcut düşüşü kaydeden bir gösterge yazmaya karar verdim, bu yüzden geçmişte hiçbir şeyi yeniden hesaplamama gerek yok. İlk satır böyle görünüyordu.
"... hiçbir yerden gelmeyen bir fiyat...", gösterge arabelleği dizisinin BAŞLATILMAMIŞ öğelerinin çöplüğüdür. Nasıl yapılır:
global değişkenler kullanmadan normal değerlerden çöplerin nasıl ayıklanacağına dair daha iyi bir örnek verin.
Belgeleri alıntılamak için hepsi çok fazla.
Kimsenin kimseye borcu yoktur. Yani, gösterge arabelleğinde, bağlamadan sonra, dizinin tüm öğelerini kendiniz başlatana kadar çöp olacaktır.
Katma:
Bir örnek oluşturalım...
//| prev_calculated.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrGray
#property indicator_label1 "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
//--- indicator buffers mapping
SetIndexBuffer ( 0 ,ExtBuffer, INDICATOR_DATA );
//---
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[])
{
//---
if (prev_calculated== 0 )
{
//--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
for ( int i= 0 ;i<rates_total;i++)
ExtBuffer[i]= 1.01 ;
return (rates_total);
}
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
int limit=rates_total-prev_calculated+ 1 ;
for ( int i=rates_total-limit;i<rates_total;i++)
{
//--- визуализация пересчёта самого правого бара
static bool drive= false ;
if (!drive)
ExtBuffer[i]= 1.03 ;
else
ExtBuffer[i]= 1.02 ;
drive=!drive;
}
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
Kimsenin kimseye borcu yoktur. Yani, gösterge arabelleğinde, bağlamadan sonra, dizinin tüm öğelerini kendiniz başlatana kadar çöp olacaktır.
Katma:
Bir örnek oluşturalım...
//| prev_calculated.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrGray
#property indicator_label1 "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
//--- indicator buffers mapping
SetIndexBuffer ( 0 ,ExtBuffer, INDICATOR_DATA );
//---
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[])
{
//---
if (prev_calculated== 0 )
{
//--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
for ( int i= 0 ;i<rates_total;i++)
ExtBuffer[i]= 1.01 ;
return (rates_total);
}
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
int limit=rates_total-prev_calculated+ 1 ;
for ( int i=rates_total-limit;i<rates_total;i++)
{
//--- визуализация пересчёта самого правого бара
static bool drive= false ;
if (!drive)
ExtBuffer[i]= 1.03 ;
else
ExtBuffer[i]= 1.02 ;
drive=!drive;
}
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
Yanlış soruya cevap verme yeteneği...
Şimdi bana şu durumlarda ne olacağını açıklayın:
1. 100 bar yeniden hesaplandı, 0'dan 99'a kadar tamponlara girildi (yönü bir zaman serisi olarak ele alalım) değeri 1.03
2. Aniden geçmiş yüklendi ve prev_hesaplanan 0 oldu
Gösterge hangi çubuktan 1.03 değerini gösterecek?