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 .
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.
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 ) :
#property indicator_chart_window#property indicator_buffers1#property indicator_plots1class CLASS
{
public :
double Buffer[];
CLASS( void )
{
SetIndexBuffer ( 0 , this .Buffer);
}
};
CLASS* Class;
voidOnInit ( void )
{
Class = new CLASS;
delete Class;
Class = new CLASS;
Class.Buffer[ 0 ] = 0 ; // array out of rangedelete Class;
return ;
}
intOnCalculate ( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &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 :
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_buffers1#ifdef __MQL5__#property indicator_plots1#endif
#ifdef __MQL5__#define TRUEtrue#define FALSEfalse#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);
staticint FullOnCalculate( void )
{
int Spread[];
long RealVolume[];
int Size = INT_MAX ;
#ifdef __MQL4__constint bars = :: Bars ;
#endif
#ifdef __MQL5__constint 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__datetimeTime [];
doubleOpen [];
doubleHigh [];
doubleLow [];
doubleClose [];
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 только самим терминалом инициирует индикаторный буферvoidOnChartEvent ( constint id, constlong & lparam, constdouble & dparam, conststring & sparam )
{
if (id == CHARTEVENT_CHART_CHANGE )
{
Print ( __FUNCTION__ );
:: OnDeinit ();
::Class = new CLASS;
if (!FirstRunOnCalculate)
CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
}
return ;
}
voidOnDeinit ( constint Reason = 0 )
{
if (:: CheckPointer (::Class) == POINTER_DYNAMIC )
delete ::Class;
return ;
}
intOnCalculate ( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &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ı?
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.
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.
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?
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ı
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?
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 :
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
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
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ı?
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ı?