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

 
이해했다. 동료들에게 도움을 주셔서 감사합니다.
 
Oleg Kolesov # :

도움을 주신 SanAlex에게 감사드립니다. 잘 이해하지 못했습니다. 버퍼 번호가 아니라 색상 인덱스?

표시기에서

고문에서. 3가지 색상. 3가지 상황.

잘 이해가 안 갑니다만 거기에 0-1-2를 추가하거나 변경해야 할 것 같습니다.

 //+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool CSampleExpert::Processing( void )
  {
//--- refresh rates
   if (!m_symbol.RefreshRates())
       return ( false );
//--- refresh indicators
   if ( BarsCalculated (m_handle_macd)< 2 )
       return ( false );
   if ( CopyBuffer (m_handle_macd, 1 , 0 , 2 ,m_buff_MACD_main)  != 2 )
       return ( false );
//   m_indicators.Refresh();
//--- to simplify the coding and speed up access
//--- data are put into internal variables
   m_macd_current   =m_buff_MACD_main[ 0 ];
   m_macd_previous  =m_buff_MACD_main[ 1 ];
   m_macd_previous_2  =m_buff_MACD_main[ 2 ];

자, 여기서 세 가지 색상을 사용할 것인지 선택해야 합니다.

 //+------------------------------------------------------------------+
//| Check for short position opening                                 |
//+------------------------------------------------------------------+
bool CSampleExpert::ShortOpened( void )
  {
   bool res= false ;
//--- check for short position (SELL) possibility
   if (m_macd_current>m_macd_previous)  ---- тут m_macd_previous_2  >  <



     {
 

바퀴를 재발명하지 않으려면 기성품 솔루션을 제공하십시오.

다음 내용의 csv 파일이 있습니다.
1,2,3
4,5,6
7,8,9

배열을 가져와야 합니다.
[
[1 2 3]
[4 5 6]
[7 8 9]
]

 

안녕하세요. 숙련된 프로그래머 여러분, 말씀해 주십시오. 선을 색칠하는 방법? 조건은 >= 파란색, <= 빨간색입니다.

파일:
ss9e1.png  16 kb
 
Oleg Kolesov # :

안녕하세요. 숙련된 프로그래머 여러분, 말씀해 주십시오. 선을 색칠하는 방법? 조건은 >= 파란색, <= 빨간색입니다.

DRAW_COLOR_LINE 그리기 스타일 사용

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_LINE
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_LINE
  • www.mql5.com
DRAW_COLOR_LINE - Стили индикаторов в примерах - Пользовательские индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir, 저는 DRAW_COLOR_LINE 그림 스타일을 사용합니다. while >= blue, while <= red 조건을 다루는 방법. 주기 내에서 주기?

어레이 검색? 배열 정렬?

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_LINE
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_LINE
  • www.mql5.com
DRAW_COLOR_LINE - Стили индикаторов в примерах - Пользовательские индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Oleg Kolesov # :
Vladimir, 저는 DRAW_COLOR_LINE 그림 스타일을 사용합니다. while >= blue, while <= red 조건을 다루는 방법. 주기 내에서 주기?

어레이 검색? 배열 정렬?

130행에 조건을 입력하십시오.

 

약간 정리:

 //+------------------------------------------------------------------+
//|                                                           V2.mq5 |
//|                                                            Koles |
//|                                             www.koles-33@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Koles"
#property link        "www.koles-33@mail.ru"
#property version    "3.00"
#property indicator_chart_window
#property indicator_buffers 2              // Количество буферов
#property indicator_plots    1              //  
//---- plot
#property indicator_label1    "малый"
#property indicator_type1    DRAW_COLOR_LINE
#property indicator_color1    clrDeepSkyBlue , clrDimGray , clrRed
#property indicator_style1    STYLE_DOT
#property indicator_width1    1
//---- input parameters
input int Period1= 24 ;                                             // Period1
input int PeriodSh= 2 ;                                             // PeriodSh
//-------------------------------------------------------------------+
double level1[];
double levelcol1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   IndicatorSetInteger ( INDICATOR_DIGITS , Digits ());                   // Точки после запятой
//---
   SetIndexBuffer ( 0 ,level1, INDICATOR_DATA );                         // Назначение массива буферу
   SetIndexBuffer ( 1 ,levelcol1, INDICATOR_COLOR_INDEX );
//--- задаем количество индексов цветов для графического построения
   PlotIndexSetInteger ( 0 , PLOT_COLOR_INDEXES , 3 );
//--- задаем цвет для каждого индекса
   PlotIndexSetInteger ( 0 , PLOT_LINE_COLOR , 0 , clrDeepSkyBlue );
   PlotIndexSetInteger ( 0 , PLOT_LINE_COLOR , 1 , clrDimGray );
   PlotIndexSetInteger ( 0 , PLOT_LINE_COLOR , 2 , clrRed );
//---  короткое имя индикатора
   string short_name= "V2(" + IntegerToString (Period1)+ "," + IntegerToString (PeriodSh)+ ")" ;
//---
   IndicatorSetString ( INDICATOR_SHORTNAME ,short_name);
   PlotIndexSetString ( 0 , PLOT_LABEL , "малый" );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- проверка количества баров на достаточность для расчёта
   if (rates_total<Period1+ 1 )
       return ( 0 );
//--- индексация элементов в массивах как в таймсериях
   ArraySetAsSeries (high, true ); // Смена направления индексации
   ArraySetAsSeries (low, true );
   ArraySetAsSeries (close, true );
   ArraySetAsSeries (level1, true );
   ArraySetAsSeries (levelcol1, true );
//--- объявления локальных переменных
   int i,limit;
   double max1,min1;       //
   double v1;
//--- расчёт стартового номера limit для цикла пересчёта баров
   if (prev_calculated== 0 )                     // проверка на первый старт расчёта индикатора
      limit=rates_total-Period1- 1 ;             // стартовый номер для расчёта всех баров
   else
      limit=rates_total-prev_calculated;       // стартовый номер для расчёта новых баров
//--- основной цикл расчёта индикатора
   for (i=limit; i>= 0 ; i--)
     {
      max1=high[ ArrayMaximum (high,i+ 1 ,Period1)];
      min1=low[ ArrayMinimum (low,i+ 1 ,Period1)];
       //---------------------------------------------+
      v1=(max1-min1)/ 2.0 ;                                           // Половина волатильности
       //---------------------------------------------+
      level1[i]=max1-v1;
       //---------------------------------------------+
       if (level1[i]>level1[i+PeriodSh])
         levelcol1[i]= 0.0 ;
       if (level1[i]==level1[i+PeriodSh])
         levelcol1[i]= 1.0 ;
       if (level1[i]<level1[i+PeriodSh])
         levelcol1[i]= 2.0 ;
     }   //--- Возвращаемое значение prev_calculated для следующего вызова
   return (rates_total);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+


코드가 작동하고 색상이 변경됩니다.

 

나는 3일 동안 머리를 긁적였다. 플랫이 DimGray로 남았습니까? 파란색과 같거나 높으면 필요합니다. 아래로 또는 빨간색과 같은 경우.

 if (level1[i]==level1[i+PeriodSh])
         levelcol1[i]= 1.0;
 
Oleg Kolesov # :

3일째 머리를 긁적입니다. 플랫이 DimGray로 남았습니까? 파란색과 같거나 같은 경우 필요합니다. 아래로 또는 빨간색과 같은 경우.

이중 숫자는 '=='( help )를 통해 비교할 수 없습니다.

다음과 같이 비교해야 합니다.

 bool CompareDoubles( double number1, double number2)
  {
   if ( NormalizeDouble (number1-number2, 8 )== 0 ) 
       return ( true );
   else 
       return ( false );
  }
void OnStart ()
  {
   double d_val= 0.3 ;
   float   f_val= 0.3 ;
   if (CompareDoubles(d_val,f_val)) 
       Print (d_val, "equals" ,f_val);
   else 
       Print ( "Different: d_val = " , DoubleToString (d_val, 16 ), "  f_val = " , DoubleToString (f_val, 16 ));
// Результат: Different: d_val= 0.3000000000000000   f_val= 0.3000000119209290
  }


표시기에 있는 방법은 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                           V2.mq5 |
//|                                                            Koles |
//|                                             www.koles-33@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Koles"
#property link        "www.koles-33@mail.ru"
#property version    "3.00"
#property indicator_chart_window
#property indicator_buffers 2              // Количество буферов
#property indicator_plots    1              //  
//---- plot
#property indicator_label1    "малый"
#property indicator_type1    DRAW_COLOR_LINE
#property indicator_color1    clrDeepSkyBlue , clrDimGray , clrRed
#property indicator_style1    STYLE_DOT
#property indicator_width1    1
//---- input parameters
input int Period1= 24 ;                                             // Period1
input int PeriodSh= 2 ;                                             // PeriodSh
//-------------------------------------------------------------------+
double level1[];
double levelcol1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   IndicatorSetInteger ( INDICATOR_DIGITS , Digits ());                   // Точки после запятой
//---
   SetIndexBuffer ( 0 ,level1, INDICATOR_DATA );                         // Назначение массива буферу
   SetIndexBuffer ( 1 ,levelcol1, INDICATOR_COLOR_INDEX );
//--- задаем количество индексов цветов для графического построения
   PlotIndexSetInteger ( 0 , PLOT_COLOR_INDEXES , 3 );
//--- задаем цвет для каждого индекса
   PlotIndexSetInteger ( 0 , PLOT_LINE_COLOR , 0 , clrDeepSkyBlue );
   PlotIndexSetInteger ( 0 , PLOT_LINE_COLOR , 1 , clrDimGray );
   PlotIndexSetInteger ( 0 , PLOT_LINE_COLOR , 2 , clrRed );
//---  короткое имя индикатора
   string short_name= "V2(" + IntegerToString (Period1)+ "," + IntegerToString (PeriodSh)+ ")" ;
//---
   IndicatorSetString ( INDICATOR_SHORTNAME ,short_name);
   PlotIndexSetString ( 0 , PLOT_LABEL , "малый" );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- проверка количества баров на достаточность для расчёта
   if (rates_total<Period1+ 1 )
       return ( 0 );
//--- индексация элементов в массивах как в таймсериях
   ArraySetAsSeries (high, true ); // Смена направления индексации
   ArraySetAsSeries (low, true );
   ArraySetAsSeries (close, true );
   ArraySetAsSeries (level1, true );
   ArraySetAsSeries (levelcol1, true );
//--- объявления локальных переменных
   int i,limit;
   double max1,min1;       //
   double v1;
//--- расчёт стартового номера limit для цикла пересчёта баров
   if (prev_calculated== 0 )                     // проверка на первый старт расчёта индикатора
      limit=rates_total-Period1- 1 ;             // стартовый номер для расчёта всех баров
   else
      limit=rates_total-prev_calculated;       // стартовый номер для расчёта новых баров
//--- основной цикл расчёта индикатора
   for (i=limit; i>= 0 ; i--)
     {
      max1=high[ ArrayMaximum (high,i+ 1 ,Period1)];
      min1=low[ ArrayMinimum (low,i+ 1 ,Period1)];
       //---------------------------------------------+
      v1=(max1-min1)/ 2.0 ;                                           // Половина волатильности
       //---------------------------------------------+
      level1[i]=max1-v1;
       //---------------------------------------------+
      levelcol1[i]= 0.0 ;
       if (level1[i]>level1[i+PeriodSh])
        {
         levelcol1[i]= 0.0 ;
         continue ;
        }
       if (CompareDoubles(level1[i],level1[i+PeriodSh]))
        {
         levelcol1[i]= 1.0 ;
         continue ;
        }
       if (level1[i]<level1[i+PeriodSh])
        {
         levelcol1[i]= 2.0 ;
         continue ;
        }
     }   //--- Возвращаемое значение prev_calculated для следующего вызова
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| CompareDoubles                                                   |
//+------------------------------------------------------------------+
bool CompareDoubles( double number1, double number2)
  {
   if ( NormalizeDouble (number1-number2, 8 )== 0 )
       return ( true );
   else
       return ( false );
  }
//+------------------------------------------------------------------+


결과:

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5