Avecces fonctions ChartTimePriceToXY et ChartXYToTimePrice, vous pouvez arranger n'importe où
Pas assez de cervelle pour trouver comment le faire. Ici, je l'ai fait à l'ancienne, de travers, mais ça marche. Et personne ne peut vous montrer comment le rendre agréable à l' aide des fonctions ChartTimePriceToXY et ChartXYToTimePrice ou vous fournir un lien vers un exemple de code fonctionnel.
Leo59: Je n'ai pas le cerveau pour trouver comment le faire. Ici, je l'ai fait à l'ancienne, de travers et en biais, mais ça marche. Personne ne peut vous montrer comment le rendre agréable à l' aide des fonctions ChartTimePriceToXY et ChartXYToTimePrice ou vous fournir un lien vers un exemple fonctionnel.
#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);
}
Je n'ai pas réécrit votre code, j'ai juste ajouté un extrait sur la façon d'utiliser les fonctions.
je n'ai pas réécrit votre code, j'ai juste ajouté un extrait sur l'utilisation des fonctions
Ooh, Rafil, ..... c'est tellement inattendu, et surtout tellement gentil, que je suis même confuse... MERCI BEAUCOUP !!!!! SUPER !!!! Probablement juste ce dont j'avais besoin !!!! La nuit est profonde maintenant, et demain matin, j'essaierai d'y trouver un sens)).
Je n'ai pas réécrit votre code, j'ai juste ajouté un fragment sur l'utilisation des fonctions
Hélas, mais dans ta version, Rafil, les chiffres ne sont pas redessinés à chaque nouvelle barre et ne sont pas mis à l'échelle à la limite supérieure (dans ta version) de la fenêtre.
Hélas, mais dans ta version, Rafil, les chiffres ne sont pas redessinés à chaque nouvelle barre et ne sont pas mis à l'échelle à la limite supérieure (dans ta version) de la fenêtre.
Je suppose que vous avez besoin de cela ? cliquez sur l'image
D'après l'animation de votre image, vous pouvez voir que les numéros de barre sont positionnés sur le bord supérieur de la fenêtre. Que se passe-t-il lorsqu'une nouvelle barre se forme ? Peut-être que la durée du clip aurait dû être légèrement plus longue, avant la formation d'une nouvelle barre, pour illustrer cela ?
Leo59: Votre animation montre que les numéros de barre sont positionnés près du bord supérieur de la fenêtre. Que se passe-t-il lorsqu'une nouvelle barre se forme ? Peut-être que la durée de l'animation aurait dû être légèrement plus longue avant la formation d'une nouvelle barre pour illustrer cela ?
Désolé, je n'ai pas saisi le moment où la nouvelle barre est apparue, regardez bien, l'image ci-dessous...
et le code lui-même, y_pos - nombre de pixels à partir du bord supérieur, si vous voulez le bas, utilisezCHART_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);
}
//+------------------------------------------------------------------+
Désolé, je n'ai pas saisi le moment où la nouvelle barre est apparue, regardez bien, l'image ci-dessous...
et le code, y_pos - nombre de pixels à partir du bord supérieur. Si vous voulez le bas, utilisezCHART_HEIGHT_IN_PIXELS ouCHART_WINDOW_YDISTANCE
Rafil, tu n'as pas à t'excuser. Ce que vous avez fait mérite le respect et l'émulation. Je suis très satisfait ! Et la question n'est même pas dans le fait que vous ayez fait ce dont j'avais besoin, mais dans votre attitude envers les personnes qui ont besoin d'attention, de soutien et d'aide. Toi, Rafil, tu es l'un des rares à savoir et à pouvoir le faire. Peut faire plus que simplement donner le conseil d'appuyer sur la touche "F1". MERCI INFINIMENT À VOUS ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!...
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Salutations !
Pouvez-vous me dire comment faire un tableau d'instu...
J'essaie de faire comme ça :
entrée double Df_1 = 0,8 ;
entrée double Df_2 = 0,1 ;
entrée double Df_3 = 0,3 ;
const double Df[3] = {Df_1 ,Df_2 ,Df_3 } ;
mais il génère une erreur :
Df_1 - expression constante nécessaire
Df_2' - expression constante requise
Df_3 - expression constante requise
Une variante :
(Insérer le code correctement dans le forum)
Avecces fonctions ChartTimePriceToXY et ChartXYToTimePrice, vous pouvez arranger n'importe où
Je n'ai pas le cerveau pour trouver comment le faire. Ici, je l'ai fait à l'ancienne, de travers et en biais, mais ça marche. Personne ne peut vous montrer comment le rendre agréable à l' aide des fonctions ChartTimePriceToXY et ChartXYToTimePrice ou vous fournir un lien vers un exemple fonctionnel.
Je n'ai pas réécrit votre code, j'ai juste ajouté un extrait sur la façon d'utiliser les fonctions.
je n'ai pas réécrit votre code, j'ai juste ajouté un extrait sur l'utilisation des fonctions
Ooh, Rafil, ..... c'est tellement inattendu, et surtout tellement gentil, que je suis même confuse... MERCI BEAUCOUP !!!!! SUPER !!!! Probablement juste ce dont j'avais besoin !!!! La nuit est profonde maintenant, et demain matin, j'essaierai d'y trouver un sens)).
Je n'ai pas réécrit votre code, j'ai juste ajouté un fragment sur l'utilisation des fonctions
Hélas, mais dans ta version, Rafil, les chiffres ne sont pas redessinés à chaque nouvelle barre et ne sont pas mis à l'échelle à la limite supérieure (dans ta version) de la fenêtre.
Ma variante :
Votre, Rafil, variante :
Hélas, mais dans ta version, Rafil, les chiffres ne sont pas redessinés à chaque nouvelle barre et ne sont pas mis à l'échelle à la limite supérieure (dans ta version) de la fenêtre.
Ma variante :
Votre, Rafil, option :
Je suppose que vous en avez besoin ?
Je suppose que vous avez besoin de cela ? cliquez sur l'image
Si je veux passer un paramètre indicateur de type ENUM_TIMEFRAMES via la structure MqlParam, quel type dois-je indiquer pour ce paramètre ?
DansENUM_DATATYPE il n'y a pas de type ENUM_TIMEFRAMES et autres énumérations.
Votre animation montre que les numéros de barre sont positionnés près du bord supérieur de la fenêtre. Que se passe-t-il lorsqu'une nouvelle barre se forme ? Peut-être que la durée de l'animation aurait dû être légèrement plus longue avant la formation d'une nouvelle barre pour illustrer cela ?
Désolé, je n'ai pas saisi le moment où la nouvelle barre est apparue, regardez bien, l'image ci-dessous...
et le code lui-même, y_pos - nombre de pixels à partir du bord supérieur, si vous voulez le bas, utilisezCHART_HEIGHT_IN_PIXELS ouCHART_WINDOW_YDISTANCE
Désolé, je n'ai pas saisi le moment où la nouvelle barre est apparue, regardez bien, l'image ci-dessous...
et le code, y_pos - nombre de pixels à partir du bord supérieur. Si vous voulez le bas, utilisezCHART_HEIGHT_IN_PIXELS ouCHART_WINDOW_YDISTANCE
Avec un profond respect, Leonid Belsky.