Conqueste funzioni ChartTimePriceToXY e ChartXYToTimePrice potete disporre ovunque
Non c'è abbastanza cervello per capire come fare. Qui l'ho fatto alla vecchia maniera, storto, ma funziona. E nessuno può mostrarti come farlo sembrare bello usando le funzioni ChartTimePriceToXY e ChartXYToTimePrice o fornirti un link ad un esempio di codice funzionante.
Leo59: Non ho il cervello per capire come fare. Qui l'ho fatto alla vecchia maniera, storto e inclinato, ma funziona. Nessuno può mostrarvi come farlo sembrare bello usando le funzioni ChartTimePriceToXY e ChartXYToTimePrice o fornirvi un link ad un esempio funzionante.
#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);
}
Non ho riscritto il tuo codice, ho solo aggiunto uno snippet su come usare le funzioni
Non ho riscritto il tuo codice, ho solo aggiunto uno snippet sull'uso delle funzioni
Ooh, Rafil, ..... questo è così inaspettato, e soprattutto, così bello, che sono persino confuso... GRAZIE MILLE!!!!! SUPER!!!! Probabilmente proprio quello di cui avevo bisogno!!!! Ora è notte fonda, e domattina cercherò di dare un senso a tutto questo))
Non ho riscritto il tuo codice, ho solo aggiunto un frammento sull'uso delle funzioni
Ahimè, ma nella tua versione, Rafil, le cifre non sono ridisegnate su ogni nuova barra e non sono scalate al limite superiore (nella tua versione) della finestra.
Ahimè, ma nella tua versione, Rafil, le cifre non sono ridisegnate su ogni nuova barra e non sono scalate al limite superiore (nella tua versione) della finestra.
Suppongo che tu abbia bisogno di questo? clicca sull'immagine
Dall'animazione nella tua immagine puoi vedere che i numeri delle barre sono posizionati sul bordo superiore della finestra. Cosa succede quando si forma una nuova barra? Forse la durata della clip avrebbe dovuto essere leggermente più lunga, prima della formazione di una nuova barra, per illustrare questo?
Leo59: La tua animazione mostra che i numeri delle barre sono posizionati vicino al bordo superiore della finestra. Cosa succede quando si forma una nuova barra? Forse la durata dell'animazione avrebbe dovuto essere leggermente più lunga prima della formazione di una nuova barra per illustrare questo?
Scusa, non ho colto il momento in cui è apparsa la nuova barra, guarda bene, l'immagine qui sotto...
e il codice stesso, y_pos - numero di pixel dal bordo superiore, se volete il fondo, usateCHART_HEIGHT_IN_PIXELS oCHART_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);
}
//+------------------------------------------------------------------+
Scusa, non ho colto il momento in cui è apparsa la nuova barra, guarda bene, l'immagine qui sotto...
e il codice, y_pos - numero di pixel dal bordo superiore. Se volete il fondo, usateCHART_HEIGHT_IN_PIXELS oCHART_WINDOW_YDISTANCE
Rafil, non hai nulla di cui scusarti. Quello che avete fatto merita rispetto ed emulazione. Sono molto soddisfatto! E la questione non è nemmeno nel fatto che hai fatto QUELLO di cui avevo bisogno, ma nel tuo atteggiamento verso le persone che hanno bisogno di attenzione, sostegno e aiuto. Tu, Rafil, sei uno dei pochi che sanno e possono. Può fare di più che consigliare di premere il tasto "F1". GRAZIE INFINITE A TE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!...
Saluti!
Potete dirmi come fare un array di istu
Sto cercando di fare così:
input double Df_1 = 0.8;
ingresso doppio Df_2 = 0,1;
input double Df_3 = 0.3;
const double Df[3] = {Df_1 ,Df_2 ,Df_3 };
ma genera un errore:
'Df_1' - espressione costante richiesta
'Df_2' - espressione costante richiesta
'Df_3' - espressione costante richiesta
Una variante:
(Inserire il codice correttamente nel forum)
Conqueste funzioni ChartTimePriceToXY e ChartXYToTimePrice potete disporre ovunque
Non ho il cervello per capire come fare. Qui l'ho fatto alla vecchia maniera, storto e inclinato, ma funziona. Nessuno può mostrarvi come farlo sembrare bello usando le funzioni ChartTimePriceToXY e ChartXYToTimePrice o fornirvi un link ad un esempio funzionante.
Non ho riscritto il tuo codice, ho solo aggiunto uno snippet su come usare le funzioni
Non ho riscritto il tuo codice, ho solo aggiunto uno snippet sull'uso delle funzioni
Ooh, Rafil, ..... questo è così inaspettato, e soprattutto, così bello, che sono persino confuso... GRAZIE MILLE!!!!! SUPER!!!! Probabilmente proprio quello di cui avevo bisogno!!!! Ora è notte fonda, e domattina cercherò di dare un senso a tutto questo))
Non ho riscritto il tuo codice, ho solo aggiunto un frammento sull'uso delle funzioni
Ahimè, ma nella tua versione, Rafil, le cifre non sono ridisegnate su ogni nuova barra e non sono scalate al limite superiore (nella tua versione) della finestra.
La mia variante:
Il tuo, Rafil, variante:
Ahimè, ma nella tua versione, Rafil, le cifre non sono ridisegnate su ogni nuova barra e non sono scalate al limite superiore (nella tua versione) della finestra.
La mia variante:
La tua, Rafil, opzione:
Suppongo che tu ne abbia bisogno?
Suppongo che tu abbia bisogno di questo? clicca sull'immagine
Se voglio passare un parametro indicatore di tipo ENUM_TIMEFRAMES tramite la struttura MqlParam, che tipo devo indicare per questo parametro?
InENUM_DATATYPE non c'è il tipo ENUM_TIMEFRAMES e altre enumerazioni.
La tua animazione mostra che i numeri delle barre sono posizionati vicino al bordo superiore della finestra. Cosa succede quando si forma una nuova barra? Forse la durata dell'animazione avrebbe dovuto essere leggermente più lunga prima della formazione di una nuova barra per illustrare questo?
Scusa, non ho colto il momento in cui è apparsa la nuova barra, guarda bene, l'immagine qui sotto...
e il codice stesso, y_pos - numero di pixel dal bordo superiore, se volete il fondo, usateCHART_HEIGHT_IN_PIXELS oCHART_WINDOW_YDISTANCE
Scusa, non ho colto il momento in cui è apparsa la nuova barra, guarda bene, l'immagine qui sotto...
e il codice, y_pos - numero di pixel dal bordo superiore. Se volete il fondo, usateCHART_HEIGHT_IN_PIXELS oCHART_WINDOW_YDISTANCE
Con profondo rispetto, Leonid Belsky.