Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 810

 
Anttonnio :

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

katı dizi başlatmaya atıfta bulunarak

Bir seçenek olarak:

 input double    Df_0 = 0.8 ;
input double    Df_1 = 0.1 ;
input double    Df_2= 0.3 ;
double Df[ 3 ];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+ 
void OnInit ()
  {
   Df[ 0 ]=Df_0;
   Df[ 1 ]=Df_1;
   Df[ 2 ]=Df_2;

( Kodu foruma doğru şekilde yapıştırın )

 
Rafil Nurmukhametov :

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_window

extern int History = 35 ;                                               // Сколько баров мы имеем ввиду
extern int 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()
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &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 ;
              }
             else
               Print ( __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 );
              }
             else
               Print ( __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

 
Rafil Nurmukhametov :

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))

 
Rafil Nurmukhametov :

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:


 
Leo59 :

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


 
Rafil Nurmukhametov :

Sanırım ihtiyacın var? resme tıklayın


Ç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ı?
 

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 .

 
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_PIXELS veya CHART_WINDOW_YDISTANCE kullanın


 //|                                                    indexBars.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_chart_window 
#property indicator_buffers 0 
#property indicator_plots    0 

int      y_pos= 10 ,     //--- координата по Y для текстовой метки
        x_pos,         //--- координата по Х для текстовой метки  
        y2, bars,             
        visibleBars= 0 , //--- количество баров в видимой части графика
        indexBars= 0 ;   //--- индекс левого крайнего бара в видимой части графика
double   price;         
string   names= "text" ; 
datetime times[];
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit ()
  {
   EventSetMillisecondTimer ( 100 );
   MqlTick last_tick;
   if ( SymbolInfoTick ( Symbol (),last_tick)) price=last_tick.last;
   else Print ( "SymbolInfoTick() failed, error = " , GetLastError ());

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   EventKillTimer ();
   ObjectsDeleteAll ( 0 ,names);
  }
//+------------------------------------------------------------------+ 
//| Custom indicator iteration function                              | 
//+------------------------------------------------------------------+ 
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
   return (rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   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 ());
           }
         else
             Print ( __FUNCTION__ , " return error code: " , GetLastError ());
        }
     }
   ChartRedraw ();
  }
//+------------------------------------------------------------------+ 
//| Создает текстовую метку                                          | 
//+------------------------------------------------------------------+ 
bool LabelCreate( const long               chart_ID= 0 ,               // ID графика 
                 const string             name= "Label" ,             // имя метки 
                 const int                sub_window= 0 ,             // номер подокна 
                 const int                x= 0 ,                       // координата по оси X 
                 const int                y= 0 ,                       // координата по оси Y 
                 const ENUM_BASE_CORNER   corner= CORNER_LEFT_UPPER , // угол графика для привязки 
                 const string             text= "Label" ,             // текст 
                 const string             font= "Arial" ,             // шрифт 
                 const int                font_size= 10 ,             // размер шрифта 
                 const color              clr= clrRed ,               // цвет 
                 const double             angle= 0.0 ,                 // наклон текста 
                 const ENUM_ANCHOR_POINT anchor= ANCHOR_LEFT_UPPER , // способ привязки 
                 const bool               back= false ,               // на заднем плане 
                 const bool               selection= false ,           // выделить для перемещений 
                 const bool               hidden= true ,               // скрыт в списке объектов 
                 const long               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( const long 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( const long chart_ID= 0 )
  {
//--- подготовим переменную для получения значения свойства 
   long result=- 1 ;
//--- сбросим значение ошибки 
   ResetLastError ();
//--- получим значение свойства 
   if (! ChartGetInteger (chart_ID, CHART_VISIBLE_BARS , 0 ,result))
     {
       //--- выведем сообщение об ошибке в журнал "Эксперты" 
       Print ( __FUNCTION__ + ", Error Code = " , GetLastError ());
     }
//--- вернем значение свойства графика 
   return (( int )result);
  }
//+------------------------------------------------------------------+
 
Rafil Nurmukhametov :

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


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!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Derin saygılarımla, Leonid Belsky.

Neden: