Estoy retorciendo el código y no consigo averiguar cómo colorear el mouwing.
Si un color crece y otro cae.
¿Puede alguien mostrarme un ejemplo?
//+------------------------------------------------------------------+//| 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);
}
//+------------------------------------------------------------------+
Te he enviado un ejemplo un poco incómodo (no he corregido los errores de copy-paste)
Hay un error en el servicio de cigarros. Cuando se cambia el apalancamiento, se muestra lo contrario. Por ejemplo, si se cambia de 1:500 a 1:100 se muestra que el apalancamiento se cambió de 1:100 a 1:500. Tengo que hacer algo al respecto... )
Así que la situación aquí es completamente diferente: no hay plantilla.
El ejemplo anterior funciona en C++... por lo que las firmas son de alguna manera atendidas allí
¿Qué está dando C++ aquí?
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 ); }
Para que funcione en MQL5, la salida debe contener dos cadenas diferentes, no la misma. Pero el mecanismo de generación de firmas tendrá que ser bastante diferente en este caso. Si C++ produce el mismo resultado en la impresión, el coste de __FUNCSIG__ se reducirá drásticamente.
Con qué puede relacionarse el siguiente comportamiento
El indicador de compilación funciona correctamente, el indicador de compilación de nuevo no funciona correctamente. ¿Funciona correctamente en el probador?
¿Cuál es la diferencia?
SetIndexBuffer(1,ValuesPainting,INDICATOR_COLOR_INDEX);
и
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
?
Estoy retorciendo el código y no consigo averiguar cómo colorear el mouwing.
Si un color crece y otro cae.
¿Puede alguien mostrarme un ejemplo?
Estoy dando vueltas al código y no consigo saber cómo colorear el mouwing.
Si un color sube, si otro baja.
¿Puede alguien mostrarme un ejemplo?
Recién estoy aprendiendo MQL5, pero debería verse así:
¿Cuál es la diferencia fundamental entre (1) y (2)? ¿Por qué hay un error en un caso y un error normal en el otro?
¿Y cuál es la diferencia fundamental entre (1) y (2)? ¿Por qué hay un error en un caso y normal en el otro?
Así, las clases dentro de las funciones pueden tener el mismo nombre pero diferentes contenidos. La firma f no está clara en la segunda variante.
Después de la primera se define. Y después de la segunda no se redefine con el mismo nombre.
¿Cuál es la diferencia?
SetIndexBuffer(1,ValuesPainting,INDICATOR_COLOR_INDEX);
и
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
?
Estoy retorciendo el código y no consigo averiguar cómo colorear el mouwing.
Si un color crece y otro cae.
¿Puede alguien mostrarme un ejemplo?
Te he enviado un ejemplo un poco incómodo (no he corregido los errores de copy-paste)
Así, las clases dentro de las funciones pueden tener el mismo nombre pero diferentes contenidos. La firma f no está clara en la segunda variante.
Aquí, todo es igual... y funciona
El ejemplo anterior en C++ funciona... para que las firmas se ordenen de alguna manera.
¿Cuál es la diferencia fundamental entre (1)(2) y (3)(4)?
Aquí es todo lo mismo... y funciona.
Así que la situación aquí es completamente diferente: no hay plantilla.
El ejemplo anterior funciona en C++... por lo que las firmas son de alguna manera atendidas allí
¿Qué está dando C++ aquí?
Para que funcione en MQL5, la salida debe contener dos cadenas diferentes, no la misma. Pero el mecanismo de generación de firmas tendrá que ser bastante diferente en este caso. Si C++ produce el mismo resultado en la impresión, el coste de __FUNCSIG__ se reducirá drásticamente.
Con qué puede relacionarse el siguiente comportamiento
El indicador de compilación funciona correctamente, el indicador de compilación de nuevo no funciona correctamente. ¿Funciona correctamente en el probador?