Избранное трейдера Олег

по

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

Скрипт lua читающий таблицу обезличенных сделок.

Всем привет. Может кому пригодится. Скрипт читает ленту сделок и раз в минуту подсчитывает разницу между покупками и продажами. Часть кода нашел в интернете часть кода написал сам. Не знаю может уже есть что то подобное. Цель была не написать что то оригинальное, а наработать навыки программирования на lua.

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

Система ценового канала скользящих средних (перевод с elliottwave com)

    • 11 марта 2020, 15:55
    • |
    • RUH666
  • Еще
Один из способов преодоления ложных сигналов системы с пересечением скользящих средних  — использование ценового канала скользящих средних. Скользящая средняя, ​​более высокая черная линия на Рисунке 1-5, представляет собой простую скользящую среднюю максимальных цен за 20 периодов. Нижняя черная линия — это 20-периодная простая скользящая средняя минимумов. Канал скользящей средней цены — это область между ними. Синяя линия — 5-периодная простая скользящая средняя по закрытиям.
Система ценового канала скользящих средних (перевод с elliottwave com)На рисунке 1-5 сигналы покупки и продажи отмечены стрелками. Покупка происходит, когда 5-периодная простая скользящая средняя закрытия или синяя линия пересекает вверх верхнюю границу нашего ценового канала. Продажа — это когда синяя линия пересекает вниз нижнюю линию или 20-периодную простую скользящую среднюю минимумов.

Использование ценового канала сокращает количество попаданий в «пилу», потому что это создает более существенное препятствие для преодоления цен до генерирования сигнала. На этом же рисунке обратите внимание на то, что с момента начала роста в конце марта 2008 года появились сигналы на покупку в сторону повышения, а также хороший ход в сторону понижения, что сигнализировало о пробое, замеченном здесь, в кукурузе.

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

перевод из "Бесплатное руководство «Как найти возможности для торговли с высокой вероятностью с помощью скользящих средних»"

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

Новичкам. Советы от бывалого. Как торговать на Forts?

Вот читаю ваши топики, друзья и недруги, где бравый солдат О'Грин, занесший меня в ЧС, слился, а потом долбо-бо… Алёша Gurov, также занесший меня в ЧС, слился, и вроде бы хочется вас пожалеть, но крокодильи слезы наворачиваются от ваших маржин-колов (крокодилы плачут, кто не знает, когда едят жертву у них гармон радости такой).

Это война, поэтому здесь не должно быть жалости, каждый сам за себя. Но...

Тем, кто меня читает, я дам пару советов как выжить на Forts, ведь это вам не вату катать на своей фонде, на фортсе все иначе — чуть варежку разинишь и, считай, что пристрелили.

Правило ^1:
Выбери достойного брокера.

Сбер, ВТБ, Финам, БКС, Альфу, Промсвязь и прочее говно шли на х… Почитай топики за последние 2 недели, если люди жаловались на то, что серваки легли и не вставали, значит беги от такого брокера. Брокер это твой автомат Калашникова, если автомат заклинило или попал песок — тебя убили. Тебе нужен автомат такой, который всегда будет стрелять. Выбирай на букву О, У, Ц, Ай, Ал.

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

Как продать квартиру без риелтора. Пошаговое руководство

Сергей Смирнов снова с вами. Огненный стрим! 
Вы получите пошаговую инструкцию для самостоятельной продажи квартиры.
Даже если вы сейчас не продаете, это будет о-о-о-очень полезно в будущем.



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

$анкции. Часть 2.

Приветствую дорогие друзья!

В прошлой статье я писал про мое отношение к инвестициям и деньгам в целом. Сегодня многие на практике испытали страх потери денег. Выдался действительно Чёрный понедельник, рынок просел, что мы будем с этим делать?

Для начала не стоит паниковать, рынок падал в истории неоднократно, если вы придерживаетесь доходной стратегии и имеете кэша или облигаций на 20-30% от портфеля, то нужно радоваться.

Мой портфель, к примеру, сегодня выглядит так:
$анкции. Часть 2.

И это при том, что большая часть активов сейчас сосредоточена в энергетике, которая вообще не подвержена санкциям (здесь без учета облигаций, их на данный момент 20% от портфеля):
$анкции. Часть 2.



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

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