MG4スクリプトとアドバイザーをサポートするテスター - ページ 2

 
AlexeyVik:

まあ、普通のプログラマーが直面するような苦労を、作り手は見ていないのかもしれませんね。

例えば、私は大学ではBASICを勉強していましたが、それ以外は何もしていませんでした。mql4が好きで自分で勉強していたこともあり、今は特に問題ないです。mql5を使おうとしたとき、mql5 indicator hatと一緒に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のポジション集計の最も愚かな原理(これは、1つのシンボルと1つの口座で複数のMTSの同時操作をトリックなしで制限することが不可能であることを意味します)は、MT5での取引を永遠に思いとどまらせています。MT5を提供するブローカーが、手のひらの指の数よりも多くなるときでさえも。

また、テスターのためだけにMT5用のコードを書き換えるなど、申し訳ありませんが、無茶な話です。

 
evillive:

MT5のポジション集計の最も愚かな原則(つまり、1つのシンボルと1つの口座で複数のMTSの同時操作をトリックなしで制限することが不可能)は、MT5での取引を永遠に思いとどまらせています。MT5をリアルで提供するブローカーが手の指の数より多くなるときでさえ。

まったく不条理なことではありません。

メリットは何度も説明しているので、繰り返したくない。また、「1つのシンボルに複数のMTSを搭載することは自滅であり、損失であり、大量利用には非現実的な状況である」理由も繰り返し説明してきました。


また、テスターのためだけにMT5用のコードを書き換えるというのは、申し訳ないですが、無茶な話です。

不条理ではありません。

自ら機会を減らし、発展のチャンスを逃しているのです。より良い、より機能的で強力なシステムが、欠陥だらけの古いシステムより悪いと、自分自身や他の人に証明することは、自分自身を直接傷つけることになります。

 
Renat:

全然違うというのは、言葉が同じということです。

違いはごく一部の機能だけであり(MT5ではそれが優れている)、使いこなすために大きなコストはかからない。

時間を無駄にしたくない」「昨日までに必要」ということについては、トレーディングプラットフォームはトレーダーの効率を上げるための重要なツールであることを思い出してほしい。近くにもっと効果的で機能的な解決策があることがわかっていながら、それを使わないのは、自分を傷つけ、作り出された神話で自分を欺いていることになります。

取引戦略のテスターを比較すると、MT4のことを永遠に忘れてしまうほどです。冗談でもなく、大袈裟でもなく、現実なんです。

レナートさん、mt4テスターとmt5テスターを同一視するのは難しいですか?
 
Renat:

これは神話であり、あなたはそれを知っている。

MetaTrader 4の標準的なATR.mq4を取り上げてみましょう。そこには104本の線がある。


MetaTrader 5のATR.mq5を例にとると、96行になっています。


104行と96行のサイズに差はなく、アドバンテージさえもMQL5に軍配が上がります。

そうやって、人々は無意味なことや神話をフォーラムからフォーラムへと移していくのです。

質問ですが、mql4で同じインジケータを書くのに1時間かかり、mql5で同じコードを書くのをマスターするのに1週間かかったのですが...。引用の数ではなく、プログラミングのアプローチへの理解......。

mql4で標準インジケータの値を取得する機能は、mql5の同機能とどの程度違うのでしょうか...。対処しているときに、気が狂いそうになったことがあります。もちろん、プログラミングの講座を開くことはできますが、そのような講座に行くことができないかもしれない他の要因も考えなければなりません...。そして、費用や年齢、会場からの距離やオンライン学習の場合の交通費など・・・。分からないものですね...。

 
AlexeyVik:
Renatさん、mt4テスターとmt5テスターを同じにするのは難しいのですか?
4には触れず、MQL5.communityとの連携というサービス部分のみとします。
 
Renat:
カルテットには触れず、MQL5.communityとの連携というサービス部分のみとします。
やるかどうかも聞いてないので、やらないんだろうなと察しました。難しいのかって...。
 
AlexeyVik:

そうではなく、mql4で同じインジケータを1時間で書き、mql5で同じコードを書く方法を学ぶのに1週間かかったと言いたかったのです......。引用の数ではなく、プログラミングのアプローチへの理解......。

mql4でカスタムインジケータの値を取得する機能は、mql5の同機能とどの程度違うのでしょうか ...私はそれを理解するために、ほとんど気が狂いそうでした。もちろん、プログラミングの講座を開くことはできますが、そのような講座に行くことができないかもしれない他の要因も考えなければなりません...。そして、費用や年齢、会場からの距離やオンライン学習の場合の交通費など・・・。分からないものですね...。

2つのファイルを比較すると、最小限の違いがあることがわかると思います。

コツをつかむのに1週間、発狂しそうになった」についてですが、掲示板では赤文字になっていますね。神話はこうして生まれる

 
AlexeyVik:
ただ、その中の言語があまりにも違うので、使いこなすには少なからず時間がかかる。
ふざけんなよ1カ月で十分だった。
 
Renat:

2つのファイルを比較すると、最小限の違いがあることがわかります。

コツをつかむのに1週間、発狂しそうになった」は、まさに掲示板の赤文字系フレーズ。神話はこうして生まれる

これが真実であることを証明することはしない。C++プログラミングや一般的なOOPに慣れていない人にとっては、むしろ難しく、赤文字や神話の創作のためでは全くありません。不思議なことに、1週間ですべてを理解し、必要なことを書きました。そして、これは全く別の神話で、私のような非専門家でもmql5を簡単にマスターできることを示しているのです。