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

 
Alexey Viktorov:

Так я не помню, надо проверять, а неохота. Возможно, что в mql4 при попытке создать объект с именем уже существующего, просто возвращалась ошибка, а в mql5 уже не ошибка а модификация параметров если координаты отличаются.

Как сказал Артём — проверяйте наличие объекта

Да, так.

 
Maxim Kuznetsov:

внезапно (впрочем как обычно) ObjectGetInteger(0,objectName,OBJPROP_TYPE) работает быстрее. 

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

если работаете со своими объектами (то есть созданными в вашем-же прикладе), то не стоит использовать ObjectFind - вы и так знаете в каком окне создавался объект и что он скорее всего есть и он нужного типа.
Максимум неприятностей - то что пользователь удалил объект или поменял свойство

Спасибо. Интересно.

 

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

Вот как я задаю индекс
int W=1000;

double T_P[W]={0};

void OnTick()

{

код

}
Подскажите пожалуйста , что я делаю ошибочно.
Спасибо.

 
ANDREY:

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

Вот как я задаю индекс
int W=1000;

double T_P[W]={0};

void OnTick()

{

код

}
Подскажите пожалуйста , что я делаю ошибочно.
Спасибо.

Индекс массива это не размер массива.
 
Alexey Viktorov:
Индекс массива это не размер массива.

Понял спасибо. А размер массива можно каким то образом задать при помощи переменной?

 
ANDREY:

Понял спасибо. А размер массива можно каким то образом задать при помощи переменной?

Устанавливает новый размер в первом измерении массива

int  ArrayResize(
   void&  array[],              // массив, переданный по ссылке
   int    new_size,             // новый размер массива
   int    reserve_size=0        // резервное значение размера (избыточное)
   );

 
Aleksey Vyazmikin:

Устанавливает новый размер в первом измерении массива

int  ArrayResize(
   void&  array[],              // массив, переданный по ссылке
   int    new_size,             // новый размер массива
   int    reserve_size=0        // резервное значение размера (избыточное)
   );

Спасибо за ценную информацию.

 

Здравствуйте! Помогите, пожалуйства разобраться в простом коде.

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

Код простой. Суть алгоритма - на графике рисуется МА (скользящая средняя) с периодом 100. Если предыдущая свеча [1]  открылась выше MA, а  закрылась ниже МА , то со следующей свечи [0] открывается SELL-ордер на продажу.

//(Условия для покупки противоположны, их не расписываю)

Для закрытия ордера следующие условия - текущая цена прошла от цены открытия ордера устанавливаемое значение пунктов, например 40.

Пример: открылся шот на Bid=1.20045, закрыться он должен на Ask= 1.20005.

Ну и короче не работает у меня что-то..(( Код открытия и закрытия запакованы в 2 соответствующие функции CheckForOpen() и CheckForClose(), которые в свою очередь вызываются функцией OnTick(). По идее, с каждым тиком должны проверяться условии открытия нового ордера и условия закрытия уже открытых позиций, но по факту цена может пройти заданное значение пунктов (пройти уровень закрытия), а ордер при этом не закроется.

Никак не могу понять, в чем дело.

p/s/ Скрины и код прилагаю.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
4elovechishe:

Здравствуйте! Помогите, пожалуйства разобраться в простом коде.

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

Код простой. Суть алгоритма - на графике рисуется МА (скользящая средняя) с периодом 100. Если предыдущая свеча [1]  открылась выше MA, а  закрылась ниже МА , то со следующей свечи [0] открывается SELL-ордер на продажу.

//(Условия для покупки противоположны, их не расписываю)

Для закрытия ордера следующие условия - текущая цена прошла от цены открытия ордера устанавливаемое значение пунктов, например 40.

Пример: открылся шот на Bid=1.20045, закрыться он должен на Ask= 1.20005.

Ну и короче не работает у меня что-то..(( Код открытия и закрытия запакованы в 2 соответствующие функции CheckForOpen() и CheckForClose(), которые в свою очередь вызываются функцией OnTick(). По идее, с каждым тиком должны проверяться условии открытия нового ордера и условия закрытия уже открытых позиций, но по факту цена может пройти заданное значение пунктов (пройти уровень закрытия), а ордер при этом не закроется.

Никак не могу понять, в чем дело.

p/s/ Скрины и код прилагаю.

CheckForOpen() надо вызывать не непосредственно в OnTick, а в самописной OnBar (которую вызывать в OnTick)- на открытии бара. Но это мелочь

смотреть стоит не Open[1], Close[1] (прежняя свеча пробила MA100) а Open[1],Open[0] (прежняя открылась с одной стороны MA, актуальная с другой). Иначе мелкий геп между свечами и прощай логика. 

SMA от Median на 0-м баре меняется, то есть непостоянна. Нельзя с ней сравнивать. Корректируйте алгоритм.

 
Aleksey Vyazmikin:

Устанавливает новый размер в первом измерении массива

int  ArrayResize(
   void&  array[],              // массив, переданный по ссылке
   int    new_size,             // новый размер массива
   int    reserve_size=0        // резервное значение размера (избыточное)
   );

Еще раз спасибо Вам за подсказку, но..... в Справочнике написано что данная функция применяется только к динамическим массивам. А в моем коде НЕ динамический массив, а обычный.

Буду Вам очень признателен , если подскажете( а лучше, покажете) как меняется размер обычного массива в первом измерении.
Еще раз спасибо за помощь.

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