Избранное трейдера Ramil Shahattudinov

по

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




Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.

    • 16 марта 2020, 19:49
    • |
    • Albus
  • Еще
--ВВЕДЕНИЕ--
Пост будет полезен только разработчикам алгоритмических стратегий. Здесь нет прорывных идей. На истории стратегия прибыльная, но опыт показывает, что эта прибыльность иллюзорна и не гарантирует успех в будущем. По любой стратегии можно найти комбинацию параметров, которая прибыльна на прошлых свечках. Но радоваться, что ты нашёл Грааль, рано. На будущих сделках эти параметры скорее всего будут убыточными.
Тем не менее, подгонка под исторические данные — штука интересная, поэтому пишу этот пост. В нём вы найдёте рабочий тестер для описанной стратегии, который можете использовать как захотите. 

---ОПИСАНИЕ СТРАТЕГИИ---
Назовём её «Поплавок», потому что это стратегия выныривания из зоны перепроданности.
1. Ждём, когда индикатор RSI сформирует двойное дно.
2. Оба дна должны быть ниже какого-то горизонтального порога по RSI, например 25.
3. Подъём (выныривание) выше этого порога мы считаем признаком разворота и покупаем.
4. Прибыль забираем, когда акция дорастёт до (к примеру) уровня 50 по RSI. Скрипт умеет подбирать и этот параметр. Часто наилучшим вариантом будет продавать при RSI = 70 или даже RSI = 80, то есть уже в состоянии сильной перекупленности. Но эту фразу не воспринимайте как рекомендательную, ведь все эти прогоны на истории ищут лучший вариант в прошлом, но это не гарантирует успеха в будущем.

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

QUIK. Реальные шаги для ускорения работы терминала.

    • 07 марта 2020, 16:22
    • |
    • SaOLin
  • Еще

Последние две недели на всех мировых рынках резко повысилась активность, количество биржевых данных выросло в 2-3 раза. Из-за этого у многих пользователей терминал QUIK начал безбожно тормозить и виснуть. Сервера брокеров также с трудом переваривают повышение нагрузки и наплыв клиентов, желающих что-либо купить-продать (по слухам кто-то из брокеров висел аж целую неделю))) ).

На Смарт-Лабе появилось несколько постов с советами как избавиться от тормозов. И меня сильно поразила неадекватность предлагаемых действий. Люди готовы покупать новое железо за бешеные деньги, создавать какие-то командные файлы и заниматься прочей ерундой. А нужно всего лишь включить голову и разобраться в причинах тормозов. Когда программисты разрабатывают какую-либо программу, они всегда оптимизируют ее для работы на определенном «средне статистическом» компьютере, закладывая при этом кратный запас по производительности. Если вдруг эта программа (QUIK) начинает неадекватно тормозить и виснуть на обычном современном компьютере — значит дело почти наверняка не в железе, и даже не в самой программе, а в ее конфигурации (настройках). Т.е. нам нужно правильно настроить терминал QUIK , а уже потом апгрейдить железо, менять туда-обратно версии и бухтеть на Смарт-лабе.



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

Разные мысли

Заметки из блокнота. Пятничное.

Регулярно и бездумно «инвестируют» дураки. Нужно уметь ждать.

Чего ты хочешь добиться? Не работать? Возьми отпуск на год (да хоть на пару месяцев) и попробуй — оно тебе надо?

Меньше движений — лучше результат.

Флет вероятнее чем тренд. Продолжение тренда вероятнее разворота. Этого уже достаточно, чтобы заработать.

Просадка 90% в Экселе и на депозите размером с три квартиры — это разные вещи.

Как сказал один дед, которому стукнуло 83 — опыт, как и половое бессилие, приходит с годами.

Входи пока тихо. Космонавт, опоздавший на ракету — это огарок от дюз.

Про рыдания кинутых форекс-кухнями: «А ты о чем думал, когда его туда совал? Что он у тебя в меду будет?»

ETF — это всего лишь юрлицо. С рисками юрлица.

Чужая конфигурация QUIK бесполезна так же, как и чужая стратегия. Нужно выстрадать свою.

Чешутся руки? Заведи на отдельный счет 200 рублей и делай сделки с FXWO/FXRW.

Что делает нормальный интрадейщик в полдень?

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

Виснет Quik? Возможно вам сюда.

    • 02 марта 2020, 23:26
    • |
    • 3Qu
  • Еще
Если подвисает сам брокер или связь с ним, то этот топик вам не поможет.
Однако, возможно  причина и в самом терминале Quik. Дело может быть в том, что Quik в процессе работы пишет данные в файлы вида *.dat и *.log, и со временем эти файлы сильно разрастаются и запись в них данных занимает значительное время, отнимая процессорное время у других задач.
Простейший выход из этого состояния — периодическое удаление файлов *.dat и *.log из директории Quik. Для этого надо написать небольшой командный файл всего в одну строчку, разместить его в директории Quik, где находятся удаляемые файлы, и, для удобства использования создать ярлык на рабочем столе.
Итак, открываем блокнот и создаем файл Quik_start.cmd В него помещаем всего одну строчку: 
del alltrade.dat curr_data.log info.log
 
После команды не забудьте нажать Enter, чтобы последней в файле была пустая строка.
Сохраняем файл в указанной выше директории (папке), создаем ярлык и переносим его на рабочий стол. Запускаем командный файл перед стартом Quik. При этом файлы, указанные в команде del будут удалены. При запуске Quik их создаст заново.

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

Управление капиталом в трейдинге

Управление капиталом в трейдинге
Сегодня мы поговорим о математике. Математике управления капиталом. 

Что мы думаем про управление капиталом? Первое что приходит на ум это – «Большой», бородатый дядька – трейдер, на бумаге высчитывает — куда ему перенаправить свои огромные деньжищи! И мы, сравнивая себя с ним, считаем себя «маленькими трейдерёнками»… А раз мы маленькие, то и высчитывать нам нечего! Вот когда заработаем…… Вот тогда и будем изучать и разбираться в этой науке. 

А не заработаем! 
Более того – потеряем то что есть! 
А почему? — Потому что деньги любят счёт!
Итак, поехали. 
Что значит управлять капиталом?
1. Не потерять! 
Сохранить.
Приумножить.Чтобы заработать на спекуляциях, особенно на производных инструментах (фьючерсы, опционы) или если вы просто работаете с плечом – первоочередная задача – не слить депозит. 

У вас должна быть: 

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

Lua для Quik 8

Обновил квик до 8 версии, теперь скрипты не идут. 
Я в программировании не разбираюсь, нашел, что нужно менять dll c 32 битных на 64.
Может кто помочь переделать файл dll 32 на 64  для простенького скрипта Автологин ?
Ссылка на файлы https://cloud.mail.ru/public/3oys/jF8KHrHhm
  • обсудить на форуме:
  • QUIK

Скрипт #ThinkOrSwim для #watchlist

Скрипт #ThinkOrSwim для #watchlist

Скрипт #ThinkOrSwim для #watchlist

Показывает в колонке с акцией, на сколько цена далеко от цены открытия сегодняшнего дня.

#Diff_Open.показывает, сколько центов до открытия дня
#Cнять галочку Include Extended Session

plot iDiffOpen = open(period = «DAY»)[0] — close;

***
Нужна полная библиотека индикаторов ???
Загляни в наш блог… https://goo.gl/TMYVXm

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