Español Português
preview
Моделирование рынка (Часть 19): Первые шаги на SQL (II)

Моделирование рынка (Часть 19): Первые шаги на SQL (II)

MetaTrader 5Тестер |
34 0
Daniel Jose
Daniel Jose

Введение

Привет, ребята, и добро пожаловать в очередную статью из серии о том, как построить систему репликации/моделирования.

В предыдущей статье «Моделирование рынка (Часть 18): Первые шаги на SQL (I)», мы начали знакомиться с первыми командами, которые можно использовать в SQL. Цель состояла в том, чтобы создать начальную базу данных для получения информации и проведения будущих поисков. Мы показали, что в MetaEditor можно использовать то же самое, что и в любой программе или скрипте SQL. Таким образом, мы также сможем использовать тот же код, только внутри исполняемого файла, созданного в MQL5. Таким образом, его можно будет запускать непосредственно из MetaTrader 5.

Однако существует команда в SQL, которая не будет работать, если мы попытаемся выполнить её с помощью MetaEditor. Она сообщит об ошибке при попытке запуска. Но я хочу четко обозначить одно: все команды SQL можно без проблем использовать в MQL5 и MetaEditor. И это связано с тем, что MetaTrader 5 использует SQLite. Хотя мы можем использовать любую команду в исполняемом файле MQL5, в MetaEditor это невозможно. Чтобы избежать недоразумений, давайте посмотрим, о какой команде идет речь.


SQL-команда, которая никогда не будет выполнена MetaEditor

Итак, теперь пришло время экспериментировать. Мы только начинаем учиться, поэтому «побочные эффекты» будут незначительными. Однако я хочу предупредить вас, что никогда не следует выполнять какие-либо SQL-команды в важной базе данных, не понимая заранее, что они делают. Если собираетесь попробовать что-то новое, делайте это как можно безопаснее, чтобы избежать неприятностей впоследствии. Как гласит пословица, вера может двигать горы, но она не восстановит ваши данные.

Давайте теперь посмотрим, что это за волшебная команда. В анимации ниже можно увидеть, о чем идет речь.

Прошу заметить, что команда DROP, когда используется в SQL, позволяет нам навсегда удалить что-либо. Если мы будем использовать эту команду, не уделяя должного внимания, у нас возникнут серьезные проблемы. Будьте внимательны к тому, что SQL не будет запрашивать у нас никакого подтверждения, а просто удалит то, что мы указали.

Однако при использовании MetaEditor файл базы данных не будет удален. Но, если мы отправим ту же команду, которая вызвала ошибку в анимации, для выполнения SQL, наш файл базы данных будет удален.

Однако вы можем ошибочно предположить, что MetaEditor отказывается выполнять команду DROP. Но, как можно было видеть в анимации, это не так, поскольку получилось удалить ранее созданную таблицу.

Возможно, вы думаете, что если мы попробуем использовать команду CREATE DATABASE в MetaEditor, то у нас это тоже не получится, как и с командой USE, и это правда. Но обе команды реализованы, но таким образом, что нам не нужно их вводить.

Однако MetaEditor не удаляет файлы из базы данных дискового устройства. Итак, есть одна разница: MetaEditor по соображениям безопасности не позволяет выполнять команду DROP DATABASE, которая в SQL означает удаление файла базы данных.

Итак, мы только продемонстрировали (и можно это проверить), что существует SQL-команда, которую MetaEditor не выполняет. За исключением данной команды, все остальные будут выполняться без сбоев. Считаю, что этим объясняется команда DROP, которая является ни чем иным, как командой для постоянного удаления чего-либо, будь то столбец, таблица или даже целая база данных. Будьте осторожны с этой командой, поскольку она не запрашивает подтверждение о том, следует ли её выполнять или нет.

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


Вставляем информацию в базу данных

Следующая команда, которую мы рассмотрим, отвечает за вставку информации в базу данных. Не советую редактировать файл базы данных вручную. Правильно всегда использовать для этого команды SQL. Неважно, маленькая ли база данных или в ней мало столбцов и данных: никогда не следует редактировать её вручную. Для этого всегда нужно использовать команды SQL.

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

Это связано с тем, что команда SQL для вставки информации в базу данных, очень похожа на создание словаря в Python. Иными словами, используется ключ и ему присваивается значение. Но здесь, в SQL, всё работает немного по-другому. Однако идея остается той же. Давайте посмотрим, как это происходит на самом деле.

Теперь мы не будем показывать эту же команду в MetaEditor. Как мне кажется, уже стало ясно, что команды, которые необходимо выполнить, будут одинаковыми. Тогда нет смысла повторять одно и то же. Чтобы упростить объяснение команды, мы используем небольшой код в SQL, который очень прост и понятен.

Посмотрите на код ниже:

01. CREATE DATABASE IF NOT EXISTS MT5_Tutor_DB;
02. USE MT5_Tutor_DB;
03. 
04. CREATE TABLE IF NOT EXISTS tb_Quotes
05. (
06.     of_day DATE,
07.     symbol CHAR(6),
08.     price DECIMAL(5, 2)
09. );
10. 
11. INSERT INTO tb_Quotes (of_day, symbol , price)
12.                VALUES ('2023-07-06', 'BOVA11' , 105.61);
13. 
14. SELECT * FROM tb_Quotes;

Скрипт на SQL

Пока что не беспокойтесь о строке 14. На данный момент она находится там только для того, чтобы мы могли увидеть результат в более простой форме. Данный код можно использовать как в MetaEditor, так и непосредственно на сервере SQL. Однако, если вы собираетесь использовать его в MetaEditor, следует иметь в виду, что строки 01 и 02 должны выполняться иначе, как мы объясняли в предыдущих статьях. В случае сомнений, найдите статьи, чтобы узнать, как действовать в MetaEditor и выполнить этот же код. Нас здесь интересуют строки 4 и 11, где мы создаем таблицу и вставляем данные, соответственно.

Несмотря на то, что данный код работает, его не следует использовать при создании базы данных. Причина заключается в том, что это позволяет бесконечно дублировать данные в базе данных. А если вы слышали о базах данных, то знаете, что в них нельзя дублировать значения. Они создаются таким образом, чтобы предотвратить подобные ситуации. Однако, даже если цель такова, если написать кода скрипта в SQL на любительском уровне, наверняка получим продублированные значения. Эта любительская форма видна в приведенном выше коде. Однако, поскольку цель здесь состоит в том, чтобы объяснить, как добавлять значения в базу данных, мы можем позволить себе принять продублированные значения и даже некоторые ошибки во время этой вставки, такие как поля со значением NULL.

Чтобы понять происходящее, прошу заметить, что в строке 04 мы создадим таблицу только в том случае, если она не существует в базе данных. Данная таблица будет иметь следующие столбцы. Сопровождающее пояснение: в строке 06 мы указываем, что нам нужна колонка, содержание которой будет представлять собой дату.

В строке 07 мы указываем, что нам нужна колонка шириной шесть символов. Так мы сможем ввести название символа, который будем хранить. Данная номенклатура следует образцу наименований символов B3 (Бразильская фондовая биржа).

В строке 08 мы указываем, что нам нужно пространство из пяти символов, два из которых будут использоваться для обозначения десятичного значения. Таким образом, мы можем вводить котировки от 0 до 999,99, что более чем достаточно для символов, торгуемых на B3. Прошу заметить, что мы не определяем никаких ключей или условий блокировки. Именно отсутствие таких условий позволяет значениям дублироваться.

Теперь посмотрим, что происходит в строке 11. Прошу заметить, что команда для вставки данных в таблицу начинается с INSERT INTO. Сразу после этого мы указываем, в какую таблицу будут внесены значения. В нашем случае, tb_Quotes, который мы только что создали. Далее мы объявляем название столбцов, которые будут принимать значения.

Теперь обратите внимание: мы можем размещать столбцы в любом порядке, но должны соблюдать те же названия, что и в таблице. Если мы введем другое название, команда выдаст ошибку. После того, как мы определили порядок столбцов, добавим слово VALUES и начнем объявлять значения, которые будут использоваться. На этом этапе мы должны разместить значения в той же последовательности, в которой были объявлены столбцы. Другими словами, если мы объявляем столбец price перед столбцом symbol, нам нужно будет скорректировать значения, чтобы цена шла перед названием символа.

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

INSERT INTO tb_Quotes (of_day, price, symbol)
               VALUES ('2023-07-06', 105.61, 'BOVA11');

Скрипт на SQL

Прошу заметить, что я изменил порядок объявления столбцов. Поэтому пришлось изменить порядок размещения значений. Это главный аспект, на который следует обратить внимание. Теперь у вас может возникнуть вопрос: почему дата указывается именно так? Причина в том, что это формат, который ожидает MySQL. То есть сначала указываем год, затем месяц и, наконец, день. Некоторые базы данных позволяют использовать другие форматы, которые будут отформатированы, как показано здесь, когда информация будет записываться в базу данных. Примером этого является SQL Server, который позволяет использовать формат день-месяц-год. В любом случае, в базе данных формат будет год-месяц-день.

Если вы запустите скрипт, показанный выше, в результате будет отображено следующее изображение.

Теперь обратите внимание: если снова выполнить строку 11, мы дублируем эту же информацию в базе данных. Результат будет таким:

Вы можете подумать, что это не проблема, что достаточно просто удалить продублированную строку. Да, достаточно просто удалить её, но сначала нужно понять, что в этом примере всё просто. Теперь представьте себе реальную базу данных: в ней может содержаться огромное количество записей. Наличие дублирующихся записей сделает базу данных полностью непригодной для использования. Кроме того, это затруднит изменения или обновления каких-либо конкретных записей. Поэтому создание базы данных требует тщательного изучения и планирования.

Хотя концептуально приведенный выше скрипт является правильным (поскольку он выполняется) он не является таковым, так как позволяет базе данных содержать продублированные данные. Кроме того, он не позволяет изменять или обновлять никакие записи. Чтобы понять это, давайте воспользуемся другим способом ввода данных в базу данных. Вместо того, чтобы объявлять все столбцы и значения за один раз, мы будем делать это по частям, что, по сути, происходит во многих сценариях. Таким образом, код для вставки тех же значений, что и в скрипте, будет выглядеть так:

01. CREATE DATABASE IF NOT EXISTS MT5_Tutor_DB;
02. USE MT5_Tutor_DB;
03. 
04. CREATE TABLE IF NOT EXISTS tb_Quotes
05. (
06.     of_day DATE,
07.     symbol CHAR(6),
08.     price DECIMAL(5, 2)
09. );
10. 
11. INSERT INTO tb_Quotes (of_day) VALUES ('2023-07-06');
12. INSERT INTO tb_Quotes (symbol) VALUES ('BOVA11');
13. INSERT INTO tb_Quotes (price) VALUES (105.61);
14.                
15. SELECT * FROM tb_Quotes;

Скрипт на SQL

Прошу заметить, что здесь мы буквально используем концепцию «ключ-значение», которая используется при создании словарей в Python. И да, мы можем сделать это в SQL, и база данных получит значения, сохранив их в указанной таблице. Однако обратите внимание на результат выполнения этого скрипта. Его можно увидеть чуть ниже:

«Но что произошло? Почему мы получили этот результат, а не предыдущий?» Для этого есть две причины. Первая заключается в том, что мы просто добавляем данные в базу данных. Вторая заключается в том, что база данных структурирована таким образом, что может дублировать значения. Если мы попытаемся изменить какую-либо запись, нам это не удастся, если наша база данных создается так, как показано в этих скриптах. Нам нужно создать какой-то способ выбора конкретной записи, чтобы иметь возможность манипулировать ею и изменять её значение. Таким образом, мы сможем вводить данные по одному в формате «ключ-значение». Но как можно это сделать?

Первый шаг — преобразовать один из этих столбцов в уникальный ключ. Это первый шаг. Таким образом, предотвратим дублирование записей в базе данных. Но важный вопрос: как лучше всего это сделать?

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

В столбце «Цена» могут быть значения, которые иногда будут разными, а иногда — одинаковыми. Поэтому, возможно, не стоит делать его единственным. Однако столбец, который содержит название символа, будет повторяться в каждой новой записи. Колонка с датой является возможным кандидатом.

Но почему «возможным», а не «кандидатом»? Причина заключается в периодичности, с которой мы будем вводить новые записи в базу данных? И почему это важно? Причина в том, что, если мы собираемся делать записи в очень короткие сроки, то нам придется создать отдельный столбец только для этого. Но если записи производятся один раз в день, то этого уже хватит.

Таким образом, если мы хотим сохранить дневную котировку символа, мы можем изменить первый скрипт, приведенный выше, следующим образом:

01. CREATE DATABASE IF NOT EXISTS MT5_Tutor_DB;
02. USE MT5_Tutor_DB;
03. 
04. CREATE TABLE IF NOT EXISTS tb_Quotes
05. (
06.     of_day DATE PRIMARY KEY,
07.     symbol CHAR(6),
08.     price DECIMAL(5, 2)
09. );
10. 
11. INSERT INTO tb_Quotes (of_day, symbol , price)
12.                VALUES ('2023-07-06', 'BOVA11' , 105.61);
13. 
14. SELECT * FROM tb_Quotes;

Скрипт на SQL

Обратите внимание, что всё, что было изменено в первом скрипте, находится именно в строке 06, где мы добавили термин PRIMARY KEY. В данный момент мы указываем, что значение столбца of_day будет первичным ключом данной таблицы. Мы можем иметь более одной колонки в качестве первичного ключа. Однако, мы НЕ МОЖЕМ ИМЕТЬ дубликаты значений в первичном ключе. Если мы попытаемся это сделать, SQL воспримет это как ошибку и команда не будет выполнена.

Таким образом, если мы попытаемся повторно выполнить команду INSERT INTO с той же датой, которая уже существует в базе данных, нам это не удастся. Необходимо будет указать другую дату, чтобы запись, которую мы пытаемся вставить, была принята SQL. Такая простейшая мера обеспечивает согласованность базы данных и предотвращает дублирование записей. Как уже говорили, одна простая мера решила целый ряд проблем.

Результат выполнения вышеуказанного скрипта показан на изображении ниже:

Прошу заметить, что она отличается от других изображений. Однако на момент запроса результат будет таким же. Естественно, вы подумаете, что теперь мы сможем вставлять данные в формате «ключ-значение» или, точнее, «столбец-значение». Да, мы можем это сделать, Тогда ваша первая идея — создать скрипт, как показано ниже:

01. CREATE DATABASE IF NOT EXISTS MT5_Tutor_DB;
02. USE MT5_Tutor_DB;
03. 
04. CREATE TABLE IF NOT EXISTS tb_Quotes
05. (
06.     of_day DATE PRIMARY KEY,
07.     symbol CHAR(6),
08.     price DECIMAL(5, 2)
09. );
10. 
11. INSERT INTO tb_Quotes (of_day) VALUES ('2023-07-07');
12. INSERT INTO tb_Quotes (symbol) VALUES ('BOVA11');
13. INSERT INTO tb_Quotes (price) VALUES (105.61);
14. 
15. SELECT * FROM tb_Quotes;

Скрипт на SQL

Помните, что данный скрипт выполняется сразу после получения значения в of_day. Таким образом, чтобы SQL не препятствовал созданию записи, мы изменяем дату. Фактически, мы используем логику и демонстрируем, что поняли, как работают первичные ключи. Однако при выполнении данного скрипта мы получаем ошибку. И, поскольку это вызывает профессиональный интерес, мы пытаемся посмотреть, что произошло в базе данных, и получим такое изображение:

Теперь можно задаться вопросом: почему возникла ошибка, если запись была создана? Причина в том, что в строке 12 мы пытаемся вставить информацию. При этом SQL попытается создать новую запись. Но подождите минутку. Почему SQL должен создавать новую запись, если я не указывал, что мы создаем новый первичный ключ? Я думал, что, пока мы используем первичный ключ, мы будем использовать ту же самую запись. На самом деле, многие люди вначале допускают такую ошибку, потому что не понимают сути концепции.

Но давайте проясним ситуацию. Когда мы используем команду INSERT INTO, мы создаем новую запись в базе данных. Однако, чтобы изменить эту запись (что именно и требуется в данном случае), необходимо использовать другую команду. Давайте теперь разделим эти вещи и рассмотрим их в другой теме.


Изменение и обновление записи

Чтобы SQL знал, какую запись изменить или обновить, нам нужен уникальный ключ, то есть первичный ключ. Поскольку мы определили значение of_day как первичный ключ, первым делом нам нужно будет попытаться добавить его в базу данных. Если он уже существует, SQL не позволит создать новую запись.

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

01. CREATE DATABASE IF NOT EXISTS MT5_Tutor_DB;
02. USE MT5_Tutor_DB;
03. 
04. CREATE TABLE IF NOT EXISTS tb_Quotes
05. (
06.     of_day DATE PRIMARY KEY,
07.     symbol CHAR(6),
08.     price DECIMAL(5, 2)
09. );
10. 
11. INSERT INTO tb_Quotes (of_day) VALUES ('2023-07-07');
12. UPDATE tb_Quotes SET symbol = 'BOVA11' WHERE of_day = '2023-07-07';
13. UPDATE tb_Quotes SET price = 105.61 WHERE of_day = '2023-07-07';
14. 
15. SELECT * FROM tb_Quotes;

Скрипт на SQL

Результат выполнения данного скрипта можно увидеть ниже:

Прошу заметить, что мы учитываем тот факт, что до выполнения вышеуказанного скрипта уже существует запись. Поэтому мы поступили именно так. Затем, в строке 11, мы создаем ключ, чтобы указать, что будем добавлять в базу данных новую запись. Как только мы создадим этот ключ, мы используем команду UPDATE следующим образом:

  1. Сразу после названия команды указываем имя таблицы.
  2. После названия таблицы следует команда SET; она указывает, что мы собираемся изменить или обновить какой-либо столбец.
  3. Далее у нас есть название столбца с соответствующим значением, которое введем в него.
  4. Чтобы SQL нашел запись, которую необходимо обновить, мы используем команду WHERE, указывая, какой ключ будет использован.

Вот ещё несколько вопросов. Но мы не будем усложнять ситуацию. Давайте сделаем всё как можно проще. Цель состоит в том, чтобы дать вам основу для использования SQL вместе с MetaTrader 5, а не проводить курс по SQL. Но я вам предлагаю ещё немного углубиться в сегодняшний материал, потому что здесь мы можем сделать гораздо больше, чтобы ускорить работу SQL и избежать его перегрузки неэффективными запросами. Здесь речь идет о дидактике, а не о эффективности.

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


Удаление записи

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

Для этого предположим следующее: вы добавили запись на 7 июля 2023 года, но потом поняли, что в этот день торгов не было. Поэтому вы хотите удалить эту запись из базы данных, поскольку недействительная запись может испортить всю базу данных. Один из способов сделать это — использовать следующий скрипт:

1. USE MT5_Tutor_DB;
2. 
3. DELETE FROM tb_Quotes WHERE of_day = '2023-07-07';
4. 
5. SELECT * FROM tb_Quotes;

Скрипт на SQL

Прошу заметить, что сначала мы выбираем базу данных в строке 01. В строке 03 мы отправляем запрос на удаление записи из базы данных. Как это было сделано? Самым простым способом. То есть сначала указываем название команды, а точнее: DELETE FROM; затем название таблицы, в которой находится запись, в данном случае tb_Quotes. Далее мы укажем, что будет удалено. Для этого мы используем команду WHERE, за которой следует информация, указывающая SQL вид искомого совпадения. В нашем случае мы используем первичный ключ дня, который мы хотим удалить из базы данных.

Чтобы завершить скрипт, в строке 05 мы просим SQL показать нам таблицу. Заметили, как просто удалить запись? Но показанный способ является лишь одним из многих возможных.


Заключительные идеи

В данной статье мы постарались максимально упростить материал. Я знаю, что есть гораздо лучшие способы сделать то же самое. Если у вас уже есть опыт и знания по программам SQL, вы хорошо знаете, что весь представленный здесь контент — это настоящая основа SQL. Для тех, кто не знает, термин «рис с фасолью» — это региональное выражение, которое используется, чтобы сказать, что нам нужен самый минимум вещей, но в тоже время и некоторое минимальное разнообразие, чтобы мы могли остаться довольными.

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

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

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

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

Подумайте об этом. До встречи в следующей статье. Есть ещё несколько моментов, которые необходимо объяснить о SQL, прежде чем мы сможем приступить к созданию чего-либо для нашей системы репликации/моделирования, используя объединение SQL и MQL5. Так что, до скорого.

Файл Описание
Experts\Expert Advisor.mq5
Демонстрирует взаимодействие между Chart Trade и советником (для взаимодействия требуется Mouse Study).
Indicators\Chart Trade.mq5 Создает окно для настройки отправляемого ордера (для взаимодействия требуется Mouse Study).
Indicators\Market Replay.mq5 Создайте элементы управления для взаимодействия с сервисом репликации/моделирования (для взаимодействия требуется Mouse Study).
Indicators\Mouse Study.mq5 Обеспечивает взаимодействие между графическими элементами управления и пользователем (необходимо как для работы системы репликации, так и на реальном рынке).
Servicios\Market Replay.mq5 Создает и поддерживает сервис репликации/моделирования рынка (основной файл всей системы).
Код VS C++ Server.cpp Создает и поддерживает сокет-сервер, разработанный на C++ (версия мини-чата).
Код на Python Server.py Создание и поддержка сокета Python для связи между MetaTrader 5 и Excel.
Indicators\Mini Chat.mq5 Позволяет реализовать мини-чат через индикатор (для работы требуется использование сервера)
Experts\Mini Chat.mq5 Позволяет реализовать мини-чат через советник (для работы требуется использование сервера).
Scripts\SQLite.mq5 Демонстрирует использование скрипта SQL с помощью MQL5
Files\Script 01.sql Демонстрирует создание простой таблицы с внешним ключом.
Files\Script 02.sql Демонстрирует добавление значений в таблицу

Перевод с португальского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/pt/articles/12927

Прикрепленные файлы |
Anexo.zip (571.71 KB)
Трейдинг с экономическим календарем MQL5 (Часть 10): Перетаскиваемая панель и hover-эффекты на кнопках Трейдинг с экономическим календарем MQL5 (Часть 10): Перетаскиваемая панель и hover-эффекты на кнопках
Мы продолжаем улучшать возможности торговли с экономическим календарем MQL5 и сегодня добавим перетаскиваемую панель, которая позволит перемещать элементы, чтобы при необходимости лучше видеть график. Также добавим эффекты при наведении курсора на кнопки, чтобы еще больше улучшить работу с панелью.
Возможности Мастера MQL5, которые вам нужно знать (Часть 67): Использование паттернов TRIX и процентного диапазона Уильямса Возможности Мастера MQL5, которые вам нужно знать (Часть 67): Использование паттернов TRIX и процентного диапазона Уильямса
Тройной экспоненциальный осциллятор скользящей средней (Triple Exponential Moving Average Oscillator, TRIX) и осциллятор процентного диапазона Уильямса (Williams Percentage Range Oscillator) — это еще одна пара индикаторов, которые можно использовать совместно в советнике MQL5. Эта пара индикаторов, как и те, которые мы недавно рассматривали, также дополняет друг друга, поскольку TRIX определяет тренд, а процентный диапазон подтверждает уровни поддержки и сопротивления. Как всегда, мы используем Мастер MQL5 для оценки потенциала индикаторов.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
Конструктор советников MQL5 (Часть 1): Простой статический шаблон Конструктор советников MQL5 (Часть 1): Простой статический шаблон
В статье разбирается пример многоцелевого шаблона торгового робота, который подойдет как для создания собственных стратегий, так и в качестве кодовой базы для работы на фрилансе. Ключевая особенность решения — торговля по барам, при этом код уже оснащен встроенными режимами усреднения, мартингейла и длительного удержания позиций. Материал будет наиболее полезен новичкам, которые хотят написать свои простые стратегии или познакомиться с распространенными торговыми техниками.