Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 639

 
Top2n:

Да, спасибо вам большое, вы просто нет слов как помогли, так все четко! Крутооо!!!

Круто будет, если вы сможете сами постепенно обучиться важным навыкам максимально прямым и эффективным способом.

И если и другие смогут извлечь такую же пользу.

 

Че то не идет мысля)  есть линия А  как проверить изминилась ли эта линия

 
ClanVi:

Че то не идет мысля)  есть линия А  как проверить изминилась ли эта линия



CHARTEVENT_OBJECT_CHANGE

Изменение свойств графического объекта через диалог свойств

при этом параметр "sparam" возвращает имя изменённого объекта. Если объект Ваш - то проверить свойства, которые критичны именно для Вашего объекта.
 
barabashkakvn:


CHARTEVENT_OBJECT_CHANGE

Изменение свойств графического объекта через диалог свойств

при этом параметр "sparam" возвращает имя изменённого объекта. Если объект Ваш - то проверить свойства, которые критичны именно для Вашего объекта.

Как без объекта, знаем цену это и есть линия, надо проверить изминилась она или нет, понятно что надо сравнить эту цену не докумекаю как)

что типо

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

 где взять замер Price2 ))

 
ClanVi:

Как без объекта, знаем цену это и есть линия, надо проверить изминилась она или нет, понятно что надо сравнить эту цену не докумекаю как)

что типо

 где взять замер Price2 ))


цена на прошлом баре и будет Price2, сравниваем Бид с любой ценой прошлого бара на выбор - Опен,Клоз,Хай,Лоу.

если хочется промежуточные цены, надо тиковую историю сохранять и оттуда брать прошлую цену, тогда будет сравнение Бид с ценой прошлого тика.

и какой смысл нормализации цены? нормализовывать нужно вычисляемые значения, которые в торговые приказы потом идут, а цена и так нормализованная уже.

 
evillive:

цена на прошлом баре и будет Price2

если хочется промежуточные цены, надо тиковую историю сохранять и оттуда брать прошлую цену.

Все разобрался :)

 Не, там у меня с барами не пракатило бы 

 
в сигналах максимальный риск я могу выставить только тот риск который использует автор, не более?
 
simpleton:

Способ поиска в нижеприведённом слегка другой:

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

Не сочтите за наглость, даже не знаю как уже обратиться, но нечего поделать не могу. Думал, что если получится составить массив, то условия забить, на от фильтрацию сигнала, как нечего делать.

 
Top2n:

Не сочтите за наглость, даже не знаю как уже обратиться, но нечего поделать не могу. Думал, что если получится составить массив, то условия забить, на от фильтрацию сигнала, как нечего делать.

 

Функция TimeCurrent() перегружена. Если почитать описание, что из себя представляет тип datetime, то выяснится, что вполне подойдёт первый вариант функции:

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

Запуск даёт:

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

Можно и с другой стороны зайти, не разницу моментов времени получать, а сравнивать эти моменты (заодно и условное выражение опять поприменяем):

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

Запуск даёт:

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

После получения понимания сути применённых идей, а также, помня о том, что из себя представляет тип datetime, работа с моментами времени, если требуемая точность не превышает единиц секунд, уже не должна вызывать затруднений.

 
simpleton:

Функция TimeCurrent() перегружена. Если почитать описание, что из себя представляет тип datetime, то выяснится, что вполне подойдёт первый вариант функции:

Запуск даёт:

Можно и с другой стороны зайти, не разницу моментов времени получать, а сравнивать эти моменты (заодно и условное выражение опять поприменяем):

Запуск даёт:

После получения понимания сути применённых идей, а также, помня о том, что из себя представляет тип datetime, работа с моментами времени, если требуемая точность не превышает единиц секунд, уже не должна вызывать затруднений.


Если честно, то  не понял как применить. Осталось до конца миллиметр, обидно останавливаться когда почти все законченно.

Задача, не записывать в массив цену, если время объекта(2-ого параметра+3600сек>текущего)||(время 1-ого параметра - время 2-ого параметра)<3600сек )

/******************************************************************************/
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;
}
Причина обращения: