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

 
ANDREY :
프로그램(mql 4, 분, 모든 틱)이 명시적으로 숫자를 읽고 함수에서 계산된 동일한 숫자를 다른 방식으로 읽는 이유를 알려주십시오.
다음은 코드입니다.

Print() 가 Pr을 1.60854로 표시하지만 프로그램은 Pr을 1.60854로 읽지 않습니다. 결과적으로 프로그램은 두 번째 주문을 엽니다.


그리고 숫자 1.60854가 Pr 변수 대신 설정되면 프로그램은 그것을 읽고 두 번째 주문을 열지 않습니다.

질문 프로그램 이 Pr을 읽고 두 번째 주문을 열지 않도록 코드를 변경해야 합니다.
도와 주셔서 감사합니다

실수를 직접 비교하는 것은 권장하지 않습니다. 정규화된 차이를 0과 비교하는 것이 옳습니다.

 NormalizeDouble (Lt1-Pr, _Digits ) != 0.0 ;
 
Alexey Viktorov :

실수를 직접 비교하는 것은 권장하지 않습니다. 정규화된 차이를 0과 비교하는 것이 옳습니다.

소중한 정보 감사합니다. 나 자신은 결코 짐작하지 못했을 것이다.

 
ANDREY :

소중한 정보 감사합니다. 나 자신은 결코 짐작하지 못했을 것이다.

권장하지 않음이 금지됨을 의미하지는 않습니다. 예를 들어 현재 가격을 제안된 정류장의 가격과 비교하면 다소간 직접적으로 비교할 수 있습니다. 결국 그 차이는 상당히 클 것입니다. 그러나 평등은 완전히 다른 문제입니다 ...

 
Alexey Viktorov :

권장하지 않음이 금지됨을 의미하지는 않습니다. 예를 들어 현재 가격을 제안된 정류장의 가격과 비교하면 다소간 직접적으로 비교할 수 있습니다. 결국 그 차이는 상당히 클 것입니다. 그러나 평등은 완전히 다른 문제입니다 ...

이해했다. 고맙습니다.

 
코드와 함께 지정된 파일을 포함하는 매크로 대체 목록이 있는 별도의 mqh 파일을 만들기로 결정했습니다.
 // файл со списком макроподстановок

#define ARRAY_C #include <JvL/Arrays/C_Array.mqh>
#define MTF_C #include <JvL/C_MTF.mqh>
 // файл с кодом в котором нужно использовать включения других файлов с кодом

#include <JvL/Includes.mqh>
ARRAY_С
그러나 그것은 그렇게 작동하지 않습니다.

'포함' 대신 매크로 인수가 필요합니다. 포함.mqh
'포함' - 전역 범위에서 표현식이 허용되지 않습니다. C_Meter.mqh


컴파일러를 능가하는 방법?

 

안녕하세요. 지그재그 표시기를 이해하도록 도와주세요. 전체 ZigZagBuffer[] 배열이 0.0 값을 취한 것으로 나타났습니다. if(res != 0.0) 표현식이 때때로 참이 되는 이유는 무엇입니까? 결국 전체 배열에 0.0이라는 값이 쓰여진다?????

 if (prev_calculated== 0 )
     {
       ArrayInitialize (ZigZagBuffer, 0.0 );
       ArrayInitialize (HighMapBuffer, 0.0 );
       ArrayInitialize (LowMapBuffer, 0.0 );
      start=InpDepth; //Print(start);
     }
   if (prev_calculated> 0 ) 
     {
      i=rates_total- 1 ; //Print(i);
       //--- searching for the third extremum from the last uncompleted bar
       while (extreme_counter<ExtRecalc && i>rates_total- 100 )
        {
         res=ZigZagBuffer[i]; 
         if (res!= 0.0 )                       //!!!
            extreme_counter++; x++;
         i--;
        }
      i++;
      start=i;
 

안녕하세요. 친애하는 프로그래머 여러분, 여러분의 도움이 필요합니다.

표시기를 다중 통화 표시기로 변환하려고 합니다. 지하실에서는 두 개의 도구에서 SMA를 표시해야 합니다.

어렵지 않다면 무엇이 잘못된 것인지 알려주세요.


 //+------------------------------------------------------------------+
//|                                          Normalzd_I_I_Oscill.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        " https://mql5.com "
#property version    "1.00"
#property description "Normlzd_I_I_Oscill"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots    2
//--- plot Int0
#property indicator_label1    "Int0"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrDeepSkyBlue
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- plot Int1
#property indicator_label2    "Int1"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrRed
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1

//--- input parameters - buffer 0 ---------
input string           symbol0= "EURUSD" ;       //----- Instrument 1 ------
input ENUM_TIMEFRAMES tf0= PERIOD_CURRENT ; //Timeframe 1
input uint             InpPeriod0= 10 ;   // Period1
//--- input parameters - buffer 1 ---------
input string           symbol1= "USDCAD" ;       //----- Instrument 2 ------
input ENUM_TIMEFRAMES tf1= PERIOD_CURRENT ; //Timeframe 2
input uint             InpPeriod1= 10 ;   // Period2
//--- input other parameters --------------
input int              max_bars= 100 ;       //Maximum Bars Calculate

//--- indicator buffers
double          Buffer1NII[];
double          Buffer1Temp[];
double          Buffer1Raw[];
double          Buffer2NII[];
double          Buffer2Temp[];
double          Buffer2Raw[];
//--- global variables
int             period_sm0;
int             period_sm1;
string          _symbol0,_symbol1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   if (symbol0==symbol1)
     {
       Alert ( "Wrong setting Symbol NAME" );
       return ( INIT_FAILED );
     }
   _symbol0=symbol0;
   _symbol1=symbol1;
   if (symbol0== "" )
      _symbol0= Symbol ();
   if (symbol1== "" )
      _symbol1= Symbol ();
//--- set global variables
   period_sm0= int (InpPeriod0< 1 ? 1 : InpPeriod0);
   period_sm1= int (InpPeriod1< 1 ? 1 : InpPeriod1);
   
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Buffer1NII, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,Buffer1Raw, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 2 ,Buffer1Temp, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 3 ,Buffer2NII, INDICATOR_DATA );
   SetIndexBuffer ( 4 ,Buffer2Raw, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 5 ,Buffer2Temp, INDICATOR_CALCULATIONS );

   PlotIndexSetString ( 0 , PLOT_LABEL ,symbol0+ " Int0-" + EnumToString (tf0));   
   PlotIndexSetString ( 1 , PLOT_LABEL ,symbol1+ " Int1-" + EnumToString (tf0));   
//--- setting indicator parameters
   IndicatorSetString ( INDICATOR_SHORTNAME , "Normlzd_I_I_O" ); 
   IndicatorSetInteger ( INDICATOR_DIGITS , Digits ());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries (Buffer1NII, true );
   ArraySetAsSeries (Buffer1Temp, true );
   ArraySetAsSeries (Buffer1Raw, true );
   ArraySetAsSeries (Buffer2NII, true );
   ArraySetAsSeries (Buffer2Temp, true );
   ArraySetAsSeries (Buffer2Raw, true );
   
   if (! SymbolInfoInteger (symbol0, SYMBOL_SELECT )) 
       SymbolSelect (symbol0, true );                
   if (! SymbolInfoInteger (symbol1, SYMBOL_SELECT ))
       SymbolSelect (symbol1, true );
//---
   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[])
  {
   bool error= false ;
   string symerror= "" ;
   ResetLastError ();
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries (high, true );
   ArraySetAsSeries (low, true );
   ArraySetAsSeries (close, true );
   ArraySetAsSeries (tick_volume, true );
//--- Проверка и расчёт количества просчитываемых баров
   if (rates_total< fmax (period_sm0, 4 )) return 0 ;
   if (rates_total< fmax (period_sm1, 4 )) return 1 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     {
      limit=rates_total- 0 ;
       ArrayInitialize (Buffer1NII, EMPTY_VALUE );
       ArrayInitialize (Buffer1Temp, 0 );
       ArrayInitialize (Buffer1Raw, 0 );
          
      limit=rates_total- 1 ;
       ArrayInitialize (Buffer2NII, EMPTY_VALUE );
       ArrayInitialize (Buffer2Temp, 1 );
       ArrayInitialize (Buffer2Raw, 1 );
     }

//--- Расчёт индикатора
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
      Buffer1Temp[i]=(high[i]-low[i]!= 0 ? ( 2.0 *close[i]-high[i]-low[i])/(high[i]-low[i])*tick_volume[i] : 0 );
      Buffer1Raw[i]=( double )tick_volume[i];
       double raw_avg1=GetSMA(rates_total,i,period_sm0,Buffer1Raw);
      Buffer1NII[i]=(raw_avg1!= 0 ? GetSMA(rates_total,i,period_sm0,Buffer1Temp)/raw_avg1 : 0 );
           {
            error= true ;
            symerror=symbol0; 
           }
     
      Buffer2Temp[i]=(high[i]-low[i]!= 0 ? ( 2.0 *close[i]-high[i]-low[i])/(high[i]-low[i])*tick_volume[i] : 0 );
      Buffer2Raw[i]=( double )tick_volume[i];
       double raw_avg2=GetSMA(rates_total,i,period_sm1,Buffer2Raw);
      Buffer2NII[i]=(raw_avg2!= 0 ? GetSMA(rates_total,i,period_sm1,Buffer2Temp)/raw_avg2 : 0 );
           {
            error= true ;
            symerror=symbol0; 
           } 
     }
//--- return value of prev_calculated for next call
   if (error)
     
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Simple Moving Average                                            |
//+------------------------------------------------------------------+
double GetSMA( const int rates_total, const int index, const int period, const double &price[], const bool as_series= true )
  {
//---
   double result= 0.0 ; 
//--- check position
   bool check_index=(as_series ? index<=rates_total-period- 1 : index>=period- 1 );
   if (period< 1 || !check_index)
       return 0 ;
//--- calculate value
   for ( int i= 0 ; i<period; i++)
      result=result+(as_series ? price[index+i]: price[index-i]);
//---
   return (result/period);
  }
//+------------------------------------------------------------------+
 
ANDREY :

모두에게 좋은 하루.
다음 조건에서 어떤 수학 함수가 기억나지 않는지 도움을 받아 올바르게 인코딩하는 방법을 알려주십시오.

if (입찰가 - 낮음[1]>=0.0030 && 입찰가 - 낮음[1]<0.0035) { action;}
위의 조건에서 && 기호 없이 할 수 있는 수학 함수가 있다는 것을 알고 있으며 프로그램은 가격이 4포인트 범위에서 일치하는지 확인합니다. 하지만 이 수학 함수의 이름과 적용 방법이 기억나지 않습니다.
도와 주셔서 감사합니다.

if ( MathAbs (입찰가 - 낮음[1]) >= 0.0004) {액션;}

 
Taras Slobodyanik :

if ( MathAbs (입찰가 - 낮음[1]) >= 0.0004) {액션;}

오 타라스, 타라스... 학교에서 생각하는 법을 가르쳐주지 않았나요? 0.0004는 0.0035보다 작습니까?

 
Alexey Viktorov :

오 타라스, 타라스... 학교에서 생각하는 법을 가르쳐주지 않았나요? 0.0004는 0.0035보다 작습니까?

읽는 법을 배우십시오, 당신은 우리의 거짓말 쟁이입니다

그리고 프로그램은 가격이 4 포인트 범위 내에 있는지 확인합니다.