Comestas funções ChartTimePriceToXY e ChartXYToTimePrice pode organizar em qualquer lugar
Não há cérebros suficientes para descobrir como o fazer. Aqui fi-lo à maneira antiga, torto, mas funciona. E ninguém lhe pode mostrar como fazer com que fique bonito usando as funções ChartTimePriceToXY e ChartXYToTimePrice ou fornecer-lhe um link para um exemplo de código funcional.
Leo59: Não tenho o cérebro para descobrir como fazê-lo. Aqui fi-lo à maneira antiga, torto e inclinado, mas funciona. E ninguém lhe pode mostrar como fazer com que fique bonito usando as funções ChartTimePriceToXY e ChartXYToTimePrice ou fornecer-lhe um link para um exemplo de código funcional.
#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);
}
Eu não reescrevi o seu código, apenas acrescentei um trecho sobre como usar as funções
não reescreveu o seu código, apenas acrescentou um trecho sobre o uso das funções
Ooh, Rafil, ..... isto é tão inesperado, e o mais importante, tão agradável, até estou confuso... MUITO OBRIGADO!!!!! SUPER!!!! Provavelmente o que eu precisava!!!! Agora está no fundo da noite e, de manhã, vou tentar dar-lhe sentido))
Não reescrevi o seu código, apenas acrescentei um fragmento sobre a utilização de funções
Infelizmente, mas na sua versão, Rafil, os dígitos não são redesenhados em cada nova barra e não são escalados no limite superior (na sua versão) da janela.
Infelizmente, mas na sua versão, Rafil, os dígitos não são redesenhados em cada nova barra e não são escalados no limite superior (na sua versão) da janela.
A partir da animação na sua fotografia pode ver que os números de barras estão posicionados na margem superior da janela. O que acontece quando uma nova barra é formada? Talvez a duração do clipe devesse ter sido ligeiramente mais longa, antes de se formar uma nova barra, para ilustrar isto?
Leo59: A sua animação mostra que os números de barras estão posicionados perto da borda superior da janela. O que acontece quando uma nova barra é formada? Talvez a duração da animação devesse ter sido ligeiramente mais longa antes da formação de um novo bar para ilustrar isto?
Desculpe, não apanhei o momento em que o novo bar apareceu, veja com atenção, a imagem abaixo...
e o próprio código, y_pos - número de pixels da margem superior, se quiser a margem inferior, useCHART_HEIGHT_IN_PIXELS ouCHART_WINDOW_YDISTANCE
//| 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);
}
//+------------------------------------------------------------------+
Desculpe, não apanhei o momento em que o novo bar apareceu, veja com atenção, a imagem abaixo...
e o código, y_pos - número de pixels da margem superior. Se quiser a margem inferior, utilizeCHART_HEIGHT_IN_PIXELS ouCHART_WINDOW_YDISTANCE
Rafil, não tem nada por que pedir desculpa. O que fez merece respeito e emulação. Estou muito satisfeito! E a questão não está sequer no facto de ter feito O QUE eu precisava, mas na sua atitude para com as pessoas que precisam de atenção, apoio e ajuda. Você, Rafil, é um dos poucos que sabe e pode. Pode fazer mais do que apenas dar conselhos para pressionar a tecla "F1". INFINITO GRAÇAS A SI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!...
Saudações!
Pode dizer-me como fazer um conjunto de instu
Estou a tentar fazê-lo desta forma:
input duplo Df_1 = 0,8;
input duplo Df_2 = 0,1;
input duplo Df_3 = 0,3;
const double Df[3] = {Df_1 ,Df_2 ,Df_3 };
mas gera um erro :
'Df_1' - expressão constante necessária
'Df_2' - expressão constante necessária
'Df_3' - expressão constante necessária
Uma variante:
(Insira o código correctamente no fórum)
Comestas funções ChartTimePriceToXY e ChartXYToTimePrice pode organizar em qualquer lugar
Não tenho o cérebro para descobrir como fazê-lo. Aqui fi-lo à maneira antiga, torto e inclinado, mas funciona. E ninguém lhe pode mostrar como fazer com que fique bonito usando as funções ChartTimePriceToXY e ChartXYToTimePrice ou fornecer-lhe um link para um exemplo de código funcional.
Eu não reescrevi o seu código, apenas acrescentei um trecho sobre como usar as funções
não reescreveu o seu código, apenas acrescentou um trecho sobre o uso das funções
Ooh, Rafil, ..... isto é tão inesperado, e o mais importante, tão agradável, até estou confuso... MUITO OBRIGADO!!!!! SUPER!!!! Provavelmente o que eu precisava!!!! Agora está no fundo da noite e, de manhã, vou tentar dar-lhe sentido))
Não reescrevi o seu código, apenas acrescentei um fragmento sobre a utilização de funções
Infelizmente, mas na sua versão, Rafil, os dígitos não são redesenhados em cada nova barra e não são escalados no limite superior (na sua versão) da janela.
A minha variante:
A sua, Rafil, variante:
Infelizmente, mas na sua versão, Rafil, os dígitos não são redesenhados em cada nova barra e não são escalados no limite superior (na sua versão) da janela.
A minha variante:
A sua, Rafil, opção:
Presumo que precise dele?
Presumo que precise disto? clique na imagem
Se eu quiser passar um parâmetro indicador do tipo ENUM_TIMEFRAMES através da estrutura MqlParam, que tipo devo indicar para este parâmetro?
EmENUM_DATATYPE não há nenhum tipo ENUM_TIMEFRAMES e outras enumerações.
A sua animação mostra que os números de barras estão posicionados perto da borda superior da janela. O que acontece quando uma nova barra é formada? Talvez a duração da animação devesse ter sido ligeiramente mais longa antes da formação de um novo bar para ilustrar isto?
Desculpe, não apanhei o momento em que o novo bar apareceu, veja com atenção, a imagem abaixo...
e o próprio código, y_pos - número de pixels da margem superior, se quiser a margem inferior, useCHART_HEIGHT_IN_PIXELS ouCHART_WINDOW_YDISTANCE
Desculpe, não apanhei o momento em que o novo bar apareceu, veja com atenção, a imagem abaixo...
e o código, y_pos - número de pixels da margem superior. Se quiser a margem inferior, utilizeCHART_HEIGHT_IN_PIXELS ouCHART_WINDOW_YDISTANCE
Com profundo respeito, Leonid Belsky.