[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 1085

 
khorosh:

Die Funktion gehört mir nicht - ich habe sie online erworben, aber nicht benutzt. Ich habe es mir jetzt genau angesehen - es fehlt ein Operator.

Der richtige Weg ist der folgende:


Wieder falsch! Der EA wird bei jedem Tick erneut piepsen, da Fun_New_Bar() immer true zurückgibt. Die Frage ist, warum wir Fun_New_Bar() brauchen, wenn es immer true zurückgibt?
 
drknn:


Und es wird nicht funktionieren - Sie müssen das Programm falsch geschrieben haben. Und das nur, weil Sie keine Ahnung haben, wie Ihr eigener Code funktionieren wird. Schauen wir uns das mal an. Der Hauptteil des Expert Advisors:

Ein neuer Tick kommt an und die Funktion Fun_New_Bar() wird aufgerufen. Wenn das Hauptprogramm den Wert "true" erhält, wird eine Warnmeldung angezeigt. Andernfalls beendet der EA seine Arbeit durch Rückkehr und wartet auf einen neuen Tick. Alles wiederholt sich auf einen neuen Tick.

Sie sagen, dass der Code nicht funktioniert? Sehen Sie sich nun an, was Sie in Ihrem Unterprogramm haben.

Eine boolesche Funktion wird deklariert. Da es sich um eine Funktion und nicht um eine Prozedur handelt, sollte sie etwas an das Hauptprogramm zurückgeben, von dem sie aufgerufen wird. Da die Funktion boolesch ist, sollte sie einen booleschen Wert zurückgeben. Wo haben Sie einen String, der etwas an das Hauptprogramm zurückgibt? Das bedeutet, dass zu Beginn des Programms, da die Funktion nichts zurückgibt, die Klammern des Ausdrucks if(Fun_New_Bar()) immer falsch sind und die Warnmeldung nie erscheint.

Gehen wir noch weiter. Warum haben Sie datetime New_Time=0; als statisch deklariert? Wie lautet Ihre Begründung? Sie haben eine Variable deklariert und sie sofort mit Null initialisiert. Beim nächsten Tick passiert das Gleiche - die Variable wird deklariert und wieder mit Null initialisiert. If(Neue_Zeit!=Zeit[0]){ In dieser Zeile wird geprüft, ob der Wert der Variablen nicht gleich der aktuellen Zeit ist. Nun, ja, die Variable hat Null, aber die aktuelle Zeit ist nicht Null. Die Bedingung ist erfüllt, der aktuelle Zeitwert wird in die Variable geschrieben, der Parameter New_Bar wird true. Beim nächsten Tick wird New_Time nicht mehr gleich Time[0] sein, es wird wieder erfolgreich auf Ungleichheit geprüft und die nächsten beiden Operationen werden ausgeführt. Mit anderen Worten, bei der Überprüfung der Bedingung if(Neue_Zeit!=Zeit[0]) wird der Ausdruck in Klammern bei jedem Tick wahr sein. IMMER. Das wirft die Frage auf: Wenn es immer wahr ist, warum zum Teufel sollte dieser Scheck dann hier sein? Vielleicht sollten wir sie einfach entfernen? Warum sollten wir New_Time=Time[0] und New_Bar=true zuweisen, wenn diese beiden Variablen nirgendwo verwendet werden?Warum zum Teufel brauchen wir diese beiden Aufgaben? Möchten Sie herumspielen? Oder sind Sie zu faul zum Denken?


Probieren Sie diesen Code aus. Es scheint zu funktionieren, aber prüfen Sie, ob es richtig oder falsch ist. Wenn etwas falsch ist, korrigieren Sie es:

//--------------------------------------------------------------------
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:


Probieren Sie diesen Code aus. Es scheint zu funktionieren, man muss nur sehen, ob es richtig oder falsch ist:

Nein, das ist es nicht - ich habe alles für Sie aufgeschrieben. Verstehst du denn gar nichts?
 

kolyango: Ich werde Ihnen den richtigen Code zeigen. Sehen Sie.

//+------------------------------------------------------------------+
//|                                                            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:
Nein, das ist nicht richtig - ich habe den Code für Sie ausbuchstabiert. Verstehst du denn gar nichts?


Aber sieh nur, es scheint richtig zu funktionieren! Ich habe es im Zeitrahmen M1 überprüft:

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:


Aber siehe da, es scheint zu funktionieren! Ich habe es mit dem Zeitrahmen M1 überprüft:



Schauen Sie, können Sie lesen, oder nicht - sagte Ihnen oben - nicht der richtige Code - es wird auf jedem Tick Signal, nicht einmal auf eine neue Kerze. Siehe oben - ich habe Ihnen den richtigen Code gegeben. Was brauchen Sie sonst nicht, um glücklich zu sein? Sie möchten wissen, warum Ihr Code falsch ist? Ich habe bereits erklärt, dass es falsch ist, weil das Unterprogramm die ganze Zeit true und nur true zurückgibt. Der Alarm erscheint bei jedem Ticken! Programmieren ist kein Ratespiel - man muss denken.
 
drknn:

Wieder falsch! Der EA wird bei jedem Tick erneut piepsen, da Fun_New_Bar() immer true zurückgibt. Die Frage ist, warum zum Teufel wir Fun_New_Bar() brauchen, wenn es immer true zurückgibt?
Es funktioniert richtig - ich habe es in der Tabelle überprüft. Wenn
New_Time=Time[0]

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

kolyango: Ich werde Ihnen den richtigen Code zeigen. Sehen Sie.

Und die Variante mit Balken ist weniger empfehlenswert, weil sich der Wert von Balken nicht nur durch das Erscheinen eines neuen Balkens ändern kann.
 

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

... Nun, zumindest manchmal ... :-)))

 
khorosh:
Und die Variante mit Balken ist weniger empfehlenswert, weil sich der Wert von Balken nicht nur durch das Erscheinen eines neuen Balkens ändern kann.


Also, klären Sie mich auf - kann sich die Anzahl der Kerzen auf dem Diagramm in Verbindung mit etwas anderem als dem Erscheinen eines neuen Balkens ändern? :)))))

Ach ja, richtig - Geschichte laden. :) Auf jeden Fall wird die Funktion bei jedem Ticken piepsen - sie merkt sich die Zeit nicht richtig.