Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 639

 
Top2n:

Ja, vielen Dank, Sie sind einfach unbeschreiblich hilfreich, so klar! Awesomeooo!!!

Es wäre toll, wenn Sie sich wichtige Fähigkeiten auf möglichst direkte und effiziente Weise selbst beibringen könnten.

Und wenn andere auf die gleiche Weise davon profitieren können.

 

Mir fällt nichts ein) gibt es eine Zeile Und wie prüfe ich, ob sich die Zeile geändert hat

 
ClanVi:

Ich kann mich nicht erinnern) gibt es eine Zeile Und wie prüfe ich, ob sich diese Zeile geändert hat



CHARTEVENT_OBJECT_CHANGE

Ändern der Eigenschaften eines grafischen Objekts über den Eigenschaftsdialog

Der Parameter "sparam" gibt den Namen des geänderten Objekts zurück. Wenn es sich um Ihr eigenes Objekt handelt, überprüfen Sie die Eigenschaften, die für Ihr Objekt entscheidend sind.
 
barabashkakvn:


CHARTEVENT_OBJECT_CHANGE

Ändern der Eigenschaften eines grafischen Objekts über den Eigenschaftsdialog

Der Parameter "sparam" gibt den Namen des geänderten Objekts zurück. Wenn es sich um Ihr Objekt handelt, überprüfen Sie die Eigenschaften, die für Ihr Objekt entscheidend sind.

Wie ohne ein Objekt, wenn wir wissen, dass der Preis eine Linie ist, müssen wir prüfen, ob er sich geändert hat, ist es klar, dass wir den Preis vergleichen müssen).

welche Art von

if(NormalizeDouble(Price,Digits)-NormalizeDouble(Price2,Digits)!=0)
Price2 = Price;

wo man ein Maß für den Preis erhält2))

 
ClanVi:

Wie ohne ein Objekt, wissen wir den Preis und das ist die Linie, ist es notwendig, um zu überprüfen, ob es sich geändert hat oder nicht, ist es klar, dass es notwendig ist, diesen Preis zu vergleichen Ich weiß nicht, wie)

welche Art von

wo man ein Maß für den Preis erhält2))


der Preis des letzten Balkens und wird zu Price2, vergleichen Sie Bid mit einem beliebigen Preis des letzten Balkens Ihrer Wahl - Open, Close, High, Low.

Wenn Sie Zwischenpreise wünschen, müssen Sie die Tick-Historie speichern und den vorherigen Preis von dort übernehmen. Dann wird das Gebot mit dem Preis des vorherigen Ticks verglichen.

Und was ist der Sinn der Preisnormalisierung? Sie müssen berechnete Werte normalisieren, die später in Handelsaufträgen verwendet werden, und der Preis ist bereits normalisiert.

 
evillive:

der Preis auf dem letzten Balken wird Price2 sein

Wenn Sie Zwischenkurse wünschen, müssen Sie die Tick-Historie speichern und den vorherigen Preis von dort übernehmen.

Ich habe alles herausgefunden :)

Nein, das würde mit meinen Bars nicht funktionieren.

 
In den Signalen kann ich nur das maximale Risiko einstellen, das der Autor verwendet, nicht mehr?
 
simpleton:

Die Suchmethode in der folgenden Tabelle ist etwas anders:

#property strict

/******************************************************************************/
bool AddValue(double &array[], const double value) {
  const int size = ArraySize(array);

  if (ArrayResize(array, size + 1) != size + 1) {
    return false; // Ошибка, значение не может быть добавлено к массиву
  }

  array[size] = value; //записываем
  return true; // Нет ошибки, значение добавлено к массиву
}

/******************************************************************************/
bool AddValueIfFound(double &array[], const string name) {
  const int type = ObjectType(name);

  if (type == OBJ_TREND) {
    switch ((color)ObjectGet(name, OBJPROP_COLOR)) { // Тип color допустимо использовать в switch
    case Goldenrod:
    case Gainsboro:
    case White:
      if (!AddValue(array, ObjectGetValueByShift(name, 1))) {
        return false; // Ошибка, значение найдено, но не может быть добавлено к массиву
      }
    }
  }

  return true; // Нет ошибки, значение, если найдено, добавлено к массиву
}

/******************************************************************************/
bool MassTrendNumber(double &array[], const bool buy) { // Поиск значения цены трендовой линии, текущего бара, запись в массив. Два массива: masS и masB
  const string subname = (buy ? "uptrendline" : "downtrendline"); // существует два названия трендовых линий, первое и второе

  if (ArrayResize(array, 0) != 0) {
    return false; // Ошибка, массив не может быть заполнен достоверно
  }

  for (int i = 0, limit = ObjectsTotal(OBJ_TREND); i < limit; i++) {
    if (!AddValueIfFound(array, subname + IntegerToString(i))|| !FilTrenLin(subname+IntegerToString(i))) { \\ Вот куда вставил
      return false; // Ошибка, массив, если и заполнен, то недостоверно
    }
  }

  return true; // Нет ошибки, массив заполнен достоверно
}
/***************************************************************************/
 bool FilTrenLin(string name) {

const  string   dt_123 = TimeToStr(TimeCurrent(),TIME_SECONDS); //
const  datetime   vremnin= StrToTime(dt_123); // Присваиваем время в секундах 
  
    
const  datetime     vrem2kor= ObjectGet(name,OBJPROP_TIME2);// время второй координаты
    MqlDateTime str1;
    TimeToStruct(vrem2kor,str2);
const  int     PjatPon=str1.sec;

    if(PjatPon+3600>=vremnin){ \\ если время 2-ой координаты + час > времени нынешнего то блокируем запись в массив
   Print("  PjatPon  ", PjatPon,"  vremnin ",vremnin,"  vrem2kor ",vrem2kor);
        return false;
    }  
   return true;
}
/******************************************************************************/ void FillAndPrint(double &array[], const bool buy) {   if (MassTrendNumber(array, buy)) {     const int limit = ArraySize(array);     Print("Найдено объектов: ", limit);     for (int i = 0; i < limit; i++) {       Print("Price[", i, "] = ", DoubleToStr(array[i], Digits));     }   } else {     Print("Чёрт!");   } }

Halten Sie es nicht für frech, ichweiß nicht einmal mehr, wie ich es ansprechen soll, aber ich kann es nicht ändern. Ich dachte, wenn ich ein Array zusammenstellen könnte, dann würden die Bedingungen herausgefiltert werden und das Signal wie nichts anderes filtern.

 
Top2n:

Kümmern Sie sich nicht um mich, ichweiß nicht einmal mehr, wie ich es ansprechen soll, aber ich kann nichts dagegen tun. Ich dachte, wenn ich ein Array erstellen könnte, dann wären die Bedingungen für die Filterung des Signals ein Kinderspiel.

Die Funktion TimeCurrent() ist überladen. Wenn Sie die Beschreibung des Typs datetime lesen, werden Sie feststellen, dass die erste Variante der ersten Funktion ausreicht:

#property strict

/******************************************************************************/
long DiffInSecs(const datetime dt1, const datetime dt2) {
  return dt1 - dt2;
}

/******************************************************************************/
void OnStart() {
  const datetime dt = TimeCurrent();

  Sleep(5555);
  Print("Diff in secs = ", DiffInSecs(TimeCurrent(), dt));
}

Das tut sie:

01:10:43 Script 2 EURUSDm,H1: loaded successfully
01:10:43 2 EURUSDm,H1: initialized
01:10:49 2 EURUSDm,H1: Diff in secs = 6
01:10:49 2 EURUSDm,H1: uninit reason 0
01:10:49 Script 2 EURUSDm,H1: removed

Wir können auf die andere Seite gehen, nicht um die Differenz der Zeitpunkte zu erhalten, sondern um diese Zeitpunkte zu vergleichen (gleichzeitig können wir wieder einen bedingten Ausdruck verwenden):

#property strict

/******************************************************************************/
void test(const datetime dt) {
  Sleep(2000);
  Print("Момент времени dt ", TimeCurrent() < dt ? "НЕ " : "", "достигнут");
}

/******************************************************************************/
void OnStart() {
  const datetime dt1 = TimeCurrent();
  const datetime dt2 = dt1 + 5;

  test(dt2);
  test(dt2);
  test(dt2);
  test(dt2);
}

Startup gibt:

01:30:29 Script 2 EURUSDm,H1: loaded successfully
01:30:29 2 EURUSDm,H1: initialized
01:30:31 2 EURUSDm,H1: Момент времени dt НЕ достигнут
01:30:33 2 EURUSDm,H1: Момент времени dt НЕ достигнут
01:30:35 2 EURUSDm,H1: Момент времени dt достигнут
01:30:38 2 EURUSDm,H1: Момент времени dt достигнут
01:30:38 2 EURUSDm,H1: uninit reason 0
01:30:38 Script 2 EURUSDm,H1: removed

Wenn man das Wesentliche der angewandten Ideen verstanden hat und sich daran erinnert, was der Datentyp datetime ist, sollte die Arbeit mit Zeitpunkten keine Schwierigkeiten bereiten, wenn die erforderliche Genauigkeit Sekundeneinheiten nicht überschreitet.

 
simpleton:

Die Funktion TimeCurrent() ist überladen. Wenn Sie die Beschreibung des Typs datetime lesen, werden Sie feststellen, dass die erste Version der Funktion in Ordnung ist:

Das tut sie:

Wir können auch in die andere Richtung gehen, nicht um die Differenz der Zeitmomente zu erhalten, sondern um diese Momente zu vergleichen (gleichzeitig können wir wieder einen bedingten Ausdruck verwenden):

Laufen gibt:

Wenn Sie die Ideen verstanden haben und sich an den datetime-Typ erinnern, sollte die Arbeit mit Zeitpunkten kein Problem sein, solange die erforderliche Genauigkeit nicht über Sekundeneinheiten hinausgeht.


Um ehrlich zu sein, habe ich noch nicht herausgefunden, wie man es anwendet. Es fehlt noch ein Millimeter, es wäre eine Schande, aufzuhören, wenn es fast fertig ist.

Aufgabe, schreibe den Preis nicht in das Array, wenn das Objekt time(2nd parameter+3600sec>current)||(1st parameter time - 2nd parameter time)<3600sec )

/******************************************************************************/
bool MassTrendNumber(double &array[], const bool buy) { // Поиск значения цены трендовой линии, текущего бара, запись в массив. Два массива: masS и masB
  const string subname = (buy ? "uptrendline" : "downtrendline"); // существует два названия трендовых линий, первое и второе

  if (ArrayResize(array, 0) != 0) {
    return false; // Ошибка, массив не может быть заполнен достоверно
  }

  for (int i = 0, limit = ObjectsTotal(OBJ_TREND); i < limit+2; i++) {
    if (!AddValueIfFound(array, subname + IntegerToString(i))||!FilTrenLin(subname + IntegerToString(i)) {// Условие вставил вот сюда
      return false; // Ошибка, массив, если и заполнен, то недостоверно
    }
  }
 
  return true; // Нет ошибки, массив заполнен достоверно
}
/***************************************************************************/
 bool FilTrenLin(string name) {

 const  datetime    dt = TimeCurrent();
 const  datetime   dt1 = ObjectGet(name,OBJPROP_TIME1);
 const  datetime   dt2 = ObjectGet(name,OBJPROP_TIME2);
  Print("  DiffInSecs(dt,dt2)  ", DiffInSecs(dt,dt2),"  DiffInSecs(dt2,dt1))  ",DiffInSecs(dt2,dt1),"  dt1  ",dt1);
  
     if(DiffInSecs(dt,dt2)<3600||DiffInSecs(dt2,dt1)<3600)// Если время объекта второго параметра + 3600 сек > текущего времени,
 или если разница первого и второго   параметра времени объекта < 3600 сек, то запускаем ошибку, чтоб цена не записалась в массив.
     {   return false;
     }  
   return true;
} 
/******************************************************************************/
long DiffInSecs(const datetime dt1, const datetime dt2) {
  return dt1 - dt2;
}