Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1374

 
Alexey Viktorov #:

Вас кто-то плохо учил. Переменная _LastError будет хранить полученное значение до тех пор, пока не произойдёт следующая, очередная ошибка.


Ну вот смотрите, вначале основного кода происходит например такая ошибка:

ERR_INVALID_DATETIME

4010

Неправильное значение даты и/или времени


А далее по коду создается объект и _LastError перезаписывается на 

ERR_OBJECT_NOT_FOUND

4202

Графический объект не найден


Если проверка  _LastError стоит в конце кода, как я обычно делаю, то я получу 4202 и просто проигнорирую ее. То есть ошибка 4010 останется незамеченной. Где я ошибаюсь?

Alexey Viktorov #:


Требованием маркета является отсутствие ошибок исполнения получаемых от сервера брокера\дц. 

Спасибо, этого не знал, думал все ошибки запрещены.
 

 
leon_17 #:

Ну вот смотрите, вначале основного кода происходит например такая ошибка:

ERR_INVALID_DATETIME

4010

Неправильное значение даты и/или времени


А далее по коду создается объект и _LastError перезаписывается на 

ERR_OBJECT_NOT_FOUND

4202

Графический объект не найден


Если проверка  _LastError стоит в конце кода, как я обычно делаю, то я получу 4202 и просто проигнорирую ее. То есть ошибка 4010 останется незамеченной. Где я ошибаюсь?

Спасибо, этого не знал, думал все ошибки запрещены.
 

Именно так. Вы не ошибаетесь…

 

Здравствуйте, может кто подсказать.

Записываю в массив значения времени конкретно каждого бара. На графике стоит ограничение 3000 баров.

Задача:

- Смещать массив значений при каждом новом баре.

void CNewBar::PriceHL2()
  {
   int start= 0;
   ArrayResize(this.m_tim_pr_hl2,this.m_rt);
  
   if(this.m_pc!=0)
     {
      start= this.m_pc;
      ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc);
     }  
   for(int b= start; b < this.m_rt; b++)
     {
      this.m_tim_pr_hl2[b]= iTime(this.m_symbol, this.m_timeframe, this.m_rt-b);
     }
  }

Не получается настроить чтобы слаженно работало.

Правильно же я смещаю массив при новом баре, если (this.m_rt-this.m_pc)=1?

ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc); // this.m_rt-this.m_pc=1
 
Mikhail Toptunov #:

Здравствуйте, может кто подсказать.

Записываю в массив значения времени конкретно каждого бара. На графике стоит ограничение 3000 баров.

Задача:

- Смещать массив значений при каждом новом баре.

Не получается настроить чтобы слаженно работало.

Правильно же я смещаю массив при новом баре, если (this.m_rt-this.m_pc)=1?

То-есть размер массива должен быть ровно 3000 и при образовании нового бара нулевой индекс надо переписать первым ……… и в конец дописать новое значение?

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

 
Alexey Viktorov #:

Если объект не найден, то это и есть ошибка поиска объекта…

ERR_OBJECT_NOT_FOUND

4202

Графический объект не найден


Не надо его алертить…

Провел пару тестов... тут вот какое дело получается. На MQL5 использовать при создании объектов ObjectFind() вовсе необязательно.
Объект можно создавать без всяких предварительных проверок его существования (просто через ObjectCreate) и даже внутри OnTick такой код не вызывается никаких ошибок _LastError.

Не знаю как это реализовано в недрах системного кода MQL5, возможно там уже уже зашита какая-то проверка, что объект будет создаваться только, если его еще нет. Но получается, что по крайней мере при создании объекта внутри MQL5 ObjectFind()  просто не нужен. И видимо все его свойства безвариантно постоянно  обновляются на каждом тике.

Чего не не скажешь про MQL4. Там создание объекта поверх уже существующего вызывается ошибку 4200 ("Объект уже существует"). То есть для его создания использование  ObjectFind() уже обязательно. При этом остается простая возможность закрыть его свойства от постоянного переобновления без генерации ошибок _LastError.

Прошу подтвердить мои выводы.

 
Alexey Viktorov #:

То-есть размер массива должен быть ровно 3000 и при образовании нового бара нулевой индекс надо переписать первым ……… и в конец дописать новое значение?

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

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

Спасибо понял, попробую через CopyTime.

 
leon_17 #:

Провел пару тестов... тут вот какое дело получается. На MQL5 использовать при создании объектов ObjectFind() вовсе необязательно.
Объект можно создавать без всяких предварительных проверок его существования (просто через ObjectCreate) и даже внутри OnTick такой код не вызывается никаких ошибок _LastError.

Не знаю как это реализовано в недрах системного кода MQL5, возможно там уже уже зашита какая-то проверка, что объект будет создаваться только, если его еще нет. Но получается, что по крайней мере при создании объекта внутри MQL5 ObjectFind()  просто не нужен. И видимо все его свойства безвариантно постоянно  обновляются на каждом тике.

Чего не не скажешь про MQL4. Там создание объекта поверх уже существующего вызывается ошибку 4200 ("Объект уже существует"). То есть для его создания использование  ObjectFind() уже обязательно. При этом остается простая возможность закрыть его свойства от постоянного переобновления без генерации ошибок _LastError.

Прошу подтвердить мои выводы.

Дело вовсе не в ошибках. Дело в том, что после создания объекта ему назначаются определённые свойства и зачем-же тратить машинное время и ресурсы на переопределение свойств без внесения изменений. Гораздо дешевле проверить существование и если объект есть то назначить новые свойства только те которые надо изменить. Например текстовая метка или Lable, часто менять надо только текст в этих объектах. А все остальные как есть так и остаются…
 
Mikhail Toptunov #:

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

Спасибо понял, попробую через CopyTime.

Ну, так если через CopyTime то вообще нет проблем. Просто копируйте от текущего 3000 баров и все дела.

 

Как задать уровень штатного трейлинг-стопа в коде программы при выставлении отложенного ордера или при открытии позиции с рынка?

Как это делается вручную, понятно. Программки для нештатных трейлинг-стопов не интересуют.

Заранее благодарю.

 
   for (int symbols; symbols < SymbolsTotal(true); symbols++) 
      {
        Print(SymbolName(symbols ,true));
      }

Почему такая конструкция не работает? Где ошибка... (в журнале пусто)


И енам, тоже пусто

enum c_mode
  {
   Auto,
   Manual,    
  };

input c_mode MODE         = Auto;

if (MODE==Auto) 
      {
      Print("MODE=Auto");
      }