[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 1085

 
khorosh:

この機能は私のものではありません。オンラインで手に入れたものですが、使ってはいません。今よく見てみると、オペレーターが1人抜けていますね。

正しくはこうです。


また間違えた!?Fun_New_Bar()は常にtrueを返すので、EAはtick毎に 再びビープ音を発します。問題は、常に真を返すなら、なぜ Fun_New_Bar() が必要なのか、ということです。
 
drknn:


そして、うまくいきません。プログラムの書き方が間違っているのでしょう。そしてそれは、自分のコードがどのように動くのか、全くわかっていないからです。分解してみよう。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:


このコードを試してみてください。動作するようです、ただ、正しいか間違っているかは見てください。

いや、そんなことはない。ちゃんと説明してある。何もわかっていないのか?
 

kolyango: 正しいコードをお見せします。見てください。

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

int MyChandle;// количество свеч на графике
//+------------------------------------------------------------------+
//|                  Блок инициализации                                |
//+------------------------------------------------------------------+
int init(){
  MyChandle=0;// ну или можно вот так : MyChandle=Bars;

  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                              |
//+------------------------------------------------------------------+
int deinit(){
  if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                            |
//+------------------------------------------------------------------+
int start(){
  if(MyChandle<Bars){
   Alert("Было свеч = ", MyChandle," Стало свеч = ",Bars);

   MyChandle=Bars;
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                       |
//+------------------------------------------------------------------+
 
drknn:
いいえ、それは違います。コードはすべてあなたに明示してあります。何もわかっていないのか?


でも、見てください!ちゃんと動いているようです。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);
}

 
kolyango:


でも、見てください!ちゃんと動いているようです。M1タイムフレームで確認した。



見て、あなたは読むことができるか、またはしない - 上記を語った - 正しいコードではない - それは、新しいキャンドルに一度ではなく、すべてのティックに 信号を送ります。上記参照 - 正しいコードをお渡ししました。他に幸せになるために必要なものはありますか?あなたのコードが正しくない理由を知るには?すでに説明したように、サブルーチンは常に真を返し、真だけを返すので、間違っているのです。ティックごとにアラートがポップアップしますプログラミングは当てずっぽうではなく、考えなければならないのです。
 
drknn:

また間違えた!?Fun_New_Bar()は常にtrueを返すので、EAはtick毎に再びビープ音が鳴ることになります。問題は、Fun_New_Bar()が常にtrueを返すのであれば、一体なぜ必要なのか、ということです。
正しく動作する - チャートで確認しました。いつ
New_Time=Time[0]

функция Fun_New_Bar() не будет возвращать истину
 
drknn:

kolyango: 正しいコードをお見せします。見てください。

そして、Barsを使用する バリエーションは、新しいバーの出現によってだけでなく、Barsの値が変化する可能性があるため、あまり好ましくはありません。
 

drknn:
... Программирование - это не игра в угадайки - тут думать надо...

...まあ、少なくとも、時には・・・。 :-)))

 
khorosh:
また、Bars を使ったバリエーションは、新しいバーが出現したときだけでなく、Bars の値が変化することがあるので、あまり好ましくない。 。


新しいバーの出現以外に、チャート上のローソクの本数が変化することはあるのでしょうか?:)))))

そうそう、ヒストリーローディングですね。:)とにかく、その機能は刻々と ビープ音が鳴り響き、時間を正しく記憶していないのです。