Ай да Пушкин, ай да сукин сын.
Суперовая статейка. Настоящий эндоскоп.
Обязательно буду пользовать в больших проэктах. А то сутками паришься где ошибка.
Дебагер хорошо, но трассировка даёт полное представление о прохождении сигнала.
Пожалуйста, старался для вас. :)
Планирую сопровождать и постараться расширить функционал в этой системе. Если будет необходимость в чем то, то пишите.
-----
Для полной ясности думаю надо сказать еще про такие два чисто технических момента.
1. В файле Trace.mqh создается единственный экземпляр трассировщика (внизу файла).
extern CTraceCtrl* m_trace; // единственный экземпляр трассировщика
благодаря директиве extern экземпляр будет только один. То есть не зависит сколько в подключаемых файлах #include "Trace.mqh"
2. Класс CTraceView используется в CTraceCtrl только по одной единственной причине - отработка функции CTraceCtrl::Break.
А именно для наличия реакции на пользовательские клики в зацикленном while (true)
Добавлена обработка макроса __PATH__ (билд 420), в связи с чем обновлены все классы.
В INFO окно вынесена кнопка открытия файла узла.
Открытие выполняется командой ShellExecute, поэтому для работы классов необходимо разрешение импорта DLL
добавлен функционал для добавления описания узла.
теперь в макросах _IN есть возможность добавлять дополнительное описание, например для вывода условий входа в узел или некоторой актуальной информации.
Это описание динамично обновляется в отображении дерева.
Пример кода:
void OnTick() { _IN(""); static datetime limit_time=0; // last trade processing time + timeout //--- don't process if timeout if(TimeCurrent()>=limit_time) { _IN2(TimeCurrent()+">="+limit_time); //--- check for data if(Bars(Symbol(),Period())>2*InpMATrendPeriod) { _IN3(Bars(Symbol(),Period())>2*InpMATrendPeriod); //--- change limit time by timeout in seconds if processed if(ExtExpert.Processing()) limit_time=TimeCurrent()+ExtTimeOut; } } //--- }
Пример как будет выглядеть информация
Кнопка активации показа описания - сверху справа "i"
1. Добавлен отдельный класс CPropertyView для отоборажения свойств узла.
2. Все переопределяемые функции у классов сделаны как virtual, в связи с чем обновлены все классы.
3. Добавлены два новых свойства в класс CNode.
m_edit - признак редактируемого поля в CPropertyView
m_brkuse - число обращения к узлу, при котором происходит остановка и вызов функции CTraceCtrl::Break
3. По заметкам Urain на форуме добавлены две возможности использования остановки кода.
- включение/отключение остановок (красная кнопка D)
- остановка по указанному числу вызова узла
а. Задание начального числа m_brkuse в узле может производится с помощью макроса (в файле Trace)
#define _BRKUSES(u) if (!NIL(m_trace)) if (!NIL(m_trace.m_cur)) ........
b. Или непосредственно в окне свойств узла в поле "DebugBreak после", в котором указывается требуемое число вызовов до остановки
CHARTEVENT_CLICK
CHARTEVENT_KEYDOWN
CHARTEVENT_OBJECT_DELETE
CHARTEVENT_OBJECT_CHANGE
CHARTEVENT_OBJECT_CREATE
5. Мелкие косметические правки в отображении деревьев
А можно как-нибудь этот механизм использовать в скриптах?
думаю да. Но обычно в скриптах код не разветвлен сильно (если конечно скрипт не в цикле).
К тому же есть неудобство - в скриптах не обрабатывается событие OnChartEvent.
думаю да. Но обычно в скриптах код не разветвлен сильно (если конечно скрипт не в цикле).
К тому же есть неудобство - в скриптах не обрабатывается событие OnChartEvent.
А если мой скрипт использует много разных классов, иерархий классов?
Думаю, что нужно заточить инструмент и под скрипты...
классу СTraceView все равно кто его вызывает. Дерево он сделает и отобразит.
Но у скриптов нерешаемая проблема в обратной связи. Активно работать с деревом не получится.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Трассировка, отладка и структурный анализ кода:
Автор: Alex Sergeev