Блог им. empenoso

Раздельное тестирование на скриптовом языке TradingView выходов торговой системы: обычный трейлинг стоп и ATR стоп

В трейдинге акцент часто смещён в сторону поиска идеальных входов, тогда как стратегии выхода остаются в тени. Между тем именно выходы определяют соотношение прибыли и убытков. Раздельное тестирование помогает изолировать входы и оценить, как разные методы управления позицией влияют на результат. В этой статье входы будут выполняться с 50% вероятностью — это устраняет фактор предсказуемости и позволяет объективно сравнивать эффективность различных стратегий выхода.

В статье тестирую две стратегии трейлинг-стопов для Московской биржи на фьючерсном контракте USD/RUB (Si) на часовом таймфрейме, используя язык Pine Script в TradingView.

 Под капотом Pine Script: как устроен и для чего используется язык TradingView

Цель исследования и описание общего подхода

Главный вопрос исследования — какой метод трейлинг-стопа показывает лучшие результаты при одинаковых входах: фиксированный процентный или адаптивный ATR? Простой трейлинг-стоп строго ограничивает риск, но полностью игнорирует рыночную волатильность. В отличие от него, ATR-трейлинг, основанный на значении среднего истинного диапазона, автоматически подстраивается под текущие колебания рынка и способен удерживать прибыль в затяжных трендах.

Цель тестирования — проверить, действительно ли адаптивный подход оказывается эффективнее на волатильном рынке фьючерса Si, благодаря способности гибко реагировать на изменчивую динамику цены.

Для сравнения двух методов применяются одни и те же условия: используется фьючерсный контракт Si (USD/RUB) с часовым таймфреймом, комиссия составляет 0,04% на сделку, учитывается проскальзывание в размере 10 тиков, а торговля ведётся одним контрактом.

Обзор первой стратегии: простой трейлинг-стоп

Стратегия использует фиксированный процентный трейлинг-стоп. После случайного входа (лонг или шорт с 50% вероятностью каждые 24 часа) стоп-уровень постоянно пересчитывается для лонга: от максимальной достигнутой цены, для шорта: от минимальной достигнутой цены.

Основная идея в коде:

<code class="javascript">// Установка начального стопа при входе
trailingStopLong := close * (1 - trailingStopOffset / 100)

// Обновление стопа для лонга
highestLongPrice := math.max(highestLongPrice, close)
trailingStopLong := highestLongPrice * (1 - trailingStopOffset / 100)</code>
Раздельное тестирование на скриптовом языке TradingView выходов торговой системы: обычный трейлинг стоп и ATR стоп

Преимущества:

  • Простота реализации и понимания

  • Предсказуемый фиксированный риск

  • Хорошо работает в трендах

Недостатки:

  • Не адаптируется к волатильности рынка

  • Может преждевременно закрывать позиции при повышенной волатильности

  • Требует ручной настройки параметра под каждый инструмент

Полный код ниже (вся коллекция на GitHub):

<code class="javascript">// === Описание стратегии ===
// Эта стратегия основана на случайных входах в рынок с использованием простого трейлинг-стопа для управления рисками.
// Основные особенности:
// 1. Случайные входы: Стратегия совершает входы в длинные (Long) или короткие (Short) позиции с заданной вероятностью
//    каждые N баров. Частота входов регулируется параметром "Частота входов (каждые N баров)".
// 2. Генерация направлений: Для определения направления входа используется генератор случайных чисел. 
//    Если случайное значение меньше установленной вероятности входа в Long, открывается длинная позиция, иначе — короткая.
// 3. Простой трейлинг-стоп: После входа в позицию устанавливается трейлинг-стоп на заданном расстоянии в процентах от цены.
//    Трейлинг-стоп обновляется при движении цены в благоприятную сторону, защищая прибыль и минимизируя убытки.
// 4. Гибкость настроек: Пользователь может задать вероятность входа в Long, частоту входов и размер трейлинг-стопа.
// 5. Отображение трейлинг-стопа: На графике отображаются уровни трейлинг-стопов для активных позиций, что позволяет
//    визуально контролировать ход торговли.

// Михаил Шардин, https://shardin.name/?utm_source=tradingview

//@version=6
strategy("Случайные входы + простой трейлинг стоп", 
     overlay=true,
     commission_type=strategy.commission.percent,   // Тип комиссии: процент
     commission_value=0.04,                         // Значение комиссии: 0.04%
     slippage=10,                                   // Проскальзывание в тиках
     process_orders_on_close=true,
     default_qty_type=strategy.fixed,               // Фиксированный размер позиции
     default_qty_value=1,                           // 1 контракт/лот
     initial_capital=500000)                        // Начальный капитал

// === Параметры ===
entryFrequency = input.int(24, "Частота входов (каждые N баров)", minval=1)
longProbability = input.int(50, "Вероятность входа в Long (%)", minval=0, maxval=100)
trailingStopOffset = input.float(1.5, "Отступ трейлинг-стопа (%)", step=0.1, minval=0.1)

// === Сигнал на вход ===
entrySignal = bar_index % entryFrequency == 0 and bar_index > 0  // Игнорируем первый бар

// === Гарантированный рандом ===  
randValue = math.random(0, 100)  // Генерация случайного числа от 0 до 100
randDirection = randValue < longProbability ? 1 : -1  // 1 = Long, -1 = Short

// === Переменные для трейлинг-стопов ===
var float highestLongPrice = na
var float lowestShortPrice = na
var float trailingStopLong = na
var float trailingStopShort = na

// === Условие входа ===
longCondition = entrySignal and randDirection == 1 and strategy.position_size == 0
shortCondition = entrySignal and randDirection == -1 and strategy.position_size == 0

// === Вход в позиции ===
if (longCondition)
    strategy.entry("Long", strategy.long)
    highestLongPrice := close
    trailingStopLong := close * (1 - trailingStopOffset / 100)

if (shortCondition)
    strategy.entry("Short", strategy.short)
    lowestShortPrice := close
    trailingStopShort := close * (1 + trailingStopOffset / 100)

// === Обновление трейлинг-стопа ===
if (strategy.position_size > 0)  // Если открыта длинная позиция
    highestLongPrice := math.max(highestLongPrice, close)
    trailingStopLong := highestLongPrice * (1 - trailingStopOffset / 100)
    
    if (close <= trailingStopLong)  // Закрытие по трейлинг-стопу
        strategy.close("Long")

if (strategy.position_size < 0)  // Если открыта короткая позиция
    lowestShortPrice := math.min(lowestShortPrice, close)
    trailingStopShort := lowestShortPrice * (1 + trailingStopOffset / 100)
    
    if (close >= trailingStopShort)  // Закрытие по трейлинг-стопу
        strategy.close("Short")

// === Отображение трейлинг-стопов ===
plot(strategy.position_size > 0 ? trailingStopLong : na, title="Лонг трейлинг-стоп", color=color.green, linewidth=2, style=plot.style_linebr)
plot(strategy.position_size < 0 ? trailingStopShort : na, title="Шорт трейлинг-стоп", color=color.red, linewidth=2, style=plot.style_linebr)

// === Информация для отладки ===
if (barstate.islast)
    label.new(bar_index, high, 
         "Текущий индекс бара: " + str.tostring(bar_index) + 
         "\nСледующая сделка через: " + str.tostring(entryFrequency - (bar_index % entryFrequency)) + " баров" +
         "\nНаправление следующей: " + (randDirection == 1 ? "LONG" : "SHORT") +
         "\nТекущая позиция: " + (strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "НЕТ"), 
         color=color.blue, style=label.style_label_down)</code>

Обзор второй стратегии: ATR трейлинг-стоп

ATR-трейлинг динамически адаптируется к рыночной волатильности. При каждом входе (лонг/шорт с 50% вероятностью) стоп рассчитывается для лонга: цена закрытия - (ATR(14) × 4) для шорта: цена закрытия + (ATR(14) × 4).

Адаптивный метод выхода: трейлинг-стоп на основе ATR учитывает волатильность инструмента. При росте колебаний стоп отодвигается дальше, при затухании — приближается. Это помогает держать тренд и снижать количество ложных выходов на «шуме».

Основная идея в коде:

<code class="javascript">// Расчет ATR
atr = ta.atr(atrPeriod)
// Установка ATR-стопа
trailingStopLong := close - atr * atrMultiplier
trailingStopShort := close + atr * atrMultiplier
// Адаптивное обновление
trailingStopLong := math.max(trailingStopLong, close - atr * atrMultiplier)</code>
Раздельное тестирование на скриптовом языке TradingView выходов торговой системы: обычный трейлинг стоп и ATR стоп

Преимущества:

  • Автоматическая подстройка под текущую волатильность

  • Шире стопы при высокой волатильности (меньше ложных выходов)

  • Уже стопы при спокойном рынке (лучше защищает прибыль)

Недостатки:

  • Сложнее в настройке (нужно подбирать период и множитель)

  • Может давать слишком широкие стопы в периоды экстремальной волатильности

Полный код ниже (вся коллекция на GitHub):

<code class="javascript">// === Описание стратегии ===
// Эта стратегия основана на случайных входах в рынок с использованием трейлинг-стопов для управления рисками.
// Основные особенности:
// 1. Случайные входы: Стратегия генерирует случайные сигналы для входа в длинные (Long) или короткие (Short) позиции
//    с заданной вероятностью. Частота входов регулируется параметром "Частота входов (каждые N баров)".
// 2. Трейлинг-стоп: Для управления рисками используется трейлинг-стоп, который рассчитывается на основе ATR (Average True Range)
//    и заданного множителя. Трейлинг-стоп автоматически обновляется при движении цены в пользу позиции.
// 3. Гибкость настроек: Пользователь может настроить вероятность входа в длинную позицию, период ATR и множитель для трейлинг-стопа.

// Михаил Шардин, https://shardin.name/?utm_source=tradingview

//@version=6
strategy("Случайные входы + ATR трейлинг стоп", 
     overlay=true,
     commission_type=strategy.commission.percent,   // Тип комиссии: процент
     commission_value=0.04,                         // Значение комиссии: 0.04%
     slippage=10,                                   // Проскальзывание в тиках
     process_orders_on_close=true,
     default_qty_type=strategy.fixed,               // Фиксированный размер позиции
     default_qty_value=1,                           // 1 контракт/лот
     initial_capital=500000)                        // Начальный капитал

// === Параметры ===
entryFrequency = input.int(24, "Частота входов (каждые N баров)", minval=1)
longProbability = input.int(50, "Вероятность входа в Long (%)", minval=0, maxval=100)
atrPeriod = input.int(14, "Период ATR")
atrMultiplier = input.float(4.0, "Множитель ATR", step=0.1, minval=0.1)

// === ATR для трейлинг-стопов ===
atr = ta.atr(atrPeriod)

// === Сигнал на вход ===
entrySignal = bar_index % entryFrequency == 0 and bar_index > 0  // Игнорируем первый бар

// === Гарантированный рандом ===  
randValue = math.random(0, 100)  // Генерация случайного числа от 0 до 100
randDirection = randValue < longProbability ? 1 : -1  // 1 = Long, -1 = Short

// === Условие входа ===
longCondition = entrySignal and randDirection == 1 and strategy.position_size == 0
shortCondition = entrySignal and randDirection == -1 and strategy.position_size == 0

// === Переменные для трейлинг-стопов ===
var float trailingStopLong = na
var float trailingStopShort = na

// === Вход в позиции ===
if (longCondition)
    strategy.entry("Long", strategy.long)
    trailingStopLong := close - atr * atrMultiplier
    // label.new(bar_index, high, "Открыт LONG", color=color.green, style=label.style_label_down, textcolor=color.white)

if (shortCondition)
    strategy.entry("Short", strategy.short)
    trailingStopShort := close + atr * atrMultiplier
    // label.new(bar_index, low, "Открыт SHORT", color=color.red, style=label.style_label_up, textcolor=color.white)

// === Обновление трейлинг-стопа ===
if (strategy.position_size > 0)  // Если открыта длинная позиция
    trailingStopLong := math.max(trailingStopLong, close - atr * atrMultiplier)
    if (close <= trailingStopLong)  // Закрытие по трейлинг-стопу
        strategy.close("Long")
        // label.new(bar_index, high, "Закрыт LONG", color=color.green, style=label.style_label_down, textcolor=color.white)

if (strategy.position_size < 0)  // Если открыта короткая позиция
    trailingStopShort := math.min(trailingStopShort, close + atr * atrMultiplier)
    if (close >= trailingStopShort)  // Закрытие по трейлинг-стопу
        strategy.close("Short")
        // label.new(bar_index, low, "Закрыт SHORT", color=color.red, style=label.style_label_up, textcolor=color.white)

// === Отображение трейлинг-стопов ===
plot(strategy.position_size > 0 ? trailingStopLong : na, title="Лонг трейлинг-стоп", color=color.green, linewidth=2, style=plot.style_linebr)
plot(strategy.position_size < 0 ? trailingStopShort : na, title="Шорт трейлинг-стоп", color=color.red, linewidth=2, style=plot.style_linebr)

// === Информация для отладки ===
if (barstate.islast)
    label.new(bar_index, high, 
         "Текущий индекс бара: " + str.tostring(bar_index) + 
         "\nСледующая сделка через: " + str.tostring(entryFrequency - (bar_index % entryFrequency)) + " баров" +
         "\nНаправление следующей: " + (randDirection == 1 ? "LONG" : "SHORT") +
         "\nТекущая позиция: " + (strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "НЕТ"), 
         color=color.blue, style=label.style_label_down)</code>

Методика тестирования

Тестирование проводилось на часовом таймфрейме фьючерса Si (USD/RUB) за период с 29.12.2023 по 21.04.2025. Это 480 дней или 11 520 часовых баров. Оценивались ключевые метрики:

  • Общие ПР/УБ: Итоговый финансовый результат стратегии выхода.

  • Макс. просадка средств: Максимальное падение эквити от пика, показатель риска.

  • Всего сделок: Общее количество для статистической значимости.

  • Прибыльные сделки, %: Доля выигрышных выходов.

  • Фактор прибыли: Отношение валовой прибыли к валовому убытку (эффективность).

Поскольку входы случайны (50/50), различия в этих показателях напрямую демонстрируют эффективность именно стратегии выхода. Это позволяет объективно сравнить, какой подход — жесткий процентный стоп или адаптивный ATR — лучше управляет позицией в заданных условиях.

Результаты и сравнение

Раздельное тестирование на скриптовом языке TradingView выходов торговой системы: обычный трейлинг стоп и ATR стопПростой трейлинг (1.5%)

Сравним ключевые показатели обеих стратегий выхода при идентичных случайных входах на фьючерсе Si за период ~16 месяцев:

Метрика

Простой трейлинг (1.5%)

ATR трейлинг (4xATR)

Общие ПР/УБ

-2.79%

+6.43%

Макс. просадка средств

5.00%

1.03%

Всего сделок

62

71

Прибыльные сделки, %

30.65%

50.70%

Фактор прибыли

0.705

2.305

Раздельное тестирование на скриптовом языке TradingView выходов торговой системы: обычный трейлинг стоп и ATR стопATR трейлинг (4xATR)

Результаты однозначно показывают преимущество адаптивного ATR-трейлинга на волатильном фьючерсе Si.

  • Где ATR-выход был лучше: практически по всем параметрам. ATR-стоп не только принёс прибыль (+6.43%) против убытка простого стопа (-2.79%), но и показал в 5 раз меньшую максимальную просадку (1.03% vs 5.00%). Значительно выше процент прибыльных сделок (50.70% vs 30.65%) и фактор прибыли (2.305 vs 0.705), что говорит о лучшем удержании прибыльных позиций и контроле убытков.

  • Где выигрывает простой трейлинг: в данном тесте – нигде. Его единственное преимущество простота – не компенсировало неспособность адаптироваться.

  • Реакция на волатильность: фиксированный стоп в 1.5%, вероятно, был слишком узким для волатильности Si, приводя к частым преждевременным выходам. ATR-стоп, динамически расширяясь и сужаясь вместе с рынком, позволил эффективнее «пересиживать» локальные коррекции и удерживать трендовые движения, что и отразилось на итоговой прибыли и просадке.

Выводы

Раздельное тестирование выходов — ценный метод анализа, так как изолирует влияние стратегии управления позицией от качества входов, позволяя объективно оценить её эффективность.

Как показали результаты для волатильного фьючерса Si, ATR-трейлинг предпочтительнее в условиях высокой изменчивости рынка. Его способность адаптивно расширять и сужать стоп помогает удерживать тренды и фильтровать рыночный шум, что критично для улучшения итогового ПР/УБ.

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

Автор: Михаил Шардин
🔗 Моя онлайн-визитка
📢 Telegram «Умный Дом Инвестора»

22 апреля 2025 г.

5.9К | ★10
34 комментария

VLTorgovie, да, классическая модель трейлинга действительно включает эти параметры.

Я в своей версии реализовал это через Pine Script, и всё прозрачно — можно посмотреть, как работает логика, где формируются уровни, и когда именно идёт смещение.

Главное отличие в том, что ваше мнение субъективно («не нравится, не использую»), а у меня — проверяемая и воспроизводимая реализация с открытым исходником.

VLTorgovie, если вы действительно проводили тесты на 43 фьючерсах ММВБ — это здорово.

Что касается SI и стопа 1.5% — он использовался как условный пример, чтобы показать механику. Оптимальность параметров — отдельная тема, которая, как вы правильно заметили, может сильно зависеть от инструмента и волатильности.

Михаил Шардин, лень разбираться в синтаксисе оператора этого языка, меняется ли в действительности стоп в 1,5% с шагом 0,1% или нет.
Если не меняется, то вполне возможна ситуация, когда стоп в 3,5%, например, побьёт адаптивный трейлинг-стоп по результату.
avatar
Давно было, когда только начинал искать ТС, поэтому чисел-цифр оценок сравнения уж и не вспомню, но я тоже сравнивал процентный и адаптивный трейлинг. У меня такой разницы не получалось, адаптивный получше, но не настолько как у вас. У вас на процентном просто крест надо ставить.
Но были отличия от вашего способа.
1.Я не делал со случайными входами. Я сравнивал реверсивные, вход в лонг там где выход из шорта и вход в щорт где выход из лонга. Случайные входы, по крайней мере при таком малом количестве сделок тоже могут сделать некорректным сравнение. Надо для чистоты хотя бы несколько генераций случайных ( да и подобрать параметры чтобы было равное количество сделок).
2.Я делал не по ценам закрытия, трейлинг отсчитывался от макс/мин цены и входы/выходы тоже не по ценам закрытия а по уровням трейлингов ( для больших стопов как у вас это не так критично, но чем меньше размер стопа тем это будет критичней).
3. Адаптивный по АТР  трейлинг у вас какой то «неправильный». У классического не будет таких же как на процентном горизонтальных полок как у вас на графике ( у вас размер адаптивного стопа фиксируется что ли на точке экстремальной цены закрытия....).
avatar
Большой Брат, хочу пояснить механику работы адаптивного трейлинга в этом скрипте.

В моей реализации адаптивный трейлинг-стоп работает по следующему принципу:

  1. При открытии позиции устанавливается начальный трейлинг-стоп на уровне: close - atr * atrMultiplier для лонгов или close + atr * atrMultiplier для шортов.
  2. Далее, трейлинг обновляется при движении цены в прибыльном направлении:
    • Для лонгов: trailingStopLong := math.max(trailingStopLong, close - atr * atrMultiplier)
    • Для шортов: trailingStopShort := math.min(trailingStopShort, close + atr * atrMultiplier)

Эти горизонтальные «полки», которые вы заметили, возникают когда цена не обновляет максимум (для лонгов) или минимум (для шортов), и трейлинг-стоп остается на прежнем уровне. Это особенность данной реализации — трейлинг-стоп сдвигается только когда текущая цена создает новую, более выгодную для нас точку размещения трейлинга с текущим ATR.

Классический адаптивный трейлинг может быть реализован по-разному. Если вы предпочитаете версию, где трейлинг постоянно «плавает» вместе с ATR даже при боковом движении (без горизонтальных полок), можно модифицировать код, убрав функции math.max и math.min, и просто пересчитывать трейлинг каждый бар как close ± atr * atrMultiplier.

Текущая реализация была выбрана осознанно, так как она обеспечивает более консервативное управление позицией — трейлинг-стоп никогда не отодвигается от достигнутой прибыли.

Михаил Шардин, Понятно. Я код не читал. Я хренею сразу с кривого «творца» меню когда нужно чтобы посмотреть прокручивать вбок тем более когда весь скрипт по высоте не помещается.
avatar
@VLTorgovie, а куда все ваши комментарии пропали?
Эх, на заре своей алготорговли тоже баловался трейлинг-стопами. На практике выяснилось, что слишком сильно снижают доходность систем. Но ностальгические воспоминания всколыхнулись :)
avatar
Антон Иванов, а сейчас как делаете?
Михаил Шардин, сейчас стопов и тейк-профитов не использую вообще.
avatar
Антон Иванов, а с просадками как боретесь?
Михаил Шардин, я с ними не борюсь, я с ними смиряюсь. Это неизбежные этапы торгового процесса, я эквити без просадок ни у кого не видел. Разве что HFT, но мне такая торговля недоступна. 
avatar
 И сам подход брать случайные места входов тоже вызывает сомнения в последующей полезности. В какой-то ТС входы происходят при каких-то условиях, то есть некоторое время после поведение рынка не вполне случайное. Соответственно статистика стопов получится иная, чем если брать все подряд ситуации.
avatar
Три тренинга в одном с разными отступами
avatar
Perl, что вы имеете в виду?
Михаил Шардин, цикл в цикле, один пол процента, второй 3% и третий 5%.
Пераый начинает как стоп защитный, второй или третий срабатывает.
Точка входа на развороте, если войдёшь.
Пераый стоп стоит и если не сработал он стоит и второй встанет повыше, тот уберется. Пока в безубытке, потом третий, профит и если не упадёт вручную продать в канале, где там.
Как запрограммировать
avatar
Perl, спасибо

господи, вы дебилы не, акции идет к себестоиомсти 
кто умный тот берет, 

вы считаете свою оценку,  дорого богата эта ваша оценка стоимости 
хотите стабильности, физическое золото и доллары в погреб 
все остальное в 21 веке 

avatar

Skifan, меня вот удивляет, что ребята «инвесторы» не видят компании которые стрельнут
В РФ 

ВЫ серьезно, не понимаете как обычные экономические процессы развиваются, и куда будет двигаться капиталл


Тогда РБК это ваш уровень, слушайте дальше  ) 

avatar
Skifan, вы сам с собой диалог выстраиваете? Только не могу понять — спорите или соглашаетесь?
Михаил Шардин, мир обычно к согласию приходит, а спор рождает истину ))))
avatar
Михаил Шардин, научись считать инфляцию, и давай бахнем, чтоб все закончилось 

avatar

не хочу ругаться, не до тебя если честно 

за пацанов 

avatar
Михаил, скажите пожалуйста, а файлики из этого поста smart-lab.ru/blog/1073200.php#comments с выступлением с конференции можно ли где-то скачать? Жаль, но я не программист совсем…   
avatar
Бомж-спекуль, ответил вам в комментарии к тому посту
Михаил Шардин, спасибо большое!
avatar
Михаил Шардин, запросила, но автоответа нет, ну и доступа тоже(
avatar
Бомж-спекуль, по утрам только отвечает скрипт
Я делал, куьуа только работает, 3 круга, малый стоп подтягивался на последний третий. В день поднимался, менял отступы. Малый подьяг вался только на третий и там срабатывал. Но вход тяжёлый.
Шпильки, сопли вышибают стопы и малый 0,3% делал.
Если все норм он повезёт хорошо.
Потом забросил.
Роботов нет
avatar
На зм круге первый вкл и профит.
Обычно срабатывал.
Есть Параболик робот, этот понравился.
Но роботы в прибыль не работают, на ме те топчатся, но немного в минус, плюс бывает.
Роботы не работают.
Нужен канальный робот автотрейда autotreid на марте есть из него сделать.

Пожалуйста.
avatar

Читайте на SMART-LAB:
Фото
Последнее заседание в 2025 году. Как поступит Банк России 19 декабря?
19 декабря состоится финальное в этом году заседание Банка России по вопросу ключевой ставки. В предыдущий раз в октябре ЦБ снизил размер...
Фото
📝 Еженедельный дайджест от ГК «А101» с комментариями экспертов
Рост ставок по депозитам, инвестиции в недвижимость и меморандум РФ и Саудовской Аравии 📊 Новости в мире финансов и...
Фото
Приближается конец года: что купить на ИИС?
Наступил декабрь, а значит, самое время пополнять ИИС. Тогда налоговый вычет вы сможете получить уже в начале следующего года. Для максимизации...

теги блога Михаил Шардин

....все тэги



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