MG4 스크립트 및 Expert Advisor를 지원하는 테스터 - 페이지 2

 
AlexeyVik :

글쎄, 제작자는 일반 프로그래머가 직면하는 그러한 어려움을 보지 못할 수도 있습니다.

예를 들어, 나는 한때 연구소에서 BASIC을 공부했고 다른 것은 아무것도 없었습니다. 그리고 나는 mql4를 스스로 공부해야했고, 지금은 문제가 없습니다. 그리고 mql5를 이해하기 위해 거의 일주일 동안 헤더가 있는 100줄 미만의 간단한 지표를 작성했습니다. 제 생각에는 차이가 있고 상당한 차이가 있습니다.

이것은 신화이고 당신은 그것을 알고 있습니다.

MetaTrader 4에서 일반 ATR.mq4를 가져옵니다. 104줄이 있습니다.

 //+------------------------------------------------------------------+
//|                                                          ATR.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright    "2005-2014, MetaQuotes Software Corp."
#property link          "https://www.mql4.com"
#property description "Average True Range"
#property strict

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1  DodgerBlue
//--- input parameter
input int InpAtrPeriod= 14 ; // ATR Period
//--- buffers
double ExtATRBuffer[];
double ExtTRBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ( void )
  {
   string short_name;
//--- 1 additional buffer used for counting.
   IndicatorBuffers( 2 );
   IndicatorDigits( Digits );
//--- indicator line
   SetIndexStyle( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 ,ExtATRBuffer);
   SetIndexBuffer ( 1 ,ExtTRBuffer);
//--- name for DataWindow and indicator subwindow label
   short_name= "ATR(" + IntegerToString (InpAtrPeriod)+ ")" ;
   IndicatorShortName(short_name);
   SetIndexLabel( 0 ,short_name);
//--- check for input parameter
   if (InpAtrPeriod<= 0 )
     {
       Print ( "Wrong input parameter ATR Period=" ,InpAtrPeriod);
       return ( INIT_FAILED );
     }
//---
   SetIndexDrawBegin( 0 ,InpAtrPeriod);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
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,limit;
//--- check for bars count and input parameter
   if (rates_total<=InpAtrPeriod || InpAtrPeriod<= 0 )
       return ( 0 );
//--- counting from 0 to rates_total
   ArraySetAsSeries (ExtATRBuffer, false );
   ArraySetAsSeries (ExtTRBuffer, false );
   ArraySetAsSeries (open, false );
   ArraySetAsSeries (high, false );
   ArraySetAsSeries (low, false );
   ArraySetAsSeries (close, false );
//--- preliminary calculations
   if (prev_calculated== 0 )
     {
      ExtTRBuffer[ 0 ]= 0.0 ;
      ExtATRBuffer[ 0 ]= 0.0 ;
       //--- filling out the array of True Range values for each period
       for (i= 1 ; i<rates_total; i++)
         ExtTRBuffer[i]= MathMax (high[i],close[i- 1 ])- MathMin (low[i],close[i- 1 ]);
       //--- first AtrPeriod values of the indicator are not calculated
       double firstValue= 0.0 ;
       for (i= 1 ; i<=InpAtrPeriod; i++)
        {
         ExtATRBuffer[i]= 0.0 ;
         firstValue+=ExtTRBuffer[i];
        }
       //--- calculating the first value of the indicator
      firstValue/=InpAtrPeriod;
      ExtATRBuffer[InpAtrPeriod]=firstValue;
      limit=InpAtrPeriod+ 1 ;
     }
   else
      limit=prev_calculated- 1 ;
//--- the main loop of calculations
   for (i=limit; i<rates_total; i++)
     {
      ExtTRBuffer[i]= MathMax (high[i],close[i- 1 ])- MathMin (low[i],close[i- 1 ]);
      ExtATRBuffer[i]=ExtATRBuffer[i- 1 ]+(ExtTRBuffer[i]-ExtTRBuffer[i-InpAtrPeriod])/InpAtrPeriod;
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+


MetaTrader 5에서 동일한 ATR.mq5를 가져옵니다. 96줄이 있습니다.

 //+------------------------------------------------------------------+
//|                                                          ATR.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright    "2009, MetaQuotes Software Corp."
#property link          "https://www.mql5.com"
#property description "Average True Range"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots    1
#property indicator_type1   DRAW_LINE
#property indicator_color1  DodgerBlue
#property indicator_label1   "ATR"
//--- input parameters
input int InpAtrPeriod= 14 ;   // ATR period
//--- indicator buffers
double     ExtATRBuffer[];
double     ExtTRBuffer[];
//--- global variable
int        ExtPeriodATR;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//--- check for input value
   if (InpAtrPeriod<= 0 )
     {
      ExtPeriodATR= 14 ;
       printf ( "Incorrect input parameter InpAtrPeriod = %d. Indicator will use value %d for calculations." ,InpAtrPeriod,ExtPeriodATR);
     }
   else ExtPeriodATR=InpAtrPeriod;
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtATRBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,ExtTRBuffer, INDICATOR_CALCULATIONS );
//---
   IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,InpAtrPeriod);
//--- name for DataWindow and indicator subwindow label
   string short_name= "ATR(" + string (ExtPeriodATR)+ ")" ;
   IndicatorSetString ( INDICATOR_SHORTNAME ,short_name);
   PlotIndexSetString ( 0 , PLOT_LABEL ,short_name);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
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,limit;
//--- check for bars count
   if (rates_total<=ExtPeriodATR)
       return ( 0 ); // not enough bars for calculation
//--- preliminary calculations
   if (prev_calculated== 0 )
     {
      ExtTRBuffer[ 0 ]= 0.0 ;
      ExtATRBuffer[ 0 ]= 0.0 ;
       //--- filling out the array of True Range values for each period
       for (i= 1 ;i<rates_total && ! IsStopped ();i++)
         ExtTRBuffer[i]= MathMax (high[i],close[i- 1 ])- MathMin (low[i],close[i- 1 ]);
       //--- first AtrPeriod values of the indicator are not calculated
       double firstValue= 0.0 ;
       for (i= 1 ;i<=ExtPeriodATR;i++)
        {
         ExtATRBuffer[i]= 0.0 ;
         firstValue+=ExtTRBuffer[i];
        }
       //--- calculating the first value of the indicator
      firstValue/=ExtPeriodATR;
      ExtATRBuffer[ExtPeriodATR]=firstValue;
      limit=ExtPeriodATR+ 1 ;
     }
   else limit=prev_calculated- 1 ;
//--- the main loop of calculations
   for (i=limit;i<rates_total && ! IsStopped ();i++)
     {
      ExtTRBuffer[i]= MathMax (high[i],close[i- 1 ])- MathMin (low[i],close[i- 1 ]);
      ExtATRBuffer[i]=ExtATRBuffer[i- 1 ]+(ExtTRBuffer[i]-ExtTRBuffer[i-ExtPeriodATR])/ExtPeriodATR;
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+


104행과 96행의 크기에는 차이가 없으며 이점이 MQL5 측에 있습니다.

이것이 사람들이 포럼에서 포럼으로 넌센스와 신화를 전송하는 방법입니다.

 
Renat :

언어가 같다는 것은 전혀 아닙니다.

차이점은 작은 기능 세트(MT5에서 더 좋음)에만 있으며 개발에 심각한 비용이 들지 않습니다.

"나는 시간을 낭비하고 싶지 않습니다"와 "어제 필요합니다"에 대해 거래 플랫폼은 거래자의 효율성을 높이는 중요한 도구임을 상기시키고 싶습니다. 분명히 더 효과적이고 기능적인 솔루션이 근처에 있을 때 이를 사용하지 않는 것은 자신에게 해를 끼치고 발명된 신화로 자신을 속이는 것입니다.

MT4를 영원히 잊어 버리려면 거래 전략 테스터를 비교하는 것으로 충분합니다. 나는 농담이 아니며 너무 멀리 가지도 않습니다. 그것은 사실입니다.

MT5에서 포지션을 합산하는 가장 어리석은 원칙(그리고 이것은 하나의 심볼과 하나의 계정에서 여러 MTS의 동시 작업을 구성하는 트릭 없이는 불가능함을 의미함)에 대한 거래를 영원히 권장하지 않습니다. 손에 손가락이 있는 것보다 실생활에서 MT5를 제공하는 브로커가 더 많을지라도.

그리고 테스터를 위해 MT5용 코드를 다시 작성합니다. 실례합니다. 하지만 이것은 터무니없는 일입니다.

 
evillive :

MT5에서 포지션을 합산하는 가장 어리석은 원칙(그리고 이것은 하나의 심볼과 하나의 계정에서 여러 MTS의 동시 작업을 구성하는 트릭 없이는 불가능함을 의미함)에 대한 거래를 영원히 권장하지 않습니다. 손에 손가락이 있는 것보다 실생활에서 MT5를 제공하는 브로커가 더 많을지라도.

전혀 바보가 아닙니다.

장점은 너무 많이 설명되어 반복하고 싶지 않습니다. 나는 또한 "하나의 심볼에 여러 MTS가 자기기만, 손실 및 대량 사용에 대한 비현실적인 상황"인 이유를 반복해서 설명했습니다.


그리고 테스터를 위해 MT5용 코드를 다시 작성합니다. 실례합니다. 하지만 이것은 터무니없는 일입니다.

이것은 터무니없다.

당신은 기회를 끊고 발전의 기회를 놓칩니다. 분명히 고품질의 기능적이며 강력한 시스템이 결함이 많은 이전 시스템보다 나쁘다는 것을 자신과 다른 사람들에게 증명하는 것은 자신에게 직접적인 해를 끼치는 것입니다.

 
Renat :

언어가 같다는 것은 전혀 아닙니다.

차이점은 작은 기능 세트(MT5에서 더 좋음)에만 있으며 개발에 심각한 비용이 들지 않습니다.

"나는 시간을 낭비하고 싶지 않습니다"와 "어제 필요합니다"에 대해 거래 플랫폼은 거래자의 효율성을 높이는 중요한 도구임을 상기시키고 싶습니다. 분명히 더 효과적이고 기능적인 솔루션이 근처에 있을 때 이를 사용하지 않는 것은 자신에게 해를 끼치고 발명된 신화로 자신을 속이는 것입니다.

MT4를 영원히 잊어 버리려면 거래 전략 테스터를 비교하는 것으로 충분합니다. 나는 농담이 아니며 너무 멀리 가지도 않습니다. 그것은 사실입니다.

Renat, MT4 테스터와 MT5 테스터를 동일시하는 것이 얼마나 어려운가요?
 
Renat :

이것은 신화이고 당신은 그것을 알고 있습니다.

MetaTrader 4에서 일반 ATR.mq4를 가져옵니다. 104줄이 있습니다.


MetaTrader 5에서 동일한 ATR.mq5를 가져옵니다. 96줄이 있습니다.


104행과 96행의 크기에는 차이가 없으며 이점이 MQL5 측에 있습니다.

이것이 사람들이 포럼에서 포럼으로 넌센스와 신화를 전송하는 방법입니다.

네, 저는 이에 대해 글을 쓰지 않았지만 mql4에 같은 지표를 한 시간 만에 작성했다는 사실과 mql5에 동일한 코드를 작성하는 것을 마스터하는 데 일주일이 걸렸다는 사실에 대해... 주식의 수에 관한 것이 아닙니다. , 그러나 프로그래밍 접근 방식을 이해하는 것에 대해 ...

mql5의 동일한 작업에서 mql4의 일반 표시기 값을 얻는 것이 얼마나 다른지... 알아내는 동안 거의 미쳐버렸습니다. 물론 프로그래밍 과정을 제공할 수는 있지만 그러한 과정을 들을 수 없는 다른 요인도 고려해야 합니다... 그리고 비용, 연령, 장소로부터의 거리 또는 교통 비용 온라인 학습의 경우 ... 네, 그 정도면 충분하지 않습니다 ...

 
AlexeyVik :
Renat, MT4 테스터와 MT5 테스터를 동일시하는 것이 얼마나 어려운가요?
4개는 건드리지 않고 MQL5.community와의 통합 서비스 부분만 다루겠습니다.
 
Renat :
4개는 건드리지 않고 MQL5.community와의 통합 서비스 부분만 다루겠습니다.
네, 하실 건지 안 물어봐서 안 하실 거라고 생각했어요. 힘들지 않냐고 물어보니...
 
AlexeyVik :

네, 저는 이에 대해 글을 쓰지 않았지만 mql4에 같은 지표를 한 시간 만에 작성했다는 사실과 mql5에 동일한 코드를 작성하는 것을 마스터하는 데 일주일이 걸렸다는 사실에 대해... 주식의 수에 관한 것이 아닙니다. , 그러나 프로그래밍 접근 방식을 이해하는 것에 대해 ...

mql5의 동일한 작업에서 mql4의 일반 표시기 값을 얻는 것이 얼마나 다른지... 알아내는 동안 거의 미쳐버렸습니다. 물론 프로그래밍 과정을 제공할 수는 있지만 그러한 과정을 들을 수 없는 다른 요인도 고려해야 합니다... 그리고 비용, 연령, 장소로부터의 거리 또는 교통 비용 온라인 학습의 경우 ... 네, 그 정도면 충분하지 않습니다 ...

두 파일을 비교하고 가장 작은 차이를 찾으십시오.

"마스터하는 데 일주일, 거의 미쳐버릴 뻔했습니다." - 이것은 포럼의 빨간 단어에 대한 것입니다. 신화는 이렇게 탄생합니다.

 
AlexeyVik :
단지 언어가 너무 달라서 마스터하는 데 많은 시간이 걸립니다.
네, 아닙니다. 한 달이면 충분했습니다.
 
Renat :

두 파일을 비교하고 가장 작은 차이를 찾으십시오.

"마스터하는 데 일주일, 거의 미쳐버릴 뻔했습니다." - 이것은 포럼의 빨간 단어에 대한 것입니다. 신화는 이렇게 탄생합니다.

글쎄, 나는 이것이 진정한 진실임을 증명하지 않을 것입니다. 일반적으로 C ++ 프로그래밍과 OOP에 익숙하지 않은 사람에게 이것은 매우 어렵고 빨간 단어나 신화의 탄생에 대해서는 전혀 아닙니다. 이상하게도 나는 일주일 만에 그것을 알아 내고 필요한 것을 썼습니다. 그리고 이것은 완전히 다른 신화입니다. mql5를 마스터하는 것은 나와 같은 비전문가도 사용할 수 있다는 것을 암시합니다.