Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 639

 
Top2n:

Sí, muchas gracias, no hay palabras para describir lo útil que es, ¡tan claro! ¡¡¡Impresionanteooo!!!

Sería genial que pudieras enseñarte gradualmente habilidades importantes de la manera más directa y eficiente posible.

Y si otros pueden beneficiarse de la misma manera.

 

No se me ocurre nada) hay una línea Y cómo compruebo si la línea ha cambiado

 
ClanVi:

No puedo pensar) hay una línea Y cómo puedo comprobar si esta línea ha cambiado



CHARTEVENT_OBJECT_CHANGE

Modificación de las propiedades de un objeto gráfico mediante el diálogo de propiedades

El parámetro "sparam" devuelve el nombre del objeto modificado. Si el objeto es suyo, compruebe las propiedades que son críticas para su objeto.
 
barabashkakvn:


CHARTEVENT_OBJECT_CHANGE

Modificación de las propiedades de un objeto gráfico mediante el diálogo de propiedades

El parámetro "sparam" devuelve el nombre del objeto modificado. Si el objeto es suyo, compruebe las propiedades que son críticas para su objeto.

Cómo sin un objeto, si sabemos que el precio es una línea, tenemos que comprobar si ha cambiado, está claro que tenemos que comparar el precio).

qué tipo de

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

donde obtener una medida del Precio2))

 
ClanVi:

Cómo sin un objeto, sabemos el precio y esta es la línea, es necesario comprobar si ha cambiado o no, está claro que es necesario comparar este precio no sé cómo)

qué tipo de

donde obtener una medida del Precio2))


el precio de la última barra y será el Precio2, compare la Oferta con cualquier precio de la última barra de su elección - Apertura, Cierre, Alta, Baja.

Si quiere precios intermedios, debe guardar el historial de ticks y tomar el precio anterior de ahí, entonces la Oferta se comparará con el precio del tick anterior.

¿Y qué sentido tiene la normalización del precio? Es necesario normalizar los valores calculados que se utilizarán posteriormente en las órdenes comerciales, y el precio ya está normalizado.

 
evillive:

el precio de la última barra será Precio2

Si quieres precios intermedios, tienes que guardar el historial de ticks y tomar el precio anterior de ahí.

Lo tengo todo resuelto :)

No, no funcionaría con mis barras.

 
en las señales, sólo puedo establecer el riesgo máximo que utiliza el autor, no más?
 
simpleton:

El método de búsqueda en el siguiente es ligeramente diferente:

#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("Чёрт!");   } }

No me tomes el pelo,ya no sé cómo dirigirme a él, pero no puedo hacer nada al respecto. Pensaba que si podía hacer una matriz, las condiciones se iban a dar a martillazos, filtrando la señal como si no hubiera nada que hacer.

 
Top2n:

No me hagas caso,ya no sé cómo dirigirme a él, pero no puedo hacer nada al respecto. Pensé que si podía hacer una matriz, entonces las condiciones serían un dolor de cabeza para filtrar la señal.

La función TimeCurrent( ) está sobrecargada. Si lees la descripción del tipo datetime, verás que la primera variante de la función sirve:

#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));
}

Lo hace:

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

Podemos ir en otra dirección, no para obtener la diferencia de momentos en el tiempo, sino para comparar estos momentos (al mismo tiempo, podemos utilizar una expresión condicional de nuevo):

#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);
}

La puesta en marcha da:

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

Una vez comprendida la esencia de las ideas aplicadas, y recordando lo que es el tipo datetime, trabajar con momentos de tiempo, si la precisión requerida no supera las unidades de segundos, no debería causar dificultades.

 
simpleton:

La función TimeCurrent( ) está sobrecargada. Si lees la descripción de lo que es el tipo datetime, verás que la primera versión de la función está bien:

Lo hace:

También podemos ir en la otra dirección, no para obtener la diferencia de momentos, sino para comparar estos momentos (al mismo tiempo, podemos utilizar una expresión condicional de nuevo):

Se da por vencido:

Una vez que se entienden las ideas, y recordando el tipo datetime, trabajar con puntos en el tiempo no debería ser un problema, siempre que la precisión requerida no supere las unidades de segundos.


Para ser sincero, no he descubierto cómo aplicarlo. Falta un milímetro, es una pena parar cuando está casi terminado.

Tarea, no escribir el precio en el array si el objeto tiempo(2º parámetro+3600seg>actual)||(1º parámetro tiempo - 2º parámetro tiempo)<3600seg )

/******************************************************************************/
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;
}