Самообучение языку MQL5 с полного нуля - страница 65

 
MrBrooklin:

Здравствуйте, Валерий! Большое спасибо, т.к. Ваш вариант "...если позиций с нашим магик и на нашем символе равно нулю то проверяем время и открываем позицию..." оказался самым простым и эффективным. Дописал в условии проверки времени && PositionTotal()==0 и стала открываться только одна позиция с нужным объёмом!

С уважением, Владимир.


К сожалению в МКЛ нет команды возвращающей количество позиций на символе. ТоталПозишн возвращает все позиции на счете на всех символах. Поэтому для получения позиций на символе нужен перебор всех позиций и сравнение символа позиция на нашей.

И еще. Логика в лоб сперва время, открываем проверяем наличие нашей позиции тралим не всегда оптимально. Иногда лучше сперва проверить открыта ли позиция с нашим магиком, и если открыта то проверяем время закрытия Иначе тралим И Иначе (else) проверяем время открытия.

Цель уменьшить количество действий советника.

 
Valeriy Yastremskiy:

К сожалению в МКЛ нет команды возвращающей количество позиций на символе. ТоталПозишн возвращает все позиции на счете на всех символах. Поэтому для получения позиций на символе нужен перебор всех позиций и сравнение символа позиция на нашей.

И еще. Логика в лоб сперва время, открываем проверяем наличие нашей позиции тралим не всегда оптимально. Иногда лучше сперва проверить открыта ли позиция с нашим магиком, и если открыта то проверяем время закрытия Иначе тралим И Иначе (else) проверяем время открытия.

Цель уменьшить количество действий советника.

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

С уважением, Владимир.

 
Valeriy Yastremskiy:

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

Здравствуйте, Валерий! Попробовал написать код без перебора позиций. Написал, проверил, всё работает.

   if(PositionSelect(Symbol())==false && PositionGetInteger(POSITION_MAGIC)!=Magic_Number
   && time_current.hour==time_open.hour && time_current.min>=time_open.min && time_current.min<time_open1.min)
      OpenBUY();
С уважением, Владимир.
 
MrBrooklin:

Здравствуйте, Валерий! Попробовал написать код без перебора позиций. Написал, проверил, всё работает.

С уважением, Владимир.

Для начала нормально, но только для начала. Слишком жесткие условия. Если на нашем символе нет позиций и нет позиций с нашим магик на всех инструментах далее вроде норм. В жизни у вас может быть открыты на одном символе 2 окна, и в другом может быть позиция. Можно вести учет просто по Магику с учетом например, как у тришкина, первых трех цифр - кода символа и следующих 2 цифр - кода скрипта/советника. И на первом этапе кодировать вручную, или формировать магик путем получения сложения строк, в зависимости от символа окна и кода скрипта и потом строку переводить в число.

Классикой почему то считается перебор всех ордеров или позиций.

Но это слишком для начала. 

Поэтому для начала норм.

 
Valeriy Yastremskiy:

Для начала нормально, но только для начала. Слишком жесткие условия. Если на нашем символе нет позиций и нет позиций с нашим магик на всех инструментах далее вроде норм. В жизни у вас может быть открыты на одном символе 2 окна, и в другом может быть позиция. Можно вести учет просто по Магику с учетом например, как у тришкина, первых трех цифр - кода символа и следующих 2 цифр - кода скрипта/советника. И на первом этапе кодировать вручную, или формировать магик путем получения сложения строк, в зависимости от символа окна и кода скрипта и потом строку переводить в число.

Классикой почему то считается перебор всех ордеров или позиций.

Но это слишком для начала. 

Поэтому для начала норм.

Спасибо, Валерий! Перебор всех позиций - это один из многих следующих шагов в самообучении, который обязательно сделаю.

С уважением, Владимир.

 
Valeriy Yastremskiy:

Классикой почему то считается перебор всех ордеров или позиций.

увы, такая традиция у MQL-сообщества, все ЕА разрабатываются с учетом внезапной потери связи и/или отключения эл.питания ПК

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

... в общем с момента создания МТ - все ждут когда пропадет интернет, а сама стратегия уже не столь важна ))

 
Igor Makanu:

увы, такая традиция у MQL-сообщества, все ЕА разрабатываются с учетом внезапной потери связи и/или отключения эл.питания ПК

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

... в общем с момента создания МТ - все ждут когда пропадет интернет, а сама стратегия уже не столь важна ))

Здравствуйте, Игорь! Спасибо Вам за то, что поделились очень нужной информацией.

С уважением, Владимир.

 
Igor Makanu:

увы, такая традиция у MQL-сообщества, все ЕА разрабатываются с учетом внезапной потери связи и/или отключения эл.питания ПК

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

... в общем с момента создания МТ - все ждут когда пропадет интернет, а сама стратегия уже не столь важна ))

Защита от пожара, наводнения и дурака всегда должна быть!) Обычно стопами ограничиваюсь на случай потери связи с ДЦ.

 

Всем доброго дня и хорошего настроения!

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

Оператор цикла for

Выполняет оператор до тех пор, пока проверяемое выражение не станет ложным. Проверка выражения производится перед каждой итерацией


Захожу в описание оператора цикла for и там читаю о том, что:

Оператор for состоит из трех выражений и выполняемого оператора:

for(выражение1; выражение2; выражение3) 
   оператор;

Выражение1 описывает инициализацию цикла. Выражение2 - проверка условия завершения цикла.
Если оно истинно, то выполняется оператор тела цикла for. Все повторяется, пока выражение2 не станет ложным. 
Если оно ложно, цикл заканчивается и управление передается следующему оператору. 
ВыражениеЗ вычисляется после каждой итерации.

Оператор выполняет оператор? Ну хорошо. Беру и запускаю оператор цикла for для перебора всех открытых позиций, дальше прописываю оператор if с нужными мне условиями:

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelect(Symbol())==false && PositionGetInteger(POSITION_MAGIC)!=Magic_Number
         && time_current.hour==time_open.hour && time_current.min>=time_open.min && time_current.min<time_open1.min)
         OpenBUY();
     }

а дальше ничего не происходит. Позиция Buy не открывается. Как это понять? Видимо, что-то делаю не так или вообще не правильно понимаю суть оператора цикла for?

Уважаемые специалисты! Прошу подсказать, но только не исправленным кодом, а словами, иначе так никогда не изучу язык программирования MQL5.

С уважением, Владимир.
 
MrBrooklin:

Всем доброго дня и хорошего настроения!

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

Оператор цикла for

Выполняет оператор до тех пор, пока проверяемое выражение не станет ложным. Проверка выражения производится перед каждой итерацией


Захожу в описание оператора цикла for и там читаю о том, что:

Оператор выполняет оператор? Ну хорошо. Беру и запускаю оператор цикла for для перебора всех открытых позиций, дальше прописываю оператор if с нужными мне условиями:

а ничего не происходит. Позиция Buy не открывается. Как это понять? Видимо, что-то делаю не так или вообще не правильно понимаю суть оператора цикла for?

Уважаемые специалисты! Прошу подсказать, но только не исправленным кодом, а словами, иначе так никогда не изучу язык программирования MQL5.

С уважением, Владимир.

Оператор цикла и операторы в теле цикла. Не совсем классический русский язык.

Все конечно хорошо, но где итератор i в теле цикла? И для того что бы получить символ позиции и ее магик ее надо сперва выбрать. Описание позиции это структура (в мкл5 все структура и ордера и время и сделки) и она заполняется через выбор, селект по итератору который не тикет позиции, а номер позиции. и надо помнить, что в структуре описания позиции всегда последний выбор позиции.

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