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

 

Вопрос новичка:

Недавно обнаружил,что в терминале не открывается MetaEditor,в советниках и индикаторах не работает команда "изменить"............помогите разобраться пожст.  Спасибо. 

 
gnawingmarket:

Вопрос новичка:

Недавно обнаружил,что в терминале не открывается MetaEditor,в советниках и индикаторах не работает команда "изменить"............помогите разобраться пожст.  Спасибо. 


Попробую ответить. 

Никакие возможности корректировки старых кодов более не работают.  

 
Зато у вас принц коронован. 
 
tara:
Зато у вас принц коронован. 


Всё ты знаешь! Сегодня не смог поймать, кто мне поставил Администратора, а пароль не дал, и мне невдомёк было спросить! Завтра заарканю! Чего не спится?

Спасибо таре за участие! Всё мне восстановил мой сосед по кварталу! Эксперт в информатике!

 
Top2n:

Да понимаю, что много вопросов глупых. Честно стараюсь, весь день просидел, но без результатно. 

Записываю в массив, значение цен нескольких трендовых линий на текущем баре. 

Как удалить из массива значение, если объекта нет?

artmedia70:

Если пробегать по значениям цен трендовых на каждом тике, инициализировать массив, и увеличивать его размерность при нахождении очередной нужной цены нужной трендовой линии, то отпадёт необходимость убирать из массива уже отработанные значения удалённых трендовых. Массив будет динамическим, и в нём каждый раз на каждом тике будут только значения существующих объектов. 


?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
double MassTrendNumber(double &array[], string tip) // Поиск значения цены трендовой линии, текущего бара, запись в массив. Два массива: masS и masB
ArrayResize(array,ObjectsTotal(OBJ_TREND));

 for (int i = 0, limit = ArrayResize(array,ObjectsTotal(OBJ_TREND)); i < limit; i++) 

 {
 string DWnem=ObjectName(i); 
  string DW="downtrendline"+IntegerToString(i); // существует два названия трендовых линий, первое
  string DW2="uptrendline"+IntegerToString(i); // второе
if(tip="Sell")   //первый массив цен на селл
  if(DWnem=DW)//если имя равно "downtrendline"
   if(ObjectGet(DWnem,OBJPROP_COLOR)==Goldenrod || ObjectGet(DWnem,OBJPROP_COLOR)==Gainsboro || ObjectGet(DWnem,OBJPROP_COLOR)==White)
// Также существует три цвета
   array[i]=ObjectGetValueByShift(DWnem,1); //записываем
if(tip="Buy")   //второй массивцен на бай
 if(DWnem=DW2)
 if(ObjectGet(DWnem,OBJPROP_COLOR)==Goldenrod || ObjectGet(DWnem,OBJPROP_COLOR)==Gainsboro || ObjectGet(DWnem,OBJPROP_COLOR)==White)
  array[i]=ObjectGetValueByShift(DWnem,1);

  }   return;
   }

	          
 

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

То есть имеем цену Close[i], надо чтобы эта цена крутилась выше-ниже нуля как в MACD/CCI, в отдельном окне, но как ни стараюсь, не получается без дополнительных значений вроде МА: сейчас что-то похожее получается если вычесть iClose-iMA, но может есть варианты без сглаживания?

Ну или в диапазоне 0,0...1,0 если вокруг нуля никак...

 
Top2n:

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

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

/******************************************************************************/
void OnStart() {
  double masS[];
  double masB[];

  Print("Sell:");
  FillAndPrint(masS, false);

  Print("Buy:");
  FillAndPrint(masB, true);
}

Добавил на график две белые трендовые линии с соответствующими именами и получил:

04:14:34 Script 2 EURUSDm,H1: loaded successfully
04:14:34 2 EURUSDm,H1: initialized
04:14:34 2 EURUSDm,H1: Sell:
04:14:34 2 EURUSDm,H1: Найдено объектов: 1
04:14:34 2 EURUSDm,H1: Price[0] = 1.36268
04:14:34 2 EURUSDm,H1: Buy:
04:14:34 2 EURUSDm,H1: Найдено объектов: 1
04:14:34 2 EURUSDm,H1: Price[0] = 1.35668
04:14:34 2 EURUSDm,H1: uninit reason 0
04:14:34 Script 2 EURUSDm,H1: removed

Не пишите километровые функции, разбивайте программу на короткие "фразы"-"кирпичики". Из мелких "кирпичиков" лепятся более крупные, из крупных - ещё более крупные. Видите, это же возможно.

Все данные передавайте функциям исключительно через параметры.

Обязательно обрабатывайте ошибки, если вызываемая функция может завершиться неуспешно, и последующие действия в случае игнорирования ошибки приведут к серьёзным последствиям. Подавляющее большинство падений программ (вообще) происходит из-за того, что обработка ошибок вообще никак не запрограммирована.

Например, если ArrayResize(), вызванная для увеличения размера массива, вернула ошибку, а программист не проверил этого и обращается к, якобы, увеличенному массиву, то возникает ошибка выхода за границы массива, что приводит к последующей остановке работы программы MQL4. Эксперт, например, перестаёт торговать, бросив открытые позиции. Правда, великолепно?

Попробуйте вставить "array[0] = 0;" перед циклом в функции MassTrendNumber(), и убедитесь, что скрипт завершается после ошибки выхода за границы массива.

 
evillive:

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

То есть имеем цену Close[i], надо чтобы эта цена крутилась выше-ниже нуля как в MACD/CCI, в отдельном окне, но как ни стараюсь, не получается без дополнительных значений вроде МА: сейчас что-то похожее получается если вычесть iClose-iMA, но может есть варианты без сглаживания?

Ну или в диапазоне 0,0...1,0 если вокруг нуля никак...


https://www.mql5.com/ru/code/9340
 

О, примерно так. Ничто не ново в этом мире )))
 
simpleton:

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

Добавил на график две белые трендовые линии с соответствующими именами и получил:

Не пишите километровые функции, разбивайте программу на короткие "фразы"-"кирпичики". Из мелких "кирпичиков" лепятся более крупные, из крупных - ещё более крупные. Видите, это же возможно.

Все данные передавайте функциям исключительно через параметры.

Обязательно обрабатывайте ошибки, если вызываемая функция может завершиться неуспешно, и последующие действия в случае игнорирования ошибки приведут к серьёзным последствиям. Подавляющее большинство падений программ (вообще) происходит из-за того, что обработка ошибок вообще никак не запрограммирована.

Например, если ArrayResize(), вызванная для увеличения размера массива, вернула ошибку, а программист не проверил этого и обращается к, якобы, увеличенному массиву, то возникает ошибка выхода за границы массива, что приводит к последующей остановке работы программы MQL4. Эксперт, например, перестаёт торговать, бросив открытые позиции. Правда, великолепно?

Попробуйте вставить "array[0] = 0;" перед циклом в функции MassTrendNumber(), и убедитесь, что скрипт завершается после ошибки выхода за границы массива.


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