Постов с тегом "алготрейдинг": 4538

алготрейдинг


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

Ниже приведены все записи на нашем сайте по теме алготрейдинга.

Фильтрация по тренду на примерах простых алгоритмов

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

Довольно часто, наблюдаю, что при создании алгоритмов, чаще прибегают к поиску прибыли через оптимизацию параметров, или не видя красивые «зеленные холмы» прибыли, просто сворачивают попытки развивать и насыщать алгоритм условиями. 
В примере ролика постарался продемонстрировать, возможно банальную попытку фильтрации, в основном идея для новичком.
Исходя из распределения дневных кластеров (объемы по ценам) «вырезаю сердцевину проторговки» и фильтрую по движению его границ. 
Другими словами, беру 50% проторговки цены и исходя из его динамики выявляю наличие тренда или его отсутствие, и тем самым фильтрую сделки по скользящим и по пробою уровня со стандартными параметрами. Все это работать может только при наличии тиковых данных, это нужно иметь ввиду, если решите повторить ролик. 


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

Как делать торговую систему?



     Еще одна памятка новичкам. Рядом с ней последние посты smart-lab.ru/blog/531726.php (трейдинг должен быть дедуктивным), smart-lab.ru/blog/532375.php (гипотезы надо не щадить), smart-lab.ru/blog/533056.php (за математикой желательна физика).

     На всякий случай оговорюсь: речь сейчас про обычную трендовушку для инструмента, на котором она уместна. Уместность легко видится на простейших тестах (например, если в Si простой вход на мувингах с выходом по таймингу дает плюс — все, это наш инструмент, можно рыть дальше). В паттерны и хфт сейчас не лезем. Еще одна оговорка: у вас есть тестер, ряд исторических цен и желание с этим работать. Без этого не получится. И я бы сказал, наблюдается парадокс: ручная торговля может получиться, но… скорее всего у того, что перебрал в уме десятки МТС. То есть это то, чем можно заняться при желании — ради опыта, забавы, диверсификации — после алго, а не до и не вместо. 

     Торговая система это вход, выход и сайз. Иногда фильтр. Иногда выход не один. Все.



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

TSLab: как жахать на всю котлету (реинвест)

Новичкам алготрейдинга.

Основным способом получения хулиардов процентов на тестировании стратегии является реинвест прибыли.
Без этого вы получите свою скучную вялую эквити, так и не поняв, какой потенциал хранится в вашей стратегии.
Если у стратегии постоянные положительные результаты за определенный период (часы или недели — роли не играет), то надо показывать график с реинвестом.
Как делать реинвест на TSLab без кода, только на кубиках (код то писать большинству лень).
Очень просто. Рассмотрим для фьючей.
Необходимо определить две константы: «стартовый депозит» и «стоимость ГО одного контракта». Тогда нам будет понятно, какое количество контрактов можно открыть изначально. (Не надо указывать стартовый капитал в настройках TSLab, пусть там будет ноль, выведите его в константу — потом, поверьте, будет проще в настройках).
Чтобы отработать с минимума, поставьте стартовый капитал = ГО, то есть стратегия начнет работу с одного контракта.
Плюс к этому добавляем в формулу кубик «Доход за всё время».

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

Портфельная оптимизация как бустинг на «слабых» моделях

Часть 1.

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

Прим. В качестве актива могут выступать ценные бумаги (акции), их производные (опционы)  или торговые системы.

 

Решение задачи состоит из двух этапов:

  1. Прогноз доходности и ковариации активов в будущих периодах – то есть построение некоторого набора «слабых» прогностических моделей.
  2. Составление оптимального портфеля в соответствии с некоторой целевой функцией, и ранее полученными оценками. То есть построение такой композиции «слабых» моделей, которая обладала бы наибольшей прогностической силой.

 

Почему мы используем аналогию портфельной оптимизации с методами машинного обучения  — Bag, Boost?! Потому что в действительности (и мы это продемонстрируем) нам абсолютно не важно, насколько хорошо динамику наших временных рядов прогнозируют «слабые» модели – нам важно только то, чтобы ошибки прогнозов наших моделей взаимно компенсировали бы друг друга в некотором интегральном смысле. Иными словами – в случае бустинга – ошибка прогноза линейной композиции была бы минимальной, а в случае портфельной оптимизации –  была бы минимальной ошибка прогноза нелинейной композиции (то есть самого портфеля).



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

Друзья, кто может подсказать тематические форумы, паблики, чаты для алготрейдеров и начинающих рыночных программистов?

    • 09 апреля 2019, 21:21
    • |
    • Gorazio
  • Еще
 Решил для себя освоить написание как простых индикаторов, так и внешних скриптов посложнее. Ищу близких по интересам товарищей, кто подскажет с чего начать, какими командами лучше изымать данные для анализа из системы и где могут подстерегать подводные камни. 
 
 Готов принять любые советы в своём начинании.

Заранее всех благодарю.

Книга для тех, кто хочет систематизировать свою торговлю или создавать торговых роботов

Автор — известный в трейдерской среде mehanizator. Создатель сайта для алгоритмических трейдеров long-short.pro
Книга является квинтэссенцией многолетнего опыта автора в области исследований свойств рынка и разработки механических торговых систем.
Являясь практическим руководством к действию, книга глава за главой проводит читателя в мир систематизированной торговли, правил, алгоритма принятия решений и проверки тех или иных гипотез.
Состоит из 4 последовательно связанных глав. Внимание следует уделить всем главам, даже несмотря на то, что кажется что в начале книги автор льет воду. На самом деле воды в книги нет, описательные разделы поведения рыночных участников и свойств рынка необходимы в начале книги, чтобы в последующем читатель смог формировать рабочие гипотезы и, проверив их затем на тестах, выйти на устойчивую алгоримическую (системную) торговлю.
Рекомендую к прочтению всем, кто хочет отойти от импровизации и перейти на системный трейдинг — позволит сэкономить кучу времени и избежать иллюзий простоты этого вида деятельности.

 


Доработал zigzag5

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

Доработал zigzag5
код индикатора:
Settings=              
        {                          
            Name = "Zigzag5",   -- название индикатора
            delta=2,                  -- параметр индикатора                          
            deltaY=1,                  -- параметр индикатора   			
            linedeltaY=0.75,                  -- параметр индикатора   				
            line=                                     
                {                               
                    {  
                        Name = "zigzagline3",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(0,255, 0)
                    },
                    {  
                        Name = "upline",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    },
                    {  
                        Name = "lowline",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(0,0, 255)
                    },
                    {  
                        Name = "declineline",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    },
                    {  
                        Name = "upline2",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(255,0, 0)
                    },
                    {  
                        Name = "lowline2",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(0,0, 255)
                    },
                    {  
                        Name = "declineline2",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(255,0, 0)
                    }				
                }
       }
	
	
function getradius(x, y)
  return math.sqrt(Settings.deltaY*y*y+x*x)
end

function koef(val)
  return 1 - 1/(1-1/val)
end


function Init()

  vMin = 0
  vMax = 0
  vMinindex = 0
  vMaxindex = 0
  voldMinindex = 0
  voldMaxindex = 0
  upval = 0
  lowval = 0
  upindex = 1
  lowindex = 1  
  veu = nil
  vel = nil
  curfrom = 1
  curto = 1

  return 7
end


function OnCalculate(index)
  local printz = 0
  vsize = Size()	  

  ve = nil
  veu = nil
  vel = nil 
  curv = nil 
  veu2 = nil
  vel2 = nil 
  curv2 = nil  
  
  if index == 1 then
    vMin = C(index)
    vMax = C(index)
    vMinindex = index
    vMaxindex = index
    voldMinindex = index
    voldMaxindex = index
    ve = C(index)  
	  
  else
         
    if voldMaxindex >= voldMinindex then
        
       
	  if C(index) > (1 + Settings.delta/100)*vMin then
         
        vMin = C(index)  
        vMax = C(index) 
        vMaxindex = index
        voldMinindex = vMinindex 
        vFrom = voldMaxindex  
        vTo = vMinindex
        printz = 1		
		
        if (C(vMinindex) > C(vsize)) and (upval > koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))) then
		  upval = koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))
		  upindex = vMinindex
		end
        if (C(vMinindex) < C(vsize)) and (lowval > koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))) then
		  lowval = koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))
		  lowindex = vMinindex
	   end	
	   
	    curfrom = voldMaxindex
	    curto = voldMinindex	  	   
	      	    
      else      
	  
        if vMin > C(index) then
          vMin = C(index)
          vMinindex = index
          vFrom = voldMaxindex      
          vTo = index
          printz = 0
		  curto = index		
        else
          vFrom = vMinindex 
          vTo = index
          printz = 0
        end 		
	  
	    curfrom = voldMaxindex	
		
      end
	 
 	 
    else
     
    if voldMaxindex <= voldMinindex then
	  
      if C(index) < (1 - Settings.delta/100)*vMax then
	     	  
        vMax = C(index) 
        vMin = C(index)  
        vMinindex = index
        voldMaxindex = vMaxindex
        vFrom = voldMinindex
        vTo = vMaxindex
        printz = 1
	
        if (C(vMaxindex) > C(vsize)) and (upval > koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))) then
		  upval = koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))
		  upindex = vMaxindex
		end                   
        if (C(vMaxindex) < C(vsize)) and (lowval > koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))) then
		  lowval = koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))
		  lowindex = vMaxindex
		end		
		
	    curfrom = voldMinindex		
	    curto = voldMaxindex
		
      else 
	    	    
        if vMax < C(index) then
          vMax = C(index)
          vMaxindex = index
          vFrom = voldMinindex    
          vTo = index
          printz = 0
		  curto = index		
        else  
          vFrom = vMaxindex  
          vTo = index        
          printz = 0
        end
		
	    curfrom = voldMinindex
		
      end  

	
    end
    end
 
    if (printz == 1) or (Size() == index) then
      for i = vFrom, vTo do
        k = (C(vTo)- C(vFrom))/(vTo- vFrom)
        v = i*k + C(vTo) - vTo*k
        SetValue(i, 1, v)
        ve = v
      end   
      if (Size() == index) then
        ve = C(index)
        if voldMaxindex >= voldMinindex then
          vFrom = voldMaxindex 
          vTo = vMinindex
        end 
        if voldMaxindex <= voldMinindex then  
          vFrom = voldMinindex
          vTo = vMaxindex
        end 
        for i = vFrom, vTo do
          k = (C(vTo)- C(vFrom))/(vTo- vFrom)
          v = i*k + C(vTo) - vTo*k
          SetValue(i, 1, v)
        end  
           
        -- up level line 
        if upindex ~= nil then
		  if C(upindex) > C(index) then		
            for i = upindex, index do
              SetValue(i, 2, C(upindex))
              SetValue(i, 5, C(upindex)-Settings.linedeltaY*C(vsize)/100)			  
            end  	
            veu = C(upindex)	
          end 		  
		end
		
		-- low level line 
		if lowindex ~= nil then
		  if C(lowindex) < C(index) then
            for i = lowindex, index do
              SetValue(i, 3, C(lowindex))
              SetValue(i, 6, C(lowindex)+Settings.linedeltaY*C(vsize)/100)				  
            end  			
            vel = C(lowindex)
         end
       end		
        
       if voldMaxindex >= voldMinindex then     
	    vsign = -1
		if curfrom == voldMinindex then
		  vsign = -1
		end
		if curfrom == voldMaxindex then
		  vsign = 1
		end		

        -- inclined line
	    if curto- curfrom > 0 then
	     maxcurv = 0
	     k = (C(curto)- C(curfrom))/(curto- curfrom)
         for i = curfrom, curto  do        
          curv = i*k + C(curto) - curto*k	
          if vsign == -1 then  		  
 		    if L(i) < curv then
		      if maxcurv < curv - L(i) then
		        maxcurv = curv - L(i)
              end
            end
		  else
 		    if H(i) > curv then
		      if maxcurv < H(i) - curv then
		        maxcurv = H(i) - curv
              end
            end		  
		  end
         end   		
         for i = curfrom, index  do
          curv = i*k + C(curto) - curto*k + vsign*maxcurv	  
          SetValue(i, 4,curv)
		  curv2 = curv+ vsign*Settings.linedeltaY*C(vsize)/100
		  SetValue(i, 7,curv2)		  
         end   		
	    end
	    curv = nil	
	   end 
	  
       if voldMaxindex <= voldMinindex then
	    vsign = -1
		if curfrom == voldMaxindex then
		  vsign = 1
		end		
		if curfrom == voldMinindex then
		  vsign = -1
		end			
  
        -- inclined line
        if curto- curfrom > 0 then
         maxcurv = 0
         k = (C(curto)- C(curfrom))/(curto- curfrom)
         for i = curfrom, curto  do        
          curv = i*k + C(curto) - curto*k		  
          if vsign == -1 then  		  
 		    if L(i) < curv then
		      if maxcurv < curv - L(i) then
		        maxcurv = curv - L(i)
              end
            end
		  else
 		    if H(i) > curv then
		      if maxcurv < H(i) - curv then
		        maxcurv = H(i) - curv
              end
            end		  
		  end
         end   		
         for i = curfrom, index  do
          k = (C(curto)- C(curfrom))/(curto- curfrom)
          curv = i*k + C(curto) - curto*k + vsign*maxcurv	  		
          SetValue(i, 4,curv)
		  curv2 = curv+ vsign*Settings.linedeltaY*C(vsize)/100
		  SetValue(i, 7,curv2)
         end   		     
        end
	    curv = nil		
       end	  
	          
      end
    end

  end  
  
  return ve, veu, vel, curv, veu2, vel2, curv2  
  
end



  • обсудить на форуме:
  • Quik Lua

Торгуем нефтью вместе с FullCup 03.04.2019

    • 03 апреля 2019, 21:09
    • |
    • FullCup
  • Еще
Аскетичный пост о сигналах ТС в нефти:

1. ТС со вчера в лонге по 69,32 ( Накоплением в апреле +61 шага (пункта, цента)! )
    цена прошла дальше стопа ТС на +0,64 (поле для творческого фикса профита)
2. ТС в шорте по 69,62  ( +0,30 от лонга по сигналу ТС)




Итоги марта.

Вчерашний торговый день


Алго-извращения.

С недавних пор в моем софте появился класс, отражающий такую сущность как «гипотеза». А как ООП (или без ООП) алго-извращаешься ты?)

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