초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 810

 
Anttonnio :

인사말!


입력 배열을 만드는 방법을 알려주세요.

나는 이렇게 노력하고있다 :

입력 더블 Df_1 = 0.8;

입력 더블 Df_2 = 0.1;

입력 더블 Df_3= 0.3;


const 이중 Df[3] = {Df_1 ,Df_2 ,Df_3 };


하지만 오류가 발생합니다.

'Df_1' - 상수 표현식 필요

'Df_2' - 상수 표현식 필요

'Df_3' - 상수 표현식 필요

엄격한 배열 초기화 참조

옵션:

 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;

( 포럼에 코드를 올바르게 붙여넣기 )

 
Rafil Nurmukhametov :

이러한 함수 ChartTimePriceToXY 및 ChartXYToTimePrice의 도움으로 어디에나 배치할 수 있습니다.

두뇌는 그것을 하는 방법을 알아내기에 충분하지 않습니다. 나는 구식, 비뚤어진, 비스듬한 방식으로 그것을했지만 작동합니다. 그리고 아무도 ChartTimePriceToXY 및 ChartXYToTimePrice 함수의 도움으로 그것이 얼마나 아름다운지 보여줄 수 없으며 작동 코드의 예에 대한 링크도 표시하지 않습니다.
 
Leo59 :
두뇌는 그것을 하는 방법을 알아내기에 충분하지 않습니다. 나는 구식, 비뚤어진, 비스듬한 방식으로 그것을했지만 작동합니다. 그리고 아무도 ChartTimePriceToXY 및 ChartXYToTimePrice 함수의 도움으로 그것이 얼마나 아름다운지 보여줄 수 없으며 작동 코드의 예에 대한 링크도 표시하지 않습니다.
 #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);
  }

코드를 다시 작성하지 않고 기능 사용에 대한 스니펫을 추가했습니다.

 
Rafil Nurmukhametov :

코드를 다시 작성하지 않고 기능 사용에 대한 스니펫을 추가했습니다.

아 라필.... 너무 뜻밖이고 무엇보다 너무 좋아서 헷갈릴정도로... 감사합니다!!!!! 감독자!!!! 나에게 꼭 필요한 것이었을 것입니다! 이미 늦은 밤이고 아침에 이해하려고 노력할 것입니다))

 
Rafil Nurmukhametov :

코드를 다시 작성하지 않고 기능 사용에 대한 스니펫을 추가했습니다.

아아, 귀하의 버전인 Rafil에서 숫자는 각각의 새 막대에서 다시 그려지지 않으며 창의 위쪽(귀하의 버전에서) 테두리에서 크기가 조정되지 않습니다.

내 버전:


당신의 것, 라필, 옵션:


 
Leo59 :

아아, 귀하의 버전인 Rafil에서 숫자는 각각의 새 막대에서 다시 그려지지 않으며 창의 위쪽(귀하의 버전에서) 테두리에서 크기가 조정되지 않습니다.

내 버전:


당신의 것, 라필, 옵션:



나는 당신이 그것을 필요로 가정하고 있습니까? 사진을 클릭


 
Rafil Nurmukhametov :

나는 당신이 그것을 필요로 가정하고 있습니까? 사진을 클릭


막대 번호가 창의 상단 경계 에 위치하는 것은 그림의 애니메이션에서 볼 수 있습니다. 새로운 막대가 형성되면 어떻게 됩니까? 이것을 설명하기 위해 새로운 막대가 형성되기 전에 비디오 길이를 약간 늘렸어야 했을까요?
 

MqlParam 구조 를 통해 ENUM_TIMEFRAMES 유형의 표시기 매개변수를 전달해야 하는 경우 이 매개변수에 대해 어떤 유형을 지정해야 합니까?

ENUM_DATATYPE에는 ENUM_TIMEFRAMES 유형 및 기타 열거형이 포함되어 있지 않습니다 .

 
Leo59 :
막대 번호가 창의 상단 경계 에 위치하는 것은 그림의 애니메이션에서 볼 수 있습니다. 새로운 막대가 형성되면 어떻게 됩니까? 이것을 설명하기 위해 새로운 막대가 형성되기 전에 비디오 길이를 약간 늘렸어야 했을까요?

죄송합니다 새로운 바가 뜨는 순간을 못잡았네요 잘보세요 아래 사진이...

글쎄, 코드 자체, y_pos - 필요한 경우 아래에서 상단 테두리로부터의 픽셀 수, 다음 사용 CHART_HEIGHT_IN_PIXELS 또는 CHART_WINDOW_YDISTANCE


 //|                                                    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 :

죄송합니다 새로운 바가 뜨는 순간을 못잡았네요 잘보세요 아래 사진이...

글쎄, 코드 자체, y_pos - 필요한 경우 아래에서 상단 테두리로부터의 픽셀 수, 다음 사용 CHART_HEIGHT_IN_PIXELS 또는 CHART_WINDOW_YDISTANCE


라필, 당신은 사과할 것이 없습니다. 당신이 한 일은 존경과 본받을 가치가 있습니다. 저는 매우 기쁩니다! 그리고 요점은 이것이 내가 정말로 필요한 것이 아니라 관심, 지원 및 도움이 필요한 사람들에 대한 태도입니다. 당신, Rafil은 알고 있고 할 수 있는 몇 안 되는 사람 중 하나입니다. "F1" 키를 누르라고 조언하는 것 이상을 수행할 수 있습니다. 매우 감사합니다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

깊은 존경을 표합니다. Leonid Belsky.

사유: