Я кручу верчу код и никак не могу понять как раскрасить мувинг.
Если растет один цвет если падае другой.
Может кто нибудь пример показать ?
//+------------------------------------------------------------------+//| 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);
}
//+------------------------------------------------------------------+
В личку тебе скинул немного кривоватый пример (косяки Copy-Paste не поправил)
Есть ошибка в сервисе сигалов. Когда меняешь плечо оно показывает все наоборот. Допустим если сменил с 1:500 до 1:100 показывает , что плечо менялось с 1:100 до 1:500. Нужно что-то с этим делать... )
Так здесь совершенно иная ситуация - нет template.
Предыдущий пример в С++ работает... значит с сигнатурами там как то разобрались
Что выдает C++ здесь?
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 ); }
Чтобы это заработало в MQL5, нужно иметь на выходе две разные строки, а не одинаковые. Но тогда должен быть совсем иной механизм формирования сигнатур. Если же C++ выдает один и тот же результат на печати, тогда сильно падает цена __FUNCSIG__.
Чтобы это заработало в MQL5, нужно иметь на выходе две разные строки, а не одинаковые. Но тогда должен быть совсем иной механизм формирования сигнатур. Если же C++ выдает один и тот же результат на печати, тогда сильно падает цена __FUNCSIG__.
Результат: C++
void f<g1::A>( g1::A& ) void f<g2::A>( g2::A& )
Как видите строки разные... используется сигнатура функции
В чем разница
SetIndexBuffer(1,ValuesPainting,INDICATOR_COLOR_INDEX);
и
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
?
Я кручу верчу код и никак не могу понять как раскрасить мувинг.
Если растет один цвет если падае другой.
Может кто нибудь пример показать ?
В личку тебе скинул немного кривоватый пример (косяки Copy-Paste не поправил)
Так классы внутри функций могут быть одинакового имени, но разного содержания. Сигнатура f не понятная во втором варианте.
Вот все одинаковое... и работает
Предыдущий пример в С++ работает... значит с сигнатурами там как то разобрались
А какая принципиальная разница между (1)(2) и (3)(4) ???
Вот все одинаковое... и работает
Так здесь совершенно иная ситуация - нет template.
Предыдущий пример в С++ работает... значит с сигнатурами там как то разобрались
Что выдает C++ здесь?
Чтобы это заработало в MQL5, нужно иметь на выходе две разные строки, а не одинаковые. Но тогда должен быть совсем иной механизм формирования сигнатур. Если же C++ выдает один и тот же результат на печати, тогда сильно падает цена __FUNCSIG__.
C чем может быть связано следующие поведение
компилируешь индикатор работает правильно, компилируешь повторно индикатор работает не правильно. В тестере работает правильно ?
Ошибка при компиляции:
А какая принципиальная разница между (1)(2) и (3)(4) ???
Если объявлять классы (3)(4) вне функций - ошибок не возникает. Если объявить внутри функции - возникает.
C чем может быть связано следующие поведение
компилируешь индикатор работает правильно, компилируешь повторно индикатор работает не правильно. В тестере работает правильно ?
Какой индикатор?
Что выдает C++ здесь?
Чтобы это заработало в MQL5, нужно иметь на выходе две разные строки, а не одинаковые. Но тогда должен быть совсем иной механизм формирования сигнатур. Если же C++ выдает один и тот же результат на печати, тогда сильно падает цена __FUNCSIG__.
Результат: C++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Как видите строки разные... используется сигнатура функции
Результат: C++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Как видите строки разные... используется сигнатура функции
MQL5 выдает
void f<A>(A&)Т.е. нет сигнатуры класса внутри функции. Когда-нибудь будет поддерживаться.
А если класс глобальный, то C++ какую из строк выдает?
void f<::A>( ::A& )
void f<A>( A& )