Блог им. hobbit

Ч9. Выборка, это тоже диверсификация, только еще более эффективная

Тенденция — это, попросту говоря, направление рыночного движения.… Рынки зачастую движутся между двумя параллельными линиями

Джон Мэрфи

Алгоритмические стоп-лоссы и тейк-профиты всегда можно визуализировать. То же можно проделать и с другими алгосигналами открытия и закрытия. Главное преимущество человека над торговым роботом — визуальное восприятие картинки торгов, как текущей, так и в прошлой истории. Так почему бы этим не воспользоваться?

Как-то упоминал о своем любимом индикаторе SavMeter, основанном на линиях двух SAR. Одна линия — трендовая. По ней открывается позиция. Другая, более быстрая, — замена трейлинг-стопа. При ее пробитии, позиция закрывается. Глядя на историю можно легко отрегулировать расстояние линий так, чтобы не было слишком много ложных сигналов. Это проще и быстрее, чем гонять тестера на истории.

Что особенно важно, индикатор SavMeter несет в себе эффект синергии. Объединяет сразу несколько инструментов. Объединенный график становится более сглаженными, это тоже уменьшает ложные сигналы. Корректировать параметры на одном графике проще, чем заниматься оптимизацией на графиках каждого отдельного инструмента.

Получается, синергия — более эффективная диверсификация. Среднегодовая доходность SavMeter на часовых фьючерсах на истории у меня всегда превышала 200%. На спотовом рынке получается в 5 раз меньше. Приблизительно 40%. Но есть еще более эффективный способ получения дохода.

Однажды меня заинтересовал блог AlexChi на Смартлабе. Он предлагает достаточно простую систему (BWS) выборки акций на недельном моменте. Система позволяет обогнать индекс. Нечто похожее, с сортировкой в таблице, я уже встречал. Не помню иностранного автора. Решил проверить. Действительно. На 4х-часовых фьючерсах доходность увеличилась в 1.5-2 раза больше, чем давал индикатор SavMeter, настроенный на одни и те же инструменты. Но прежде нужно было править LbotTest.

О новых свежих возможностях 2025. Они достаточно принципиальны, как и 3D. Речь идет об использовании внешних функций. Раньше, язык Lbot был замкнутым. Закрытым для сложных внешних алгоритмов и расчетов. Сейчас таких проблем нет. Фактически, можно расширять и развивать Lbot дальше по своему усмотрению, не вторгаясь во внутренности LbotTest_2025 и Lbot3D_2025. Для расширения нужно только знать язык Qlua (Lua для QUIK).

Пример использования внешней функции best34() на языке Lbot.

OpenLong = {best34(), 1} >= 29
CloseLong = {best34(), 1} < 29
OpenShort = {best34(), 1} <= -29
CloseShort = {best34(), 1} > -29

По правилам выше, позиция открывается в лонг только у тех инструментов, которые входят в шестерку сильнейших. Имеют вес от 29 до 34. Более сильный получает больший вес (больший номер). Критерием выборки может быть индикатор RSI. Ниже пример такой функции best34(). Код требуется поместить в файл LbotExternal.lua (внутри нового дистрибутива). Робот выбирает лучшие на данный момент инструменты из заранее заданных 34х в массиве TGS.

------------------------------------------------------------------
local getCBar = getConcBar

-- Выборка лучшего инструмента по RSI (*_h4_r)
local TGS = { 'Si_h4_r', 'CR_h4_r', 'Eu_h4_r', 'GL_h4_r', 'BR_h4_r', 'NA_h4_r', 'RI_h4_r', 'MM_h4_r', 'NG_h4_r', 'GD_h4_r'
, 'SV_h4_r', 'SF_h4_r', 'ED_h4_r', 'SR_h4_r', 'GZ_h4_r', 'RN_h4_r', 'SN_h4_r', 'LK_h4_r', 'VB_h4_r', 'YD_h4_r'
, 'TI_h4_r', 'MN_h4_r', 'ME_h4_r', 'GK_h4_r', 'TT_h4_r', 'AL_h4_r', 'PZ_h4_r', 'AF_h4_r', 'NK_h4_r', 'AK_h4_r'
, 'MT_h4_r', 'PI_h4_r', 'CH_h4_r', 'VK_h4_r' }
local MEDIUM = 17
function best34(id, tag, line, index)
    local tg = tag .. '_r'
    local n = getNumCandles(tg)
    if n == 0 then
        message('best34() ОШИБКА Отсутствует график ' .. tg, 3)
        return 0
    end
    local b, n = getCandlesByIndex(tg, line, index - 1, 1)
    if n ~= 1 then
        message('best34() ОШИБКА Отсутствует значение №' .. index .. ' графика ' .. tg, 3)
        return 0
    end
    b = b[0]
    local c = b.close
    local rate = 1
    local exists
    local p, k = 0, 0
    if c > 50 then
        p = p + 1
    elseif c < 50 then
        k = k + 1
    end
    index = index - 1
    for _, tg1 in pairs(TGS) do
        if tg1 and tg1 ~= tg then
            local b1 = getCBar(tag, index, tg1, line)
            if b1 then
                local c1 = b1.close
                if c1 > 50 then
                    p = p + 1
                elseif c < 50 then
                    k = k + 1
                end
                exists = true
                if c > c1 then
                    rate = rate + 1
                end
            end
        end
    end
    assert(exists, 'best34() ОШИБКА Отсутствуют сравниваемые значения для графика ' .. tg)
    local rm
    if p >= MEDIUM then
        rm = p
    elseif k <= MEDIUM then
        rm = -k
    else
        rm = 0
    end
    if rm < 0 then
        rate = rate - #TGS - 1
    end
    return rate
end

Продолжение следует. Пожалуйста, ставьте лайки, чтобы поддержать проект.

Начало здесь

Тестер для конструктора роботов Lbot3D. Ч1. Нужна обратная связь

Ч2. Как все начиналось (из истории трейдера и программиста)

Ч3. В начале все стратегии были приведены к одной общей формуле

Ч4. Расшифровка торговой формулы E=#X%VD

Ч5. Пример расчета потерь при торговле на нескольких таймфреймах

Ч6. Оптимальное распределение активов при торговле фьючерсами

Ч7. Первое время, сама торговля для меня была тестированием

Ч8. Роботам недостаточно одного теста, тем более без добавок и низкого качества



★2

теги блога Хоббит

....все тэги



UPDONW
Новый дизайн