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

 
Konstantin Nikitin :

예, 거의 동일합니다. 글쎄, 그들은 건너 뛰었습니다. 가장 중요한 것은 그가 무엇을 이해한다는 것입니다 ...

그는 누구인가? 그것이 바로 내가 시작한 일입니다.

SymbolInfoInteger 함수는 int 값뿐만 아니라 long, bool 및 enum도 반환합니다.

그리고 나서 당연히 Digits()나 _Digits를 의미하고 제가 쓴 것을 썼습니다. 그리고 답변의 마지막 줄은 질문의 두 번째 부분과 관련이 있습니다. "똑똑한 자는 말하지 않고 바보는 추측하지 않는다"라는 러시아 속담을 잊지 마십시오. 추측하고 말했다, 그것은 어느 쪽도, 다른 쪽도 의미하지 않지만, 그래서 ...
 
Alexey Viktorov :

Может вам очень не повезло, но я не люблю колупаться в чужом коде. Тем более править его...

알렉세이 빅토로프 :

다음 질문: 얼마나 자주 지표 값이 정확히 50과 같을 것이라고 생각합니까?

작업을 이해한 대로 한 색상 > 50 및 다른 색상 < 50이어야 하지만 == 50을 어디에서도 본 적이 없습니다. 물론 == 50인 경우 손실을 없애려면 비교 중 하나에 >=50 또는 다른 <=50을 추가해야 합니다.이것이 종교가 허용하는 방식입니다. 얼마나 아름답게 보일지.

그리고 두 번째 질문: 버퍼의 전체 인덱싱을 변경하는 데 얼마나 필요했습니까? 다시 인덱싱한 후 코드의 모든 항목이 수정되었습니까? 인덱스가 4인 색상 버퍼와 보조 버퍼 5와 6을 각각 할당하는 것이 더 쉬울 수도 있습니다. 편집해야 하는 횟수가 줄어들고 실수를 더 많이 저지를 가능성이 줄어듭니다.

  • 답변 해주셔서 감사합니다. 다른 사람의 코드를 어지럽히는 것을 좋아했다면 전문가로서 당신을 잃을 가능성이 높으므로 이와 관련하여 동일한 LUCKY입니다.
  • about <= or >= 동의합니다. 생략, 물론 내가 지나치자마자 그들 중 하나가 있어야 하지만 지금은 중요하지 않습니다.
  • 나는 시도하고, 하나의 색상 버퍼를 재할당하고, 전체 그룹을 재할당하고, 그룹을 장소(상위/하위)로 변경했습니다. 아무 것도 도움이 되지 않습니다. 이제 포스트를 마치며 선이 없는 별도의 히스토그램 표시기를 만들어 보겠습니다. 작동하면 다시 결합하려고 합니다. 여기서는 원칙의 문제입니다. 이해할 수 없는 흰 반점을 남기고 싶지 않다.

 
Sergey Voytsekhovsky :

  • 답변 해주셔서 감사합니다. 다른 사람의 코드를 어지럽히는 것을 좋아했다면 전문가로서 당신을 잃을 가능성이 높으므로 이와 관련하여 그냥 운이 좋습니다.
  • about <= or >= 동의합니다. 생략, 물론 내가 지나치자마자 그들 중 하나가 있어야 하지만 지금은 중요하지 않습니다.
  • 나는 시도하고, 하나의 색상 버퍼를 재할당하고, 전체 그룹을 재할당하고, 그룹을 장소(상위/하위)로 변경했습니다. 아무 것도 도움이 되지 않습니다. 이제 포스트를 마치며 선이 없는 별도의 히스토그램 표시기를 만들어 보겠습니다. 작동하면 다시 결합하려고 합니다. 여기서는 원칙의 문제입니다. 이해할 수 없는 흰 반점을 남기고 싶지 않다.

버퍼의 인덱싱을 변경했을 때 뇌가 심하게 긴장되었을 것입니다.

돌아가서 메시지 8806 에서 이전 코드를 가져와서 버퍼 시퀀스만 변경합니다.

   SetIndexBuffer ( 4 ,ColorHistogram_2Colors, INDICATOR_COLOR_INDEX );
   SetIndexBuffer ( 5 ,ExtHighesBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 6 ,ExtLowesBuffer, INDICATOR_CALCULATIONS );
그런 다음 색상 버퍼에 0을 넣고 1을 입력해야 하는 조건을 추적합니다.
 
Alexey Viktorov :

아마도 버퍼의 인덱싱을 변경했을 때 뇌가 심하게 긴장했을 것입니다.

돌아가서 메시지 8806 에서 이전 코드를 가져와서 버퍼 시퀀스만 변경합니다.

그런 다음 색상 버퍼에 0을 넣고 1을 입력해야 할 때의 조건을 추적합니다.

나는 이것을했지만 도움이되지 않았습니다. 실수로 한 것을 인정하고 귀하의 게시물 이후에 다시했습니다. 다음은 내가 변경한 코드의 위치입니다. 오래된 것은 주석 처리됩니다.

 //+------------------------------------------------------------------+
//|                                       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[];
double     ColorHistogram_2Colors[];
double     ExtHighesBuffer[];
double     ExtLowesBuffer[];
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);
   SetIndexBuffer ( 4 ,ColorHistogram_2Colors, INDICATOR_COLOR_INDEX );
   SetIndexBuffer ( 5 ,ExtHighesBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 6 ,ExtLowesBuffer, INDICATOR_CALCULATIONS );
   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 );
//--- 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;
//--- 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= 1 ;
         ColorHistogram_2Buffer1[i]= 50 ; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " cl=" ,cl,
           " ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 
       if (ExtMainBuffer[i]< 50 ){
         cl= 0 ;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]= 50 ; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " cl=" ,cl,
           " ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 
     }
//--- 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.
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,colors[i]);
   return (rates_total);
  }
//+------------------------------------------------------------------+ 

변경전에는 이랬습니다. 히스토그램은 있지만 원하는 색상이 없습니다.

그렇게 된 것입니다. 히스토그램이 사라지고 표시되지 않습니다.

또 고개를 갸웃거릴 것 같습니다.


 
Sergey Voytsekhovsky :

나는 이것을했지만 도움이되지 않았습니다. 실수로 한 것을 인정하고 귀하의 게시물 이후에 다시했습니다. 다음은 내가 변경한 코드의 위치입니다. 오래된 것은 주석 처리됩니다.

변경전에는 이랬습니다. 히스토그램은 있지만 원하는 색상이 없습니다.

그렇게 된 것입니다. 히스토그램이 사라지고 표시되지 않습니다.

또 고개를 갸웃거릴 것 같습니다.


여기에 논리의 완전한 고장이 있습니다. 순서는 다음과 같아야 합니다. 히스토그램의 값을 결정 하고 표시기 버퍼의 i번째 인덱스를 채웁니다. 그런 다음 이 값이 >=50인지 별도 확인하여 색상 버퍼를 0으로 채우고 그렇지 않으면 1로 채웁니다. 이는 지시문에 있는 색상 순서에 따라 결정됩니다.

 #property indicator_color3    clrGreen , clrRed

0이면 clrGreen 색상을 사용하고 1이면 clrRed 색상을 사용합니다.

그리고 이 줄은 절대적으로 필요하지 않으며 순서는 첫 번째 줄과 반대입니다.

 color      colors[]={ clrRed , clrGreen };

 int        cl;

그것을 추가하는 목적은 무엇입니까? 더 쉽게 직접 채우기

ColorHistogram_2Colors[i]= 0 ;
// или 
ColorHistogram_2Colors[i]= 1 ;

색상 버퍼를 채우기 위해 이 구성을 사용합니다.

         ColorHistogram_2Colors[i]=ExtMainBuffer[i] >= 50 ? 0 : 1 ; 
연산자 ?: if else와 동일하지만 적용하기 더 쉽습니다.
 
Alexey Viktorov :

여기에 논리의 완전한 고장이 있습니다. 순서는 다음과 같아야 합니다. 히스토그램의 값을 결정 하고 표시기 버퍼의 i번째 인덱스를 채웁니다. 그런 다음 이 값이 >=50인지 별도 확인하여 색상 버퍼를 0으로 채우고 그렇지 않으면 1로 채웁니다. 이는 지시문에 있는 색상 순서에 따라 결정됩니다.

0이면 clrGreen 색상을 사용하고 1이면 clrRed를 사용합니다.

그리고 이 줄은 절대적으로 필요하지 않으며 순서는 첫 번째 줄과 반대입니다.

그것을 추가하는 목적은 무엇입니까? 더 쉽게 직접 채우기

색상 버퍼를 채우기 위해 이 구성을 사용합니다.

연산자 ?: if else와 동일하지만 적용하기 더 쉽습니다.

UURRAA, 그리고 영혼이 노래했습니다. Alexey, 정말 감사합니다!

모든 것이 작동했지만 어레이 없이 어떻게 작동하는지 이해하지 못했습니다.

 color      colors[]={ clrRed , clrGreen };

설명이 제거되었습니다. 추가 배열 없이 여기에서 할 수 있습니까?


 
Sergey Voytsekhovsky :

  • 답변 해주셔서 감사합니다. 다른 사람의 코드를 어지럽히는 것을 좋아했다면 전문가로서 당신을 잃을 가능성이 높으므로 이와 관련하여 동일한 LUCKY입니다.
  • about <= or >= 동의합니다. 생략, 물론 내가 지나치자마자 그들 중 하나가 있어야 하지만 지금은 중요하지 않습니다.
  • 나는 시도하고, 하나의 색상 버퍼를 재할당하고, 전체 그룹을 재할당하고, 그룹을 장소(상위/하위)로 변경했습니다. 아무 것도 도움이 되지 않습니다. 이제 포스트를 마치며 선이 없는 별도의 히스토그램 표시기를 만들어 보겠습니다. 작동하면 다시 결합하려고 합니다. 여기서는 원칙의 문제입니다. 이해할 수 없는 흰 반점을 남기고 싶지 않다.

내 고문을 위한 켜기/끄기 버튼에 대해 Sergey에게 많은 감사를 드립니다. 작업은 1년 동안 지속되었으며 이제 준비가 되었습니다. 테스트 결과를 보고 손에 들고 다른 통화와 다른 스프레드로 테스트한 첫 번째 사용자입니다. 일반 결과는 모든 곳에서 동일합니다. 미안하지만, 나는 운율을 생각해 냈습니다 ... 내 Piskun은 기적 일뿐입니다. 그는 모든 곳에서 모든 것을 가져갑니다.

ps. 아직 제대로 이미지 첨부하는 법을 배우지 못해서 죄송합니다. 스킨은 화면에서 올리겠습니다.

파일:
EURUSD.png  52 kb
GBPUSD.png  54 kb
 
Alexey Viktorov :

색상 버퍼를 채우기 위해 이 구성을 사용합니다.

연산자 ?: if else와 동일하지만 적용하기 더 쉽습니다.

훌륭한 조언과 미래를 위한 훌륭한 과학!!! 조금 더 나아갔습니다. 아래는 결과입니다.

그것은:

 if (ExtMainBuffer[i]>= 50 ){
         //cl=1;
         ColorHistogram_2Buffer1[i]= 50 ; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]= 0 ;
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=" ,ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 
if (ExtMainBuffer[i]< 50 ){
         //cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]= 50 ; 
         ColorHistogram_2Colors[i]= 1 ;
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=" ,ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 

그래서 접근의 효과는 명백했다!!! 고맙습니다.

      ColorHistogram_2Buffer1[i]=ExtMainBuffer[i] >= 50 ? 50 : ExtMainBuffer[i]; 
      ColorHistogram_2Buffer2[i]=ExtMainBuffer[i] >= 50 ? ExtMainBuffer[i] : 50 ; 
      ColorHistogram_2Colors [i]=ExtMainBuffer[i] >= 50 ? 0 : 1 ;
         Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
             " # ExtSignalBuffer[i]=" ,ExtSignalBuffer[i],
             " # ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
             " # ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
             " # ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
 
Sergey Voytsekhovsky :

훌륭한 조언과 미래를 위한 훌륭한 과학!!! 조금 더 나아갔습니다. 아래는 결과입니다.

그것은:

그래서 접근의 효과는 명백했다!!! 고맙습니다.

여기에는 효율성이 없습니다. if-else 조건이 1이 아닌 3배입니다. 여기가 더 심하다...

 
Artyom Trishkin :

여기에는 효율성이 없습니다. if-else 조건이 1이 아닌 3배입니다. 여기가 더 심하다...

네 확실합니다. 그것에주의를 기울이지 않았습니다. 그리고 더 좋아 보입니다. 다시 글자가 적습니다.

그러나 하나의 연산자 아래에 넣는 것은 불가능 합니까?: 한 번에 세 번 실행(정확히 말하는 방법을 모르겠습니다)?