MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 881

 
기준에 따라 개체를 숨길 필요가 있습니다. 차트(주로 선)에서 개체를 어떻게 숨길 수 있습니까? 개체는 접두사로 선택할 수 있습니다.
 
Seric29 :
기준에 따라 개체를 숨길 필요가 있습니다. 차트(주로 선)에서 개체를 어떻게 숨길 수 있습니까? 개체는 접두사로 선택할 수 있습니다.

OBJPROP_TIMEFRAMES가 이 작업을 도와줄 것입니다. 그러나 무리가 아니라 한 번에 하나씩 순환합니다.

 
Alexey Viktorov :

OBJPROP_TIMEFRAMES가 이 작업을 도와줄 것입니다. 그러나 무리가 아니라 한 번에 하나씩 순환합니다.

나는 이것을 할 것이고, 나는 기간별로 표시하기를 원하고 나는 실험을 할 것입니다. 조언에 감사드립니다.

 

프로그램이 더 빨리 실행되는 방법은 무엇입니까?

1위 var.- 범용 함수를 작성하는 경우. 이 경우 검사의 수는 증가하지만 코드의 양은 감소하기 때문에 결국, 더 적은 수의 함수가 더 적은 변수가 초기화되지만 앞서 표시된 빼기가 있습니다.

두 번째 변형 - 덜 복잡한 계산을 생성하는 더 많은 함수를 작성하는 경우. 이 경우 코드의 양이 늘어나고 더 많은 변수가 초기화되며 컴파일러는 원하는 기능을 찾기 위해 코드를 유휴 상태로 실행해야 하는 경우가 많지만 검사 횟수가 감소한다는 장점이 있습니다.

누가 이것에 대해 생각합니까?

 
Seric29 :

프로그램이 더 빨리 실행되는 방법은 무엇입니까?

1위 var.- 범용 함수를 작성하는 경우. 이 경우 검사의 수는 증가하지만 코드의 양은 감소하기 때문에 결국, 더 적은 수의 함수가 더 적은 변수가 초기화되지만 앞서 표시된 빼기가 있습니다.

두 번째 변형 - 덜 복잡한 계산을 생성하는 더 많은 함수를 작성하는 경우. 이 경우 코드의 양이 늘어나고 더 많은 변수가 초기화되며 컴파일러는 원하는 기능을 찾기 위해 코드를 유휴 상태로 실행해야 하는 경우가 많지만 검사 횟수가 감소한다는 장점이 있습니다.

누가 이것에 대해 생각합니까?

옵션 2, 많은 작은 기능, 하지만 2개월 후에 컴파일러가 인터프리터와 어떻게 다른지 알 수 없을 것입니다. 컴파일러는 코드를 유휴 상태로 실행하지 않고 함수, 변수, 상수에 대한 링크 테이블을 생성합니다... 그리고 그런 다음 이 테이블을 사용하여 실행 시 점프합니다.

여기를 읽으십시오 https://habr.com/ru/company/intel/blog/143446/

여기 개발자가 어딘가에 같은 것을 썼습니다. 주제 https://www.mql5.com/ru/forum/304239/page36#comment_11049194 를 찾으십시오.


추신: 컴파일러 작동 방식은 다음과 같습니다. https://habr.com/ru/sandbox/114988/

Делиться не всегда полезно: оптимизируем работу с кэш-памятью
Делиться не всегда полезно: оптимизируем работу с кэш-памятью
  • habr.com
Делиться с ближним своим для нас, божьих тварей, это очень характерно, считается добродетелью, и вообще, как утверждает первоисточник, положительно отражается на карме. Однако в мире, созданном архитекторами микропроцессоров, такое поведение не всегда приводит к хорошим результатам, особенно если это касается разделения памяти между потоками...
 
Alexey Viktorov :

정말 놀랍습니다. 문서를 읽고 DRAW_HISTOGRAM2를 보고 DRAW_COLOR_HISTOGRAM2를 보지 않는 방법

예, 추가 버퍼가 발표되었습니다.

좋은 저녁이에요. 길고 열심히 노력했습니다. 히스토그램은 올바르게 그려지지만 다른 색상(레벨 50 이상 및 이하)의 채색은 이기지 못했습니다. 내가 어디를 망쳤는지 알려주세요. 아래 텍스트, 파일 묶음

 //+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots    3

#property indicator_type1    DRAW_LINE        // основная
#property indicator_color1    clrLightSeaGreen
#property indicator_style1    STYLE_SOLID

#property indicator_type2    DRAW_LINE        // сигнальная
#property indicator_color2    clrYellow
#property indicator_style2    STYLE_SOLID

#property indicator_type3    DRAW_COLOR_HISTOGRAM2
#property indicator_color3    clrGreen , clrRed
#property indicator_style3    STYLE_SOLID

#property indicator_width1    3 
#property indicator_width2    2 
#property indicator_width3    1 
//--- input parameters
input int InpKPeriod= 5 ;   // K period
input int InpDPeriod= 3 ;   // D period
input int InpSlowing= 3 ;   // Slowing
//--- indicator buffers
double     ExtMainBuffer[];
double     ExtSignalBuffer[];
double     ColorHistogram_2Buffer1[]; 
double     ColorHistogram_2Buffer2[]; 
double     ExtHighesBuffer[];
double     ExtLowesBuffer[];
double     ColorHistogram_2Colors[];
color      colors[]={ clrRed , clrGreen };
int        cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtMainBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,ExtSignalBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,ColorHistogram_2Buffer1, INDICATOR_DATA );
   SetIndexBuffer ( 3 ,ColorHistogram_2Buffer2, INDICATOR_DATA );
   SetIndexBuffer ( 4 ,ExtHighesBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 5 ,ExtLowesBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 6 ,ColorHistogram_2Colors, INDICATOR_COLOR_INDEX );
   PlotIndexSetDouble ( 2 , PLOT_EMPTY_VALUE , 0 );
//--- set accuracy
   IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
//--- set levels
   IndicatorSetInteger ( INDICATOR_LEVELS , 3 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 0 , 20 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 1 , 50 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 2 , 80 );
////--- установим пустое значение для HISTOGRAM2
//   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);   
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble ( INDICATOR_MINIMUM , 0 );
   IndicatorSetDouble ( INDICATOR_MAXIMUM , 100 );
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString ( INDICATOR_SHORTNAME , "Stoch_HISTOGRAM(" +( string )InpKPeriod+ "," +( string )InpDPeriod+ "," +( string )InpSlowing+ ")" );
   //PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetString ( 0 , PLOT_LABEL , "Main" );
   PlotIndexSetString ( 1 , PLOT_LABEL , "Signal" );
   PlotIndexSetString ( 2 , PLOT_LABEL , "UP" );
   PlotIndexSetString ( 3 , PLOT_LABEL , "LOW" );
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
   PlotIndexSetInteger ( 1 , PLOT_DRAW_BEGIN ,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger ( 2 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
   PlotIndexSetInteger ( 3 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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,k,start;
   
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,0);
   
//--- check for bars count
   if (rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
       return ( 0 );
//---
   start=InpKPeriod- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++)
        {
         ExtLowesBuffer[i]= 0.0 ;
         ExtHighesBuffer[i]= 0.0 ;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double dmin= 1000000.0 ;
       double dmax=- 1000000.0 ;
       for (k=i-InpKPeriod+ 1 ;k<=i;k++)
        {
         if (dmin>low[k])  dmin=low[k];
         if (dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod- 1 +InpSlowing- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++) ExtMainBuffer[i]= 0.0 ;
     }
//--- main cycle
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double sumlow= 0.0 ;
       double sumhigh= 0.0 ;
       for (k=(i-InpSlowing+ 1 );k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
       if (sumhigh== 0.0 ) ExtMainBuffer[i]= 100.0 ;
         else           ExtMainBuffer[i]=sumlow/sumhigh* 100 ;
       if (ExtMainBuffer[i]> 50 ){
         cl= 0 ;
         ColorHistogram_2Buffer1[i]= 50 ; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
         } 
       if (ExtMainBuffer[i]< 50 ){
         cl= 1 ;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]= 50 ; 
         ColorHistogram_2Colors[i]=colors[cl];
         } 
     }
//--- signal
   start=InpDPeriod- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++) ExtSignalBuffer[i]= 0.0 ;
     }
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double sum= 0.0 ;
       for (k= 0 ;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return (rates_total);
  }
//+------------------------------------------------------------------+ 

파일:
 
Sergey Voytsekhovsky :

좋은 저녁이에요. 길고 열심히 노력했습니다. 히스토그램은 올바르게 그려지지만 다른 색상(레벨 50 이상 및 이하)의 채색은 이기지 못했습니다. 내가 어디를 망쳤는지 알려주세요. 아래 텍스트, 파일 묶음


디버그 모드 에서 값을 단계별로 살펴보았습니다.

  • ExtMainBuffer[i]
  • 색상히스토그램_2버퍼1[i]
  • 색상히스토그램_2버퍼2[i]
  • 색상히스토그램_2색상[i]
모든 것이 맞는 것 같지만 히스토그램은 녹색 만 있고 50 미만은 빨간색으로 변하지 않습니다.
 
Sergey Voytsekhovsky :

디버그 모드 에서 값을 단계별로 살펴보았습니다.

  • ExtMainBuffer[i]
  • 색상히스토그램_2버퍼1[i]
  • ColorHistogram_2Buffer2[i]
  • 색상히스토그램_2색상[i]
모든 것이 맞는 것 같지만 히스토그램은 녹색 만 있고 50 미만은 빨간색으로 변하지 않습니다.
 
Sergey Voytsekhovsky :

디버그 모드 에서 값을 단계별로 살펴보았습니다.

  • ExtMainBuffer[i]
  • 색상히스토그램_2버퍼1[i]
  • ColorHistogram_2Buffer2[i]
  • 색상히스토그램_2색상[i]
모든 것이 맞는 것 같지만 히스토그램은 녹색 만 있고 50 미만은 빨간색으로 변하지 않습니다.
코드 살펴보기
Normalized_Volume
Normalized_Volume
  • www.mql5.com
Индикатор Normalized Volume - индикатор нормализованного объёма. Отображает средний объём в диапазоне баров в виде цветной гистограммы с пороговым уровнем. Имеет два настраиваемых параметра:
 
Igor Makanu :

하지만 당신은 매력...

글쎄, 이것은 이해할 수 있습니다. 나는 비유적으로 프로그램을 컴파일러라고 불렀지 만 일반적으로 어떤 경우에 더 좋습니까?