Создаём аналитический инструмент | #1
Расскажу последовательность и некоторые методы как я создаю собственные инструменты для исследования чартов котировок. Для примера, возьму вот этот простой индикатор:
Идея
Чтобы рукам покоя не было, надо иметь дурную голову. Всё начинается с замысла, идеи:
- Отследить взаимные комбинации наименьшего количества баров. Можно ли эти комбинации использовать в качестве точек для совершения сделок.
Что это будет?
В анализе и принятии решений в торговом процессе участвуют разные виды приложений. Их можно разделить на три большие группы:
- Индикаторы
- Роботы
- Утилиты
Каждая группа отличается нюансами написания кода и функциональными возможностями, поэтому важно определить, в каком виде мы хотим получить свой продукт.
Я решил, что это будет комбинация утилиты и индикатора, не автомат.
Логика процесса
В программировании изначально принято рисовать блок-схему логики работы приложения. Каюсь, я этого не делаю. Иногда пишу отправные моменты, которые надо облечь в код. Например, для вышеозвученной идеи надо выполнить следующие пункты:
- Найти на графике метку, установленную встроенными средствами торгового терминала. Берём в качестве метки - вертикальную линию.
- Сигнализировать о том, что линия (метка) найдена.
- Идентифицировать бар, который совмещается с установленной меткой.
- Сравнить параметры идентифицированного бара с параметрами предыдущего бара.
- Найти на графике другие бары соответствующие параметрам определёнными в п.4.
- Нарисовать на графике сигналы, где встречаются подобные комбинации.
- Предусмотреть функцию перерисовки сигналов при перемещении вертикальной линии на другой бар.
- Убрать все графические элементы, относящиеся к приложению, при выгрузке его из памяти терминала.
Кодописание и предпочтения
(Облекаем пункты 1 и 2 в код)
В языке программирования одна и та же задача решается разными способами. Каждый способ предполагает свои функции и оперативные возможности.
Для нашего приложения найти метку (вертикальную линию) также можно двумя путями:
- Когда устанавливаем линию на график, сразу прописываем ей имя, и по этому имени её будет находить приложение.
- Устанавливаем линию без предварительного присваивания имени, но на чистый график (т.е. на нём нет никаких других вертикальных линий). В этом случае, приложение будет искать единственную вертикальную линию.
В каждом способе есть свои плюсы и минусы. В первом случае - раздражительно и неудобно всегда прописывать название, которое должно точно соответствовать тому, что в коде.
Во втором - открывать окно нового чистого чарта, либо удалять уже имеющиеся вертикальные линии.
Я пошел вторым путём. В конце-концов, открыть новый чарт - это просто один клик мышки.
Пишем:
//----
int start() {
//---Объявляем и выводим в отдельную переменную общее количество объектов чарта
int obj_total=ObjectsTotal();
//---Объявляем переменную для приёма имени найденных объектов
string name;
//---
for(int p=0;p<obj_total+1;p++){ //Цикл перебора всех объектов чарта
name=ObjectName(p);// Приём имен объектов в переменную name
if(ObjectType(name)==OBJ_VLINE) // Если находим вертикальную линию,то
ObjectSetString(0,name,OBJPROP_NAME,"Initial Period"); //назначаем ей имя: "Initial Period"
ObjectSetInteger(0,"Initial Period",OBJPROP_COLOR,ColPeriodInitial);//перекрашиваем цвет
ObjectSetInteger(0,"Initial Period",OBJPROP_STYLE,StylePeriodInitial);//устанавливаем стиль
ObjectSetInteger(0,"Initial Period",OBJPROP_WIDTH,WidthPeriodInitial);//устанавливаем толщину
ChartRedraw();//перерисовываем чарт
}
return(0); }
//---
Модификация найденной линии по цвету, стилю и толщине, введена для визуального подтверждения, что приложение нашло её. Перед запуском функции start(), вставляем пользовательские настройки этих параметров. Их можно оперативно менять без переписки самого тела приложения:
//---Настройки пользователя при старте приложения
input color ColPeriodInitial=clrSteelBlue;//Цвет линии
input int StylePeriodInitial= 0;//Стиль линии
input int WidthPeriodInitial =0;//Толщина линии
//---
Теперь, перед запуском приложения, будут запрашиваться параметры для найденной линии. Если параметры по умолчанию устраивают, то просто запускаем код на исполнение. Если нет, то меняем и запускаем.
А вот так работает наш код написанный выше:
Рисуем вручную линию, приложение её находит, присваивает имя, меняет параметры. (В свойствах объекта можно наблюдать эти изменения)
Пункт 1 и 2 из "Логики процесса" написан и работоспособен.
Продолжение следует
* * *
Исходный код разобранный в этом посте лежит здесь: https://ru.files.fm/f/gf73xxut
(Для использования на чарте, его надо прежде скомпилировать средствами Language Editor MT4)