gardist
gardist личный блог
13 марта 2019, 19:38

скрипт для quik

скрипт для отслеживания бумаг по системе BWS:

--Массив с Тикерами, добавьте нужные тикеры
aTickerList = {"MSNG", "GAZP", "LKOH",
	    "SIBN", "GMKN","ROSN",
	    "SBER", "TATN", "NVTK",
	    "IRAO", "RSTI", "SBERP",
	    "PHOR", "SNGS", "TRNFP",
	    "VTBR", "FEES", "MVID",
	    "RASP", "MFON", "AFLT", 
	    "MAGN", "ALRS", "MTSS", "MOEX",
	    "RTKM", "MGNT", "NLMK", "SNGSP",
	    "CHMF", "MTLR", "HYDR", "MFON",
	    "RSTI", "PLZL", "BANEP", "POLY"
	    };

--Функция поиска цены
function fGetPrice(sTickerName, sNum)
	--Подключаемся к источнику данных
	local ds=CreateDataSource("TQBR", sTickerName, INTERVAL_D1);
	while (Error=="" or Error == nil) and ds:Size() ==0 do sleep(10) end;
	if Error ~="" and Error ~=nil then message("Error: "..Error, 1) end;
	local sSize=ds:Size();
	local sCurrentPrice=ds:O(sSize);
	
	local sLastWeekPrice7=0;
	local sLastWeekPrice14=0;

	--Берем цену закрытия свечи неделю назад
	sLastWeekPrice7=ds:C(sSize-4);
	--Берем цену закрытия свечи 2 недели назад
	sLastWeekPrice14=ds:C(sSize-8);

		--Вычисляем проценты
		local sPrc7=math.floor((100-((sLastWeekPrice7*100)/sCurrentPrice))*100)/100;
		local sPrc14=math.floor((100-((sLastWeekPrice14*100)/sCurrentPrice))*100)/100;

		--Заполняем таблицу значениями
		SetCell(t_id, sNum, 0, tostring(sTickerName));
   		SetCell(t_id, sNum, 1, tostring(sCurrentPrice),sCurrentPrice);
   		SetCell(t_id, sNum, 2, tostring(sLastWeekPrice7),sLastWeekPrice7);
   		SetCell(t_id, sNum, 3, tostring(sLastWeekPrice14),sLastWeekPrice14);
   		SetCell(t_id, sNum, 4, tostring(sPrc7),sPrc7);
		SetCell(t_id, sNum, 5, tostring(sPrc14),sPrc14);

		--Текущая цена больше цены прошлой недели - раскрашиваем зеленым
		if sCurrentPrice>sLastWeekPrice7 then 
			fGreen(sNum);
		end;
		--Текущая цена меньше цены прошлой недели - раскрашиваем красным
		if sCurrentPrice<sLastWeekPrice7 then
			fRed(sNum);
	   	end;
		--Текущая цена больше цены прошлой недели и цена прошлой недели больше цены позапрошлой недели
		--раскрашиваем желтым
		if sCurrentPrice>sLastWeekPrice7 and sLastWeekPrice7>sLastWeekPrice14  then 
			fYellow(sNum);
	   	end;
end;

--- Функция создает таблицу
function CreateTable()
	-- Получает доступный id для создания
	t_id = AllocTable();	
	-- Добавляет 6 колонок
 	AddColumn(t_id, 0, "Тикер", true, QTABLE_INT_TYPE, 15);
 	AddColumn(t_id, 1, "Сегодня", true, QTABLE_INT_TYPE, 15);
 	AddColumn(t_id, 2, "Неделя", true, QTABLE_INT_TYPE, 15);
 	AddColumn(t_id, 3, "2 Недели", true, QTABLE_INT_TYPE, 15);
 	AddColumn(t_id, 4, "Неделя (%)", true, QTABLE_INT_TYPE, 15);
 	AddColumn(t_id, 5, "2 Недели (%)", true, QTABLE_INT_TYPE, 15);
	
	-- Создаем
	t = CreateWindow(t_id);
	-- Даем заголовок	
	SetWindowCaption(t_id, "7 Days");

   -- Добавляем строки
      for k,v in pairs(aTickerList) do
		InsertRow(t_id, k);
      end;
end;

--- Функции раскрашивают ячейки таблицы
function fRed(col)
	SetColor(t_id, col, -1, RGB(255,168,164), RGB(0,0,0), RGB(255,168,164), RGB(0,0,0));
end;
function fGreen(col)
	SetColor(t_id, col, -1, RGB(157,241,163), RGB(0,0,0), RGB(157,241,163), RGB(0,0,0));
end;
function fYellow(col)
	SetColor(t_id, col, -1, RGB(249,247,172), RGB(0,0,0), RGB(249,247,172), RGB(0,0,0));
end;

--Основная функция
function main()
	-- Создаем таблицу
 	CreateTable();

 	--Пробегаемся по массиву тикеров
	for k,v in pairs(aTickerList) do
	  fGetPrice(v, k);
	end;

end;
как выглядит в квике:
скрипт для quik
ссылка на скрипт 
P.S.: не является рекомендацией к покупке/продаже акций, вы используете программу на свой страх и риск.

кросспост rffx.ru
16 Комментариев
  • kachanov
    13 марта 2019, 21:27
    Полезная работа
    Единственный вопрос как скрипт переживет праздники, например что он насчитает 15/03?

      • kachanov
        13 марта 2019, 22:14
        gardist, варианта два:
        1. просто сдвиг на заданное количество свечей (тут будут регулярно кривые недели)
        2. пусть пользователь задает использовать сдвиг или нет, в случае праздника, а если использовать то какой (тут новый год и майские все равно тяжело учесть)

      • Shara
        14 марта 2019, 09:41
        gardist, Подскажите плиз, как в этом скрипте таймфрейм менять на День, Месяц, Год и как скрипт в Квик вставить? Возможно ли сделать СтопЛосс как у AlexChi
        Спасибо.
      • Ramil Shahattudinov
        09 апреля 2021, 16:00
        gardist, Доброго времени.
        Ваш скрипт интересная штука.
        Пока юзал ваш скрипт возникло несколько вопросов. 
        Я так понимаю сам скрипт не  отображает 8 лучших акций за неделю вверху таблицы, акции будут располагаться в таком порядке, в каком указан тикер в коде. Берётся цена открытия, а если поменять на цену закрытия, сильно всё изменится...?


        Если попробовать сортировать по % недели, тоже получается бяка. Сначала всё нормально, но потом начинается мешанина, так же подсвечиваются все тикеры, не только лучшие. А каков алгоритм цветового отображения. Как сделать, что бы было более похоже на BWS. 

    • AlexChi
      13 марта 2019, 22:37
      kachanov, я в своем аналогичном скрипте считаю неделю как 5 торговых дней, т.е. в вашем примере неделя будет с 7 марта по 15 марта, т.к. 8 марта праздничный день.
      • kachanov
        13 марта 2019, 23:06
        AlexChi, ну это самый простой и разумный на мой взгляд подход.
        Я тоже в похожих ситуациях именно его использую 
  • Константин
    13 марта 2019, 22:27
    а не правильнее ли рассчитать доходность не по разнице с прошлой неделей, а по meam и вычислить sigma (SD), и если ушли выше 1sd, то считать, что бумага лучшая за неделю ?
    кстати если считать по дням и входить каждый день, а не раз в неделю, то какая будет доходность ))
      • Константин
        13 марта 2019, 23:59
        gardist, тут, тут и тут например )))
        в 2017 году писал робота под МТ5 на эту тему, правда сам не стал тогда торговать т.к. там вход был лимитниками перед аукционом закрытия, а протестить корректно это не получалось т.к. аукционы в МТ5 (да и вообще на истории) не сводятся и получалось что на тестах стратегия четко шла в гору )) а на практике часть сделок анулировалась на аукционах, а часть закрывалась по ТП ))
        ТФ брали D1, потом изголялись на меньших и даже делали открытие на следующий день сразу после аукциона открытия и вообще в течении дня )) в принципе доходность там нормальная с учетом доходности по вашей стратегии (то что тут и в других темах писали) т.е. в районе 25% годовых, но меня такая доходность не устраивала, поэтому и не стал дальше пилить робота )) хотя он в боевом положении до сих пор лежит у меня, нацеленный вылететь в корзину )))
  • Milo
    13 марта 2019, 23:24
    Красава+. Праздники у нас 2 раза в году н.г. и майские, потом неделю все отходят, входят в работу так что найдется выход. А в принципе можешь сделать ссылку на исключение с переносом, прописав конкретные даты. 15.3 то значение…
  • П М
    13 марта 2019, 23:58
    есть неэффективности в коде,
    например
    sTempYear=tonumber(os.date("%Y", os.time(ds:T(i))));
    
     насколько я понимаю, это просто 
    sTempYear = ds:T(i).year

    аналогично вроде
    local sLastDayWeek7=tonumber(os.date("%d", os.time(dt7)));
    
     это просто 
    local sLastDayWeek7 = os.time(dt7).day

    хотя раньше почему-то нормально пользуешься
    local dt7 = os.date("*t"); dt7.day = dt7.day - 8;
  • Stasik
    14 марта 2019, 11:35
    Надеюсь вы не пишите скрипт на этих клеточках, глаза сломать можно.
  • Abstract
    14 марта 2019, 20:17
    Надо добавить вторую неделю отдельно и раскрасить изменение по каждой неделе и суммарное разными цветами в строке. Тогда будет информативно. 

    А в таком виде неудобно.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн