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

 
Konstantin Nikitin:

はい、そういうことです。なるほど、見逃してたんですね。一番大事なのは、何がどうなっているのかを理解してもらうことなのですが...。

彼って?そこからスタートしたのです。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

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

アレクセイ・ビクトロフ, 2019.06.11 09:06

SymbolInfoIntegerでPoint()を取得することはできません)。

また、一般に、Point()や_Pointは、現在のシンボルに対してのみ有効であることを覚えておく必要があります。EAが動作するシンボル以外のシンボルについては、この機能を使用する必要があります。

SymbolInfoInteger関数は、int値だけでなく、long、bool、列挙型も返します。

次に、当然ながらDigits()または_Digitsの意味で、自分が書いたものを書いている。そして、最後の一行は、質問の後半部分に関する回答であった。ロシアのことわざ、"利口な者は語らず、愚か者は当てずっぽう "を忘れないでください。を推測して言ったので、どっちつかずの状態です。
 
Alexey Viktorov:

Может вам очень не повезло, но я не люблю колупаться в чужом коде. Тем более править его...

アレクセイ・ヴィクトロフ

次の質問: インジケータの値がちょうど50になるのは、どのくらいの頻度だと思いますか?

私が理解したところでは、ある色が>50で別の色が<50であるべきですが、==50はどこにも見当たりません。もちろん、==50の場合の負けを避けるために、一方に>=50を、もう一方に<=50を追加する必要があります。見栄えが良くなるかもしれません。

そして2つ目の質問ですが、バッファのインデックスをすべて変更する必要があったのはどの程度でしょうか。再インデックス化した後、コード内のすべてを修正しましたか?カラーバッファのインデックスを4にして、それに合わせて補助バッファ 5、6を作ると楽かもしれませんね。編集の手間が省け、ミスをする機会も少なくなるはずです。

  • 回答ありがとうございました。もしLubyが他人のコードをつついていたら、専門家としてのあなたを失っていた可能性が高いので、この点ではLUCKYとしか言いようがないですね。
  • <= or >=について 同意します、省略、当然どちらかが存在しなければなりません、私が駆け抜けるとすぐに、しかし今のところ原則的な問題ではありません。
  • 1つのカラーバッファの再割り当て、グループ全体の再割り当て、グループ(上/下)の入れ替えなどを試しましたが、何も解決しませんでした。これから投稿を終えて、線のないヒストグラムのインジケータを別に作ってみようと思います。うまくいったら、また組み合わせてみようと思います。これは原則的なことです。理解不能の白い斑点を残したくないのです。

 
Sergey Voytsekhovsky:

  • ご回答ありがとうございました。もしLubileeが他人のコードをつつくようなことをしていたら、専門家として失われていたかもしれませんから、その点ではLUCKYとしか言いようがありませんね。
  • <= or >=について 同意します、省略、当然どちらかが存在しなければなりません、私が駆け抜けるとすぐに、しかし今のところ原則的な問題ではありません。
  • 1つのカラーバッファの再割り当て、グループ全体の再割り当て、グループ(上/下)の入れ替えなどを試しましたが、何も解決しませんでした。これから投稿を終えて、線のないヒストグラムのインジケータを別に作ってみようと思います。うまくいったら、また組み合わせてみようと思います。これは原則的なことです。理解不能の白い斑点を残したくないのです。

バッファのインデックスを変更する際に頭を悩ませたことでしょう。

Message8806 の古いコードに戻り、バッファの並びだけを変更します。

   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
そして、0を入れる必要があるときと、1を入れる必要があるときの条件をトレースします。
 
Alexey Viktorov:

バッファのインデックスを変更する際に、あまり深く考えていなかったのでしょう。

8806の 投稿から古いコードを取り出して、そこのバッファ配列だけを変えてみてください。

そして、カラーバッファに0を入れるときと1を入れるときの条件をトレースする

私はそれをしましたが、役に立たず、自分が間違っていることを認めました。以下、変更したコード箇所です。古いもの はコメントを受け付けていません。

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID

#property indicator_type3   DRAW_COLOR_HISTOGRAM2
#property indicator_color3  clrGreen,clrRed
#property indicator_style3  STYLE_SOLID

#property indicator_width1  3 
#property indicator_width2  2 
#property indicator_width3  1 
//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing
//--- indicator buffers
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
     //double    ExtHighesBuffer[];
     //double    ExtLowesBuffer[];
     //double    ColorHistogram_2Colors[];
double    ColorHistogram_2Colors[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(3,ColorHistogram_2Buffer2,INDICATOR_DATA);
        //SetIndexBuffer(4,ExtHighesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(5,ExtLowesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(6,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   //PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetString(0,PLOT_LABEL,"Main");
   PlotIndexSetString(1,PLOT_LABEL,"Signal");
        //PlotIndexSetString(2,PLOT_LABEL,"UP");
        //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>=50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,colors[i]);
   return(rates_total);
  }
//+------------------------------------------------------------------+ 

変更前はこのような状態でした。ヒストグラムはあるが、正しい色がない。

今はこんな感じです。ヒストグラムが消えて、表示されない。

また思考が停止しているのでしょう。


 
Sergey Voytsekhovsky:

私はそれをやった、それはうまくいかなかった、私はミスをした、あなたの投稿の後に私は再びそれをやった。以下は、コード内で変更した箇所です。古いもの はコメントを受け付けていません。

変更前はこのような状態でした。ヒストグラムはあるが、正しい色がない。

今はこんな感じです。ヒストグラムが消えて、表示されない。

また思考が停止しているのでしょう。


ここには論理がまったくない。ヒストグラムの値が決定され,指標バッファの i 番目のインデックスが埋められるという順序が望ましい.次に別のチェックが行われ、この値が >=50 であればカラーバッファは 0 で満たされ、そうでなければ 1 で満たされます。これは、指令の色の順序によって決定されます。

#property indicator_color3  clrGreen,clrRed

0 の場合は clrGreen、1 の場合は clrRed が指定されます。

そして、このセリフは完全に余計なもので、順序は最初と逆になっています。

color     colors[]={clrRed,clrGreen};

そして、この

int       cl;

何のために追加したのか?直接充填する方が簡単です。

ColorHistogram_2Colors[i]=0;
// или 
ColorHistogram_2Colors[i]=1;

カラーバッファを埋めるには、次のような構文になります。

         ColorHistogram_2Colors[i]=ExtMainBuffer[i] >= 50 ? 0 : 1; 
?: 演算子は if else と同じですが、より簡単に適用できます。
 
Alexey Viktorov:

ここの論理は全般的に破綻している。ヒストグラムの値を決定し,インジケータバッファの i番目のインデックスを埋めるという順序にします.その後、別のチェックが行われ、この値が >=50 であればカラーバッファは 0 で満たされ、そうでなければ 1 で満たされます。これは、ディレクティブのカラーシーケンスによって決定されます。

0 の場合は clrGreen、1 の場合は clrRed が指定されます。

そしてこのセリフは絶対に不要で、順序は最初と逆になっています。

そして、この

何のために追加したのか?直接充填する方が簡単です。

カラーバッファを埋めるには、次のような構成をとります。

?: 演算子は if else と同じですが、より簡単に適用できます。

WURRAA、そして私の魂は歌った。Alexey、どうもありがとう!!!!

すべてうまくいきました。配列がないとどうなるのか、よく理解できませんが

color     colors[]={clrRed,clrGreen};

その記述が削除されたためでは、ここに余分な配列がなくても大丈夫なんですね。


 
Sergey Voytsekhovsky:

  • ご回答ありがとうございました。もしLubyが他人のコードを詮索していたら、専門家としてのあなたを失っていた可能性が高いので、その点ではLUCKYとしか言いようがないですね。
  • <= or >=について 同意します、省略、当然どちらかが存在しなければなりません、私が駆け抜けるとすぐに、しかし今のところ原則的な問題ではありません。
  • 1つのカラーバッファの再割り当て、グループ全体の再割り当て、グループ(上/下)の入れ替えなどを試しましたが、何も解決しませんでした。これから投稿を終えて、線のないヒストグラムのインジケータを別に作ってみようと思います。うまくいったら、また組み合わせてみようと思います。これは原則的なことです。理解不能の白い斑点を残したくないのです。

私のスクイークはまさに奇跡で、どこにでも、どこにでも持っていきます。

p.s 画像を正しく添付する方法をまだ学んでいません、スクリーンショットを投稿しますので、お許しください。

ファイル:
EURUSD.png  52 kb
GBPUSD.png  54 kb
 
Alexey Viktorov:

カラーバッファを埋めるには、次のような構造を使用します。

?: 演算子は if else と同じですが、より使いやすくなっています。

素晴らしいアドバイスと未来への科学!!!!さらにもう一歩踏み込んで。以下はその結果です。

そうだったんですね。

if(ExtMainBuffer[i]>=50){
         //cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=0;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
if(ExtMainBuffer[i]<50){
         //cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=1;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 

となったわけで、アプローチの効果は一目瞭然!!!!ありがとうございます。

      ColorHistogram_2Buffer1[i]=ExtMainBuffer[i] >= 50 ? 50 : ExtMainBuffer[i]; 
      ColorHistogram_2Buffer2[i]=ExtMainBuffer[i] >= 50 ? ExtMainBuffer[i] : 50; 
      ColorHistogram_2Colors [i]=ExtMainBuffer[i] >= 50 ? 0 : 1;
         Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
            " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
            " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
            " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
            " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
 
Sergey Voytsekhovsky:

素晴らしいアドバイスと未来への科学!!!!さらにもう一歩踏み込んで。以下はその結果です。

そうだったんですね。

となったわけで、アプローチの効果は一目瞭然!!!!ありがとうございます。

1つの条件ではなく、3つの条件を設定することで、効率化を図っています。ここでは、そのままではもっとひどいことに...。

 
Artyom Trishkin:

1つの条件ではなく3つの条件があるため、効率的ではありません。こっちはもっとひどいよ...。

そうですね、確かに。 それは気がつきませんでした。見た目がよくなり、文字数も少なくなりました。

また、1人のオペレーターの下に3つの実行(正しい言い方がわかりません)を一 度に入れることはできないのでしょうか