Новая версия платформы MetaTrader 5 build 3490: мобильная версия веб-терминала и новые методы матриц в MQL5 - страница 3

 

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

К примеру пользователь торгует средним объемом 1 лот по инструменту довольно продолжительное время и тут по неосторожности пролетает у него вместо одного лота сто лотов. Конечно система должна спрашивать в таком случае вы действительно хотите открыть 100 лотов при средней работе 1-2 лота?  (тот самый фат фингер) ))

Или дать писать код для кнопок это самое лучшее решение. 

 
MetaQuotes:
  1. MQL5: Добавлены методы векторов и матриц CopyTicks и CopyTicksRange. Они позволяют легко копировать массивы тиковых ценовых данных в векторы и матрицы.
    Тип копируемых данных указывается в параметре flags при помощи перечисления ENUM_COPY_TICKS. Доступны следующие значения:
    При выборе нескольких типов данных (доступно только для матриц) порядок строк в матрице будет соответствовать порядку значений в перечислении.

  2. MQL5: Расширены возможности методов matrix::Assign и vector::Assign.

    Теперь матрице можно назначить одномерный массив или вектор:
    Результатом будет однострочная матрица.а

    Также вектору теперь можно назначить матрицу (будет выполнено сглаживание матрицы):
  3. MQL5: Добавлены методы Swap для векторов и матриц.
    Каждый массив, вектор или матрица ссылаются на буфер памяти, который содержит элементы данного объекта. Метод Swap фактически меняет местами указатели на данные буферы, не проводя записи элементов в памяти. Поэтому матрица остается матрицей, а вектор вектором. При обмене матрицы и вектора вы получите однострочную матрицу с элементами вектора и вектор с элементами матрицы в плоском представлении (смотрите метод Flat).
    Метод Swap также позволяет работать с динамическими массивами (массив фиксированного размера в качестве параметра передавать нельзя). При этом массив может быть любой размерности, но согласованного размера. Это означает, что общий размер матрицы или вектора должен быть кратен нулевой размерности массива. Нулевой размерностью массива называется количество элементов, которые содержатся по первому индексу массива. Например, для динамического трехмерного массива double array[][2][3] нулевой размерностью будет произведение размеров второго и третьего измерения, то есть 2x3=6. Значит, такой массив можно использовать в методе Swap только с матрицами и векторами, общий размер которых кратен 6: 6, 12, 18, 24 и т.д.

Это всё безусловно хорошо!

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

 

Возможно ошибка стандартной библиотеки

Заголовок задавался красным и некоторые другие элементы красным, но итог синий.

Код 

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#include <Graphics/Graphic.mqh>
CGraphic* Graphic = new CGraphic;
const string Name = "Graphic";// + (string)(GetTickCount() + MathRand());
int t = 0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void GetPrices(double &Bids[], double &Asks[], const int Count = 100)
  {
// MqlTick Ticks[];
// const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
   t++;
   ArrayResize(Bids, t);
   ArrayResize(Asks, t);
   Bids[t - 1] = rand();
   Asks[t - 1] =  rand();
//for(int i = 0; i < Amount; i++)
//  {
//   Bids[i] = Ticks[i].bid - _Point * 100;
//   Asks[i] = Ticks[i].ask;
//  }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void GraphTicks(const double &Price1[], const double &Price2[])
  {
   Graphic.Destroy();
   delete Graphic;
   Graphic = new CGraphic;
// ------------
   Graphic.Create(0, Name, 0, 10, 40, (int)(ChartGetInteger(0, CHART_WIDTH_IN_PIXELS)), (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS));
// ------------
   Graphic.BackgroundMain("Заголовок");   // Получить/установить текст заголовка графика
   Graphic.BackgroundMainSize(30);        // Получить/установить размер шрифта заголовка
   Graphic.BackgroundMainColor(clrRed);   // Получить/установить цвет заголовка графика     БАГ <<<<<<<<
// ------------
   Graphic.BackgroundSub("Под Заголовок"); // Получить/установить текст заголовка графика
   Graphic.BackgroundSubSize(30);          // Получить/установить размер шрифта заголовка
   Graphic.BackgroundSubColor(clrRed);     // Получить/установить цвет заголовка графика    БАГ <<<<<<<<
// ------------
   Graphic.GridLineColor(clrGray);         // Получить/установить цвет линий сетки          БАГ <<<<<<<<
   Graphic.GridBackgroundColor(clrLightGray);  // Получить/установить цвет фона сетки
// ------------
   Graphic.GridCircleRadius(1);           // Получить/установить радиус точек в узлах сетки
   Graphic.GridCircleColor(clrRed);       // Получить/установить радиус точек в узлах сетки
   Graphic.GridHasCircle(true);           // Получить/установить флаг отрисовки точек в узлах сетки
// ------------
   Graphic.HistoryNameWidth(200); // Получить/установить максимально допустимую длину для отображения имени кривой
   Graphic.HistoryNameSize(18); // Получить/установить размер шрифта имени кривой
   Graphic.HistorySymbolSize(20); // Получить/установить размер символов условных обозначений
// ------------
   Graphic.TextAdd(80, 80, "Привет", clrBlue, 0);
// ------------
   Graphic.CurveAdd(Price1, clrBlue, CURVE_LINES, "Первая");
   Graphic.CurveAdd(Price2, clrGreen, CURVE_LINES, "Вторая");
// ------------
   Graphic.CurvePlotAll();
   Graphic.Update();
   Graphic.Redraw();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   double Bids[], Asks[];
   GetPrices(Bids, Asks);
   GraphTicks(Bids, Asks);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Graphic.Destroy();
   delete Graphic;
   ChartRedraw();
  }
//+------------------------------------------------------------------+

Результат

 
Vladimir Pastushak #:

Возможно ошибка стандартной библиотеки

Заголовок задавался красным и некоторые другие элементы красным, но итог синий.

Код 

Результат

Нужно сделать преобразование цвета, посмотрите статью https://www.mql5.com/ru/articles/2866

   curve.PointsColor(ColorToARGB(clrRed,255));
Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R
Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R
  • www.mql5.com
При исследовании и изучении закономерностей важную роль играет визуальное отображение с помощью графиков. В популярных среди научного сообщества языках программирования, таких как R и Python, для визуализации предназначена специальная функция plot. С её помощью можно рисовать линии, точечные распределения и гистограммы для наглядного представления закономерностей. В MQL5 вы можете делать всё то же самое с помощью класса CGraphics.
 
В Алерт, добавьте цвет, текста. Одним шрифтом в одном цвете, плохо читается и воспринимается.  Также удаление старых сообщении перед отправкой алертом новых.   Работа такова что нужно быстро получить информацию а не искать её среди сообщении. Трейдера знают примерно какая информация выйдет, из новостей, если значение вывести красным текстом а остальное черным то получение  информации будет удобней. 
 
void OnDeinit( const int )
{
  A::OnDeinit(); // Просьба в этом месте сделать правильный переход по ALT+G.
}

class A
{
public:
  static void OnDeinit() {} // Сюда.
};
Строка для поиска: Uluchshenie 047.
 
fxsaber #:
Строка для поиска: Uluchshenie 047.
+1
 
BillionerClub #:

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

К примеру пользователь торгует средним объемом 1 лот по инструменту довольно продолжительное время и тут по неосторожности пролетает у него вместо одного лота сто лотов. Конечно система должна спрашивать в таком случае вы действительно хотите открыть 100 лотов при средней работе 1-2 лота?  (тот самый фат фингер) ))

Или дать писать код для кнопок это самое лучшее решение. 

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

Все кто мало-мальски выходит на про-уровень, торгуют с использованием советников-помощников. И как раз такой ЕА обеспечивает защиту от операционных рисков.

Посмотрите на сайте статьи на эту тему, н-р "Инструментарий для быстрой ручной торговли".

Инструментарий для быстрой ручной торговли: Базовый функционал
Инструментарий для быстрой ручной торговли: Базовый функционал
  • www.mql5.com
На текущий момент всё больше трейдеров переходят на автоматические системы торговли, которые либо требуют начальную настройку, либо часть из них уже полностью автоматизированы. Тем не менее остается немалая часть трейдеров, которые торгуют руками по старинке. В данной статье создадим набор инструментов для быстрой ручной торговли с помощью горячих клавиш и выполнения типичных торговых действий в один клик.
 
fxsaber #:

Ошибка в работе функции CalendarValueHistory: не производит фильтрацию событий по заданной валюте.


Результат.

На b2958 отрабатывает правильно.

Строка для поискаOshibka 048.

Спасибо, исправлено

 

Вообще возможно перенести график не используя верхнюю границу с тремя кнопками?  а эту границу убрать когда она не нужна