Избранное трейдера Игорь В.

по

Лучший трейлинг на свете! Часть 3.

Продолжаю разбирать возможности ТСЛаб по организации  трейлинг стопов средствами «из коробки». 
Сегодня речь пойдет о трейлинге позиции по параболе.



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

Quik. Индикатор корреляции

    • 02 ноября 2017, 16:21
    • |
    • Karim
  • Еще
Написал на досуге по просьбе одного из участников смартлаба индикатор корреляции.
Индикатор простенький, считает коэффициент корреляции Пирсона
для двух выбранных инструментов на заданном таймфрейме.
Выкладываю исходный код. Может кому то пригодится.

Settings= 
{ 
Name = "Piton", 
N = 100,
legend = "price2",
line = 
	{ 
		{ Name = "Sint", 
		  Color = RGB(0, 132, 0), 
		  Type = TYPE_LINE, 
		  Width = 1 
		}		
	} 
} 

function Init() 
return 1
end 

Candles = {};


function OnCalculate(index) 
	local numCandles = getNumCandles(Settings.legend);
	if index <= Settings.N or numCandles <= Settings.N then
		return nil;
	end
	
	Candles, n, _ = getCandlesByIndex(Settings.legend, 0, index - Settings.N, Settings.N);
	if n ~= Settings.N then
        return nil;
    end
	
	-- Предварительный расчет
	sum1, sum2, sum3 = advancePaynemt(index);
	
	-- расчет коэффициента корреляции Пирсона
	r = sum3/math.sqrt(sum1*sum2);
	
	return r;
end

--  Предварительный расчет
----------------------------------------
function advancePaynemt(index)	
	local sum1 = 0;
	local sum2 = 0;	
	local sum3 = 0;
	local j    = 0;
	
	--  Вычислить среднее арифметическое
	for i=index - Settings.N + 1, index, 1 do
		sum1 = sum1 + C(i);			
		sum2 = sum2 + Candles[j].close;
		j = j + 1;
	end
	aver1 = sum1/Settings.N;
	aver2 = sum2/Settings.N;
	
	-- Вычислить сумму квадратов отклонений
	sum1 = 0;
	sum2 = 0;
	j 	 = 0;
	for i=index - Settings.N+1, index, 1 do
		sum1 = sum1 + math.pow(C(i) - aver1, 2);
		sum2 = sum2 + math.pow(Candles[j].close - aver2, 2);
		j = j + 1;
	end
	
	--  Вычислить сумму произведений разности
	j=0;
	for i=index - Settings.N+1, index, 1 do
		sum3 = sum3 + (aver1 - C(i))*(aver2 - Candles[j].close);
		j = j + 1;
	end
	
	return sum1, sum2, sum3;
end

Как запустить и настроить:


Архив исходника на QLua: https://yadi.sk/d/OxDvAekV3PLn2z
  • обсудить на форуме:
  • QUIK

Торговая система

    • 08 октября 2017, 13:18
    • |
    • Maks
  • Еще

Приветствую!

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

ТОЧКА ВХОДА

Вход всегда только от уровня. Цена уровня — это цена входа. Люфт может быть максимально 3-5 пунктов, в зависимости от ситуации, и при условии что все это помещается в размер стопа.

Предпочтительно работать от ключевых уровней или их спутников.

Классификация уровней
ключевые — это месячные, недельные, дневные и 4часовые уровни
остальные — 15мин уровни.
спутники — как правило это 15мин уровни, которые формируются сверху и снизу ключевых уровней, в связи с тем что, цена периодически пробивает этот ключевой уровень. И образуется так называемая
зона.
Торговая система



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

Справочник Lua для Quik

    • 09 сентября 2017, 22:26
    • |
    • Dzam
  • Еще

Справочник Lua для Quik

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


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

Пользуйтесь

План (А)

Когда на пятиминутном тайм фрейме менее 50-и пунктов то ставим лимитные заявки на покупку и на продажу
около 25% от депозита, на расстоянии 10 пунктов от текущей цены. Стоп лос ставим по 20 пунктов от лимитных заявок.
После того как сработала одна из лимитных заявок переносим встречную заявку (тейк профит) на 10 пунктов от цены
исполнения, ждем исполнения лоса или профита. Если профит то повторяем, если лос то переходим к плану (Б)


План (Б)

Ставим лимитные заявки в 20-и пунктах от текущей цены, на 50% от депозита, после того как сработала одна
из заявок переносим встречную заявку на 10 пунктов от цены исполнения. Если профит то повторяем план (Б) до признаков
узкого боковика, после этих признаков переходим к плану (А), если лос то переходим к плану (В).


План (В)

Ставим лимитные заявки по 40 пунктов от текущей цены на 100% от депозита, после исполнения одной из заявок
переносим встречную заявку на 10 пунктов от цены исполнения.Если профит повторяем до признака узкого боковика,
если и в третий раз сработал лос то ждем признаков узкого боковика и переходим к плану(А) и т.д. по кругу.


Признак узкого боковика:

Три прилипшие свечки к средней скользящий, moving average 8 периодов, на пяти минутном тайм фрейме.


Работает на фьючерсе доллар рубль.

Не работает в более широком временном тайм фрейме.

 


Таблица "Портфель" в QUIKе


    Представляю таблицу для портфельных инвестиций. В квике до сих пор такого нет. Цвет строки меняется если Прибыль%<>5%. Обновление каждые 5 сек.
Таблица "Портфель" в QUIKе

Для её создания необходимо:
1. Создать файл «tablePortfolio.txt» в папке «C:\QUIK\Scripts». Если папки нет, создать её.
2. Скопировать туда код скрипта
3. Сохранить, выбрав кодировку «ANSI», иначе вместо русских букв могут быть кракозябры.
4. Сменить расширение файла с ".txt" на ".lua"
5. Запустить скрипт командой Сервисы->Lua  скрипты->Добавить (выбрать файл tablePortfolio.lua) ->Запустить

Код скрипта:
IsRun = true
class_code="TQBR"

function main()
   -- Получает доступный id для создания
   t_id = AllocTable()   
   
   -- добавить столбцы
   AddColumn(t_id, 1, "Бумага",       true, QTABLE_STRING_TYPE, 20)
   AddColumn(t_id, 2, "Кол-во",       true, QTABLE_INT_TYPE,     7)
   AddColumn(t_id, 3, "Цена покупки", true, QTABLE_DOUBLE_TYPE, 14)
   AddColumn(t_id, 4, "Цена текущая", true, QTABLE_DOUBLE_TYPE,   14)
   AddColumn(t_id, 5, "Прибыль, р",   true, QTABLE_DOUBLE_TYPE,   14)
   AddColumn(t_id, 6, "Прибыль, %",   true, QTABLE_DOUBLE_TYPE, 14)
   t = CreateWindow(t_id)

   for iRow=1, getNumberOf("depo_limits")-1, 1 do
      rowInPortfolioTable = getItem("depo_limits", iRow) -- получить текущую строку из таблицы "Лимиты по бумагам"            
      qtyBoughtLots  = tonumber(rowInPortfolioTable.currentbal)         
      limitKind = rowInPortfolioTable.limit_kind          
      if qtyBoughtLots>0 and limitKind<1 then      
         InsertRow(t_id, iRow)-- добавить новую строку вниз таблицы   
      end
   end
   local rows, columns = GetTableSize (t_id)
   InsertRow(t_id, rows+1) -- добавить новую строку вниз таблицы для "Итого"
   
   SetWindowCaption(t_id, "Портфель: прибыли и убытки    © [email protected]") 

   -- исполнять цикл, пока пользователь не остановит скрипт или не закроет окно таблицы
   while IsRun do 
      if IsWindowClosed(t_id)==true then
         IsRun=false
      end

      local currentPrice=0
      local qtyBoughtLots=0
      local profitAbs = 0
      local profitPerc = 0
      local currentSecCode= ""
      local fullNameOfInstrument = ""
      local limitKind = 0
      local rowInPortfolioTable = {}    -- строка из таблицы "Лимиты по бумагам"
      local tableInstrument = {}    -- данные "Таблицы текущих торгов"
      local iRowInOutTable = 1
	  local totalInvest = 0
	  local totalPortfolio = 0
	  local totalProfit = 0
	  local totalPercent = 0

      for iRow=0, getNumberOf("depo_limits")-1, 1 do
         rowInPortfolioTable = getItem("depo_limits", iRow) -- получить текущую строку из таблицы "Лимиты по бумагам"         
         
         qtyBoughtLots  = tonumber(rowInPortfolioTable.currentbal)
         
         limitKind = rowInPortfolioTable.limit_kind 
         
         if qtyBoughtLots>0 and limitKind<1    then      -- если кол-во лотов >0 и тип лимита T0
            currentSecCode = rowInPortfolioTable.sec_code
            fullNameOfInstrument =  tostring(getParamEx(class_code, currentSecCode, "SHORTNAME").param_image or "0") --"LONGNAME"
            avgPrice       = tonumber(rowInPortfolioTable.awg_position_price)                  
            currentPrice = GetAskPrice(currentSecCode)   
            profitAbs = (currentPrice-avgPrice)*qtyBoughtLots      
            profitPerc    = 100*currentPrice/avgPrice   - 100
			
			totalInvest = totalInvest + avgPrice*qtyBoughtLots  
			totalPortfolio = totalPortfolio + currentPrice*qtyBoughtLots   
            
            SetCell(t_id, iRowInOutTable, 1, fullNameOfInstrument) -- "Бумага"
            SetCell(t_id, iRowInOutTable, 2, tostring(qtyBoughtLots)) -- "Кол-во"RemoveZero(tostring(qtyBoughtLots)))
            SetCell(t_id, iRowInOutTable, 3, tostring( math_round(avgPrice, 3) ))  -- tostring(avgPrice))   -- "Цена покупки"
            SetCell(t_id, iRowInOutTable, 4, RemoveZero(tostring(currentPrice)))   -- "Цена текущая"
            SetCell(t_id, iRowInOutTable, 5, tostring( math_round( profitAbs, 0)) ) -- "Прибыль, р"
            SetCell(t_id, iRowInOutTable, 6, tostring(math_round(profitPerc, 1)) .."%") -- "Прибыль, %"
            
            if profitPerc >5 then       -- окрашиваем
               ColourRowInGreen(iRowInOutTable)
            elseif profitPerc<-5 then 
               ColourRowInRed(iRowInOutTable)
            else 
               ColourRowInYellow(iRowInOutTable)
            end   
            iRowInOutTable = iRowInOutTable+1
         end
      end
      totalProfit = totalPortfolio - totalInvest 
      totalPercent   = 100*totalProfit/totalInvest  
	  SetCell(t_id, iRowInOutTable, 1, "Итого") 
      SetCell(t_id, iRowInOutTable, 3, tostring( math_round(totalInvest, 0) ))  
      SetCell(t_id, iRowInOutTable, 4, tostring( math_round(totalPortfolio, 0)))  
      SetCell(t_id, iRowInOutTable, 5, tostring( math_round( totalProfit, 0)) ) 
      SetCell(t_id, iRowInOutTable, 6, tostring(math_round(totalPercent, 1)) .."%") 
	  
	  if profitPerc >5 then       -- окрашиваем
               ColourRowInGreen(iRowInOutTable)
            elseif profitPerc<-5 then 
               ColourRowInRed(iRowInOutTable)
            else 
               ColourRowInYellow(iRowInOutTable)
            end   
            iRowInOutTable = iRowInOutTable+1
      sleep(5000) -- пауза 5 сек.
      end
   --message("script table portfolio finished")
end


function ColourRowInRed(num_row)
   SetColor(t_id, num_row, QTABLE_NO_INDEX, RGB(255,150,150), RGB(0,0,0), RGB(255,150,150), RGB(0,0,0))
end
function ColourRowInYellow(num_row)
   SetColor(t_id, num_row, QTABLE_NO_INDEX, RGB(255,255,200), RGB(0,0,0), RGB(255,255,200), RGB(0,0,0))
end
function ColourRowInGreen(num_row)
   SetColor(t_id, num_row, QTABLE_NO_INDEX, RGB(150,255,150), RGB(0,0,0), RGB(150,255,150), RGB(0,0,0))
end
function GetAskPrice(inp_Sec_Code )
   local ask = tostring(getParamEx(class_code, inp_Sec_Code, "OFFER").param_value or 0)
   return ask
end
-- Округляет число до указанной точности
function math_round (num, idp)
   local mult = 10^(idp or 0)
   return math.floor(num * mult + 0.5) / mult
end
-- удаление точки и нулей после нее
function RemoveZero(str)
   while (string.sub(str,-1) == "0" and str ~= "0") do
      str = string.sub(str,1,-2)
   end
   if (string.sub(str,-1) == ".") then 
      str = string.sub(str,1,-2)
   end   
   return str
end
function OnStop()
   DestroyTable(t_id)
   IsRun = false   
end
  • обсудить на форуме:
  • QUIK

Видишь пять волн, жди разворот. Часть 2, построение торгового плана.

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

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

В EWP торговые планы не имеют каких-либо мудреных изысканий, и они в принципе очень простые. Качество построение торгового плана зависит не от совокупности, каких либо сигналов,  которые дают индикаторы, качество торгового плана зависит от качества проведенного анализа структуры движения цены. 
Видишь пять волн, жди разворот. Часть 2, построение торгового плана.

Схема начала построения торгового плана будет выглядеть, так как показано на картинке ниже из книги:  Wayne Gorman & Jeffrey Kennedy — Visual Guide to Elliott Wave Trading 2013.c 

Видишь пять волн, жди разворот. Часть 2, построение торгового плана.



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

Видишь пять волн, жди разворот. Часть 1.

Из-за непредвиденно продолжившегося выходного, обзоры разместить сегодня не получится, но так как есть немного свободного времени, решил написать небольшую заметку в продолжение серии заметок о технической части EWP и применении её на практике. 

В EWP основным паттерном является пяти волновая действующая модель. Таких, действующих моделей всего две, это импульс и диагональ. Ранее уже было описана модель диагональ, и  в ближайшее время заметка о диагоналях будет продолжена. В данный момент речь пойдет об импульсах.

Импульс – это наиболее распространенный вид действующей волны, и так как импульс является основным паттерном в  EWP то, все, абсолютно все модели как начинаются с импульсов так ими и заканчиваются. Видишь пять волн, жди разворот. Часть 1.

Существует всего несколько простых правил интерпретации ценового поведения внутри импульсов. Правило потому и называются правилом, что не допускает исключений и выполняется всегда. 
Видишь пять волн, жди разворот. Часть 1.



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

Скрипт Reshpekt'а для загрузки цитат в ленту комментариев (SL-autoquote) перестал работать (как починить внутри)

Не могу знать, почему отвалилась его работа с https ссылками, но поправить можно так.
  1. Зайти в настройки Tampermonkey (или Greasemonkey, или что там у вас для скриптов в браузере).
  2. Нажать Installed userscripts.
  3. Напротив SL-autoquote нажать Edit (иконка справа под Actions).
  4. В начало скрипта вставить строку // @include        https://smart-lab.ru/my/*, прямо под // @include        http://smart-lab.ru/my/*
  5. Нажать Save.
  6. Перезагрузить ленту комментариев SL.
Для тех, кто не знает, скрипт делает так:
Скрипт Reshpekt'а для загрузки цитат в ленту комментариев (SL-autoquote) перестал работать (как починить внутри)
Лежит тут: https://greasyfork.org/ru/scripts/19687-sl-autoquote



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