Bu fonksiyonların yardımıyla ChartTimePriceToXY ve ChartXYToTimePrice istediğiniz yere yerleştirebilirsiniz.
Beyinler bunu nasıl yapacağını bulmak için yeterli değil. Eski moda şekilde yaptım, çarpık, çarpık, ama işe yarıyor. Ve hiç kimse ChartTimePriceToXY ve ChartXYToTimePrice fonksiyonlarının yardımıyla ne kadar güzel olduğunu gösteremez ve çalışan bir kod örneğine bir bağlantı gösteremezler.
Leo59 : Beyinler bunu nasıl yapacağını bulmak için yeterli değil. Eski moda şekilde yaptım, çarpık, çarpık, ama işe yarıyor. Ve hiç kimse ChartTimePriceToXY ve ChartXYToTimePrice fonksiyonlarının yardımıyla ne kadar güzel olduğunu gösteremez ve çalışan bir kod örneğine bir bağlantı gösteremezler.
#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);
}
kodunuzu yeniden yazmadı, sadece işlevlerin kullanımıyla ilgili bir pasaj ekledi
kodunuzu yeniden yazmadı, sadece işlevlerin kullanımıyla ilgili bir pasaj ekledi
Ah, Rafil, ..... çok beklenmedik ve en önemlisi, o kadar güzel ki kafam bile karıştı... ÇOK TEŞEKKÜRLER!!!!! SÜPER!!!! Tam ihtiyacım olan şey bu olmalı! Zaten gece geç oldu ve sabah anlamaya çalışacağım))
Çubuk numaralarının pencerenin üst sınırında konumlandırıldığı resminizdeki animasyondan görülebilir. Yeni bir çubuk oluşturulduğunda ne olur? Belki de yeni bir çubuk oluşmadan önce bunu göstermek için videonun süresi biraz arttırılmalıydı?
Leo59 : Çubuk numaralarının pencerenin üst sınırında konumlandırıldığı resminizdeki animasyondan görülebilir. Ve yeni bir çubuk oluşturulduğunda ne olur? Belki de yeni bir çubuk oluşmadan önce bunu göstermek için videonun süresi biraz arttırılmalıydı?
kusura bakmayın yeni barın çıktığı anı yakalayamadım dikkatli bakın resim aşağıda...
peki, kodun kendisi, y_pos - gerekirse aşağıda üst kenarlıktan piksel sayısı, ardından CHART_HEIGHT_IN_PIXELSveyaCHART_WINDOW_YDISTANCE kullanın
//| 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);
}
//+------------------------------------------------------------------+
kusura bakmayın yeni barın çıktığı anı yakalayamadım dikkatli bakın resim aşağıda...
peki, kodun kendisi, y_pos - gerekirse aşağıda üst kenarlıktan piksel sayısı, ardından CHART_HEIGHT_IN_PIXELSveyaCHART_WINDOW_YDISTANCE kullanın
Rafil, özür dileyecek bir şeyin yok. Yaptığınız şey saygıyı ve taklidi hak ediyor. Çok memnunum! Ve mesele şu ki, gerçekten İHTİYACIM olan şey bu değil, sizin ilgiye, desteğe ve yardıma ihtiyacı olan insanlara karşı tavrınız. Sen, Rafil, bilen ve bilen birkaç kişiden birisin. "F1" tuşuna basmak için tavsiye vermekten fazlasını yapabilir. ÇOK TEŞEKKÜR EDERİM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Selamlar!
Bana bir dizi girdiyi nasıl yapacağımı söyle
Ben böyle çalışıyorum:
çift giriş Df_1 = 0.8;
çift giriş Df_2 = 0.1;
çift giriş Df_3= 0.3;
const double Df[3] = {Df_1 ,Df_2 ,Df_3 };
ama hata veriyor:
'Df_1' - sabit ifade gerekli
'Df_2' - sabit ifade gerekli
'Df_3' - sabit ifade gerekli
Bir seçenek olarak:
( Kodu foruma doğru şekilde yapıştırın )
Bu fonksiyonların yardımıyla ChartTimePriceToXY ve ChartXYToTimePrice istediğiniz yere yerleştirebilirsiniz.
Beyinler bunu nasıl yapacağını bulmak için yeterli değil. Eski moda şekilde yaptım, çarpık, çarpık, ama işe yarıyor. Ve hiç kimse ChartTimePriceToXY ve ChartXYToTimePrice fonksiyonlarının yardımıyla ne kadar güzel olduğunu gösteremez ve çalışan bir kod örneğine bir bağlantı gösteremezler.
kodunuzu yeniden yazmadı, sadece işlevlerin kullanımıyla ilgili bir pasaj ekledi
kodunuzu yeniden yazmadı, sadece işlevlerin kullanımıyla ilgili bir pasaj ekledi
Ah, Rafil, ..... çok beklenmedik ve en önemlisi, o kadar güzel ki kafam bile karıştı... ÇOK TEŞEKKÜRLER!!!!! SÜPER!!!! Tam ihtiyacım olan şey bu olmalı! Zaten gece geç oldu ve sabah anlamaya çalışacağım))
kodunuzu yeniden yazmadı, sadece işlevlerin kullanımıyla ilgili bir pasaj ekledi
Ne yazık ki, sizin sürümünüzde Rafil, sayılar her yeni çubukta yeniden çizilmez ve pencerenin üst (sizin sürümünüzde) sınırında ölçeklenmez.
Benim versiyonum:
Seninki, Rafil, seçenek:
Ne yazık ki, sizin sürümünüzde Rafil, sayılar her yeni çubukta yeniden çizilmez ve pencerenin üst (sizin sürümünüzde) sınırında ölçeklenmez.
Benim versiyonum:
Seninki, Rafil, seçenek:
Sanırım ihtiyacın var? resme tıklayın
Sanırım ihtiyacın var? resme tıklayın
ENUM_TIMEFRAMES türünde bir gösterge parametresini MqlParam yapısından geçirmeniz gerekiyorsa, bu parametre için ne tür belirtmelisiniz?
ENUM_DATATYPE, ENUM_TIMEFRAMES türünü ve diğer numaralandırmaları içermez .
Çubuk numaralarının pencerenin üst sınırında konumlandırıldığı resminizdeki animasyondan görülebilir. Ve yeni bir çubuk oluşturulduğunda ne olur? Belki de yeni bir çubuk oluşmadan önce bunu göstermek için videonun süresi biraz arttırılmalıydı?
kusura bakmayın yeni barın çıktığı anı yakalayamadım dikkatli bakın resim aşağıda...
peki, kodun kendisi, y_pos - gerekirse aşağıda üst kenarlıktan piksel sayısı, ardından CHART_HEIGHT_IN_PIXELS veya CHART_WINDOW_YDISTANCE kullanın
kusura bakmayın yeni barın çıktığı anı yakalayamadım dikkatli bakın resim aşağıda...
peki, kodun kendisi, y_pos - gerekirse aşağıda üst kenarlıktan piksel sayısı, ardından CHART_HEIGHT_IN_PIXELS veya CHART_WINDOW_YDISTANCE kullanın
Derin saygılarımla, Leonid Belsky.