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

 

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

Продолжаю изучение языка программирования MQL5. В код Василия Соколова внёс небольшое изменение для того, чтобы открывалась только одна позиция в день, как изначально и было задумано в алгоритме работы советника. Изменение выделено желтым цветом.

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

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Зададим условия для открытия позиций BUY и SELL
   double price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   double point=SymbolInfoDouble(Symbol(),SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);
   price=NormalizeDouble(price,digits);

   if(IsMainPositionOpen() == false && IsTimeForOpen())
     {
      if(TickUP()==(price+point))
         OpenBUY();
      else
        {
         if(TickDOWN()==(price-point))
            OpenSELL();
        }
     }
   if(IsTimeForClose())
      CloseALL();
 
Vasiliy Sokolov:

OnInit блок тоже перемудрен и все равно написан не совсем корректно. Во-первых нужно стремится писать идентификаторы, а не числа. Возвращаеть не -1, а INIT_FAILED не 0, а INIT_SUCCEEDED. Во-вторых switch здесь излишен. Нужно писать либо if либо switch. Писать сначала одно, потому другое - масло масленное.

В третьих нужно контролировать все варианты типа счета. Есть демо, есть реал. А еще есть Contest. Но даже если бы третьего счета не было, должна стоять заглушка которая бы отлавливала все прочие варианты:

Наверное разумнее объяснить работу с исключениями, иначе не будет понимания, зачем вообще контролировать то, о чем не знаешь.

В самом утрированном понимании должно быть так:

1. старт программы на выполнение

2. отработка алгоритма и выход из него по двум направлениям:

   а) Истина - алгоритм отработал верно

   б) Ложь - алгоритм не отработал

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

 
Konstantin:

Наверное разумнее объяснить работу с исключениями, иначе не будет понимания, зачем вообще контролировать то, о чем не знаешь.

В самом утрированном понимании должно быть так:

1. старт программы на выполнение

2. отработка алгоритма и выход из него по двум направлениям:

   а) Истина - алгоритм отработал верно

   б) Ложь - алгоритм не отработал

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

Здравствуйте, Константин! Спасибо Вам за разъяснение.

Уважаемые участники данной темы! Хочу ещё раз всех Вас поблагодарить за конструктивные подсказки и советы, которые помогли мне в изучении языка программирования MQL5.

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

Версию советника Trailing_Stop (v.1).mq5 с подробными комментариями каждой строчки кода, в изложении доступном для ученика 1-го класса школы программирования, как и обещал ранее, опубликую, но немного позже.

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

 

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

Продолжаю изучение языка программирования MQL5. Наконец-то появилось немного времени, чтобы написать версию советника с подробными комментариями каждой строчки кода, в изложении доступном для ученика 1-го класса школы программирования. В связи с тем, что код советника получился достаточно громоздким, публикую его в виде файла c названием Trailing_Stop_gv.22.mq5.

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

На настоящий момент в советнике реализована возможность:

  1. Проверять торговый счет, на который планируется его установить. Если советник будет устанавливаться на демо-счёт, то в окне сообщений появится разрешение на продолжение работы. Если будет предпринята попытка установить советник на реальный счёт, то в окне сообщений появится предупреждение о невозможности продолжения работы, после чего он автоматически удалится с рабочего окна торгового терминала.
  2. Один раз в торговый день ровно в 9 ч. 00 мин. по московскому времени автоматически открывать одну позицию в ту сторону, куда будет направлен первый тик. Например, если в 9 ч. 00 мин. по московскому времени первый тик будет направлен вверх, то значит откроется позиция BUY, если первый тик будет вниз, то значит откроется позиция SELL.
  3. Задавать размер лота.
  4. Задавать размер стоп лосса.
  5. Задавать уровень относительно цены открытия позиции, при котором стоп лосс переносится в безубыток.
  6. Задавать шаг трейлинга стоп лосса.

В данном варианте советника реализовано большинство подсказок, ранее предложенных Василием Соколовым.

ПРЕДУПРЕЖДЕНИЕ!!!

Советник разрабатывался согласно плана самообучения для демо-счёта и исключительно в учебных целях! Не предназначен для торговли на реальном счёте и извлечения прибыли!

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

Файлы:
 
MrBrooklin:

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

Продолжаю изучение языка программирования MQL5. Наконец-то появилось немного времени, чтобы написать версию советника с подробными комментариями каждой строчки кода, в изложении доступном для ученика 1-го класса школы программирования. В связи с тем, что код советника получился достаточно громоздким, публикую его в виде файла c названием Trailing_Stop (v.2).mq5.

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

На настоящий момент в советнике реализована возможность:

  1. Проверять торговый счет, на который планируется его установить. Если советник будет устанавливаться на демо-счёт, то в окне сообщений появится разрешение на продолжение работы. Если будет предпринята попытка установить советник на реальный счёт, то в окне сообщений появится предупреждение о невозможности продолжения работы, после чего он автоматически удалится с рабочего окна торгового терминала.
  2. Один раз в торговый день ровно в 9 ч. 00 мин. по московскому времени автоматически открывать одну позицию в ту сторону, куда будет направлен первый тик. Например, если в 9 ч. 00 мин. по московскому времени первый тик будет направлен вверх, то значит откроется позиция BUY, если первый тик будет вниз, то значит откроется позиция SELL.
  3. Задавать размер лота.
  4. Задавать размер стоп лосса.
  5. Задавать уровень относительно цены открытия позиции, при котором стоп лосс переносится в безубыток.
  6. Задавать шаг трейлинга стоп лосса.

В данном варианте советника реализовано большинство подсказок, ранее предложенных Василием Соколовым.

ПРЕДУПРЕЖДЕНИЕ!!!

Советник разрабатывался согласно плана самообучения для демо-счёта и исключительно в учебных целях! Не предназначен для торговли на реальном счёте и извлечения прибыли!

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

Здравствуйте! - не компилируется.

Trailing_Stop_gv.22.mq5 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

разобрался - имя нужно без скобок создавать эксперта Trailing_Stop (v.2)

 
SanAlex:

Здравствуйте! - не компилируется.

 

Здравствуйте! Только что скачал файл с сайта и проверил в своем MetaEditor, все нормально компилируется.

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

 
MrBrooklin:

Здравствуйте! Только что скачал файл с сайта и проверил в своем MetaEditor, все нормально компилируется.

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

Спасибо! за работу. я имя, не правильно вписал при создании эксперта. всё работает.

 
SanAlex:

Спасибо! за работу. я имя, не правильно вписал при создании эксперта. всё работает.

Пожалуйста!

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

 

Уважаемые участники данной темы!

Хочу ещё раз всех Вас поблагодарить за конструктивные предложения, подсказки и советы, которые помогли мне в изучении основ языка программирования MQL5. Особую благодарность выражаю Василию Соколову! Дай бог Вам всем здоровья и благополучия!

С большим уважением ко всем, Владимир.

 

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

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

Вот наброски программного кода:

input string Symbol_Main="GBPUSDrfd";  //Валютная пара, на которую ставим советник

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   /* Определим график валютной пары, на который будем устанавливать советник*/
   string currency_chart=SymbolInfoString(Symbol(),SYMBOL_DESCRIPTION);
   if(currency_chart==Symbol_Main) //если график валютной пары совпадает со входным параметром
     {
      /* выводим окно сообщений на торговом терминале и продолжаем работу советника */
      MessageBox("Работа советника на данной валютной паре разрешена!");
      return(INIT_SUCCEEDED); //возвращаем для функции OnInit значение означающее "удачная инициализация"
     }
   else //в противном случае, если график валютной пары не совпадает со входным параметром
     {
      /* выводим окно сообщений на торговом терминале и закрываем советник */
      MessageBox("Работа советника на данной валютной паре запрещена! Выходим!");
      return(INIT_FAILED); //возвращаем для функции OnInit значение означающее "неудачная инициализация"
     }
  }

Компилятор ошибок не выдает. Желтым цветом выделил тот код, который не работает. Наверное из-за того, что не совсем правильно понимаю смысл идентификатора SYMBOL_DESCRIPTION -  строковое описание символа. Пробовал применять другие идентификаторы, но результат тот же. А может функция SymbolInfoString() здесь вообще не нужна? Название валютной пары написал GBPUSDrfd только потому, что советник планирую использовать на Альфа-Форексе, а у этого форекс-дилера абсолютно все символы имеют окончание rfd.

Уважаемые специалисты, подскажите, пожалуйста, в каком направлении нужно думать!

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

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