Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 639

 
Top2n:

Sim, muito obrigado, você está além das palavras como é útil, tão claro! Fantástico!!!

Seria legal se você pudesse gradualmente ensinar a si mesmo habilidades importantes da maneira mais direta e eficiente possível.

E se outros podem se beneficiar da mesma forma.

 

Não consigo pensar em nada) existe uma linha E como posso verificar se a linha mudou

 
ClanVi:

Não consigo pensar) há uma linha E como posso verificar se esta linha mudou



CHARTEVENT_OBJECT_CHANGE

Mudando as propriedades de um objeto gráfico através do diálogo de propriedades

O parâmetro "sparam" retorna o nome do objeto alterado. Se o objeto for seu, verifique as propriedades que são críticas para seu objeto.
 
barabashkakvn:


CHARTEVENT_OBJECT_CHANGE

Mudando as propriedades de um objeto gráfico através do diálogo de propriedades

O parâmetro "sparam" retorna o nome do objeto alterado. Se o objeto for seu, então verifique as propriedades que são críticas para seu objeto.

Como sem um objeto, se sabemos que o preço é uma linha, temos que verificar se ele mudou, é claro que temos que comparar o preço).

que tipo de

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

onde obter uma medida de preço2))

 
ClanVi:

Como sem um objeto, sabemos o preço e esta é a linha, é necessário verificar se ele mudou ou não, é claro que é necessário comparar este preço eu não sei como)

que tipo de

onde obter uma medida de preço2))


o preço na última barra e será Price2, compare Bid com qualquer preço da última barra de sua escolha - Aberto, Fechado, Alto, Baixo.

Se você quiser preços intermediários, você precisa salvar o histórico do tick e tirar o preço anterior de lá, então o Bid será comparado com o preço do tick anterior.

E qual é o sentido da normalização dos preços? Você precisa normalizar os valores calculados que serão usados nas ordens comerciais mais tarde, e o preço já está normalizado.

 
evillive:

o preço na última barra será Price2

Se você quiser preços intermediários, você tem que salvar o histórico do tick e tirar o preço anterior de lá.

Já entendi tudo :)

Não, isso não funcionaria com meus bares.

 
nos sinais, só posso definir o risco máximo que o autor utiliza, não mais?
 
simpleton:

O método de busca no método abaixo é ligeiramente 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("Чёрт!");   } }

Não pense nisso como atrevido, eunem sei mais como lidar com isso, mas não posso evitar. Pensei que, se eu pudesse compor uma matriz, então as condições estariam marteladas, filtrando o sinal como nada mais.

 
Top2n:

Não se importe comigo, eunem sei mais como lidar com isso, mas não há nada que eu possa fazer sobre isso.Pensei que se eu pudesse fazer uma matriz, então as condições seriam uma dor de cabeça para filtrar o sinal.

A função TimeCurrent() está sobrecarregada. Se você ler a descrição do tipo de data/hora, você verá que a primeira variante da primeira função serve:

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

E é verdade:

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 para o outro lado, não para obter a diferença de momentos no tempo, mas para comparar esses momentos (ao mesmo tempo, podemos usar uma expressão condicional novamente):

#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 dá:

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

Após compreender a essência das idéias aplicadas, e lembrar qual é o tipo de data/hora, trabalhar com momentos de tempo, se a precisão requerida não exceder unidades de segundos, não deve causar dificuldades.

 
simpleton:

A função TimeCurrent() está sobrecarregada. Se você ler a descrição de qual é o tipo de data/hora, você verá que a primeira versão da função está bem:

E é verdade:

Podemos ir na outra direção também, não para obter a diferença de horários, mas para comparar esses momentos (ao mesmo tempo, podemos usar uma expressão condicional novamente):

Correr dá:

Uma vez que você tenha uma compreensão das idéias que foram aplicadas, e tendo em mente o tipo de data/hora, trabalhar com pontos no tempo, se a precisão necessária não exceder unidades de segundos, não deve mais ser um problema.


Para ser honesto, ainda não descobri como aplicá-lo. Falta um milímetro, é uma pena parar quando está quase pronto.

Tarefa, não escreva preço para array se o tempo do objeto(2º parâmetro+3600sec>current)||(1º parâmetro tempo - 2º parâmetro tempo)<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;
}