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

 
MrBrooklin:

В дальнейшем, согласно плана самообучения, стоит задача по проведению поэтапной модификации скрипта, а именно:

  1. добавить Stop Loss и Take Profit;
  2. добавить трейлинг;
  3. добавить максимальный риск;
  4. расширить выбор отложенных ордеров.
С уважением, Владимир.
Зря конечно, Вы не последовали совету обучения по учебнику. Вот, допустим,  нахватаетесь знаний как ставить линии, ордера и прочее, но стратегию написать все равно не сможете, ведь теоретичекая база отсутствует. Все эти линии и скрипты не помогут понять главные вещи программирования, а без них далеко не уедешь. Я первые 4 месяца только учился, даже не пытаясь что то писать. Можно конечно было и нахрапом, как Вы, но качество таких знаний невысокое, - сплошь и рядом пробелы в элементарном, которые придется восполнять в будущем...
 
Реter Konow:
Зря конечно, Вы не последовали совету обучения по учебнику. Вот, допустим,  нахватаетесь знаний как ставить линии, ордера и прочее, но стратегию написать все равно не сможете, ведь теоретичекая база отсутствует. Все эти линии и скрипты не помогут понять главные вещи программирования, а без них далеко не уедешь. Я первые 4 месяца только учился, даже не пытаясь что то писать. Можно конечно было и нахрапом, как Вы, но качество таких знаний невысокое. Сплошь и рядом пробелы в элементарном, которые придется восполнять в будущем...

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

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

 
MrBrooklin:

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

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

При написании скрипта пользовался только информацией взятой из Справочника MQL5!

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

Пример хороший. Предлагаю использовать его в качестве отправной точки. Базиса. 

MrBrooklin:

В дальнейшем, согласно плана самообучения, стоит задача по проведению поэтапной модификации скрипта, а именно:

  1. добавить Stop Loss и Take Profit;
  2. добавить трейлинг;
  3. добавить максимальный риск;
  4. расширить выбор отложенных ордеров.
С уважением, Владимир.

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

 
Vasiliy Sokolov:

Пример хороший. Предлагаю использовать его в качестве отправной точки. Базиса. 

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

Здравствуйте, Василий! Конечно подскажите, что нужно переписать, мне это очень интересно!

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

 
MrBrooklin:

Здравствуйте, Василий! Конечно подскажите, что нужно переписать, мне это очень интересно!

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

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

//+------------------------------------------------------------------+
//|                                                         New6.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#property script_show_inputs
//---

#define      orderType1 "BUY_STOP"   //Тип ордера UP
#define      orderType2 "SELL_STOP"  //Тип ордера DOWN
input int    Distance=100;           //Отступ отложенного ордера от текущей цены
input double Lots=0.01;              //Фиксированный размер лота
input long   Pending_magic=86513;    //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()                                                    
  {
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
   request.action=TRADE_ACTION_PENDING;
   request.symbol=Symbol();
   request.volume=Lots;
   request.deviation=2;
   request.magic=Pending_magic;
   double price;
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   if(orderType1=="BUY_STOP")
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   if(orderType2=="SELL_STOP")
     {
      request.type=ORDER_TYPE_SELL_STOP; 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

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

enum ENUM_ORDER_TYPE_FLAGS
{
    BuyStop = 1,                // Только BuyStop
    SellStop = 2,               // Только SellStop
    BuyStopAndSellStop = 4      // BuyStop и SellStop
};

input ENUM_ORDER_TYPE_FLAGS TypeSendOrders = BuyStop;   // Тип Выставляемого ордера(ов)

Соответственно мы определили новое перечисление, которое внедрили в качестве параметра выбора для пользователя.

 
Vasiliy Sokolov:

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

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

Соответственно мы определили новое перечисление, которое внедрили в качестве параметра выбора для пользователя.

Отлично, по сути дела, Вы мне подсказали то, что написано в 4-м пункте поэтапной модификации скрипта, а именно расширить выбор отложенных ордеров.

Спасибо!

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

 

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

  • Весь код написанный на MQL (а это все скрипты, индикаторы и советники в CodeBase например) находится либо внутри системных функций, либо внутри пользовательский функций.
  • Любой код на MQL вызывает десятки встроенных функций MQL. Все взаимодействие с MetaTrader и его торговым окружением происходит через вызов той или иной системной функции.
  • Любая функция не зависящая от внешних параметров всегда возвращает один и тот же результат. Такую функцию можно просто копировать из одного скрипта/индикатора/советника в другой и она будет корректно работать. Копировать произвольный кусок процедурного кода, наоборот, скорее всего не получится.
  • Можно написать любую пользовательскую функцию которая делает полезную работу. Тем самым, она нужным именно Вам образом будет расширять стандартный функционал MQL. Например, Вы думаете: "Как здорово, если бы в MQL была бы вот такая функция...." - Но почему бы тогда не написать ее самому?
 
Vasiliy Sokolov:

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

  • Весь код написанный на MQL (а это все скрипты, индикаторы и советники в CodeBase например) находится либо внутри системных функций, либо внутри пользовательский функций.
  • Любой код на MQL вызывает десятки встроенных функций MQL. Все взаимодействие с MetaTrader и его торговым окружением происходит через вызов той или иной системной функции.
  • Любая функция не зависящая от внешних параметров всегда возвращает один и тот же результат. Такую функцию можно просто копировать из одного скрипта/индикатора/советника в другой и она будет корректно работать. Копировать произвольный кусок процедурного кода, наоборот, скорее всего не получится.
  • Можно написать любую пользовательскую функцию которая делает полезную работу. Тем самым, она нужным именно Вам образом будет расширять стандартный функционал MQL. Например, Вы думаете: "Как здорово, если бы в MQL была бы вот такая функция...." - Но почему бы тогда не написать ее самому?

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

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

 
Vasiliy Sokolov:

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

  • Весь код написанный на MQL (а это все скрипты, индикаторы и советники в CodeBase например) находится либо внутри системных функций, либо внутри пользовательский функций.
  • Любой код на MQL вызывает десятки встроенных функций MQL. Все взаимодействие с MetaTrader и его торговым окружением происходит через вызов той или иной системной функции.
  • Любая функция не зависящая от внешних параметров всегда возвращает один и тот же результат. Такую функцию можно просто копировать из одного скрипта/индикатора/советника в другой и она будет корректно работать. Копировать произвольный кусок процедурного кода, наоборот, скорее всего не получится.
  • Можно написать любую пользовательскую функцию которая делает полезную работу. Тем самым, она нужным именно Вам образом будет расширять стандартный функционал MQL. Например, Вы думаете: "Как здорово, если бы в MQL была бы вот такая функция...." - Но почему бы тогда не написать ее самому?
Василий, человек еще даже массивы не освоил. Рано ему подобные лекции слушать.)
 
Реter Konow:
Василий, человек еще даже массивы не освоил. Рано ему подобные лекции слушать.)

Петер, мне важны все конструктивные советы, в том числе и Ваши!

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

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