エラー、バグ、質問 - ページ 590

 
Swan:

すべてのバーについて、指標は一度だけ計算されます。つまり、農耕の歴史については、起動に少し時間がかかることがあります。

その後、2つの値の組が再計算され、すべてがうまくいくはずです。)

プログラマーは、プログラミングの空き時間に手動で時間軸を飛び越えるのが好きな人たちであることを忘れてはいけない。そして、新しいタイムフレームが出るたびに、インジケーターの解剖学の非初期化と初期化が繰り返され、すべての計算が再び実行されます。したがって、あるTFから別のTFにジャンプする際には、毎回ArrayInitialize() がトリガーされることになります。再初期化が必要な複数のバッファを持つ複雑なインジケータであれば、遅延は蓄積され、自動的に割り当てられるメモリのオーバーフローについてでさえ、私は話していないのです。

私はなんて単純なんだろう。私はいつも、OnInit()での 初期化で十分だという自信があり、この段階では、OnCalculate()での もっと緊急なタスクに頭を突っ込んで、それで十分だと考えています。でも、そんなことはない。ところで、複雑なインジケータの作成に多少なりとも成功しているにもかかわらず、ArrayInitialize() OnInit()での 初期化ではなく、OnCalculate() に正確に含まれ、各ティックでそれをチェックしなければならない理由を明確に理解することができません。私の経験では、このバリエーションを拒否するとすぐに問題が発生するケースしかなかったのですが、これについては後述します。今のところ、OnCalculate()のArrayInitialize() は、(コードの論理ではなく)単純で明白な人間の論理の観点から、非常に非難されるべきものに見えることを指摘しておきたいと思います。

if(prev_calculated<7) // или < чего-то там...
最初にプログラムが複数回起動するのは、初回起動時である。つまり、新たなフラクタルが出現し、その状態は沈黙する。では、OnCalculate()では一体何をしているのでしょうか?

という考えがさらに甘くなりました。

handle=iFractals(_Symbol,_Period);

私は、これらのクリーンアップの配列と 経済的なアルゴリズムの 効果を、オリジナルのFractals.mq5から自動的に継承することが義務付けられているはずです。しかし-何度も何度もノー!!!私はよく考えて、私が使っているハンドルのインジケータからコピーして自分でコードを作成する必要がありました。初めてインジケータのコードを解析したとき、Fractals.mq5とヘルプにあるiFractalsの例を比較して、(すごく省略しても)2番目のコードの方が大きいことに気づき、愕然としたことを思い出します。どうだろう。私にすべての私の帽子を投げるが、プログラマは実際にそこに全体のライブラリ、クラスまたは何か他のボリュームを参照して1行で自分のコードに何かを差し込むことを期待しますが、ここで...

さて、先ほどの問題の本質を明らかにします。iFractalsのインジケーターを上段フラクタルに簡略化したコードを添付しています。最初の例では、バッファは履歴全体に対して満たされています。歴史の一部だけをコピーして、状況を変えよう。最初の計算でコピーした値の割り当てをコメントアウトし、独自の小さい値を設定してみましょう。

values_to_copy=100; // то же, что amount
今度は時間軸の上で飛び回って、現れたフラクタルなアーティファクトにぞっとさせられよう。フラクタルを必要としない歴史の部分を一掃するために、Fractals.mq5から自動的に継承されないコードブロックclean up arraysをコピーする以上のことは思いつかなかったのです。
   if(bars_calculated<7)
   {
      ArrayInitialize(FractalUpBuffer,EMPTY_VALUE);
      Print("the condition is true; ArraySize(FractalUpBuffer)=",ArraySize(FractalUpBuffer));
   }
これで、すべて(多くの冗長性を持つ!!)が完璧にクリーンアップされ、同時にPrint() は、いつ、何回再初期化が機能するか、さらにバッファサイズを表示するようになりました。100ではなく、もっともっと多いことがわかります。テーブルの埃を拭きたいときは、フラット全体を掃除するのではなく、テーブルの埃を拭いています。それとも、メモリや時間のオーバーランは何でもない、間接的に問題を解決する方法を見つけることができる、と何が何でも私を安心させ、私のコントロールを超えたリソースの露骨なむさぼりを無視する仕掛けなのでしょうか?


スワン

1つのFIXで、ある程度の大きさを設定する必要がある...。同じ境界で直接ループを作ることができるのに、なぜ異なる境界で曲がったループを作るのか)

そうでなければ、指標は松葉づえを基にしたものになります。

正直、負担になりたくはなかったのですが、シンパがコードを全部掘り返してくることはあらかじめ理解していました。チャパイとペトカの逸話にあるように、ヴァシリー・イヴァノヴィッチが帰ってきてシャベルを求めたら壊れていた→馬を埋めた→チャパイの留守中に村が白人に襲撃された、という具合だ。他の人のコードの詳細に入りたい人は、おそらく現れないと悟り、私は、(ブレーキや他の欠点を除いて)最終的になる指標出力を参照することができます:https://www.mql5.com/ru/forum/1111/page577#comment_119227。 そして今、考えてみてください。そこですべてがシンプルだと考え、一見明白な解決策を提案することは合理的なのでしょうか?

私は、特定の部分に何かを求める前に、コードを単純化し、制限することは無意味ではありません。だから、素人がいない限り、馬を全部発掘しないで、それだけに絞ってお願いしているんです...。

実は、4番目の-特別な-バッファは、最初の3つよりも原理的に長く(長さは同じ)、SetIndexBuffer()の おかげで、履歴全体にわたって伸びています。ループの境界を4番目のバッファまで広げ、同時に最初の3つの配列のサイズをそれに合わせると、少なくともループ内の要素数が増え、完全に左のバッファの要素セグメントを読み込む推定時間が長くなります。これは、このようなアルゴリズムの変種によって生じる問題の氷山の一角に過ぎない。さらに、他のバッファのサイズが大きくなったため、再初期化に時間がかかるようになりました。4番目の特殊配列は、インジケータが特定のアルゴリズムに従って他のタイムフレームからのフラクタルの深刻な転置を持っているので、他のEMPTY_VALUEで明示的に埋めることができず、最初の3つのバッファのインデックスと第4バッファの間に対応関係がない...。

スワン

//配列の0と1の要素にEMPTY_VALUEの値が割り当てられている...そして最後の3つのバーで)

どうしてですか?なぜ全部じゃないのか?これは理解できない。説明できますか?実は、実際の(実効)値だけを割り当てるということではなく、どうしてもバッファ全体を洗わなければならないということなのです。ArrayInitialize() は、他の多くの配列関数と同様に、エンドMQLプログラマーにとって暗黙の了解となっているループをベースにしています。

についての質問です。 メモリオーバーラン は有効であり、開発者はArrayInitialize()バッファの再初期化の回数や限界を指定 する追加パラメータを導入することを考えるべきでしょう

追伸:ここでOnInit()ArrayInitialize() が効率的でない理由が推測できますね。バッファは動的で、サイズが変化します。OnInit() では、OnCalculate() でバッファの実際のサイズをまだ知らないので、一度だけ、現在の長さの値で初期化されます。

ファイル:
cleanup.mq5  2 kb
 
papaklass:

ビジュアライザーのインジケーターが作動しない。

オンライン端末のターミナルでは、正常に動作しています。

詳細を教えてください。ビジュアライザーチャートにインジケーターが表示されるようになったのはなぜですか?
 
papaklass:

Expert Advisorのコードに以下の行を挿入します。

この3つの指標をきれいなチャートに並べて、Expert Advisorとしてテンプレートを保存しています。写真は前回の記事でネット上にアップしています。

ビジュアライザーでExpert Advisorを動かしています。

1.保存されたテンプレートを表示する

2.テンプレートなしで可視化を実行してみてください(つまり、事前に該当するtplファイルを削除してください)。最新の555ビルドでは、自動的に追加されたカスタムインジケータが正しく表示されるはずです。

 
papaklass:

すべてがうまくいく。ありがとうございます。

テンプレートを削除しました。OnInit()に規定されたエキスパートで。

テンプレートを表示します。インジケーターもテンプレートで正常に表示されること(つまり、問題があり、解決されること)
 
papaklass:

*.tplファイルを送信する

現在、テンプレートで再試行中 - うまくいきません。テンプレートを削除する - うまくいく

ありがとうございます。調べてみます。
 

x100intraday:

さて、よく考えてみてください。そこにあるものすべてがシンプルで、一見明白な解決策を示唆していると信じるに値するでしょうか?

天才は皆、単純だ。

あとは無理でした。フォーラムでの質問、扁桃腺の取り方についての逸話で思い出したのですが :)

どうしたらいいのかわからない・・・どうしたらいいのかわからない。

//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//+------------------------------------------------------------------+
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  clrGray
#property indicator_color2  clrGray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
//--- input parameters
input int BarsCount=100;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Fractals                                                        |
//+------------------------------------------------------------------+
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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//---
   if(rates_total<5) return(0);
//---
   if(prev_calculated<7)
     {
      limit=2;
      if(rates_total-2>BarsCount) limit=rates_total-BarsCount;
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,limit);//отрисовываются и расчитываются только значения на последних BarsCount барах
      PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,limit);

      for(i=rates_total-2;i<rates_total;i++)//Последним двум барам присваивается EMPTY_VALUE. Исправил циферку в соответствии с iFractal(там фрактал может быть на 2ом баре)
         {
         ExtUpperBuffer[i]=EMPTY_VALUE;
         ExtLowerBuffer[i]=EMPTY_VALUE;
         }
     }
   else
      {
      limit=prev_calculated-3;//Здесь от prev_calculated правильнее считать..
      
      //---Добавленным с появлением нового бара элементам массивов присваиваем значение EMPTY_VALUE//Возможно всё будет нормально и без этого.
      if(rates_total>prev_calculated)
         {
         for(i=prev_calculated;i<rates_total;i++)
            {
            ExtUpperBuffer[i]=EMPTY_VALUE;
            ExtLowerBuffer[i]=EMPTY_VALUE;
            }
         }
      //---
      }
//---
   for(i=limit;i<rates_total-2 && !IsStopped();i++)//Исправил циферку
     {
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];
      else ExtUpperBuffer[i]=EMPTY_VALUE;
      //---- Lower Fractal
      if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<=Low[i-1] && Low[i]<=Low[i-2])
         ExtLowerBuffer[i]=Low[i];
      else ExtLowerBuffer[i]=EMPTY_VALUE;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
Fractals
Fractals
  • 投票: 8
  • 2010.01.26
  • MetaQuotes Software Corp.
  • www.mql5.com
Фракталы (Fractals) — это один из пяти индикаторов торговой системы Билла Вильямса, позволяющий обнаруживать дно или вершину.
 
Swan:

天才は皆、単純だ。

あとは無理でした。フォーラムでの質問、扁桃腺の取り方についての逸話で思い出したのですが :)

イマドキのオーソドックスなインジケーターフラクタル 限定の例。参考になるかも...。

実は、インジケータをハンドルで書いているのですが・・・。しかし、私はArrayInitialize() を拒否して、EMPTY_VALUE値で明示的に手動充填するアイデアが好きです。ありがとうございます。後で掃除しなくていいように、その上で新しいガチャガチャを作ってみようと思います。微妙なところや不便なところはあるでしょうが、あらかじめ予見しているので......。が、ともかく
 

次のコード

struct Pos
{
   int x;
   int y;
};

class Test
{
public:
   Test(const Pos& other)
      : pos(other)
   {
      Print("other = {", other.x, ", ", other.y, "}");
      Print("pos = {", pos.x, ", ", pos.y, "}");
   }
   
public:
   Pos pos;
};

int OnInit()
{
   Pos pos = {123, 456};
   Test test(pos);
   
   return(0);
}

出力します。

2011.12.05 22:01:28 RectLabel (EURUSD,H1) pos = {12, 176314750}。
2011.12.05 22:01:28 RectLabel (EURUSD,H1) other = {123, 456}.

つまり、初期化リストがうまくいかず、構造体の中にゴミがあるのです。これはバグなのでしょうか?

 

2つのエージェントをクラウドから切り離しても、30秒ごとにクラウドサーバーに接続します。

MO 0 ネットワーク 00:00:17 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0. を経由)
LK 0 ネットワーク 00:00:47 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています。)
RG 0 ネットワーク 00:01:17 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています。)
NS 0 ネットワーク 00:01:48 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0 を経由)
RO 0 ネットワーク 00:02:18 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0. を経由)。
OK 0 ネットワーク 00:02:48 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0. を経由)
MG 0 ネットワーク 00:03:18 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています。)
DR 0 ネットワーク 00:03:48 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0. を経由)
DN 0 ネットワーク 00:04:18 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0 を経由)
EJ 0 ネットワーク 00:04:48 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています。)
GF 0 ネットワーク 00:05:18 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています)。
RR 0 ネットワーク 00:05:48 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています。)
NN 0 ネットワーク 00:06:18 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0. を経由)
KJ 0 ネットワーク 00:06:48 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0. を経由)
QF 0 ネットワーク 00:07:18 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています。)
HQ 0 ネットワーク 00:07:48 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています。)
PM 0 ネットワーク 00:08:18 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0. を経由)
QI 0 ネットワーク 00:08:48 2.agents.mql5.com に接続(プロキシサーバー 192.168.0.X を経由)。
KE 0 ネットワーク 00:09:18 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています。)
NQ 0 ネットワーク 00:09:51 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています。)
OM 0 ネットワーク 00:10:18 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0. を経由)
RI 0 ネットワーク 00:10:48 2.agents.mql5.com に接続(プロキシサーバー 192.168.0 を経由しています。)
LE 0 ネットワーク 00:11:18 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0 を経由)
EP 0 ネットワーク 00:11:48 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0. を経由)
IL 0 ネットワーク 00:12:18 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0 を経由)
HH 0 ネットワーク 00:12:48 2.agents.mql5.com に接続 (プロキシサーバー 192.168.0. を経由)
FD 0 ネットワーク 00:13:18 2.agents.mql5.com に接続(プロキシサーバー経由

 
Konstantin83:

2つのエージェントをクラウドから切り離しても、30秒ごとにクラウドサーバーに接続します。

servicedeskに行こう。

具体的にどのように切断したのか、具体的に教えてください。サービスを削除(凍結)しましたか?問題のあるエージェントのログを添付してください。

ログにあるプロキシ設定が なんだか変ですね。エージェントのコンフィグにプロキシ設定を書き込んだか?エージェントマネージャのcommon.iniを添付してください。