Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 523

 
Maxim Kuznetsov:

какой такой канон ? есть оф.док - там именно как у вас..всё остальное от лукавого.

1. стоит внутри OnCalculate задавать серийность вcех используемых массивов

2. до входа в цикл поставьте buff[length]=Bid+size; - получится примерно как хотите. Кривая линия и в конце "козырёк" на уровне Bid+size

3. следите за границами массивов. Конечно вряд-ли rates_total < length, но чем чёрт не шутит :-)

1. То есть в начале написать ArraySetAsSeries и дальше плясать от этого?

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

 
YanSay:

Огромное Вам спасибо за подробный ответ!

По Вашему совету разделил ветки и все получилось.

Потом столкнулся с проблемой что одновременно открывало по 10-15 отложенных ордеров, решил проблему добавив после вашего кода:

Это тоже не выход. Ордер может быть открыт вручную или другим советником. В итоге разрабатываемый советник ничего не откроет. Поэтому нужно считать количество ордеров, открытых советником. Имея эти данные, принимать решение о необходимости открытия ордера.

Уверен, есть более грамотный способ.

По Вашему коду, не поясните пожалуйста, что значит 1; i >=0; --i ?

Это стандартный цикл перебора ордеров. OrdersTotal() - это количество ордеров. Ордера индексируются, начиная с нуля. Так, если есть 1 ордер, то у него индекс 0, а OrdersTotal() вернет 1. Таким образом, цикл нужно начинать с индекса, который на 1 меньше, чем количество ордеров. Получаем OrdersTotal() - 1. Второй операнд - условие выполнения тела цикла. В данном случае цикл прервется при значении i = -1. Третий операнд - выполнение перехода к следующему индексу (уменьшение на 1).

Об операторе цикла можно прочесть в документации.

 
Ihor Herasko:

Это тоже не выход. Ордер может быть открыт вручную или другим советником. В итоге разрабатываемый советник ничего не откроет. Поэтому нужно считать количество ордеров, открытых советником. Имея эти данные, принимать решение о необходимости открытия ордера.

Попробовал вот так, но он опять стал открывать 10-15 ордеров на 1 сигнал:

if ((OrdersTotal ()>0) && (OrderMagicNumber() != 100)) return;

Третий операнд - выполнение перехода к следующему индексу (уменьшение на 1).

То есть с конца просматривает все ордера?

 
YanSay:

Попробовал вот так, но он опять стал открывать 10-15 ордеров на 1 сигнал:

То есть с конца просматривает все ордера?

Чтобы использовать функцию OrderMagicNumber(), нужно сначала выбрать ордер. Стандартный цикл сбора информации о своих ордерах выглядит так (например, посчитаем количество своих ордеров):

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;

      if (OrderSymbol() != Symbol())
         continue;

      if (OrderMagicNumber() != <значение ID ордеров эксперта>)
         continue;

      ++nCnt;
   }

После выполнения этого кода в переменной nCnt будет количество рабочих ордеров эксперта. 

 
Ihor Herasko:

Я решаю проблему следующим образом...


Спасибо.

 
Ihor Herasko:

Чтобы использовать функцию OrderMagicNumber(), нужно сначала выбрать ордер. Стандартный цикл сбора информации о своих ордерах выглядит так (например, посчитаем количество своих ордеров):

После выполнения этого кода в переменной nCnt будет количество рабочих ордеров эксперта. 

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber)
     continue;
  ++nCnt;
  {
   if (nCnt>0)
      return;
  }
 }

Спасибо большое! Сработало.

Подскажите, а ++nCnt, это подстановка полученного количества ордеров в саму переменную nCnt?

 
YanSay:

Спасибо большое! Сработало.

Подскажите, а ++nCnt, это подстановка полученного количества ордеров в саму переменную nCnt?

Во всех подобных случаях сразу смотрите документацию. ))

 
YanSay:

Спасибо большое! Сработало.

Подскажите, а ++nCnt, это подстановка полученного количества ордеров в саму переменную nCnt?

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

Не ленитесь читать её - невозможно всё держать в голове - всегда там справляются практически все - не только новички.

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении. Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в...
 
Artyom Trishkin:

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

Не ленитесь читать её - невозможно всё держать в голове - всегда там справляются практически все - не только новички.

Спасибо. Не всегда понимаю в каком разделе искать, пока плохо ориентируюсь, а F1 эдиторе не всегда отправляет куда надо)

Постараюсь по совсем глупым вопросам не тревожить, спасибо за терпение)

 
Roman Sharanov:

1. То есть в начале написать ArraySetAsSeries и дальше плясать от этого?

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

ну так и рисуйте горизонтальную линию.

Зачем вам при этом какие-о буферы и их пересчёты ? ObjectSetDoubke(0,myHLine,OBJPROP_PRICE,concrete_price_value);

пользователь увидит линию, вы не отожрёте время на пересчёт буферов, все довольны и счастливо расходятся

PS/ поймите верно - индикаторный буфер, он для передачи(расшаривания/совместного использования) результатов произведённых вычислений в первую очередь. Нарисовать горизонтальную линию длинной N - это про другое

Причина обращения: