#property indicator_chart_windowexternint History = 35; // Сколько баров мы имеем ввидуexternint Multiple = 5; // Кратность отображаемой разметкиcolor Color=0;
color Color_multiple=Moccasin; // Цвет индексов кратных "Multiple"color Color_between=MintCream; // Цвет индексов промежуточных string name="", name2="";
string Text="";
int Font_size=0;
int Font_size_multiple=14; // Размер шрифта индексов кратных "Multiple"int Font_size_between=8; // Размер шрифта индексов промежуточныхbool Back=true; //--- отобразим на переднем (false) или заднем (true) плане. Если (true), то подсветки дат не выводитсяstring Font="Arial"; // Шрифтdouble Angle=0.0; // Угол наклона в градусахint Style=STYLE_DOT; // Для всех - стиль пунктирint Width=1; // Толщина линииint x,y=10,y2;
double _price;
datetime dt;
int window;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж//+------------------------------------------------------------------+//| Custom indicator initialization function F 1 | int init()//+------------------------------------------------------------------+int init()
{
// IndicatorShortName(IN + " (" + ")"); // Короткое имя индикатораreturn(INIT_SUCCEEDED); // Успешная инициализация приложения
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж//+------------------------------------------------------------------+//| expert deinitialization function F 2 | int deinit()//+------------------------------------------------------------------+int deinit() // Время исполнения специальной функции deinit() ограничено периодом 2,5 секунды.
{
ObjectsDeleteAll(0,"label",0); // Идентификатор графика, префикс имени объекта, индекс окнаObjectsDeleteAll(0,"text",0);
return(0); // Выход из deinit()
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж//+------------------------------------------------------------------+//| Custom indicator iteration function F 3 | int start()//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i=0;
int limit=Bars-IndicatorCounted()-1;
if(limit>1) limit=MathMin(Bars,History+(History==0)*Bars)-1;
for(i=0; i<History; i++)
{
name="label "+i;
name2= "text "+i;
Text = DoubleToStr(i,0);
if(MathMod(i,Multiple)==0) // MathMod() Возвращает вещественный остаток от деления двух чисел (i/Multiple).
{
Color=Color_multiple;
Font_size=Font_size_multiple;
if(ObjectFind(0,name)==-1) // Если объект "name" не найден
{
ObjectCreate(0,name,OBJ_VLINE,0,Time[i],0); // Создаем объект..ObjectSetInteger(0,name,OBJPROP_STYLE,Style); //--- установим стиль отображения линииObjectSetInteger(0,name,OBJPROP_WIDTH,Width); //--- установим толщину линииObjectSetInteger(0,name,OBJPROP_COLOR,Color); //--- установим цветif(ChartTimePriceToXY(0,0,time[i],close[i],x,y2))
{
if(x<0) continue;
}
elsePrint(__FUNCTION__," return error code: ",GetLastError());
if(ChartXYToTimePrice(0,x,y,window,dt,_price))
{
if(!ObjectCreate(0,name2,OBJ_TEXT,0,time[i],_price))
{
Print(__FUNCTION__,
": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
}
//--- установим угол графика, относительно которого будут определяться координаты точки ObjectSetInteger(0,name2,OBJPROP_CORNER,CORNER_LEFT_UPPER);
//--- установим текст ObjectSetString(0,name2,OBJPROP_TEXT,IntegerToString(i));
//--- установим шрифт текста ObjectSetString(0,name2,OBJPROP_FONT,"Arial");
//--- установим размер шрифта ObjectSetInteger(0,name2,OBJPROP_FONTSIZE,12);
//--- установим угол наклона текста ObjectSetDouble(0,name2,OBJPROP_ANGLE,0);
//--- установим способ привязки ObjectSetInteger(0,name2,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);
//--- установим цвет ObjectSetInteger(0,name2,OBJPROP_COLOR,clrBlue);
//--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger(0,name2,OBJPROP_BACK,false);
//--- включим (true) или отключим (false) режим перемещения метки мышью ObjectSetInteger(0,name2,OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,name2,OBJPROP_SELECTED,false);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(0,name2,OBJPROP_HIDDEN,true);
//--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger(0,name2,OBJPROP_ZORDER,0);
}
elsePrint(__FUNCTION__," return error code: ",GetLastError());
}
else// Если объект "name" найден
{
ObjectMove(0,name,0,Time[i],0); // Сообщение новых координат.
}
}
/* else
{
Color = Color_between;
Font_size = Font_size_between;
if(ObjectFind(0, name)==-1) // Если объект "name" не найден
{
ObjectCreate(0,name,OBJ_VLINE,0,Time[i],0); // Создаем объект..
ObjectSetInteger(0,name,OBJPROP_STYLE,Style); //--- установим стиль отображения линии
ObjectSetInteger(0,name,OBJPROP_WIDTH,Width); //--- установим толщину линии
ObjectSetInteger(0,name,OBJPROP_COLOR,Color); //--- установим цвет
ObjectSetString(0,name,OBJPROP_TEXT,Text); //--- установим текст
ObjectSetString(0,name,OBJPROP_FONT,Font); //--- установим шрифт текста
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,Font_size); //--- установим размер шрифта
ObjectSetDouble(0,name,OBJPROP_ANGLE,Angle); //--- установим угол наклона текста
// Для отображения текстового описания объекта необходимо включить галочку опции "Показывать описания объектов" в окне Графики->Свойства финансового инструмента (F8) > Общие.
ObjectSetInteger(0,name,OBJPROP_BACK, Back); //--- отобразим на переднем (false) или заднем (true) плане
}
else // Если объект "name" найден
{
ObjectMove(0,name, 0, Time[i], 0); // Сообщение новых координат.
}
}*/
}
return(rates_total);
}
//| indexBars.mq5 |//| Copyright 2017, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property indicator_chart_window#property indicator_buffers0#property indicator_plots0int y_pos=10, //--- координата по Y для текстовой метки
x_pos, //--- координата по Х для текстовой метки
y2, bars,
visibleBars=0,//--- количество баров в видимой части графика
indexBars=0; //--- индекс левого крайнего бара в видимой части графикаdouble price;
string names="text";
datetime times[];
//+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ intOnInit()
{
EventSetMillisecondTimer(100);
MqlTick last_tick;
if(SymbolInfoTick(Symbol(),last_tick)) price=last_tick.last;
elsePrint("SymbolInfoTick() failed, error = ",GetLastError());
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
EventKillTimer();
ObjectsDeleteAll(0,names);
}
//+------------------------------------------------------------------+ //| 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[])
{
return(rates_total);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTimer()
{
bars=Bars(_Symbol, _Period);
if(bars<=0) return;
if(CopyTime(_Symbol, _Period, 0, bars, times)<=0) return;
//--- перевернем доступ к массиву times[] - сделаем как в таймсерии ArraySetAsSeries(times,true);
//--- если изменился номер крайнего индекса или кол-во видимых баров на графике, то отрисуем if(indexBars!=ChartFirstVisibleBar() || visibleBars!=ChartVisibleBars())
{
indexBars=ChartFirstVisibleBar(); //запомним новое значение
visibleBars=ChartVisibleBars();
int a=indexBars-visibleBars;
ObjectsDeleteAll(0,names);
for(int i=indexBars; i>a; i--)
{
if(ChartTimePriceToXY(0,0,times[i],price,x_pos,y2))
{
string nname=names+IntegerToString(i);
if(!LabelCreate(0,nname,0,x_pos,y_pos,0,IntegerToString(i,0)))
Print(__FUNCTION__,": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
}
elsePrint(__FUNCTION__," return error code: ",GetLastError());
}
}
ChartRedraw();
}
//+------------------------------------------------------------------+ //| Создает текстовую метку | //+------------------------------------------------------------------+ bool LabelCreate(constlong chart_ID=0, // ID графика conststring name="Label", // имя метки constint sub_window=0, // номер подокна constint x=0, // координата по оси X constint y=0, // координата по оси Y constENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки conststring text="Label", // текст conststring font="Arial", // шрифт constint font_size=10, // размер шрифта constcolor clr=clrRed, // цвет constdouble angle=0.0, // наклон текста constENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки constbool back=false, // на заднем плане constbool selection=false, // выделить для перемещений constbool hidden=true, // скрыт в списке объектов constlong z_order=0) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки ResetLastError();
//--- создадим текстовую метку if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим координаты метки ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим угол наклона текста ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим способ привязки ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение return(true);
}
//+------------------------------------------------------------------+ //| Функция получает номер первого видимого бара на графике. | //| Индексация как в таймсерии, последние бары имеют меньшие индексы.| //+------------------------------------------------------------------+ int ChartFirstVisibleBar(constlong chart_ID=0)
{
//--- подготовим переменную для получения значения свойства long result=-1;
//--- сбросим значение ошибки ResetLastError();
//--- получим значение свойства if(!ChartGetInteger(chart_ID,CHART_FIRST_VISIBLE_BAR,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты" Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика return((int)result);
}
//+------------------------------------------------------------------+ //| Функция получает количество баров, которые отображаются (видимы )| //| в окне графика. | //+------------------------------------------------------------------+ int ChartVisibleBars(constlong chart_ID=0)
{
//--- подготовим переменную для получения значения свойства long result=-1;
//--- сбросим значение ошибки ResetLastError();
//--- получим значение свойства if(!ChartGetInteger(chart_ID,CHART_VISIBLE_BARS,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты" Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика return((int)result);
}
//+------------------------------------------------------------------+
问候!
你能告诉我如何使一个数组的instu
我正试图这样做。
输入双倍Df_1 = 0.8。
输入双倍Df_2 = 0.1。
输入双倍Df_3 = 0.3。
const double Df[3] = {Df_1 ,Df_2 ,Df_3 };
但它产生了一个错误。
'Df_1' - 需要常数表达式
'Df_2' - 需要常数表达式
'Df_3' - 需要常数表达式
一个变体。
(在论坛中正确插入代码)
通过这些ChartTimePriceToXY和 ChartXYToTimePrice函数,你可以在任何地方安排
我没有脑子去想怎么做。在这里,我采用了老式的方法,歪歪斜斜的,但它是有效的。也没有人可以告诉你如何 使用ChartTimePriceToXY 和ChartXYToTimePrice 函数 使它看起来漂亮,或者为你提供一个工作代码的例子链接。
我没有重写你的代码,只是添加了一个关于如何使用这些函数的片段
没有重写你的代码,只是添加了一个关于函数使用的片段
哦,拉菲尔,.....,这太出乎意料了,最重要的是,这么好,我甚至感到困惑......非常感谢您!!!!!SUPER!!!!可能正是我所需要的!!!!现在已经是深夜了,到了早上,我将努力使之合理化))
我没有重写你的代码,只是添加了一个关于使用函数的片段
唉,但在你的版本中,Rafil,数字不是在每个新的条形图上重新绘制,也不是在窗口的上边界(在你的版本中)进行缩放。
我的变体。
你的,拉菲尔,变体。
唉,但在你的版本中,Rafil,数字并没有在每个新的条形图上重新绘制,也没有在窗口的上边界(在你的版本中)进行缩放。
我的变体。
你的,拉斐尔,选择。
我想你需要它?
我想你需要这个吧? 请点击图片
如果我想通过MqlParam结构 传递一个ENUM_TIMEFRAMES类型的指标参数,我应该为这个参数指明什么类型?
在ENUM_DATATYPE 中,没有 ENUM_TIMEFRAMES和其他枚举类型。
你的动画显示,条形数字被定位在窗口的上边界 附近。当一个新的酒吧形成时,会发生什么?也许动画的持续时间应该在新的柱状体形成之前稍微长一些,以说明这一点?
对不起,我没有抓住新栏出现的那一刻,仔细看,下面的图片...
和代码本身,y_pos - 距离顶部边界的像素数,如果你想要底部,使用CHART_HEIGHT_IN_PIXELS 或CHART_WINDOW_YDISTANCE
对不起,我没有抓住新栏出现的那一刻,仔细看,下面的图片...
和代码,y_pos - 距离顶部边界的像素数。 如果你想要底部,使用CHART_HEIGHT_IN_PIXELS 或CHART_WINDOW_YDISTANCE
深表敬意,列昂尼德-别尔斯基。