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

 
Vladimir Karputov :

여기:

고맙습니다. 나는 내 컴퓨터에 있을거야, 아마도 내가 한 번 볼게.
 
Artyom Trishkin :
고맙습니다. 나는 내 컴퓨터에 있을거야, 아마도 내가 한 번 볼게.

거기에 아주 아주 오래된 형식으로 MQL4에 대한 표시기가 작성되어 있습니다. 나는 오랫동안 그것들을 만지지 않았습니다. 어떻게 쓰여졌는지 기억나지 않습니다.

@zig2003 을 옵션으로 사용하려면 start()에서 IndicatorBuffers(6);를 제거해 보세요.

상단에서 #property indicator_buffers 6 수정

 
Igor Makanu , 칠면조를 고친 후 반전을 프로그래밍하기 위해 조언자의 것과 비교해야 하는 것은 무엇입니까?
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
zig2003 :
Igor Makanu , 칠면조를 고친 후 반전을 프로그래밍하기 위해 조언자의 것과 비교해야 하는 것은 무엇입니까?

각 표시기는 여러 표시기 버퍼로 구성됩니다.

iCustom()을 통해 EA에서 표시기를 호출할 때 특정 막대에서 한 버퍼의 값을 가져옵니다. 데이터 창에서 이 값을 볼 수 있습니다 Ctrl+D

무엇과 무엇을 비교할 것인지는 차량 또는 표시기 버퍼 또는 버퍼 및 가격의 값에 따라 다릅니다. 다양한 옵션이 있습니다.

우선 Mashka에 대한 고문을 만든 다음 MA 대신 알아낼 때 지표를 호출합니다.

일반적으로 모든 것이 그렇게 간단하지 않습니다. 몇 가지 명령을 작성했으며 고문이 준비되었습니다.


추신: 표시기의 반전은 표시기 버퍼의 여러 값을 비교한 것입니다. 2번 막대의 화면으로 판단하면 1번 버퍼의 가격 근처에 값이 있어야 하고 나머지 버퍼에는 EMPTY_VALUE 값이 있어야 합니다. , 그리고 1번 막대에서 반대로 1번 버퍼는 EMPTY_VALUE 값을 가지며 2개 또는 3개의 버퍼 중 일부는 EMPTY_VALUE와 다른 값을 갖습니다. 이것이 데이터 개요 창에서 볼 필요가 있는 전부입니다. 막대에서 마우스 화살표를 이동하고 버퍼의 값을 참조하십시오)

 

Igor는 덕분에 칠면조를 수정했지만 버퍼의 값이 나타나지 않았습니다. Mashki는 과거 단계이며 모든 것이 간단합니다. 두 줄 - 두 개의 버퍼가 있습니다. 그리고 여기에 한 줄과 하나의 버퍼가 있는 것 같습니다. 일반적으로 한 줄로 구성되지만 색상 버퍼가 다른 이러한 표시기의 경우 다음과 같이 코드를 작성합니다.

 //Функция для определения входа и выхода по AMA 
 int Enter()
  {
   double AMAbuy_1  = iCustom ( NULL , _Period , "AMA" , Range, FastMA,SlowMA,filter,normalizeDigits, 0 , 1 );             //Подключаем AMA для первого бара (buy)
   double AMAsell_1 = iCustom ( NULL , _Period , "AMA" , Range, FastMA,SlowMA,filter,normalizeDigits, 1 , 1 );             //                                (sell)
   double AMAbuy_2  = iCustom ( NULL , _Period , "AMA" , Range, FastMA,SlowMA,filter,normalizeDigits, 0 , 2 );             //Подключаем AMA для второго бара (buy)       
   double AMAsell_2 = iCustom ( NULL , _Period , "AMA" , Range, FastMA,SlowMA,filter,normalizeDigits, 1 , 2 );             //                                (sell)                    
                         
   if (AMAbuy_1> 0 && AMAsell_2> 0 )                                                                                 //Вход в бай
       return ( 1 );                                                                                           
   if (AMAsell_1> 0 && AMAbuy_2> 0 )                                                                                 //Вход в селл
       return (- 1 );                                                                                          
        
   return ( 0 );
  } 

그러나 이것은 실제 버퍼가 각 색상에 할당된 경우에만 해당됩니다. 첫 번째 닫힌 막대에서 색상이 변경되면 버퍼 값은 0보다 커집니다. 반면 이전 막대에서는 0과 같거나 다른 색상의 버퍼가 0보다 큽니다. 그리고 이 칠면조에서는 두 번째 값인 Sell color를 얻을 수 없으며 반전을 포착하기 위해 무엇과 비교해야 하는지 명확하지 않습니다. 모든 버퍼 번호를 시도했습니다. 이 Mladenovsky 칠면조는 오래되었지만 수동 전략에서 꽤 괜찮은 추세이기 때문에 이것은 슬픈 일입니다. .... 누군가 두 번째 버퍼에서 값을 가져와 반전 공식을 기록하는 방법을 추측할 수 있습니까?

 
zig2003 :

Igor는 덕분에 칠면조를 수정했지만 버퍼의 값이 나타나지 않았습니다. Mashki는 과거 단계이며 모든 것이 간단합니다. 두 줄 - 두 개의 버퍼가 있습니다. 그리고 여기에 한 줄과 하나의 버퍼가 있는 것 같습니다. 일반적으로 한 줄로 구성되지만 색상 버퍼가 다른 이러한 표시기의 경우 다음과 같이 코드를 작성합니다.

그러나 이것은 실제 버퍼가 각 색상에 할당된 경우에만 해당됩니다. 첫 번째 닫힌 막대에서 색상이 변경되면 버퍼 값은 0보다 커집니다. 반면 이전 막대에서는 0과 같거나 다른 색상의 버퍼가 0보다 큽니다. 그리고 이 칠면조에서 나는 두 번째 색상의 값을 어떤 식으로든 얻을 수 없으며 반전을 잡기 위해 무엇과 비교해야 하는지 명확하지 않습니다. 그리고 이것은 슬픈 일입니다. 왜냐하면 이 Mladenovsky 칠면조는 오래되었지만 수동 전략에서 매우 괜찮은 추세이기 때문입니다. ... 아마도 누군가가 반전 공식을 작성하는 방법을 추측할 것입니까?

표시기의 변경 없이.

두 버퍼의 데이터는 0과 1에서 무엇을 의미합니까?

  • 버퍼 0에는 값이 있고 버퍼 1에는 값이 없으면 이 방향이 길다(지시선 파란색(기본값인 경우))
  • 버퍼 0에 값이 있고 버퍼 1에 값이 있는 경우 이는 단락 방향입니다(표시줄의 빨간색(기본값인 경우))

선의 방향(색상) 변경:

  • 버퍼 0에는 항상 값이 있으며, 결정하는 데 사용할 수도 있습니다(세 막대의 값 비교: 2<=1 && 1>0 --> down, 2>=1 && 1<0 - -> 위로)
    ...
    그러나 버퍼 1만 사용할 수 있습니다.
  • 버퍼 1의 막대 0에 값이 없고 막대 1의 값이 있는 경우 이는 라인 방향이 긴 방향으로 변경된 것입니다.
  • 막대 0의 버퍼 1에 값이 있고 막대 1의 값이 없으면 라인 방향이 short로 변경됩니다.

여기서 "값 없음"은 EMPTY_VALUE 입니다. 글쎄, 또는 DBL_MAX - 그것은 중요하지 않습니다. 그것은 같은 것입니다. 즉, 0이 아니라 EMPTY_VALUE 입니다.

 
zig2003 :

누군가 두 번째 버퍼에서 값을 가져와 반전 공식을 기록하는 방법을 추측할 수 있습니까?

추측할 필요가 없습니다. 먼저 MQL4 언어의 현재 상태에 해당하는 일반 형식으로 표시기를 다시 작성해야 합니다.

여기에 코드를 조금 정리했지만 오류가 없을지 확신이 서지 않습니다. 소스가 마음에 들지 않지만 아아, 그것이 원래의 작업이었습니다.

 #property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrTomato
#property indicator_color3 clrTomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
input int     Range           = 9 ;
input int     FastMA          = 3 ;
input int     SlowMA          = 30 ;
input int     filter          = 25 ;
input int     normalizeDigits = 4 ;

input bool    alertsOn        = false ;
input bool    alertsOnCurrent = false ;
input bool    alertsMessage   = true ;
input bool    alertsSound     = true ;
input bool    alertsEmail     = false ;
input string soundfile       = "alert2.wav" ;


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
{
   SetIndexBuffer ( 0 , fAMA);
   SetIndexLabel( 0 , "fAMA" );
   SetIndexBuffer ( 1 , Downa);
   SetIndexLabel( 1 , "Downa" );
   SetIndexBuffer ( 2 , Downb);
   SetIndexLabel( 2 , "Downb" );
   SetIndexBuffer ( 3 , trend);
   SetIndexLabel( 3 , "trend" );
   SetIndexBuffer ( 4 , mAMA);
   SetIndexLabel( 4 , "mAMA" );
   SetIndexBuffer ( 5 , AMA);
   SetIndexLabel( 5 , "AMA" );
   for ( int i= 0 ; i< indicator_buffers ; i++) {
      SetIndexStyle(i, DRAW_LINE );
   }
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,       // размер входных таймсерий
                 const int prev_calculated,   // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],         // Low
                 const double &close[],       // Close
                 const long &tick_volume[],   // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
                )
{
   int limit;
   if (prev_calculated== 0 ) limit=rates_total- 1 ;
   else limit=rates_total-prev_calculated+ 1 ;
   if (trend[limit] == - 1 ) ClearPoint(limit, Downa, Downb);
   double k1 = 2.0 / (SlowMA + 1 );
   double k2 = 2.0 / (FastMA + 1 ) - k1;
   for ( int i = limit; i>= 0 ; i--) {
       double sdAMA = 0 ;
       double Noise = 0 ;
       for ( int k= 0 ; k<Range; k++) Noise += MathAbs (Close[i+k] - Close[i+k+ 1 ]);
       double ER    = 0 ;
       if (Noise != 0 ) ER = MathAbs (Close[i] - Close[i+Range]) / Noise;
       double SSC   = (ER*k2+k1);



      AMA[i]  = AMA[i+ 1 ] + NormalizeDouble (SSC*SSC*(Close[i] - AMA[i+ 1 ]), normalizeDigits);
      mAMA[i] = AMA[i];

       if (filter < 1 ) fAMA[i] = mAMA[i];
       else {
         for (k = i; k <= i + SlowMA - 1 ; k++)  sdAMA = sdAMA + MathAbs (mAMA[k] - mAMA[k+ 1 ]);
         double dAMA  = mAMA[i] - mAMA[i+ 1 ];
         if (dAMA >= 0 )
             if (dAMA < NormalizeDouble (filter*sdAMA/( 100 *SlowMA), 4 ) &&  High[i] <= High[Highest( NULL , 0 , MODE_HIGH , 4 , i)]+ 10 * Point )
               fAMA[i] = fAMA[i+ 1 ];
             else    fAMA[i] = mAMA[i];
         else if ( MathAbs (dAMA) < NormalizeDouble (filter*sdAMA/( 100 *SlowMA), 4 ) && Low[i] > Low[Lowest( NULL , 0 , MODE_LOW , 4 , i)]- 10 * Point )
            fAMA[i] = fAMA[i+ 1 ];
         else   fAMA[i] = mAMA[i];
      }

      Downa[i] = EMPTY_VALUE ;
      Downb[i] = EMPTY_VALUE ;
      trend[i] = trend[i+ 1 ];
       if (fAMA[i]> fAMA[i+ 1 ]) trend[i] = 1 ;
       if (fAMA[i]< fAMA[i+ 1 ]) trend[i] =- 1 ;
       if (trend[i]==- 1 ) PlotPoint(i, Downa, Downb, fAMA);
   }

//


   if (alertsOn) {
       if (alertsOnCurrent)
         int whichBar = 0 ;
       else      whichBar = 1 ;
       if (trend[whichBar] != trend[whichBar+ 1 ])
         if (trend[whichBar] == 1 )
            doAlert( "buy" );
         else   doAlert( "sell" );
   }
   return (rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void doAlert( string doWhat)
{
   static string    previousAlert= "nothing" ;
   static datetime previousTime;
   string message;

   if (previousAlert != doWhat || previousTime != Time[ 0 ]) {
      previousAlert  = doWhat;
      previousTime   = Time[ 0 ];

       //
       //


      message =   StringConcatenate ( Symbol (), " at " , TimeToStr( TimeLocal (), TIME_SECONDS ), " AMA STL_Color " , doWhat);
       if (alertsMessage) Alert (message);
       if (alertsEmail)   SendMail ( StringConcatenate ( Symbol (), " AMA STL_Color " ), message);
       if (alertsSound)   PlaySound (soundfile);
   }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClearPoint( int i, double & first[], double & second[])
{
   if ((second[i]  != EMPTY_VALUE ) && (second[i+ 1 ] != EMPTY_VALUE ))
      second[i+ 1 ] = EMPTY_VALUE ;
   else if ((first[i] != EMPTY_VALUE ) && (first[i+ 1 ] != EMPTY_VALUE ) && (first[i+ 2 ] == EMPTY_VALUE ))
      first[i+ 1 ] = EMPTY_VALUE ;
}
void PlotPoint( int i, double & first[], double & second[], double & from[])
{
   if (first[i+ 1 ] == EMPTY_VALUE )
       if (first[i+ 2 ] == EMPTY_VALUE ) {
         first[i]  = from[i];
         first[i+ 1 ]  = from[i+ 1 ];
         second[i] = EMPTY_VALUE ;
      }
       else   {
         second[i] = from[i];
         second[i+ 1 ] = from[i+ 1 ];
         first[i]  = EMPTY_VALUE ;
      }
   else      {
      first[i]  = from[i];
      second[i]   = EMPTY_VALUE ;
   }
}
//+------------------------------------------------------------------+

여기에이 표시기의 표시기 버퍼 값이 표시됩니다.


 
여러분, 팁 감사합니다. 특히 이고르 마카누 . 예, 실제로 기본값 3 대신 6개의 버퍼를 만들었고 1과 -1의 값이 버퍼 중 하나에 나타나지만 원래 있던 버퍼에는 전혀 나타나지 않았습니다. 따라서 그는 가치를 끌어낼 수 없었습니다. 그리고 나는 결코 추측하지 않았을 것입니다. 이제 모든 것이 제자리에 떨어졌습니다. 모든 것이 작동합니다. Igor, 칠면조를 새로운 형식으로 증류해 주셔서 감사합니다. 다시 한 번 당신의 지식에 활을 쏘십시오!!!
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
Igor Makanu :

추측할 필요가 없습니다. 먼저 MQL4 언어의 현재 상태에 해당하는 일반 형식으로 표시기를 다시 작성해야 합니다.

여기에 코드를 조금 정리했지만 오류가 없을지 확신이 서지 않습니다. 소스가 마음에 들지 않지만 아아, 그것이 원래의 작업이었습니다.

여기에이 표시기의 표시기 버퍼 값이 표시됩니다.

다시 작성하지 않고 작동하며 매우 간단하게 데이터를 가져올 수 있습니다. 위에서 모든 것을 설명했습니다 . 데이터 창 (Ctrl + D)에서 버퍼의 판독값을 확인해야 했습니다.

 
Artyom Trishkin :

다시 작성하지 않고 작동하며 매우 간단하게 데이터를 가져올 수 있습니다. 위에서 모든 것을 설명했습니다 . 데이터 창 (Ctrl + D)에서 버퍼의 판독값을 확인해야 했습니다.

나는 IndicatorCounted() 함수가 이전 표시기에서 어떻게 작동하는지 기억하지 못한다고 위에서 썼습니다. OnCalculate()가 있는 새로운 형태의 표시기는 어떻게 든 이해하기 쉽습니다.

글쎄, 문제가 해결 된 것 같습니다.