Главная

Статьи

Тривимірні графіки - професійний інструмент аналізу ринку

  1. Вступ Всі трейдери працюють з постійно мінливими цінами і котируваннями. Всі шукають залежності...
  2. Бібліотека generateCsv.
  3. Використання бібліотеки generateCsv.
  4. Найпростіший приклад.
  5. Висновок.

Вступ

Всі трейдери працюють з постійно мінливими цінами і котируваннями. Всі шукають залежності і закономірності. Ми досліджуємо обсяги, значення різних індикаторів і ще дуже багато чого. Не думаю, що потрібно вас переконувати, наскільки хороша мова MQL 4 для аналізу ринку. Ви просто пишете скрипт і робите висновок за результатами. Зазвичай аналіз проводиться за графіками самих котирувань або за графіками, які показують певну залежність двох змінних. Це все, звичайно, дуже добре, але іноді потрібно знайти зв'язок між трьома змінними і наочно побачити, що їх пов'язує. Для цього у всьому світі використовуються тривимірні графіки і їх аналіз. Такий підхід економить ваш час і гроші.

В цей статті ми напишемо просту бібліотеку для створення тривимірних графіків і подальшого їх перегляду в Microsoft Excel. Ми скористаємося стандартними можливостями мови MQL 4 для підготовки і експорту даних в файл формату * .csv.

Що таке формат * .csv?

Це текстовий файл, в якому розміщується послідовність значень розділених заданим роздільником, в нашому випадку крапкою з комою - ";". Щоб сформувати таблицю, достатньо записати кілька рядків коду. Краса цього формату в тому, що він легко розпізнається і інтерпретується у вигляді таблиці програмою Microsoft Excel. А вже в ній ми можемо на основі отриманих даних легко створити тривимірний графік і зайнятися його аналізом.

Бібліотека generateCsv.

Для того, щоб просто і швидко виводити дані, ми створимо бібліотеку. Отже, створіть нову бібліотеку і вставте наведений код, збережіть під назвою generateCsv.mq4 в папці "... MetaTrader \ experts \ libraries". Після цього скомпілюйте бібліотеку.

#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved" #property link "[email protected]" #property library string PrepareString (string s) {bool exit = false; int index = 0; string str = s; while (! exit) {index = StringFind (str, ".", index); if (index> - 1) str = StringSetChar (str, index, ','); else exit = true; } Return (str); } Int GenerateCsv (string fileName, int arraySizeX, int arraySizeY, double arrayIndexX [], double arrayIndexY [], double arrayZ [] []) {int handle = FileOpen (fileName, FILE_CSV | FILE_WRITE, ''), x, y; string str; if (handle1) {Print ( "Error:", GetLastError ()); return (handle); } Else {str = ";" ; for (x = 0; x <arraySizeX; x ++) {str = str + arrayIndexX [x]; str = str + ";" ; } FileWrite (handle, PrepareString (str)); for (y = 0; y <arraySizeY; y ++) {str = ""; str = str + arrayIndexY [y] + ";" ; for (x = 0; x <arraySizeX; x ++) {str = str + arrayZ [x, y]; str = str + ";" ; } FileWrite (handle, PrepareString (str)); }} FileClose (handle); return (handle); }

Тепер створіть новий заголовки для доступу до функцій бібліотеки під назвою generateCsv.mqh, вставте туди наведений код і збережіть в папці "... MetaTrader \ experts \ include".

#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved" #property link "[email protected]" #import "generateCsv.ex4" string PrepareString (string s); int GenerateCsv (string fileName, int arraySizeX, int arraySizeY, double arrayIndexX [], double arrayIndexY [], double arrayZ [] []);

Ця проста бібліотека складається з двох функцій. Розглянемо призначення кожної з них. Перша функція PrepareString призначена для заміни в рядку точок на коми. Справа в тому, що під час запису даних в файл за допомогою стандартної функції FileWrite використовується точка при поділі цілої і дробової частини числа. Це є неприпустимим в нашому випадку, так як Microsoft Excel розпізнає дробові числа тільки в тому випадку, якщо вони розділені коми. Тому при виведенні даних в файл * .csv здійснюється виклик цієї функції в тілі функції GenerateCsv. Єдиний параметр функції є рядок, в якій слід замінити точки на нулі. Значення, що повертається - новий рядок, яка вже без точок. Пам'ятайте, що цю функцію не потрібно ніде викликати, це робить друга функція автоматично, коли потрібно.

Функція GenerateCsv служить для виведення даних в форматі * .csv в файл. Розглянемо її параметри:

int GenerateCsv (string fileName, int arraySizeX, int arraySizeY, double arrayIndexX [], double arrayIndexY [], double arrayZ [] []);

  • stringfileName - назва файлу для виведення, не забудьте вказати формат * .csv;
  • intarraySizeX - ширина масиву з даними;
  • int arraySizeY - висота масиву з даними;
  • double arrayIndexX [] - масив значень першої змінної;
  • double arrayIndexY [] - масив значень другої змінної;
  • double arrayZ [] [] - двомірний масив значень третьої змінної;

Щоб зрозуміти призначення кожного параметра, погляньте на малюнок:

Отже, все що вам потрібно мати, щоб вивести дані, це три масиву значень для кожної змінної. Тепер давайте подивимося, як все це працює.

Використання бібліотеки generateCsv.

Створіть новий скрипт з ім'ям 3dGraphicOut і вставте туди наведений код.

#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved" #property link "[email protected]" #include <generateCsv.mqh> #define ARRAY_SIZE_X 16 #define ARRAY_SIZE_Y 16 int start () {int x, y; double arrayIndexX [ARRAY_SIZE_X]; double arrayIndexY [ARRAY_SIZE_Y]; double arrayZ [ARRAY_SIZE_X, ARRAY_SIZE_Y]; for (x = 0; x <ARRAY_SIZE_X; x ++) arrayIndexX [x] = x / 10.0; for (y = 0; y <ARRAY_SIZE_Y; y ++) arrayIndexY [y] = y / 10.0; for (x = 0; x <ARRAY_SIZE_X; x ++) for (y = 0; y <ARRAY_SIZE_Y; y ++) arrayZ [x, y] = MathSin (arrayIndexX [x] + arrayIndexY [y]); GenerateCsv ( "test.csv", ARRAY_SIZE_X, ARRAY_SIZE_Y, arrayIndexX, arrayIndexY, arrayZ); return (0); }

Це стандартний шаблон, з якого повинен починатися будь-який тривимірний графік. Розглянемо кожен рядок окремо:

#include <generateCsv.mqh>

Підключаємо бібліотеку generateCsv.

#define ARRAY_SIZE_X 16 #define ARRAY_SIZE_Y 16

Тут ми визначаємо розмірність таблиці для виведення: ARRAY_SIZE_X - ширина таблиці, ARRAY_SIZE_Y - висота.

int x, y;

Це два індексу масивів. Так як вони використовуються неодноразово, то я їх виніс з тіла циклів.

double arrayIndexX [ARRAY_SIZE_X];

Це масив значень першої змінної. Припустимо, ви досліджуєте вплив двох індикаторів на прибуток. Тоді значення першого індикатора будуть розміщені в цьому масиві. Пам'ятайте, що потрібно починати з якогось початкового значення, наприклад, з нуля і поступово збільшувати його з певним кроком, наприклад, 0,5.

double arrayIndexY [ARRAY_SIZE_Y];

Значення другого індикатора повинні бути розміщені в цьому масиві. Також виберіть відповідне початкове значення і крок.

double arrayZ [ARRAY_SIZE_X, ARRAY_SIZE_Y];

А тут вже повинні бути значення прибутку в залежності від значень індикаторів. Ще раз подивіться на наведений вище малюнок, що б зрозуміти, що це за масиви.

Зверніть увагу, що тип масивів - double. Це зроблено для універсальності. Якщо ви використовуєте в якості значень елементів масиву цілі числа (int), то нічого страшного в цьому немає, адже в MQL 4 є неявне перетворення типів.

for (x = 0; xARRAY_SIZE_X; x ++) {}

У цьому блоці заповнюємо масив першої змінної значеннями, пам'ятайте, що вони повинні збільшуватися з певним кроком.

for (y = 0; y <ARRAY_SIZE_Y; y ++) {}

Теж саме для другої змінної.

for (x = 0; x <ARRAY_SIZE_X; x ++) {for (y = 0; y <ARRAY_SIZE_Y; y ++) {}}

А це найцікавіше місце в усьому шаблоні: заповнюємо двомірний масив значеннями в залежності від двох інших змінних.

GenerateCsv ( "test.csv", ARRAY_SIZE_X, ARRAY_SIZE_Y, arrayIndexX, arrayIndexY, arrayZ);

І нарешті виводимо дані в файл для подальшого аналізу в Microsoft Exсel. Тепер збережіть цей шаблон для подальшого використання.

Найпростіший приклад.

Розглянемо найпростіший приклад використання бібліотеки. Я спеціально не писав приклад пов'язаний з торгівлею, щоб зробити код максимально простим і доступним.

#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved" #property link "[email protected]" #include <generateCsv.mqh> #define ARRAY_SIZE_X 16 #define ARRAY_SIZE_Y 16 int start () {int x, y; double arrayIndexX [ARRAY_SIZE_X]; double arrayIndexY [ARRAY_SIZE_Y]; double arrayZ [ARRAY_SIZE_X, ARRAY_SIZE_Y]; for (x = 0; x <ARRAY_SIZE_X; x ++) arrayIndexX [x] = x / 10.0; for (y = 0; y <ARRAY_SIZE_Y; y ++) arrayIndexY [y] = y / 10.0; for (x = 0; x <ARRAY_SIZE_X; x ++) for (y = 0; y <ARRAY_SIZE_Y; y ++) arrayZ [x, y] = MathSin (arrayIndexX [x] + arrayIndexY [y]); GenerateCsv ( "test.csv", ARRAY_SIZE_X, ARRAY_SIZE_Y, arrayIndexX, arrayIndexY, arrayZ); return (0); }

Збережіть тестовий скрипт, відкомпілюйте і запустіть в терміналі. Тепер загляньте в папку "... MetaTraider \ experts \ files \", там з'явиться файл "test.csv", відкрийте його за допомогою Microsoft Excel. Файл буде перетворений в двомірну таблицю, як показано нижче:

Тепер виділіть всі комірки (CTRL + A) і зайдіть в Insert -> Chart (ALT + I, H):

Після цього виберіть Chart Type -> Surface, Chart sub-type -> 3D-Surface і натисніть Finish:

Після цих дій з'явиться тривимірний графік:

Висновок.

Вам став доступний зручний інструмент для швидкого експортування даних з торговельного термінала MetaTrader в програму Microsoft Excel для швидкої побудови тривимірних графіків і їх подальшого аналізу. Тепер ви маєте можливість аналізувати залежності і закономірності валютного ринку Forex між трьома змінними одночасно. Спробуйте проаналізувати тривимірні гістограми залежності прибутку від таких параметрів як TakeProfit і StopLoss або подивіться як виглядає графік залежності обсягів від поточного дня тижня і години. Думаю ви знайдете багато цікавих і корисних закономірностей.


Переклад з англійської проведений MetaQuotes Software Corp.
Оригінальна стаття: https://www.mql5.com/en/articles/1443

Csv?

Новости