среда, 25 марта 2020 г.

Индикатор спреда в МТ5/МТ4 от Ранна

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










Далее идете Меню - Файл - Создать
В открывшемся окне выбираете Советник (шаблон) и кнопку Далее



















Придумываете название советнику и Далее
Затем в следующих окнах никакие галки не ставите, Далее и Готово



























Открывается редактор с готовым шаблоном для советника
В нем есть раздел свойств вверху (они никакой особой нагрузки не несут) и три функции:
int OnInit()
void OnDeinit(const int reason)
void OnTick()
В OnInit пишется код, который надо выполнить при старте советника, когда вы его присоединяете к графику (мы оставим пустым)
В OnDeinit пишется код, который надо выполнить при остановке советника, когда вы его удаляете или закрываете график (его мы тоже оставим пустым)
А вот OnTick это, как раз то, что нам понадобится. В этом разделе пишется код, который выполняется с приходом каждого тика.
Логика советника будет такая:
С приходом каждого тика мы будем брать Бид и Аск, вычитать Бид из Аска, итоговое значение класть в переменную spread и будем выводить эту переменную на экран.
Т.к. вы еще скорее всего пока не читали никакие учебники по С++, я вам просто скажу как факт, что переменную spread сперва надо объявить (система должна выделить под нее кусочек памяти в компьютере), только тогда с ней можно будет работать. Делается это строкой:

double spread;

Которая пишется в самом верху код (обычно под свойствами, хотя свойства можно вообще удалить, ничего страшного не будет).














Про типы переменных вы тоже пока не читали, поэтому скажу, что double говорит о том, что число будет с плавающей точкой (короче дробное, с большим количеством знаков после запятой).
Далее в рамках функции OnTick мы сперва получаем значение спред и присваиваем его переменной spread:

spread=Ask-Bid;











Т.к. спред у нас получится маленькое дробное число, мы его должны привести в целому числу.
Например, если инструмент у нс EURUSD, то он имеет 5 знаков после запятой. В этом случае нам надо умножить спред на 100000. Тогда мы получим число не 0.00001, а 1.


spread=(Ask-Bid)*100000;
Но тут есть тонкость. Т.к. у всех инструментов разное количество знаков после запятой, то нам нужен способ это учитывать.
Для этого есть предопределенная переменная Point, которая знает сколько у инструмента знаков. В случае с EURUSD это она будет 0.00001, и нам достаточно разделить на нее:

spread=(Ask-Bid)/Point;











Теперь выводим значение переменной на экран, с комментарием, что это текущий спред:


Comment(" Текущий спред по инструменту: ", spread);










Но, как мы видим, цифра выглядит некрасиво.




















Теперь нам надо сделать ее красивой. Мы ее округлим. Для этого можно использовать функцию округления round(), которая приводит число к целому значению. Либо можем ее нормализовать с помощью функции NormalizeDouble(), которая может округлять к точности с заданным количеством знаков после запятой, вот ей и воспользуемся. Количество знаков возьмем ноль:


spread=NormalizeDouble((Ask-Bid)/Point,0);
В скобках указываем значение, которое нужно округлить и через запятую количество знаков после запятой.
Код готов. Теперь его надо скомпилировать (это перевод кода из понятного программисту, в понятный для компьютера).
Для этого есть специальная кнопка
Теперь идете в терминал, находит своего советника и прикрепляете его к графику.
В МТ5 синтаксис немного отличается. На мой взгляд там уже все немного посложнее, но и возможности больше.
В МТ5 для получения текущих цен надо использовать структуру MqlTick и функцию SymbolInfoTick
MqlTick получается основные данные по инструменту,  SymbolInfoTick их нам выдает.

Обработчиком будет являться  OnTick

Комментариев нет:

Отправить комментарий