Избранное трейдера dimaz07

по

Интересная среднесрочная стратегия "Рыбалка"

    • 23 апреля 2020, 16:43
    • |
    • ZizZz
  • Еще

Покупаем 20 ликвидных акций, которые по нашему субъективному мнению будут расти в перспективе нескольких ближайших недель.

Каждый день в конце торговой сессии удаляем из списка акции, которые показали убыточные дни подряд с общим значением, допустим -0.5% и ниже.

Например, с начала покупки бумага показала вчера первый минус на уровне -0.3 и сегодня на уровне -0.4, в сумме -0.7, что меньше -0.5, значит сегодня её продаём.

Или бумага сегодня первый раз с начала «рыбалки» показала убыток -0.6, значит тоже продаём.

Полученные средства в этот же день в равных долях распределяем по оставшимся бумагам в портфеле.

Продолжаем подобное действие до того дня, когда придётся продать последнюю бумагу из списка, которая аккумулировала в себе все средства

Считаем прибыль/убыток и снова закидываем «невод».

Стратегия простая и в то же время эффективная.

В портфеле всегда только самые «сильные» в моменте бумаги, из которых выжимается весь потенциал среднесрочного движения.

Если попадаем на дивидендную отсечку Т-2, то бумагу естественно придётся продать по установленному правилу, но позже получим дивиденды примерно равные уровню падения.

Можно поиграться с параметрами, например 30 бумаг и дневной убыток больше «рыночного шума», допустим -1% и ниже.

Начало покупок можно выбирать по дневным свечам Хейкен Аши на индексе ММВБ, которые очень точно показывают зарождающиеся тренды.

Например, вчера была первая зелёная свеча после серии красных, следовательно сегодня уже получили бы прибыль.

Интересная среднесрочная стратегия "Рыбалка"

Торгуйте красиво, торгуйте успешно!


Ещё немного о волатильности❗️

Ещё немного о волатильности❗️
Я написал два поста про волатильность в рамках тем по развитию финансовой грамотности. Я показал, что ценовую волатильность можно измерять с помощью показателя Average True Range (ATR) и с помощью него неплохо можно выставлять ордера на ограничения потерь (stop loss). Полезно тем, кто активно торгует.

Второй показатель волатильности — это стандартное (среднеквадратичное) отклонение. Применяется для показателей доходности актива и удобен при составление своего портфеля и его последующей оптимизации. (Кстати, на встречи в прошлую субботу в рамках вебинара из курса ТРИ КИТА ИНВЕСТИЦИЙ, я как раз показывал как с помощью Excel можно искать оптимальный портфель для себя, зная доходность и волатильность. В эту субботу я покажу как использовать бету для составления собственного портфеля и как его оптимизировать, а также поговорим о пассивных и активных стратегиях управления портфелем. Кому интересно научиться инвестировать на уровне профессионала — присоединяйтесь. Действует скидка❗️ 



( Читать дальше )

Поиск точек входа для алгоритма.

Всем привет.
Сей пост скорее поток мыслей, дабы их структурировать, пообсуждать, а возможно и идею интересную почерпнуть, :)
 
Все кто смотрел мои видюшки уже в курсе, что я тиху по малу пытаюсь прикрутить нейронные сети или мл к торговле, и построить прибыльную систему. Начал я конечно с самых азов и подхода в лоб, но как и предполагалось, ничего у не вышло. Так как весь подход построен на сетях которые обучаются с учителем, нам нужны размеченные данные. Всегда встает вопрос, как же нам получить эти метки. Чем на самом деле являются эти метки? Мне кажется слово триггер будет более правильным описанием того что происходит. Мы делаем некоторое предположение, что после некоторого события, цена пойдет в том или ином направлении, на некоторое минимально ожидаемое расстояние, с некоторой вероятностью. По большому счету мы и пытаемся узнать эту вероятность при помощи нейросетей.

Был проведен эксперемент со стратегией на двух скользящих средних. Пересечение средних — это наш триггер, если цена со 100% вероятностью дошла до минимально заданной цели то мы можем искользовать этот триггер. Далее можно посчитать всякого рода статистику, сколько прибыльных, сколько убыточных сделок. Тут никаких нейросети не нужны, посмотрели результат, увидили что ничерта не работает. :) Однако можно пойти другим путем, берем пересечение прямых, и смотрим куда после нашего триггера пошла цена, вверх или вниз, если видим некоторый перекос в результатах, скажем на истории у нас оказалось 60% прибыльных и 40% убыточных сделок, то тут есть уже над чем подумать. Встает вопрос как узнать будет ли сделка прибыльна или убыточна. Вот тут то и можно попытаться использовать нейронные сети, которые нам могут заменить сложные статистические модели. Мы же всегда работаем с предположениями и вероятностями, если мы скормили модели наши данные, и модель, не дай бог, обучилась и смогла в этих данных что то найти, то мы можем смело сказать, что у нас есть зависимость между нашими данными и результатом. Зависимость эта нам не известна, да и не нужно нам ее знать. Эдакий простой метод и не надо нам все эти заумные статистические, математические методы поиска нужного процесса.

( Читать дальше )

индикатор: канал на последнем зигзаге

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

Параметры индикатора:
Procent - величина зигзага в %
  k - коэффизиент ширины канала
  Ext - =0-канал стоится по средним =1-канал стоится по экстремуму


Примеры:

два индикатора с 5 и 15% по экстремумам:
индикатор:  канал на последнем зигзаге

один индикатор по средним:
индикатор:  канал на последнем зигзаге


( Читать дальше )

Скрипт lua Баланс покупок/продаж

Всем привет. Переделал первоначальную версию скрипта. Исправил некоторые ошибки и немного расширил функционал. Теперь скрипт может сохранять данные в текстовый файл, который потом можно анализировать в другой программе (например exсel). Также, в отличии от первого варианта, скрипт показывает в таблице усредненную цену, по которой прошли сделки. В первом варианте отображалась цена последней сделки. И в скрипте добавлен показ накопленной дельты за все время пока скрипт работает.

TICER = "SBER";
CLASS_CODE = "TQBR";
FilePath = getScriptPath() .. "\\export.txt";--путь к файлу
save = false;--сохранять данные в файл если false нет, true да

f = nil;
stopped = false;
t_id = nil
H = -1;
M = -1;
VSELL = 0;
VBUY  = 0;
CDelta = 0;
CountTrans = 0;
PriceTrans = 0.0; 
t = "";
function OnInit()
    CountTrans = 0;
        if save then f = io.open(FilePath,"w"); end
        CreateTable();
end 

function main() 
        while not stopped do 
          if IsWindowClosed(t_id) then
         stopped = true;
      end       
          sleep(10);
        end
end

function CreateTable()
   t_id = AllocTable(); 
   AddColumn(t_id, 0, "Время", true, QTABLE_STRING_TYPE, 10);
   AddColumn(t_id, 1, "BUY", true, QTABLE_INT_TYPE, 10);
   AddColumn(t_id, 2, "SELL", true, QTABLE_INT_TYPE, 10);
   AddColumn(t_id, 3, "Дельта V", true, QTABLE_INT_TYPE, 10);   
   AddColumn(t_id, 4, "AVG Цена", true, QTABLE_DOUBLE_TYPE, 15);
   AddColumn(t_id, 5, "Накопленная Дельта", true, QTABLE_INT_TYPE, 15);
   AddColumn(t_id, 6, "Кол-во сделок", true, QTABLE_DOUBLE_TYPE, 12);   
   tab = CreateWindow(t_id);
   local NAME = tostring(getParamEx(CLASS_CODE,TICER,"LONGNAME").param_image);
   SetWindowCaption(t_id, TICER.." ("..NAME..") Баланс покупок/продаж");
   SetTableNotificationCallback(t_id, EventCallBack);
end

function Calc(alltrade)
        if bit.test(alltrade.flags, 0) then VSELL = VSELL+alltrade.qty;  --Продажа
        else VBUY  = VBUY+alltrade.qty;  end                            
        CountTrans = CountTrans+1;
        PriceTrans = PriceTrans+alltrade.price;                 
end

function OnAllTrade(alltrade)    
        if alltrade.sec_code == TICER then      
                local Rows, Col = GetTableSize(t_id);
                
                if H==-1 or H~= alltrade.datetime.hour then 
                        H = alltrade.datetime.hour;
                        M = alltrade.datetime.min;
                        t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);
                end
                if M==alltrade.datetime.min then
                        Calc(alltrade);
                else                                    
                M=alltrade.datetime.min;        
                        InsertRow(t_id, -1);                                               
                        local Delta = VBUY-VSELL;
                        Price = PriceTrans/CountTrans;
                        SetCell(t_id, Rows, 6, tostring(CountTrans));                   
                        SetCell(t_id, Rows, 0, t);
                        SetCell(t_id, Rows, 1, tostring(VBUY));
                        SetCell(t_id, Rows, 2, tostring(VSELL));                           
                        SetCell(t_id, Rows, 3, tostring(Delta));
                        local SEC_SCALE = tostring(getParamEx(CLASS_CODE,TICER,"SEC_SCALE").param_value);
                        SEC_SCALE = string.format("%.0f",SEC_SCALE);                    
                        SetCell(t_id, Rows, 4, string.format("%."..SEC_SCALE.."f", tostring(Price)));
                   if Rows>=2 then
                           local OldPrice = tonumber(GetCell(t_id,Rows-1,4).image);
                           if OldPrice>Price then 
                                        Red(Rows,4); 
                           else 
                                        Green(Rows,4);
                           end
                           CDelta = tonumber(GetCell(t_id,Rows-1,5).image);
                           CDelta = CDelta + Delta;                        
                        else 
                          CDelta = Delta;
                        end
                        SetCell(t_id, Rows, 5, tostring(CDelta));
                    if Delta<0 then Red(Rows,3); end
                    if Delta>0 then Green(Rows,3); end
                    if CDelta<0 then Red(Rows,5); end
                    if CDelta>0 then Green(Rows,5); end                                                   
                   if save then
                                local Str = tostring(H)..";"..tostring(M)..";"..tostring(VBUY)..";"..tostring(VSELL)..";"
                                                ..tostring(Delta)..";"..tostring(Price)..";"..tostring(CDelta);
                           Str=Str.."\n";
                           SaveFile(Str);
                        end
                t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);                        
                    VBUY = 0;VSELL = 0;
                        PriceTrans = 0;
                        CountTrans = 0;
                        Calc(alltrade);
                end
        end --if alltrade.sec_code == TICER then        
end

function SaveFile(Str)
        if f ~= nil then 
                f:write(Str);           
                f:flush();                               
        end
end

function Red(row,col)
        SetColor(t_id, row, col, RGB(255,0,0), RGB(0,0,0), RGB(255,0,0), RGB(0,0,0));
end
function Yellow(row,col)
        SetColor(t_id, row, col, RGB(240,240,0), RGB(0,0,0), RGB(240,240,0), RGB(0,0,0));
end
function Green(row,col)
        SetColor(t_id, row, col, RGB(0,200,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0));
end


function EventCallBack(t_id, msg, par1, par2)
   if msg==QTABLE_CLOSE then
     OnStop();
   end;
end

function OnStop(s)
  if f ~= nil then f:close(); end
  if t_id ~= nil then
    DestroyTable (t_id);
  end;
  stopped = true;
end




Алготорговля в условиях высокой волатильности. Мини-отчет за первый квартал 2020 года


Одинокий боец идущий в огонь в рукопашную или взвод роботов не знающий страха, у кого больше шансов выжить?

Всех приветствую!
Не планировал писать квартальные отчеты, однако! Ожидания прошлого года оправдались. Затишье сменилось лютой волатильностью, которая за первый квартал почти удвоила счет +95%. 
Алготорговля в условиях высокой волатильности. Мини-отчет за первый квартал 2020 года

Общая эквити тут.

Алготорговля в условиях высокой волатильности. Мини-отчет за первый квартал 2020 года



( Читать дальше )

Тренд и волатильность: упражняемся ради упражнений?

Или нет?

Возьмём одну торговую систему только лонг на РИ:
Тренд и волатильность: упражняемся ради упражнений?




























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

В такой эквити напрягает два момента. Это хоть и редкие, но глубокие дродауны и есть плато, когда волатильность на рынке была низенькая и рынок не рос. Поскольку это лонговая система, то на растущем рынке при низкой волатильности она чего-то да заработать может.

Ну и проверим, что будет, если торговать с учетом волатильности. Т.е. при высокой волатильности сайз пониже. При низкой — повыше.
Как делается нормировка? Имеем доходности сделок, для каждой сделки считаем какой была волатильность на рынке к моменту закрытия этой сделки. Итого на выходе получаем два ряда значений: r и vol. Вводим веса w, которые в исходном варианте без учета волатильности были все равны 1: w[i]=1 для всех i, где i  — порядковый номер сделки.

( Читать дальше )

QLua: формирование свечных данных для робота

    • 31 марта 2020, 13:37
    • |
    • _sk_
  • Еще
Поделюсь своим опытом, который может быть полезен начинающим алготрейдерам, пишущим своего робота на QLua.

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

Пример 1. Мы торгуем акции на 30-минутках и при этом не хотим учитывать свечу, которая получается в 9:30 из-за аукциона открытия, и не хотим, чтобы аукцион закрытия портил последнюю свечу дня в 18:30. Хотим только нужные свечи в одном массиве.

Пример 2. Мы торгуем фьючерсы только в дневную сессию, а вечернюю сессию выбрасываем, поскольку наша стратегия в этом случае даёт более приличный график эквити. Хочется иметь «отфильтрованный» свечной ряд.

Пример 3. Мы торгуем американские акции на Санкт-Петербургской бирже и хотим, чтобы время свечей было как в Америке, а не как на бирже, и хотим оставить только основные торги с 9:30 до 16:00 по буржуйскому времени.

( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Досужие размышления о Quik, Lua и Python.

    • 28 марта 2020, 16:03
    • |
    • 3Qu
  • Еще

Я уже писал, что у меня сделана C++ DLL, которая получает данные из Lua и пишет их в БД SQLite. Уже писал также, что DLL под Lua делается на раз, и даже приводил коды и шаблон проекта простенькой C++ DLL. Посмотрело несколько тысяч, скачало, аж 12 человек, применят от силы двое. КПД постов, прямо скажем, оч низкий.)

В DLL реализована как связь с Lua, и будет реализована сама стратегия, вот только не решил какая из них. Повторять старые стратегии на новой для меня платформе Quik уже неинтересно, а новых моделей АТС отработано уже несколько. Все моделируется в Python. Часть стратегий не требует сложной математики, и могут быть легко перенесены непосредственно на С++. Другие непосредственно в DLL перенесены быть не могут, т.к. используют пакеты Python — всяческие регрессии и машинное обучение.
В общем, получилось, что DLL является шаблоном для любой стратегии. Все необходимые для АТС данные доступны АТС — реал-тайм данные поступают в DLL непосредственно из терминала, а необходимая история пишется DLL в БД SQLite и читается АТС из базы данных.



( Читать дальше )

Новичкам. Разбираемся с опционным doctor'ом. Изучаем греки: тету, дельту, гамму, вегу.

Всем привет.

Продолжаем грызть тему опционов по рекомендуемой ранее литературе (см.здесь).

Сегодня мы добрались до 11-ой Главы «Греки».

Изучив данный материал, окажемся на 150 странице книги, а это значит, что в теме опционов на текущий момент ваш покорный слуга прокачан уже на 150/400=38%.

Попутно разберемся с местным опционным doctor , который, судя по всему, считает себя умнее всех, при этом даже не понимает того, о чем он пишет. Его топик был здесь.

Итак, цитата:
Уже и не знаю, сколько раз это было написано, в том числе и здесь, но повторю еще раз.Торгуя опционы, Вы торгуете гамму и вегу. Т.е., прогнозируете будущую волатильность базового актива и IV. Тета — это просто последствия Вашей гамма-ставки.Если ставите на то, что в ближайшие n-дней диапазон движения актива будет меньше, чем за последние n-дней, то создаете позицию с отрицательной гаммой. Соответственно, тета позиции будет положительной.


( Читать дальше )

....все тэги
UPDONW
Новый дизайн