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

по

Бесплатный робот на quik XoraX боковик на lua, нефть Brent

    • 13 мая 2020, 22:26
    • |
    • XoraX
  • Еще
Робот очень хорошо держит боковик в определённом диапазоне. Точку входа соответственно надо искать самому, желательно если вы уверены что рынок уже будет в боковике и идти ему некуда. Робот будет совершать покупку и выставлять заявку на продажу с установленным профитом в панели управления. Можно установить чтобы он покупал только по 2 или 3 контракта, просто устанавливаете 3 контракта «add» и он будет покупать и продавать 3 контракта, но не более того что разрешено. На последнем скрине например установлено покупать до 10 контрактов. 
При падении, если тренд пошел вниз, робот совершает так же покупку, но постоянно старается увеличить промежуток покупки.
Если робот ранее покупал на текущем участке(промежутке) то он не будет покупать здесь, пока не продаст.


Бесплатный робот на quik XoraX боковик на lua, нефть Brent
Бесплатный робот на quik XoraX боковик на lua, нефть Brent

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

Моделирование Торговых Систем на Python. 1.

    • 09 мая 2020, 19:31
    • |
    • 3Qu
  • Еще

Для моделирование ТС на Python, прежде всего нужен сам Python. Pythonы бывают очень разные.

Самый большой и длинный Python — Anaconda (https://anaconda.org/). Скачать дистрибутив Anaconda можно здесь — Индивидуальное издание -https://www.anaconda.com/products/individual.
Я работаю именно с Anaconda. Установив Anaconda мы получаем сам Python, уже установленные значительную часть нужных и ненужных пакетов с библиотеками Python, и несколько сред разработки. И все это сразу готово к работе, и нам, по большей части, уже не придется дополнительно устанавливать пакеты и среды.

Самый маленький Python последней версии 3.8.2. скачивается с сайта самого Python — https://www.python.org/. Это, практически, только сам язык, компилятор и минимальный набор пакетов. Сделать с ним практически ничего невозможно, и для работы придется постоянно устанавливать нужные пакеты. Среду разработки придется также устанавливать самостоятельно.
Этот Python больше подходит для запуска и работы с уже отлаженными законченными программами.



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

Ручной интрадей трейдинг. Личный опыт.

Всегда любил май месяц, проснулся под пение птиц и с отличным настроением и решил сегодня сделать доброе дело. Сразу обозначу важные моменты:

1. Я ничего не продаю и ничему не обучаю (ИМХО трейдингу невозможно никого научить в том контексте как это предлагают 98% инфо-гуру). 
2. Я не изобретал велосипед, вся информация которая помогла мне встать на эффективные рельсы в трейдинге имеется в открытом доступе на просторах интернета, ищите, фильтруйте. 
3. Вся информация ниже уместна только для ручного интрадей трейдинга
3. Грааля в торговле нет.


Общались как-то с коллегой в феврале месяце: 

Ручной интрадей трейдинг. Личный опыт.

Я считаю, что успешность ручной торговли на 90% состоит из личностных психологических качеств человека и на 10% от технического оснащения (ПО, индикаторы).

Первый блок:

Необходимо уничтожить в себе:

1. Страх (что тебя выбьет по стопу, что после твоего входа цена развернется и т.д.);

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

Куда вложить накопленное?

Куда вложить накопленное?

Всем доброго дня!

В текущих условиях короноэкономической ситуации, когда из-за изоляции полностью проседает вся экономика (снижение потребления, и как следствие производства, ведет к снижению доходов населения, занятого практически во всех сферах) – возникает вопрос: «А где же собственно сейчас безопасно держать свои финансы?» В каких инструментах или коммодити?

Озадачился я этим вопросом неспроста. Я работаю на хорошей позиции в крупной российской нефтяной компании. Путем жесткого учета расходов — все необходимые затраты на жизнь моей семьи составляют порядка 1/3 от моих доходов или порядка 1/4 от общесемейного бюджета. Ранее, естественно, никогда не возникало вопроса куда девать «остающееся».

У меня два основных брокера – Сбербанк (ИИС под дивидендные акции, брокерский счет под облигации, ETF и дивидендные спекуляции) и ВТБ (высокодоходные облигации). Помимо этого, я занимаюсь краудлендингом, то есть «даю деньги в долг частникам» на платформах Ozon.Invest (заемщики только из числа продавцов на Озоне, до 18% процентов годовых) и Сберкредо (заемщики как правило ИП, прошедшие скоринг, но видимо малонадежные, потому что до 34 процентов годовых). Разумеется, есть существенный объем кэша на экстренный случай, некоторое количество инвестиционных золотых монет (Победоносец, ММД) и несколько лет назад я начал покупать антикварные книги. Есть пара майнеров на шумоизолированном балконе, которые добывают свои 10-12 долларов в день и некоторый объем биткоинов на защищенном криптокошельке Ledger.



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

Первые 88 торговых сигналов: счет моих роботов 55:33

    • 21 апреля 2020, 20:45
    • |
    • AlexChi
  • Еще

Первые 88 торговых сигналов: счет моих роботов 55:33


Сегодня 21.04.2020 закрылась одна публичная сделка моих роботов:

  • Робот AVP, купивший акции Распадской (RASP) 17 апреля по 104,72 рублей, закрыл сделку по стоп-лоссу, цена продажи 101,72.

На текущий момент было 88 публичных сигналов на покупку. 34 от робота AVP, 46 от робота PVVI и 8 от робота CandleMax. Вот ссылки:

  1. тс: покупка HYDR робот AVP
  2. тс: покупка NVTK робот AVP
  3. тс: покупка TATN робот PVVI
  4. тс: покупка RTKM робот AVP
  5. тс: покупка GAZP робот CandleMax


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

Практическая реализация некоторых идей John Ehlers

Практическая реализация некоторых идей John Ehlers

Об авторе


«Джон Элерс-инженер-электрик, получивший степень бакалавра и магистра в Университете Миссури. Он сделал свою докторскую работу в Университете Джорджа Вашингтона, специализируясь на полях, волнах и теории информации. Он ушел на пенсию в качестве старшего инженера из Raytheon. Он был частным трейдером с 1976 года.


Джон является пионером в области внедрения алгоритма измерения циклов MESA и использования цифровой обработки сигналов в техническом анализе. Он разработал анализ спектра максимальной энтропии (MESA) более трех десятилетий назад. Программа развивалась с увеличением мощности современных компьютеров.




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

Интеграция Lua и С++ (2)


Обмен данными между Lua и Сpp осуществляется через Lua-стэк, то есть через специальным образом структурированное (по принципу Last In — First Out) пространство. 


Интеграция Lua и С++ (2)

Иллюстрация процесса добавления переменных в Cтэк (Push) и извлечения переменных из Стэка (Pop).

Иными словами, Lua стэк — это одномерный массив переменных (список, строка) с прямой (от 1 до n) индексацией.



Заполняется стэк командами lua_push (С-side) :

void lua_pushnumber (lua_State *L, lua_Number n);
const char *lua_pushstring (lua_State *L,  const char *s);

и другими. 


Новой переменной в стэке Луа длинной n автоматически присваивается индекс [n+1] или [-1], где n+1 — абсолютный индекс переменной, а -1 — индекс новой переменной относительно конца (!) стэка. 




Доступ, к переменным, соответственно осуществляется функциями lua_to (C-side) :

lua_Number lua_tonumber (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
где L — указатель Lua-стэка, а index — абсолютный или относительный индекс переменной в стэке.

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

QLua: таблица крупных "склеенных" обезличенных сделок

    • 03 апреля 2020, 15:06
    • |
    • _sk_
  • Еще
Иногда хочется наблюдать за ситуациями, когда участники торгов исполняют по рынку крупные заявки. Конечно, можно смотреть на обычную ленту обезличенных сделок с настроенными фильтрами на размер сделки, но ведь можно написать специальный QLua-скрипт, который будет отбирать сделки, являющиеся результатом исполнения.

В терминале QUIK ордерлог недоступен, поэтому надо как-то эвристическим образом определить, что набор обезличенных сделок относится к одной и той же рыночной заявке. Например, можно проверять, что инструмент в текущей сделке совпадает с инструментом в предыдущей сделке, направление сделки то же самое, время сделки совпадает с точностью до миллисекунд, и цена при покупке растёт, а при продаже — падает.

Если суммарный объём не менее какой-то границы, которую можно задать для каждого инструмента индивидуально, такие «склеенные» сделки выводятся в таблице. В ней указаны:
— суммарный объём;
— количество обезличенных сделок, которые были склеены;
— начальная цена и конечная цена;

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

Скрипт 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




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

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

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

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

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

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

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

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