Kodu büküyorum ve hareketli ortalamayı nasıl renklendireceğimi bulamıyorum.
Bir renk yükselirse, diğeri düşerse.
Birisi bir örnek gösterebilir mi?
//+------------------------------------------------------------------+//| ColorMA.mq5 |//| Copyright 2018, MetaQuotes Software Corp. |//| https://mql5.com/ru/users/artmedia70 |//+------------------------------------------------------------------+#property copyright"Copyright 2018, MetaQuotes Software Corp."#property link"https://mql5.com/ru/users/artmedia70"#property version"1.00"#property description"Colored Moving Average"#property indicator_chart_window#property indicator_buffers2// Всего буферов 2 - рисуемый буфер и буфер цвета#property indicator_plots1// Один рисуемый буфер//--- plot ClrMA#property indicator_label1"Colored MA"#property indicator_type1DRAW_COLOR_LINE#property indicator_color1clrBlue , clrRed , clrDarkGray#property indicator_style1STYLE_SOLID#property indicator_width12//--- input parametersinputuint InpPeriod = 14 ; // Период расчётаinputENUM_MA_METHOD InpMethod = MODE_SMA ; // Метод расчётаinputENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE ; // Цена расчёта//--- indicator buffersdouble BufferMA[]; // Рисуемый буферdouble BufferColors[]; // Буфер цвета//--- global variablesint period;
int handle_ma;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- set global variables
period= int (InpPeriod< 1 ? 1 : InpPeriod);
//--- indicator buffers mappingSetIndexBuffer ( 0 ,BufferMA, INDICATOR_DATA ); // Рисуемый буферSetIndexBuffer ( 1 ,BufferColors, INDICATOR_COLOR_INDEX ); // Буфер цвета//--- setting indicator parametersIndicatorSetString ( INDICATOR_SHORTNAME , "Colored MA" );
IndicatorSetInteger ( INDICATOR_DIGITS , Digits ());
//--- setting buffer arrays as timeseriesArraySetAsSeries (BufferMA, true );
ArraySetAsSeries (BufferColors, true );
//--- create MA's handlesResetLastError ();
handle_ma= iMA ( NULL , PERIOD_CURRENT ,period, 0 ,InpMethod,InpAppliedPrice);
if (handle_ma== INVALID_HANDLE )
{
Print ( "Не удалось создать хэндл iMA(" ,( string )period, ") " , EnumToString (InpAppliedPrice), ". Ошибка: " , GetLastError ());
returnINIT_FAILED ;
}
//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate ( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка и расчёт количества просчитываемых баровif (rates_total< fmax (period, 4 )) return0 ; // три бара и меньше в расчёт не берём//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated;
if (limit> 1 )
{
/*
Почему больше 1. Например, загрузилась история, и разница будет больше одного.
Если все нормально, то разница rates_total-prev_calculated равна или 0, или 1
0 - пришел новый тик, новый бар формироваться не начал.
1 - пришел новый тик и начал формироваться новый бар
*/
limit=rates_total- 2 ; // rates_total - это Bars для текущего символа и периода// Если не требуется проверять в цикле расчёта i+число, то limit=rates_total-1 (чтобы не вылететь за пределы массива), // иначе, если требуется проверять, например, i+period, то limit=rates_total-period-1ArrayInitialize (BufferMA, EMPTY_VALUE );
ArrayInitialize (BufferColors, 2 );
}
//--- Подготовка данных - в данном случае это и есть расчёт МА - копирование в буфер её значений из хэндлаint count=(limit> 1 ? rates_total : 1 ); // если новый бар, то копируем всю доступную историю, иначе - только один текущийint copied= CopyBuffer (handle_ma, 0 , 0 ,count,BufferMA);
if (copied!=count) return0 ; // Если скопировать не удалось - выходим до следующего тика//--- Установка цвета линииfor ( int i=limit; i>= 0 && ! IsStopped (); i--)
{
// Тут всё просто: // У нас задано три цвета: #property indicator_color1 clrBlue,clrRed,clrDarkGray// 1. если МА на текущем баре выше чем МА на прошлом, то цвет под номером 0// 2. если МА на текущем баре ниже чем МА на прошлом, то цвет под номером 1// 3. иначе - цвет под номером 2 (в блоке инициализации в строке 86 задаётся этот цвет начальным для отображения линии, что, впрочем делать там не обязательно)
BufferColors[i]=(BufferMA[i]>BufferMA[i+ 1 ] ? 0 : BufferMA[i]<BufferMA[i+ 1 ] ? 1 : 2 );
}
//--- return value of prev_calculated for next callreturn (rates_total);
}
//+------------------------------------------------------------------+
Size PM'de biraz çarpık bir örnek gönderdim (Kopyala-Yapıştır söveleri düzeltmedi)
#define CLASS \
class A { \
public : \
void f( int i ) { Print ( i ); } \
int a; \
}
void g1() { CLASS a; a.f( 1 ); }
void g2() { CLASS a; a.f( 2 ); }
voidOnStart ()
{
g1();
g2();
}
C ++'daki önceki örnek işe yarıyor ... bu, oradaki imzaları bir şekilde çözdükleri anlamına geliyor
Sinyal hizmetinde bir hata var. Omuz değiştirdiğinizde tam tersini gösteriyor. Diyelim ki 1:500'den 1:100'e değiştiysem, kaldıracın 1:100'den 1:500'e değiştiğini gösteriyor. Bu konuda bir şeyler yapılması gerekiyor...)
Yani burada tamamen farklı bir durum var - şablon yok.
C ++'daki önceki örnek işe yarıyor ... bu, oradaki imzaları bir şekilde çözdükleri anlamına geliyor
C++ burada ne çıktı verir?
template < typename T>
void f( T& ) { Print ( __FUNCSIG__ ); }
void g1() { class A { int i; } a; f( a ); }
void g2() { class A { double d; } a; f( a ); }
Bunun MQL5'te çalışması için aynı değil iki farklı çıktı diziniz olması gerekir. Ama o zaman imzaların oluşumu için tamamen farklı bir mekanizma olmalı. C++ baskıda aynı sonucu veriyorsa, __FUNCSIG__ fiyatı önemli ölçüde düşer.
Fark ne
SetIndexBuffer(1,ValuesPainting,INDICATOR_COLOR_INDEX);
ve
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
?
Kodu büküyorum ve hareketli ortalamayı nasıl renklendireceğimi bulamıyorum.
Bir renk yükselirse, diğeri düşerse.
Birisi bir örnek gösterebilir mi?
Kodu büküyorum ve hareketli ortalamayı nasıl renklendireceğimi bulamıyorum.
Bir renk yükselirse, diğeri düşerse.
Birisi bir örnek gösterebilir mi?
Ben sadece MQL5'i öğreniyorum, ancak bunun gibi bir şey olmalı:
Ve (1) ve (2) arasındaki temel fark nedir? Neden bir durumda yanlış, diğerinde normal?
Ve (1) ve (2) arasındaki temel fark nedir? Neden bir durumda yanlış, diğerinde normal?
Bu nedenle, fonksiyonların içindeki sınıflar aynı ada ancak farklı içeriğe sahip olabilir. İkinci varyantta imza f anlaşılmaz.
İlkinden sonra kararını verdi. Ve ikinciden sonra, aynı adla yeniden tanımlamayın.
Fark ne
SetIndexBuffer(1,ValuesPainting,INDICATOR_COLOR_INDEX);
ve
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
?
Kodu büküyorum ve hareketli ortalamayı nasıl renklendireceğimi bulamıyorum.
Bir renk yükselirse, diğeri düşerse.
Birisi bir örnek gösterebilir mi?
Size PM'de biraz çarpık bir örnek gönderdim (Kopyala-Yapıştır söveleri düzeltmedi)
Böylece fonksiyonlar içindeki sınıflar aynı ada ancak farklı içeriğe sahip olabilir. İkinci varyantta imza f anlaşılmaz.
Hepsi aynı... ve işe yarıyor
C ++'daki önceki örnek işe yarıyor ... bu, oradaki imzaları bir şekilde çözdükleri anlamına geliyor
Ve (1)(2) ve (3)(4) arasındaki temel fark nedir???
Hepsi aynı... ve işe yarıyor
Yani burada tamamen farklı bir durum var - şablon yok.
C ++'daki önceki örnek işe yarıyor ... bu, oradaki imzaları bir şekilde çözdükleri anlamına geliyor
C++ burada ne çıktı verir?
Bunun MQL5'te çalışması için aynı değil iki farklı çıktı diziniz olması gerekir. Ama o zaman imzaların oluşumu için tamamen farklı bir mekanizma olmalı. C++ baskıda aynı sonucu veriyorsa, __FUNCSIG__ fiyatı önemli ölçüde düşer.
Aşağıdaki davranışa ne sebep olabilir?
derlerseniz gösterge düzgün çalışır, yeniden derlerseniz gösterge düzgün çalışmıyor. Test cihazında düzgün çalışıyor mu?