//-------------------------------------------------------------------- int start() // Спец. функция start { if(Fun_New_Bar())//проверка наличия нового бара return; // Выход из start() } //-------------------------------------------------------------------- bool Fun_New_Bar() // Ф-ия обнаружения .. { // .. нового бара static datetime New_Time=0; // Время текущего бара bool New_Bar=false; // Нового бара нет if(New_Time!=Time[0]) // Сравниваем время { New_Time=Time[0]; // Теперь время такое New_Bar=true; // Поймался новый бар Alert("Сформировался новый бар"); // Вывод на экран } } //--------------------------------------------------------------------
int start() // Спец. функция start { if(Fun_New_Bar())//проверка наличия нового бара { Alert("Сформировался новый бар"); // Вывод на экран } return(0); // Выход из start() } //-------------------------------------------------------------------- bool Fun_New_Bar() // Ф-ия обнаружения .. { // .. нового бара static datetime New_Time=0; // Время текущего бара bool New_Bar=false; // Нового бара нет if(New_Time!=Time[0]) // Сравниваем время { New_Time=Time[0]; // Теперь время такое New_Bar=true; // Поймался новый бар } return(New_Bar); }
この機能は私のものではありません。オンラインで手に入れたものですが、使ってはいません。今よく見てみると、オペレーターが1人抜けていますね。
正しくはこうです。
また間違えた!?Fun_New_Bar()は常にtrueを返すので、EAはtick毎に 再びビープ音を発します。問題は、常に真を返すなら、なぜ Fun_New_Bar() が必要なのか、ということです。
そして、うまくいきません。プログラムの書き方が間違っているのでしょう。そしてそれは、自分のコードがどのように動くのか、全くわかっていないからです。分解してみよう。Expert Advisorの本体です。
新しいティックが到着し、Fun_New_Bar()関数が呼び出されます。メインプログラムにtrueを返すと、Alertがポップアップ表示されます。そうでない場合は、EA は return で作業を終了し、新しいティックを待ちます。すべては新しい刻みで繰り返される。
コードが動作しないとのことですが?さて、サブプログラムの中身を見てみましょう。
ブーリアン関数が宣言されている。これは関数であり、プロシージャではないので、呼び出されたメインプログラムに何かを返す必要があります。この関数はブーリアンなので、ブーリアン値を返すはずです。メインプログラムに何かを返す文字列はどこにあるのでしょうか?これは、プログラムの開始時に、関数から何も返されないので、if(Fun_New_Bar()) 式の括弧は常に false になり、アラートは決してポップアップされないことを意味します。
さらに上を目指そう。なぜ、datetime New_Time=0; を static として宣言したのですか?その理由は何ですか?変数を宣言して、すぐにゼロで初期化したんですね。次のティックでは、同じことが起こります - 変数は再びゼロで宣言され、初期化されます。If(New_Time!=Time[0]){ この行は、変数の値が現在の時刻と等しくないかどうかをチェックします。そうですね、変数にはゼロがありますが、現在の時刻はゼロではありません。条件成立で現在時刻が変数に書き込まれ、パラメータ New_Bar がtrue になる。次のtickでは 、New_Timeは再び Time[0]と等しくならないので、再び不等号のチェックに成功し、次の二つの演算が実行されます。つまり、if(New_Time!=Time[0])という条件をチェックする場合、括弧内の式が毎回の目盛りで真となる。ALWAYS.もしそれが常に真実であるなら、なぜこのチェックがここにあるべきなのか?削除したほうがいいのでは?New_Time=Time[0] と New_Bar=true はどこにも使われない のに、なぜ代入しなければならないのでしょうか?なぜこの2つの割り当てが必要なのか?遊びたいですか?それとも、考えるのが面倒なのか?
このコードを試してみてください。うまくいっているようですが、正しいのか間違っているのかを見てください。間違っていることがあれば、修正する。
//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------
このコードを試してみてください。動作するようです、ただ、正しいか間違っているかは見てください。
kolyango: 正しいコードをお見せします。見てください。
いいえ、それは違います。コードはすべてあなたに明示してあります。何もわかっていないのか?
でも、見てください!ちゃんと動いているようです。M1タイムフレームで確認しました。
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
{
Alert("Сформировался новый бар"); // Вывод на экран
}
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}
でも、見てください!ちゃんと動いているようです。M1タイムフレームで確認した。
また間違えた!?Fun_New_Bar()は常にtrueを返すので、EAはtick毎に再びビープ音が鳴ることになります。問題は、Fun_New_Bar()が常にtrueを返すのであれば、一体なぜ必要なのか、ということです。
New_Time=Time[0] функция Fun_New_Bar() не будет возвращать истину
kolyango: 正しいコードをお見せします。見てください。
drknn:
... Программирование - это не игра в угадайки - тут думать надо...
...まあ、少なくとも、時には・・・。 :-)))
また、Bars を使ったバリエーションは、新しいバーが出現したときだけでなく、Bars の値が変化することがあるので、あまり好ましくない。 。
新しいバーの出現以外に、チャート上のローソクの本数が変化することはあるのでしょうか?:)))))
そうそう、ヒストリーローディングですね。:)とにかく、その機能は刻々と ビープ音が鳴り響き、時間を正しく記憶していないのです。