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

 

표시기의 높고 낮은 값을 비우는 방법은 무엇입니까? 예를 들어, 최대값이 100이고 최소값이 0으로 설정되어 있고 모든 것을 시각화하기 위해 표시기가 필요한 경우 이를 구성하는 방법은 무엇입니까? 사실 여러 모드로 표시기를 작성하고 있는데 그 중 하나에서 최대값과 최소값을 사용하지만 모드를 전환한 후 최대값은 입력 매개변수에서 100으로, 최소값은 0으로 유지됩니다.


MQL5

 
Alekseu Fedotov :

이미 Envelopes( ........ ) 함수를 호출하여 Deviation(Kanal) 함수에서 반환된 값을 전달했습니다.

Envelopes( ........ ) 함수 자체에서 마지막 매개변수는 이 값을 사용할 변수를 선언합니다.


이 같은

덕분에 이제 더 명확해졌습니다.

 

귀하의 조언에 따라 MT5에 대한 코드를 약간 다시 수정했는데 다음과 같이 나타났습니다.

 input    string Parametrs_Indicator       = "Настройки Индикатора" ; // Настройки Индикатора

input    ENUM_TIMEFRAMES    Time_Frames    = PERIOD_M5 ;             // Временной период
       int                 Ma_Period     = 120 ;                   // Период
       int                 Ma_Shift      = 0 ;                     // Cдвиг средней
       ENUM_MA_METHOD      Ma_Method     = MODE_SMMA ;             // Mетод усреднения
       ENUM_APPLIED_PRICE Applied_Price = PRICE_CLOSE ;           // Tип цены
//************************************************************************************************/
void OnTick ()
{
//---------------------------------------------------
   double Signal_Sell = Envelopes( 0 , Deviation( 1 )); // Сигнал на Продажу
   Print ( "Signal_Sell = " , Signal_Sell);
     if (Signal_Sell < 0 ) { Print ( "Signal_Sell error #" , GetLastError ()); }
   double   Signal_Buy = Envelopes( 1 , Deviation( 1 ));   // Сигнал на Покупку
   Print ( "Signal_Buy = " , Signal_Sell);
     if (Signal_Buy < 0 ) { Print ( "Signal_Buy error #" , GetLastError ()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes( 0 , Deviation( 2 ));
   Print ( "Signal_Sell_2 = " , Signal_Sell);
       if (Signal_Sell_2 < 0 ) { Print ( "Signal_Sell_2 error #" , GetLastError ()); }
   double   Signal_Buy_2 = Envelopes( 1 , Deviation( 2 ));
   Print ( "Signal_Buy_2 = " , Signal_Sell);
       if (Signal_Buy_2 < 0 ) { Print ( "Signal_Buy_2 error #" , GetLastError ()); }
//---------------------------------------------------
}
//************************************************************************************************/
double Envelopes( int buff, double _Deviation)
{
   double buf[ 1 ];
   int handle= iEnvelopes ( Symbol (), TimeFrames, Ma_Period, Ma_Shift, Ma_Method, Applied_Price, _Deviation);
   if (handle< 0 )
   {
     Print ( "Failed to create handle iEnvelopes, Error: " , GetLastError ());
     return ( WRONG_VALUE );
   } else
   {
     if ( CopyBuffer (handle,buff, 0 , 1 ,buf)< 0 )
    {
     Print ( "Failed to copy data from the indicator iEnvelopes, Error: " , GetLastError ());
     return ( WRONG_VALUE );
    }
   }
   return (buf[ 0 ]);
}
//************************************************************************************************/

이제서야 첫 번째 계산된 값이 매 틱마다 어디에나 기록되는지 이해가 되지 않습니다.

계산

그것을 고칠 방법을 말해?
 
Alexander Layzerevich :

귀하의 조언에 따라 MT5에 대한 코드를 약간 다시 수정했는데 다음과 같이 나타났습니다.

이제서야 틱마다 계산된 값이 도처에 기록되는 이유를 이해할 수 없습니다.

 //---------------------------------------------------
   double Signal_Sell = Envelopes( 0 , Deviation( 1 )); // Сигнал на Продажу
   Print ( "Signal_Sell = " , Signal_Sell );
     if (Signal_Sell < 0 ) { Print ( "Signal_Sell error #" , GetLastError ()); }
   double   Signal_Buy = Envelopes( 1 , Deviation( 1 ));   // Сигнал на Покупку
   Print ( "Signal_Buy = " , Signal_Sell );
     if (Signal_Buy < 0 ) { Print ( "Signal_Buy error #" , GetLastError ()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes( 0 , Deviation( 2 ));
   Print ( "Signal_Sell_2 = " , Signal_Sell );
       if (Signal_Sell_2 < 0 ) { Print ( "Signal_Sell_2 error #" , GetLastError ()); }
   double   Signal_Buy_2 = Envelopes( 1 , Deviation( 2 ));
   Print ( "Signal_Buy_2 = " , Signal_Sell );
       if (Signal_Buy_2 < 0 ) { Print ( "Signal_Buy_2 error #" , GetLastError ()); }
//---------------------------------------------------

단번에 시선을 사로잡는다. 강조 표시하지 않아도.

 
Artyom Trishkin :

단번에 시선을 사로잡는다. 강조 표시하지 않아도.

덕분에.

 

MQL4에 대한 모든 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론

윈프로젝트 , 2019.05.07 18:38

동일한 코드가 MT4에서는 작동하지만 MT5에서는 작동하지 않는 이유를 말씀해 주시겠습니까? MT5에서 변수 strNum은 항상 =1이지만 MT4에서 카운터 ++는 정상적으로 작동하고 strNum = 파일의 줄 요소 수입니다.

int strNum;
void OnStart ()
  {
 FileNum();
 Alert1();
  } 

   void FileNum()
{
       int handle= FileOpen ( "File.csv" , FILE_CSV | FILE_READ , ';' );
      strNum= 0 ; 
       while (! FileIsEnding (handle))
{
       FileReadString (handle);
      strNum++;
       if ( FileIsEnding (handle)== true )
       break ;
}
       FileClose (handle);
}

       void Alert1()
{
       Alert (strNum);
}

나는 스스로 대답합니다. MT5에서 파일을 열 때 배열이나 구조로 읽을 때 주기가 없는 사람에게 유용할 수 있습니다. MT5에서는 MT4와 달리 .csv 파일을 읽을 때 FILE_ANSI 파일 열기 플래그 를 추가로 설정해야 합니다.

저것들. MT5에서 행은 다음과 같아야 합니다.

 int handle= FileOpen ( "File.csv" , FILE_READ | FILE_ANSI | FILE_CSV , ";" );

왜 난 몰라, 아무도 몰라?

 
이 형식의 EA 로그에 알림이 있는 경우 - 단위 이유 3(알림은 TM이 전환되었다는 사실 때문임)이지만 로봇이 차트에서 제거되지 않은 경우 변수의 값과 수신된 모든 계산이 저장되었습니까?
 

알 수 없는 이유로 "OrderSend 오류 130"이 표시되고 프로그램이 데모 계정의 전략 테스터에서 실행되므로 브로커의 제한이 없을 수 있습니다. 내가 이해하는 한 Stops Level = 30입니다. 오류가 발생합니다. 테스트 중 정기적인 간격으로 모든 거래에 대한 ATR 비율로 스톱이 고정되지만 일부 주문은 성공적으로 이루어지고 다른 주문은 그렇지 않습니다.

       Print ("!!! long level = ", level, ", stop = ", NormalizeDouble (level - stop, Digits ));
       if (Bid < level) {
         tickets[orders] = OrderSend (symbol, OP_BUYSTOP, volume, level, 5 , NormalizeDouble (level - stop, Digits ), 
                             NormalizeDouble (level + take, Digits ), NULL , magicNum, TimeLocal () - TimeLocal () % 1800 + 7200 , clrBlue );                                                                           
         orderLevels[orders] = level;
         directions[orders] = true ;
         orderIsTheLast[orders] = lastOrder;          
         firstTouchTimes[orders] = firstTouchTime;
         orders++;                   
      }       
       else { 
         tickets[orders] = OrderSend (symbol, OP_BUYLIMIT, volume, level, 5 , NormalizeDouble (level - stop, Digits ), 
                             NormalizeDouble (level + take, Digits ), NULL , magicNum, TimeLocal () - TimeLocal () % 1800 + 7200 , clrBlue );                
         orderLevels[orders] = level;
         directions[orders] = true ;
         orderIsTheLast[orders] = lastOrder;
         firstTouchTimes[orders] = firstTouchTime;
         orders++;    
      }

주문이 여러 번 거부 된 다음 통과하는 경우가 있습니다 ...



 

CodeBase에서 다른 언어 청중을 위해 동일한 코드를 게시하는 방법(예: 시장에서 해당 언어에 대한 양식을 채우는 방법)?


CodeBase에서 이미 본 적이 있습니다. 여기에 예가 있습니다.


어떻게 같은 일을 할 수 있습니까?

 

예를 들어, 마우스로 양초의 크기를 극한까지 줄이면 표시기 데이터의 판독 값이 변경되지만 아무 것도 기록되지 않은 경우 표시기 데이터의 정확성으로 더 기울어 져야하는 차트 표시 표시기 코드의 양초 크기를 수천 개 변경하는 방법 예를 들어 4시에 축소된 형태의 볼륨은 하나의 값을 표시하지만 다른 배열을 위해 양초를 약간 늘릴 가치가 있습니다. 더 정확한 것으로 간주되는 판독 값.