Может ли чайник написать робота? Что два байта переслать! Глава 1

24 января 2020, 17:04
Programmer96
[Удален]
3
215


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


________________________________ Содержание ________________________________
  • Введение
  • Первый шаг
  • Основы языка
  • Переменные
  • Функции
  • Учимся читать
  • Обучение методом "Ломаем/строим". Модификация чужого кода
  • Работа над ошибками
  • Как найти "иголку" в стоге кода функции которую якобы можно использовать "как есть"?
  • Графический интерфейс
  • Пишем простой советник с нуля
  • Пишем сеточный советник с Мартингейлом
  • Перечень вложений

    Введение

       Это не учебник в его классическом виде - формат блога не позволяет это сделать, а скорее всего что-то вроде "Букварь MQL4", который позволит вам сделать первые шаги в сторону понимания языка, научит работать с Документацией. Принцип обучения тоже будет примерно такой же - первой учим букву "М", второй букву "А". Как только выучим, тут же пишем по слогам первое слово "Ма-ма" (пишем одноклеточный, но работающий советник). Выучив еще несколько букв напишем: "Ма-ма мы-ла ра-му" - напишем простой советник, который можно использовать  в реальной торговле.
      Почему так?
    Все просто. До сих пор с умилением вспоминаю брошюрку (интернета тогда не было не только у нас)  по которой я за несколько дней выучил Basic и написал работающую программу (какую-то простую игрушку, уже не помню какую). И, в то же самое время, я хорошо помню сколько раз я упоминал чью-то там мать, делая первые шаги в MQL4. И это при том что к тому времени я уже знал несколько языков и активно на них писал... /добавлено 26.01.2020/
      
       Обучать буду на примерах написания роботов для MQL4, более сложный MQL5 освоите потом, самостоятельно. Кроме того - платформа МТ4 еще долго будет оставаться самой популярной в мире торговой платформой.
       Статья будет состоять из нескольких разделов, они будут публиковаться отдельными постами, но все будет связано Содержанием.  

        Конечно, для того чтобы быстро выучить язык MQL4, очень желательно знать хотя бы Basic.
    Увы, знакомы с ним далеко не все, а тратить время на изучение не хочется, хочется побыстрее написать робота по своей торговой идее. Разочарую - если вы полный чайник, то быстро не получится. Придется вначале "буквы" MQL4 выучить, потом научиться читать, потом писать хоть что-то, хоть как-то работающее. И только потом вы сможете перевести в код свою очередную гениальную торговую идею.

       Сколько времени это займет? Это по разному. Мне хватило двух недель от первых шагов до написания первого работающего советника. Но я и Basic еще в 1986 по брошюре выучил (интернета у нас тогда еще не было), и еще пару-тройку других языков программирования знал, и веб свободно верстал. Мне пришлось всего лишь освоить специфику языка MQL, а потом я писал почти с той же скоростью что и этот текст.

       Если вы не знаете совсем ничего, то путь от изучения первых букв до создания первого рабочего советника займет у вас от одного до двух-трех месяцев. Но не расстраиваетесь - это время пролетит быстро, так как вы каждый день будете узнавать что-то новое и интересное, ваш прогресс в изучении языка будет очень и очень заметен.


    Первый шаг

       Работа всех программ базируется на анализе условий и выполнении каких либо действий или расчетов по результатам этого анализа.
       Объясню на примере примитивного советника объемом аж в 19 строк, который делает простое вычисление и выводит в комментарий оценку правильности вычисления. Это весь его код, включая вывод оценки:

    // input parameters (menu)
    input int a          =1;
    input int b          =2;
    input int CorrectSum =3;
    //--------------------------------------
    void OnTick() {
    //---
     int sum=0;
     bool CalculationResult=false;
     string txt="";
    //---
       sum=a+b; // calculation of the sum of variables
    //---
          if(sum==CorrectSum) CalculationResult=true; 
          else CalculationResult=false;
             if(CalculationResult==true) txt="it is right";
             if(CalculationResult==false) txt="it is not right";
    //   if(CalculationResult) txt="it is right"; else txt="it is not right";
    //---
     Comment(
             "\n a= ",a,
             "\n b= ",b,
             "\n sum= ",sum, 
             "\n CorrectSum= ",CorrectSum,
             "\n CalculationResult= ",txt
     ); //--
     
    //---
     } //-- OnTick()


    Откройте редактор, скопируйте в него этот код, сохраните как "if_test", нажмите кнопку "Компиляция".
    Установите этот советник на любой график. По первому же тику вы увидите такую картинку:

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

       И что же написано в этом коде советника-калькулятора? Как это прочесть?
    Боюсь что для того кто на самом деле в программировании "ни  в зуб ногой" это действительно почти невыполнимая задача. Не проблема, перевожу с MQL4 на русский:

      Входные параметры.
      input int a          =1;
      input int b          =2;
      input int CorrectSum =3;

          От того что вы видите открывая советник отличается тем что:
      - перед переменными стоит понятное слово input(входной, вводимый)
      - непонятное int 
      - знак "=" перед цифрой

          intэто тип переменной хранящей значения целых чисел.
      Еще бывают:
         - double  десятичные числа
         - bool  переключатели
         - string  текст
         - color  цвет
         - datetime  дата и время
      и много других типов. Ниже я скажу где об этом прочесть.

         Оператор   =   присваивает значение переменной. Не путать с оператором  ==  - этот оператор применяется для сравнивания двух переменных.
      А если видите  !=  то сие значит "не равно". Восклицательный знак, это оператор отрицания.

          Сразу после слов void OnTick() (обязательная стандартная функция,) видим:
       int sum=0;
       bool CalculationResult=false;
       string txt="";
      
          Это объявление переменных.
      Переменная любого типа обязательно должна быть объявлена. Причем объявлять ее нужно ранее, чем она впервые будет использована. Иначе ошибка. 
            Следующая строка - составной оператор  sum=a+b;  переводить не нужно. По написанию понятно что он делает.
        Только одно уточнение: после любого составного оператора обязательно должна стоять точка с запятой. 

             Далее следует основной "работающий" код нашего примитивного советника-калькулятора:
             1. if(sum==CorrectSum) CalculationResult=true; 
             2. else CalculationResult=false;
             3.    if(CalculationResult==true) txt="it is right";
             4.    if(CalculationResult==false) txt="it is not right";
        
          
            1-2 строки это не что иное как условный оператор if-else в простом классическом виде.
        Перевожу на русский:
         1.  "Если (sum равна CorrectSum) то присвоить переменной  CalculationResult значение правда";  
         2.   иначе присвоить переменной
        CalculationResult значение ложь;                                                   

           3-4 строки переводятся так:
        если(CalculationResult ==правда) то присвоить переменной txt значение =" правильно";
        если(CalculationResult ==ложь)то  присвоить переменной txt значение ="неправильно";


            Будь это не учебный код, а рабочий советник, то эти две строки я написал бы одной строкой такого вида:
        if(CalculationResult) txt="it is right"; else txt="it is not right";

        Работает это точно так же как и предыдущая редакция. Непонятно? На самом деле все очень просто:
             для bool-переменных if(CalculationResult) это точно то же самое что и   if(CalculationResult == true)
             а если впереди стоит восклицательный знак if(!CalculationResult) ,
             то это то же самое что и  if(CalculationResult == false)  
        Что такое  else  вы уже знаете.

             Идущая далее функция Comment() выводит на график результат наших вычислений.
         Comment(
                 "\n a= ",a,
                 "\n b= ",b,
                 "\n sum= ",sum, 
                 "\n CorrectSum= ",CorrectSum,
                 "\n CalculationResult= ",txt
         ); //--
        - текст, который вы хотите вывести на график, обязательно нужно заключать в двойные кавычки
        \n   это перевод строки
        - если после текстового ввода стоит запятая, то после нее можно писать переменную, ее значение будет выведено на график
        - если это не последнее выражение, то после переменной также нужно поставить запятую. А вот запятая после последнего выражения будет ошибкой.
        - функция обязательно должна закрываться круглой скобкой и двоеточием.

        ________________________________________________________________________________________________________________
           Если вы внимательно все это прочли, то  язык MQL4 наверняка уже не кажется вам чем-то непостижимым. 
        Бейсик проще, но и в С-подобном MQL4 тоже нет ничего что нельзя было бы понять человеку не имеющему специального образования, но имеющему мозги.
          Код несложного советника открывающего сделки, устанавливающего ТП и СЛ через некоторое время покажется вам таким же простым и понятным. И вы его скоро самостоятельно напишете.

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

           Букварь публикуется "с листа".
        Это значит что правки неизбежны. Изучив главу 15 (например) не поленитесь пролистать все предыдущие. Высока вероятность что там появилась новая (очень важная) информация или поправлены ошибки.



           Если это кому то интересно, то ниже ссылка на все мои посты опубликованные в блоге начиная с августа 2014
                          Ранее опубликованные посты
           Не все в них так, то таких которые категорически нужно удалить не обнаружил (пока не обнаружил)