MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 771

 
Igor Zakharov:

ただ、カレンダーのものはダメですね。30日バー逆算(日曜、土曜)

シフトパラメータなしの関数から判断して、あなたは5でやっていて、4で質問していますね :)

はい、30本の棒は、昨日から数えると21営業日です。(24.02.2019 - 25.01.2019)

私は

月平均キャンドルサイズ:598の場合

1週間の平均キャンドルサイズ:519

iATR()は10桁の数字が出るし...。

だから、まだ使い方がよくわからないんです。

 
Alexander Layzerevich:

そしてiATR()は10桁の数字を出力する...。

通常、小数の端数(=価格のようなもの。 ポイントに換算するには、_Pointで割る必要がある)。

イラスト参照:本日時点のユーロ/ドル - 月間の日足ベースで560pips。


 
Igor Zakharov:

通常、小数の端数(=価格のようなもの。 ポイントに換算する場合は、_Pointで割る)。

イラストをご覧ください:今日のユーロ/ドル - 1ヶ月間、日足ベースで560ピップス。


MQL4で確認 しました。

アイエーティーアール

 
Igor Zakharov:

通常、小数の端数(=価格のようなもの。 ポイントに換算する場合は、_Pointで割る)。

イラスト参照:本日時点のユーロ/ドル - 1ヶ月間、日足ベースで560pips。


MQL5で確認しました。それを確認するために、以下のようなコードを書きました。

//************************************************************************************************/
double iPointOrderStep()
{
   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);
   int Awerage7 = (iATR (Symbol(),PERIOD_D1, 5));
   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2),0);
   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/

このように表示されます。

アイエーティーアール

つまり、ある値を表示しているのに、別の値を表示している...。

 
Alexander Layzerevich:

MQL5で確認しました。それを確認するためにこのコードを書きました。

これが出力されるのです。

つまり、ある値を表示しているのに違う値を表示している...。

MQL5では、このようなインジケーターの操作方法は適切ではありません。

   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);

まず、ハンドルを作成する必要があり、それが完了した後に初めてCopyBufferから 値を取得することができます。

// этот код в Init()
      int handleATR=iATR(Symbol(),PERIOD_D1,21);
      if(handleATR==INVALID_HANDLE) return;

// это уже в сам советник/индикатор: OnTick()
      double hATR[];
      CopyBuffer(handleATR,0,0,1,hATR);
// double ATR = hATR[0]; // здесь значение ATR
 
Vitaly Muzichenko:

MQL5では、このようなインジケーターの操作方法は適切ではありません。

まず、ハンドルを作成する必要がありますが、これで完了です。その後、CopyBufferから 値を取得することができます。

ありがとうございます、それを踏まえてコードを書き直します。

MT4で書いて、MT5でテストするために#include <MT4Orders.mqh>を使っているだけなのですが。

ライブラリがIndicatorをサポートしていないのかもしれません。

 
Alexander Layzerevich:

ありがとうございます、それを踏まえてコードを書き直します。

MT4で書いて、#include <MT4Orders.mqh>でMT5でテストしているだけなんですけどね。

ライブラリがIndicatorをサポートしていない可能性があります。

はい、トレード機能のみ です。

 
Alexander Layzerevich:

ありがとうございます、それを踏まえてコードを書き直します。

MT4で書いて、#include <MT4Orders.mqh>でMT5でテストしているだけなんですけどね。

ライブラリでIndicatorがサポートされていない可能性があります。

2つのプラットフォームを結合するのは非常に速い方法であり、うまくいくが、mql5ではそうしない方が良い

double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }

そして、mql4と同じようにインジケータを適用します。

double atr=ATR(Symbol(),PERIOD_D1, 30);
 
Vitaly Muzichenko:

これは、2つのプラットフォームを結合するための非常に速いオプションで、それは動作しますが、それはmql5でそうしない方がよいです

そして、mql4と同じようにインジケータを適用します。

コードをありがとうございました。

それが功を奏した。

//************************************************************************************************/
double iPointOrderStep()
{
   double Awerage30 = (int)((ATR(Symbol(),PERIOD_D1,21,1))/Point());
//   Print ("Awerage30 = ", Awerage30);
   double Awerage7 = (int)((ATR(Symbol(),PERIOD_D1,5,1))/Point());
//   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2/6),0);
//   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/
double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
//************************************************************************************************/

これで、EA起動時の平均化されたデータができました。そしてこのデータは、私が関数にアクセスするたびに再計算されます。

私の理解では、呼び出しを制限するためには、計算されたデータでバッファレコードを作成する必要があります。

そこで、再計算のための条件を設定する必要があります。月曜日」とバッファに何もない場合。

例えば、変数 buferStep = -1 を宣言し、OnTick() で buferStep <0 または "Monday" ならば再計算する、という具合です。

ここでまた、困ったことに、ロボットはどうやって今日を「月曜日」と宣言するのでしょうか?

 
Alexander Layzerevich:

コードをありがとうございました。

こんな感じでうまくいきました。

これでEAの開始時に平均化されたデータが手に入りました。そして、このデータは関数が呼び出されるたびに再計算される。

私の理解では、呼び出しを制限するためには、計算されたデータでバッファレコードを作成する必要があります。

そこで、再計算のための条件を設定する必要があります。月曜日」とバッファに何もない場合。

例えば、変数 buferStep = -1 を宣言し、OnTick() で buferStep <0 または "Monday" ならば再計算する、という具合です。

ここでまた困ったことに、ロボットはどうやって今日が「月曜日」だと宣言するのでしょうか?

月曜日は使いたくないので、何日前かだけ教えてほしい。また、Expert Advisorに計算の負荷をかけないように、新しいバーごとに取得することにしています。