どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 600

 

ごあいさつ:)

このインジケータとほぼ同じコードを書いています。

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

M1チャートで落とす。インジケーターは端末と一緒にぶら下がり、計算を行うとされています。
15分後に強制終了し、そのログを開く。

Pic1

それは、インジケータが初めて計算するまでは、新しく到着したティックに反応しない(論理的である)ことが判明しました。しかし、評価中にターミナルにIndicatorConted()には既に0以外の値が割り当てられて いなければならないことを伝え忘れています。
つまり、評価のために注文された受信ティックはIndicatorCounted()の現在の値を覚えていることが判明したのでしょうか。

busy変数(コメントアウトされた文字列 - 同じ結果)で制御しようとしました。

私もこの方法でやってみました。

int start()
{
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   return(0);
   .
   .
   .
}

当然ながら、今回はすべて正常に動作した。

ピック2

ここに何があるのか?システムがIndicatorCounted()に新しい値を書き込む時間がないのでは?つまり、sleep()のようなことをする必要があるのでしょうか?インジケータでは不可能なのは知っています)
それとも、新しいティックが来たときに、古いティックの計算が終わっていないため、IndicatorCounte()がまだ0に等しいことを記憶して、その時間が来たら古い値IndicatourCounted()=0から計算するのでしょうか?

どうすればいいのか?)

 
Expert:

ごあいさつ:)

インジケータとほぼ同じコード です。


全部書いてあるんですよ。このコードについて、この対応について...。を書けば いいのか?
 
peace1984:
これは私の最初の経験です。あまり厳しく判断しないでください:)
正直なところ、テスターは変数の過去の値、つまり前回のテストの値を記憶しているように思えます。どうやって......わからない、デバッグにあまり時間がとれないんだ。端末のバグかもしれませんね。コードにコメントを入れて、値をログに 出力しているだけです。そこで、新しいテストを実行するたびに、前のテストの値がsys変数に格納されることがわかりました。なんということでしょう。もしかしたら、誰かが見てくれるかもしれない、私の目が濡れているのかもしれない...。
ファイル:
11_1.mq4  8 kb
 
AlexeyVik:
これがすべてを物語っている。このコードは、おおよそこのような答えになります。を書くか


要は、それ以外のコードは関係ないのです。この作品には、エラーの本質が描かれています。一般的に、私は大きな投稿で人々を怖がらせることを恐れていました。だから、膨らませたんです。

簡単に説明すると、あるインディケータが 長時間(1分以上)計算された場合、IndicatorCounted()は常に0を返す、という定式化です。

 
artmedia70:
正直なところ、テスターは変数の過去の値、つまり前回のテストの値を記憶しているように思えます。どうやって......わからない、報告する時間があまりないんだ。端末のバグかもしれません。コードにコメントを入れて、値をログに出力しているだけです。そこで、新しいテストを実行するたびに、前のテストの値がsys変数に格納されることがわかりました。なんということでしょう。もしかしたら、誰かが見てくれるかもしれない、私の目が濡れているのかもしれない...。

というセリフを忘れているだけです。

int       sys=(Sys<0)?0:Sys;

インジケーターのプロパティが呼び出された場合、そのプロパティは実行されません。

しっかり調べたわけではないのですが、もしかしたらこれで期待通りの結果が得られるかも?

extern int Sys=0;
int       sys;    // изменено
double    opb;
double    ops;
double    cb;
double    cs;
double    lot;
double    next_order;
int       i=0;
int       x;
double    max;
double    min;
int       ticket;
int       tip;
int       count;
bool      res;
double    bal;
double    sl;
datetime  d;
double    N;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   sys=(Sys<0)?0:Sys;  // добавлено
   bal=AccountBalance();
   return(0);
  }
 
AlexeyVik:

を忘れているだけで、文字列は

インジケーターのプロパティが呼び出された場合、そのプロパティは実行されません。

しっかり調べたわけではないのですが、もしかしたらこれで期待通りの結果が得られるかも?



一般にアドバイザーと呼ばれる。しかし、HZ、実験している暇はない。私はすべてのEAを書いたとおりに動作させています。テスターでこのクソをトレースすることになる。時間に余裕があるとき。
 
Expert:


要は、それ以外のコードは関係ないのです。この作品には、エラーの本質が描かれています。一般的に、私は大きな投稿で人々を怖がらせることを恐れていました。だから、膨らませたんです。

簡単に説明すると、あるインディケータが長時間(1分以上)計算された場合、IndicatorCounted()は常に0を返す、という定式化です。


そういう問題じゃないんです。誰もあなたの完全な秘密のコードを必要としません。その勘違いで完全なテスト品を書けばいいんだよ。そして、このように。

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

ハイライトされた行を消去したのはいつですか?テレパスは役に立たないし、ただの人間はなおさらだ...。

それから、この部分です。

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;

どこのプログラマーが作ったのかわからないが、何か書き方が不十分だ......。あなたのせいではありません。あなたは、他の多くの人と同じように、ただコードを取って、それを修正しようとしただけです...。

counted_bars変数が、最後のインジケータ呼び出し(1行目)から変化せずに残っているバーの数に等しい場合、次のようになります。

if(counted_bars < 0)でチェックされるのに、どうして0より小さくなるのか、私には理解できません...。

残りもナンセンスですが、分析するのが億劫で...。

 
AlexeyVik:

を忘れているだけで、文字列は

インジケーターのプロパティが呼び出された場合、そのプロパティは実行されません。

しっかり調べたわけではないのですが、もしかしたらこれで期待通りの結果が得られるかも?




試してみたけど、うまくいかない...。
 
artmedia70:
一般にアドバイザーと呼ばれる。しかし、HZ、実験している暇はない。私はすべてのEAを書いたとおりに動作させています。テスターでこのクソをトレースすることになる。時間に余裕があるとき。

そうですね、もちろんExpert Advisorですね。では、なぜEAをベースメント指標としてチャートに配置したのか、別の疑問が生じます。しかし、インジケータもEAも再起動しても、グローバルレベルの変数は再初期化されず、int sys=(Sys<0)?0:Sys; という行が実行されないのは変わりません。
 
peace1984:

試してみたけど、うまくいかない...。
それは、私が試した方法とはちょっと違うかもしれませんね。
EAで再コンパイルして実行しただけです。コメント中のSysパラメータを変更すると、この値が変化します。