Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım 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
Pekala millet, ilk kısım bitti (tüm çift oranlarını okuma).
Şimdi, aşağıdaki resimde çizdiğim gibi, RSI gibi bazı grafik göstergeleri yerleştirmek için ArrayCopyRates işleviyle kopyalanan tüm paris oranlarını kullanmam gerekiyor:
İlk sorumda bunu nasıl yapacağımı biliyorum ... ve okuma oranları hakkında değil. Çizmek için daha önce oranları kopyalamam gerekeceğini sanmıyorum, ancak nasıl yapılacağını bilmek güzeldi... şimdi tüm çiftleri çizmek için gösterge alanını bölmenin bir yolunu bulmam gerekiyor...
Gösterge alanını bölmenin bir yolu yoktur. Her şey ayrı ayrı çizilmeli, arabellek yok, otomatik ölçeklendirme yok. Görmek
Böyle bir resim gördünüz mü? (MetaQuotes Software Corp.) - MQL4 forumu - Sayfa 12
Böyle bir resim gördünüz mü? (MetaQuotes Software Corp.) - MQL4 forumu - Sayfa 14
Böyle bir resim gördünüz mü? (MetaQuotes Software Corp.) - MQL4 forumu - Sayfa 36
Gösterge alanını bölmenin bir yolu yoktur. Her şey ayrı ayrı çizilmeli, arabellek yok, otomatik ölçeklendirme yok. Görmek
Böyle bir resim gördünüz mü? (MetaQuotes Software Corp.) - MQL4 forumu - Sayfa 12
Böyle bir resim gördünüz mü? (MetaQuotes Software Corp.) - MQL4 forumu - Sayfa 14
Böyle bir resim gördünüz mü? (MetaQuotes Software Corp.) - MQL4 forumu - Sayfa 36
Bu, bir yerden aldığım bir Gösterge, deşifre etmeye hiç çalışmadım. Mevcut grafiğin 3 zaman diliminin bir temsilini gösteriyorum. Çılgın olan, mumların Histogramlarla çizilmesidir. Oldukça temiz ama şu anda içinde olduğum şey değil.
En iyi dileklerimle
Bu konuyu takip edenler için bir güncelleme!
OP'nin PM aracılığıyla kodunu düzeltmesine yardım ediyorum, çünkü İngilizce'de zorluk çekiyor ve ikimiz de Portekizce konuşuyoruz. Testlerimizde " ArrayCopyRates() " işleviyle gerçekleşen başka bir "komik" ile karşılaştık. Bir EA'da " ArrayCopyRates() " ile bir MqlRates dizisi kullanırken, veri dizisi her zaman şeylerin mevcut durumunu bildiren sanal bir dizidir, bu nedenle veriler her zaman tazedir.
Ancak, bir Göstergede durum böyle görünmüyor. Dizi sanal bir kopya değil, bunun yerine " ArrayCopyRates() " çağrıldığı anda ayarlanmış statik bir kopyadır. Sembol, grafik sembolünden farklı olduğunda veriler güncellenmez. Grafikle aynı sembol olduğunda, dizi verileri "canlıdır" ve beklendiği gibi güncellenir, ancak başka bir sembole ait olduğunda statik bir kopyadır.
Bu nedenle, bir Göstergede çalışması için, taze verilere ihtiyaç duyulursa, OnCalculate() olayına yapılan her çağrıda " ArrayCopyRates() " işlevi çağrılmalıdır.
Sadece bulgularınızı genişletmek için Fernando - sembol grafik sembolüyle aynı olsa bile, zaman çerçevesi farklıysa dizi statiktir.
Dolayısıyla, bir göstergede sanal bir kopyaya sahip olmak için, aynı sembol VE aynı zaman diliminde olmalıdır. Diğer her şey statiktir.
Bir önceki günün en yüksek ve en düşük değerlerini bulmanın hafta ortası olduğunu varsayarsak, şunu kullanıyorum:
Lo = iLow ( NULL , PERIOD_D1 , 1 );
Sorun değil, ama şimdi önceki gün saatin en yüksek ve en düşük olduğunu bulmam gerekiyor. iHighest ve iLowest'i kullanarak zamanı yüksek ve düşük olarak 1 saatlik muma yaklaştırmaya karar verdim. Ve işte o zaman sorunlar başladı.
PrevDayEnd = iBarShift ( NULL , PERIOD_H1 , iTime ( NULL , PERIOD_D1 , 0 )- 1 );
PrevDayBegin--;
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
ArrayCopyRates (mqlrates_array_d1, NULL , PERIOD_D1 );
ArrayCopyRates (mqlrates_array_h1, NULL , PERIOD_H1 );
ArrayCopyRates (mqlrates_array, NULL , 0 );
OnInit ();
:
isHistoryLoading = true ;
:
OnCalculate ( ... )
:
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
if (isHistoryLoading)
{
ResetLastError ();
if ( ArrayCopyRates (mqlrates_array_d1, NULL , PERIOD_D1 )> 0 )
{
if ( GetLastError () == 0 )
{
if (( iTime ( NULL , PERIOD_D1 , 0 ) > 0 ) && ( iTime ( NULL , PERIOD_D1 , 1 ) > 0 ))
{
ResetLastError ();
if ( ArrayCopyRates (mqlrates_array_h1, NULL , PERIOD_H1 )> 0 )
{
if ( GetLastError () == 0 )
{
if (( iTime ( NULL , PERIOD_H1 , 0 ) > 0 ) && ( iTime ( NULL , PERIOD_H1 , 1 ) > 0 ))
{
ResetLastError ();
if ( ArrayCopyRates (mqlrates_array, NULL , 0 )> 0 )
{
if ( GetLastError () == 0 )
{
if (( iTime ( NULL , 0 , 0 ) > 0 ) && ( iTime ( NULL , 0 , 1 ) > 0 ))
{
isHistoryLoading = false ;
if (DebugLog)
Print ("Chart up-to-date!");
}
}
}
}
}
}
}
}
}
}
if (isHistoryLoading)
{
if (DebugLog)
Print ("Waiting for chart to update!");
return (rates_total);
}
:
:
if ( ObjectFind (Trend2Name) != - 1 ) // Check whether mid range line exists
{
if (( TimeDay ( ObjectGetInteger ( 0 ,Trend2Name, OBJPROP_TIME , 0 ))== TimeDay ( TimeCurrent ()))
&& ( TimeMonth ( ObjectGetInteger ( 0 ,Trend2Name, OBJPROP_TIME , 0 ))== TimeMonth ( TimeCurrent ()))
&& ( TimeYear ( ObjectGetInteger ( 0 ,Trend2Name, OBJPROP_TIME , 0 ))== TimeYear ( TimeCurrent ()))) // Indicator has already been ploted today
{
return (rates_total);
}
else // Indicator exists but in a past date, so delete it and plot it on current day
{
if (DebugLog)
Print ( "Indicator in a past date! Deleting it and creating it today!" );
if ( ObjectFind (FibName) != - 1 )
FiboLevelsDelete( 0 ,FibName);
// Indicator will be created by the OnChartEvent() when it detects the fib was deleted.
}
}
else // Indicator doesn't exist, so create it
{
if (DebugLog)
Print ( "Indicator doesn't exist! Creating it." );
CreateIndicator();
}
:
Birkaç tıklamadan sonra, veriler kısmen yüklenir ve yukarıdaki kod parçası, satırların önceki bir günde çizildiğini algılar, fib'i siler ve aralıkların yeniden hesaplanmasını ve nesnelerin (yani fib, trend çizgileri, vb.) yeniden çizilmesini tetikler. ).
CurrDayBegin = iTime ( NULL , PERIOD_D1 , 0 );
while ( TimeDayOfWeek ( iTime ( NULL , PERIOD_H1 , iBarShift ( NULL , PERIOD_H1 , CurrDayBegin))) != TimeDayOfWeek ( TimeCurrent ()))
// If iBarShift can't find the 0am candle and returns the 11pm candle of prev day.
CurrDayBegin = CurrDayBegin + 3600 ; // Move 1h until you find the 1st candle of today.Bunlar göstergenin ekran görüntüleridir:
(1) Eksik geçmiş kullanılarak hesaplanmıştır (lütfen yatay çizgilerin günün başında başlamadığına dikkat edin)
(2) Geçmişin tamamı kullanılarak yeniden hesaplanır (günün başından başlayan yatay çizgiler)