//+------------------------------------------------------------------+//| 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);
}
//+------------------------------------------------------------------+
따라서 함수 내부의 클래스는 이름은 같지만 내용이 다를 수 있습니다 . 서명 f는 두 번째 변형에서 이해할 수 없습니다.
그것은 모두 동일합니다 ... 작동합니다
#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();
}
차이점은 무엇입니까
SetIndexBuffer(1,ValuesPainting,INDICATOR_COLOR_INDEX);
그리고
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
?
코드를 비틀고 있는데 이동 평균 의 색상을 지정하는 방법을 알 수 없습니다.
한 색이 오르면 다른 색이 떨어지면.
누군가가 예를 보여줄 수 있습니까?
코드를 비틀고 있는데 이동 평균의 색상을 지정하는 방법을 알 수 없습니다.
한 색이 오르면 다른 색이 떨어지면.
누군가가 예를 보여줄 수 있습니까?
저는 MQL5에 대해 배우고 있지만 다음과 같아야 합니다.
그리고 (1)과 (2)의 근본적인 차이점은 무엇입니까? 한 경우에는 잘못되고 다른 경우에는 정상인 이유는 무엇입니까?
그리고 (1)과 (2)의 근본적인 차이점은 무엇입니까? 한 경우에는 잘못되고 다른 경우에는 정상인 이유는 무엇입니까?
따라서 함수 내부의 클래스는 이름은 같지만 내용이 다를 수 있습니다. 서명 f는 두 번째 변형에서 이해할 수 없습니다.
첫 번째 이후, 그녀는 마음을 정했습니다. 그리고 두 번째 이후에는 같은 이름으로 같은 것을 재정의하지 마십시오.
차이점은 무엇입니까
SetIndexBuffer(1,ValuesPainting,INDICATOR_COLOR_INDEX);
그리고
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
?
코드를 비틀고 있는데 이동 평균의 색상을 지정하는 방법을 알 수 없습니다.
한 색이 오르면 다른 색이 떨어지면.
누군가가 예를 보여줄 수 있습니까?
오후에 약간 비뚤어진 예를 보냈습니다 (복사-붙여 넣기가 잼을 수정하지 못했습니다)
따라서 함수 내부의 클래스는 이름은 같지만 내용이 다를 수 있습니다 . 서명 f는 두 번째 변형에서 이해할 수 없습니다.
그것은 모두 동일합니다 ... 작동합니다
C ++의 이전 예제는 작동합니다 ... 그것은 그들이 어떻게 든 서명을 알아 냈습니다.
그리고 (1)(2)와 (3)(4)의 근본적인 차이점은 무엇입니까???
그것은 모두 동일합니다 ... 작동합니다
여기 완전히 다른 상황이 있습니다. 템플릿이 없습니다.
C ++의 이전 예제는 작동합니다 ... 그것은 그들이 어떻게 든 서명을 알아 냈습니다.
여기서 C++는 무엇을 출력합니까?
이것이 MQL5에서 작동하려면 동일한 것이 아니라 두 개의 다른 출력 문자열이 있어야 합니다. 그러나 서명 형성을 위한 완전히 다른 메커니즘이 있어야 합니다. C++에서 동일한 결과를 출력하면 __FUNCSIG__의 가격이 크게 떨어집니다.
다음 행동의 이유는 무엇입니까?
표시기를 컴파일하면 올바르게 작동하지만 다시 컴파일하면 표시기가 올바르게 작동하지 않습니다. 테스터에서 제대로 작동합니까?