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

 
Vladimir Karputov:

あり:

ありがとうございます。パソコンに向かうから、見てみようかな。
 
Artyom Trishkin:
ありがとうございます。パソコンに向かうから、見てみようかな。

インジケータはMQL4の非常に古い形式で書かれており、長い間触っていないので、どのように書かれていたのか覚えていないのですが

zig2003 オプションとして、start()からIndicatorBuffers(6)を削除してみてください。

で、一番上の #property indicator_buffers 6 を修正。

 
イゴール・マカヌ さん、インジケーターを修正した後、反転のプログラムを組むには、EAの何と比較する必要があるのでしょうか。
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
zig2003:
Igor Makanu さん、インジケーターを修正した後、Expert Advisorでピボットをプログラムするために何と比較すればいいのでしょうか。

各指標は複数の指標バッファで構成される

Expert AdvisorからiCustom()でインジケータを呼び出すと、あるバーのあるバッファの値を取得し、データウィンドウでこの値を見ることができます Ctrl+D

何を比較するかはTSに依存し、インジケータバッファの値またはバッファと価格 - 多くのバリエーションがあります。

まずMAインジケータを作成し、理解したらMAではなく自作のインジケータを呼び出すようにします

コマンドをいくつか書くだけで、Expert Advisorの準備は完了です。


ZSです。インジケータ・ピボットは、インジケータ・バッファの複数の値の比較です。スクリーンショットから判断すると、バー番号2はバッファ番号1の価格の近くに設定されなければならず、残りのバッファは、バッファ番号1の価格に設定されます。EMPTY_VALUE値、およびバー№1に、逆に、バッファ№1は値EMPTY_VALUEを持っており、2または3バッファの一つは、EMPTY_VALUEとは異なる値を持っているでしょう - あなたはデータ概要のウィンドウでそれをすべて見てください(バー上のマウス矢印を移動すると、バッファ値を参照します。)

 

Igorさん、ありがとうございます。インジケータを修正しましたが、やはりバッファからの値は表示されませんでした。私はとっくにその段階を過ぎています。そこではすべてがシンプルで、2つのライン、つまり2つのバッファがあります。 通常、同じようなインジケータで、1行で構成され、色のバッファが異なる場合、私はこのようにコードを書きます。

//Функция для определения входа и выхода по AMA 
 int Enter()
  {
   double AMAbuy_1  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,1);             //Подключаем AMA для первого бара (buy)
   double AMAsell_1 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,1);             //                                (sell)
   double AMAbuy_2  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,2);             //Подключаем AMA для второго бара (buy)       
   double AMAsell_2 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,2);             //                                (sell)                    
                         
   if(AMAbuy_1>0 && AMAsell_2>0)                                                                                 //Вход в бай
      return(1);                                                                                           
   if(AMAsell_1>0 && AMAbuy_2>0)                                                                                 //Вход в селл
      return(-1);                                                                                          
        
   return(0);
  } 

ただし、これは各色に実バッファが割り当てられている場合に限ります。最初に閉じたバーで色を変更すると、バッファの値が0より大きくなり、前のバーでは0と等しいか、別の色のバッファが0より大きくなっていました。このインジケータから2つ目の売り色の値が得られず、何と比較して反転を捉えるのかが不明です。すべてのバッファ番号を試した。このムラデノフのターンテーブル、古いけどマニュアルストラテジーの中では非常にまともな傾向なので残念です...。 誰か2番目のバッファから値を引っ張ってきて反転させる式を書いてくれないでしょうか?

 
zig2003:

Igorさん、ありがとうございます。インジケータを修正しましたが、やはりバッファからの値は表示されませんでした。私はとっくにその段階を過ぎています。そこではすべてがシンプルで、2つのライン、つまり2つのバッファがあります。通常、1行で構成される同様のインジケーターで、色のバッファが異なるものは、このようにコードを書きます。

ただし、これは各色に実バッファが割り当てられている場合に限ります。最初に閉じたバーで色を変更すると、バッファの値が0より大きくなり、前のバーでは0と等しいか、別の色のバッファが0より大きくなっていました。このインジケータから2色目の値を得ることができず、何と比較して反転を捉えればいいのか理解できません。そして、このムラデノフの指標は、古いが、マニュアル戦略では非常によくトレンドが出るので、これは残念だ...。 誰か、反転式の書き方を教えてくれませんか?

インジケーターエディットなし

2つのバッファのデータは何を意味するのか - 0と1において。

  • バッファ0に値があり、バッファ1に値がない場合、これはロングする方向です(青いインジケータライン(デフォルトの場合)
  • バッファ0に値があり、バッファ1に値がある場合、これはショート方向です(インジケータラインの色が赤(デフォルトの場合))。

線の方向(色)を変える。

  • バッファ0には常に値があり、ところで、常にそれを定義することができる(3本のバーで値を比較:2<=1 && 1>0 --> ダウン、2>=1 && 1<0 --> アップ)。
    ...
    しかし、バッファ1のみを使用することも可能です。
  • 0小節目にバッファ1に値がなく、1小節目に値がある場合、これはラインの方向がロングに変化していることを意味します。
  • バッファ1のバー0に値があり、バー1に値がない場合、これはラインの方向がショートに変わることを意味します。

ここでいう「値がない」とは、EMPTY_VALUEの ことです。またはDBL_MAX - 問題ではありません、それは同じことです。つまり、ゼロではなく、EMPTY_VALUE です。

 
zig2003:

2番目のバッファから値を取り出し、ピボット式を書く方法を誰か想像できますか?

推測する必要はなく、まずMQL4の現状に対応した正規の形でインジケータを書き換える必要があります

少しはコードを整えましたが、エラーが出ないかどうかはわかりません。 ソースコードは好きではありませんが、手に入れたもので作業しています。

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrTomato
#property indicator_color3 clrTomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
input int    Range           = 9;
input int    FastMA          = 3;
input int    SlowMA          = 30;
input int    filter          = 25;
input int    normalizeDigits = 4;

input bool   alertsOn        = false;
input bool   alertsOnCurrent = false;
input bool   alertsMessage   = true;
input bool   alertsSound     = true;
input bool   alertsEmail     = false;
input string soundfile       = "alert2.wav";


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0, fAMA);
   SetIndexLabel(0, "fAMA");
   SetIndexBuffer(1, Downa);
   SetIndexLabel(1, "Downa");
   SetIndexBuffer(2, Downb);
   SetIndexLabel(2, "Downb");
   SetIndexBuffer(3, trend);
   SetIndexLabel(3, "trend");
   SetIndexBuffer(4, mAMA);
   SetIndexLabel(4, "mAMA");
   SetIndexBuffer(5, AMA);
   SetIndexLabel(5, "AMA");
   for (int i=0; i<indicator_buffers; i++) {
      SetIndexStyle(i, DRAW_LINE);
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],        // Low
                 const double &close[],      // Close
                 const long &tick_volume[],  // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
                )
{
   int limit;
   if(prev_calculated==0) limit=rates_total-1;
   else limit=rates_total-prev_calculated+1;
   if (trend[limit] == -1) ClearPoint(limit, Downa, Downb);
   double k1 = 2.0 / (SlowMA + 1);
   double k2 = 2.0 / (FastMA + 1) - k1;
   for(int i = limit; i>= 0; i--) {
      double sdAMA = 0;
      double Noise = 0;
      for(int k=0; k<Range; k++) Noise += MathAbs(Close[i+k] - Close[i+k+1]);
      double ER    = 0;
      if(Noise != 0) ER = MathAbs(Close[i] - Close[i+Range]) / Noise;
      double SSC   = (ER*k2+k1);



      AMA[i]  = AMA[i+1] + NormalizeDouble(SSC*SSC*(Close[i] - AMA[i+1]), normalizeDigits);
      mAMA[i] = AMA[i];

      if(filter < 1) fAMA[i] = mAMA[i];
      else {
         for(k = i; k <= i + SlowMA - 1; k++)  sdAMA = sdAMA + MathAbs(mAMA[k] - mAMA[k+1]);
         double dAMA  = mAMA[i] - mAMA[i+1];
         if(dAMA >= 0)
            if(dAMA < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) &&  High[i] <= High[Highest(NULL, 0, MODE_HIGH, 4, i)]+10*Point)
               fAMA[i] = fAMA[i+1];
            else   fAMA[i] = mAMA[i];
         else if(MathAbs(dAMA) < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) && Low[i] > Low[Lowest(NULL, 0, MODE_LOW, 4, i)]-10*Point)
            fAMA[i] = fAMA[i+1];
         else  fAMA[i] = mAMA[i];
      }

      Downa[i] = EMPTY_VALUE;
      Downb[i] = EMPTY_VALUE;
      trend[i] = trend[i+1];
      if (fAMA[i]> fAMA[i+1]) trend[i] =1;
      if (fAMA[i]< fAMA[i+1]) trend[i] =-1;
      if (trend[i]==-1) PlotPoint(i, Downa, Downb, fAMA);
   }

//


   if (alertsOn) {
      if (alertsOnCurrent)
         int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
         if (trend[whichBar] == 1)
            doAlert("buy");
         else  doAlert("sell");
   }
   return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;

   if (previousAlert != doWhat || previousTime != Time[0]) {
      previousAlert  = doWhat;
      previousTime   = Time[0];

      //
      //


      message =  StringConcatenate(Symbol(), " at ", TimeToStr(TimeLocal(), TIME_SECONDS), " AMA STL_Color ", doWhat);
      if (alertsMessage) Alert(message);
      if (alertsEmail)   SendMail(StringConcatenate(Symbol(), " AMA STL_Color "), message);
      if (alertsSound)   PlaySound(soundfile);
   }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClearPoint(int i, double& first[], double& second[])
{
   if ((second[i]  != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE))
      second[i+1] = EMPTY_VALUE;
   else if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE))
      first[i+1] = EMPTY_VALUE;
}
void PlotPoint(int i, double& first[], double& second[], double& from[])
{
   if (first[i+1] == EMPTY_VALUE)
      if (first[i+2] == EMPTY_VALUE) {
         first[i]  = from[i];
         first[i+1]  = from[i+1];
         second[i] = EMPTY_VALUE;
      }
      else  {
         second[i] = from[i];
         second[i+1] = from[i+1];
         first[i]  = EMPTY_VALUE;
      }
   else     {
      first[i]  = from[i];
      second[i]   = EMPTY_VALUE;
   }
}
//+------------------------------------------------------------------+

ここでは、このインジケーターのインジケーターバッファの値を表示しています。


 
みんな、ヒントをくれてありがとう。特にイゴール・マカヌは。はい、確かに、デフォルトの3つのバッファではなく、6つのバッファを作ったところ、1つのバッファに1と-1の値が現れましたが、オリジナルのバッファには全く現れませんでした。だから、値が出せなかったんです。そして、自分でも想像もつかなかった。今はすべてが元通りになっています。すべてがうまくいっている。イゴール、インジケーターを新しいフォーマットに蒸留してくれたことにも感謝します。 また、あなたの知識に感謝します!!!
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
Igor Makanu:

推測する必要はありません。まず、MQL4言語の現状に対応する正規形にインジケータを書き換える必要があります。

私は少しコードを整えたが、エラーがないとは限らない、私はソースコードが好きではないが、私は私が持っているもので作業してきた

ここでは、このインジケーターのインジケーターバッファの値を表示しています。

上書きせずに動作するので、データの入手がとても簡単になります。上記で説明したように、データウィンドウ(Ctrl+D)でそのバッファの読み取りを見る必要があります。

 
Artyom Trishkin:

書き換えることなく動作し、非常に簡単にデータを受け取ることができます。上記で説明したように、データウィンドウ(Ctrl+D)でそのバッファの読み取りを見る必要があります。

上で、古いインジケータでIndicatorCounted()関数がどう動くか覚えていないと書きましたが、OnCalculate()を使った新しい形のインジケータの方が分かりやすいと思います

まあ、問題は解決したようで、よしとしましょう ;)