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

по

Индикатор осциллятор на зигзаге

Автор блога предпочел скрыть этот пост. Чтобы читать такие посты, надо стать его другом. Отправьте заявку в друзья.

Необходимо авторизоваться.

Скрипт для QUIK, показывающий, какое количество сделок у вас исполняется по рынку об встречные заявки, а также как изменится комиссия на срочной секции в случае принятия изменений тарифов.

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

Вот наваял Lua-скрипт для QUIK, показывающий, какое количество сделок у вас исполняется по рынку об встречные заявки.
Для работы скрипта в QUIK должны быть заказаны обезличенные сделки по тем инструментам, которыми вы торгуете.

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

Напишите в комментариях, сильно ли изменится ваша комиссия?

function main()
  local Trades = {}
  local comission = 0
  SearchItems('trades', 0, getNumberOf('trades')-1,
    function (class_code, trade_num, flags, exchange_comission)
      if class_code == 'SPBFUT' or class_code == 'SPBOPT' then  -- Учитываем только сделки на срочной секции
        comission = comission + exchange_comission
        local t = {flags & 0x4, exchange_comission}
        if Trades[class_code] then
          Trades[class_code][trade_num] = t
        else
          Trades[class_code] = {[trade_num] = t}
        end
      end
      return false
    end,
  'class_code,trade_num,flags,exchange_comission')

  local total = 0
  local maker = 0
  local taker = 0
  local comission2 = 0
  SearchItems('all_trades', 0, getNumberOf('all_trades')-1,
    function (class_code, trade_num, flags, sec_code)
      if Trades[class_code] then
        local t = Trades[class_code][trade_num]
        if t then
          total = total + 1
          if flags & 0x1 ~= 0 then
            if t[1] == 0 then
              maker = maker + 1
            else
              taker = taker + 1
              comission2 = comission2 + t[2]
            end
          elseif flags & 0x2 ~= 0 then
            if t[1] == 0 then
              taker = taker + 1
              comission2 = comission2 + t[2]
            else
              maker = maker + 1
            end
          else
            comission2 = comission2 + t[2]
          end
        end
      end
      return false
    end,
  'class_code,trade_num,flags,sec_code')
  message(string.format('total:   %u\nmaker: %u\ntaker:  %u\n\ncomission\nсейчас:       %.2f\nскальпинг: %.2f\nстанет:       %.2f', total, maker, taker, comission, comission / 2, comission2 * 3))
end
  • обсудить на форуме:
  • QUIK

Самая старая стратегия - она же и самая эффективная и самая простая.

    • 06 мая 2022, 21:54
    • |
    • 3Qu
  • Еще
Решил смоделировать на Phyton свою старую и хорошо забытую интрадей стратегию. Стратегия была построена, типа, на нескольких МА, только немного посложнее, плюс некоторые вычислительные прибабахи, к ТА никакого отношения не имеющие. Построена стратегия была на C# и работала через API со старым терминалом Альфы Alfadirect 4.5. Терминал где-то в 15-16 году был снят Альфой с эксплуатации, и стратегия кончилась вместе с ним. Исходники валяются где-то на дисках почивших компьтеров — хрен найдешь.
Для Quik были сделаны стратегии на других принципах.

Ну, вот, решил повторить по памяти. Повторил. Ушло на это несколько часов.
Неожиданно оказалось, что стратегия оч проста в реализации (я ее преже делал несколь месяцев) и вполне эффективна — и сейчас можно использовать. Даже ничего особо настраивать не пришлось.
График теста потом внизу приведу, сейчас с телефона пишу. Как бы, не собирался этого делать
МАшки -сила! Наше все!

Немного о теории построения торговых систем, индикаторов

Немного о теории построения торговых систем, индикаторов

Решил поделиться своими мыслями о построении торговой системы (индикатора).
Для формализации задачи я бы определил рынок как случайный набор характеристик. А именно, период колебания и амплитуда колебания.
Как работают обычные индикаторы. У большинства индикаторов есть входной параметр, как правило, это период, определяющий количество баров, за которые он рассчитывается. Типичный представителем такого семейства является средняя. На ее примере видно, что такой индикатор будет иметь плохие сигнала на небольших периодах колебания и на небольших амплитудах колебания. Начиная с определенной величины амплитуды и периода, при их увеличении, его показатели начнут показывать прибыль. Поэтому такие индикаторы склонны к большому количеству ложных сигналов.
Для того чтоб избавиться от зависимости индикатора от периода колебания рынка, можно использовать индикатор с входным параметром, измеряемым не в количествах баров, а в величине изменения цены. Таким индикатором может выступать зигзаг (если знаете какой-нибудь другой, напишите в коментах). У зигзага есть параметр дельта — это предельное изменение цены, при котором он отрисовывает плечо. Зигзаг может работать практически в любых периодах колебания рынка. А так же, он может не обращать внимание на небольшие амплитуды колебания, игнорируя их. Но у зигзага есть диапазон амплитуд, когда он приносит убытки. Этот диапазон амплитуд находится в пределах одного-двух дельт (дельта-параметр зигзага). Поэтому, если внутри зигзага использовать индикатор, который будет приносить прибыль в диапазоне одной — двух дельт, а так же в других диапазонах амплитуд, то можно получить достаточно прибыльную систему. А дальше встает вопрос на миллион баксов, какой индикатор использовать, чтоб зарабатывать в самой плохой зоне амплитуд колебания зигзага. Лично у меня есть понимание какой метод при этом использовать.
Я изложил шаблонный подход к разработке торговых систем (индикаторов). Считаю, что именно в этом направлении нужно копать.

Каким должен быть трейдер, чтобы успешно торговать?

Еще недавно образ идеального трейдера был таким: молодой, без семьи и финансовых обязательств, ничем не обремененный любитель компьютерных игр. Но мы в Live Investing сразу начали бороться с этим стереотипом. Среди наших трейдеров много тех, кто начал торговать в более зрелом возрасте, много ребят с семьями, с детьми. Торгуют они так же успешно, как и более молодые трейдеры.

Мы уверены, что трейдер в первую очередь должен быть разумным, трудолюбивым и упорным. Как мы говорили не раз, трейдинг — самый долгий и сложный путь к быстрым деньгам. Без упорства здесь не обойтись.

И нужно быть готовыми к тому, что на изучение трейдинга вам потребуется несколько лет. Почему-то никто не жалуется на то, что нужно учиться в школе 9-11 лет, в институте — 5 лет. Все принимают данные факты как должное. Но изучить трейдинг многие хотят за месяц, и, желательно, сразу достичь каких-то невероятных результатов — например, сделать миллион. Но зачастую требуется время и усилия, чтобы прийти к хорошему заработку на бирже.



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

41. Итоги 2021 года. Цели на 2022 год (Финансы и Жизнь) 💕

Автор блога предпочел скрыть этот пост. Чтобы читать такие посты, надо стать его другом. Отправьте заявку в друзья.

Необходимо авторизоваться.

lua quik

Добрый день. Вопрос для программистов на lua. Я начал разбираться с написанием робота. Сам робот на простой ma10. Вход при пробитии закрытия свечи ma(закрытием снизу вверх — лонг, сверху в них — шорт). Выход по стопам, при этом после стопа входить в противоположную сторону по открытию следующего часа. И выход по пробитию закрытия свечи и ma.
1)Не могу понять в какую часть когда записать следующее условие: нужно что бы робот выходил при пробитии закрытия свечи ma и делал переворот.
2)Как прописать условие переворота, по открытию следующего часа, переворота при выбивании стопа.
3)Как прописать перенос сделок через ноч.



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

Не знаю, почему автор молчит

    • 08 октября 2021, 11:57
    • |
    • Vkt
  • Еще
Есть реально полезная штука — фреймворк для торговых роботов
Оказывается существует новая версия:  github.com/ffeast/hacktrade
А я все на старой сидел, про которую узнал тут:   smart-lab.ru/blog/195508.php
Как можно использовать -  smart-lab.ru/blog/246568.php



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

Доработанный индикатор уровней Zigzag_channel_fast


Доработанный индикатор уровней Zigzag_channel_fast
Как им пользоваться:
в папке QUIK\LuaIndicators создаем текстовый файл с содержимым кода индикатора
добавляем индикатор на график
задаем параметр чувствиельности инлдикатора — Процент
индикатор показывает уровни, в которых находится тренд
если тренд еще не сформировался, то границы канала могут расширяться по мере движения цены
если в канале уже есть локальные вершины, то при следующем походе индикатора к границе канал возмен разворот тренда или коррекции в рамках данного канала
--[[
индикатор торговой системы QUIK: 
канал на последнем зигзаге
индикатор строит канал по зигзагу, показывает слом тренда при выходе цены за границы канала
параметры:
  Procent - величина зигзага в %
  k - коэффизиент ширины канала
  Ext - =0-канал стоится по средним =1-канал стоится по экстремуму
Как им пользоваться:
в папке QUIK\LuaIndicators создаем текстовый файл с содержимым кода индикатора
добавляем индикатор на график
задаем параметр чувствиельности инлдикатора — Процент
индикатор показывает уровни, в которых находится тренд
если тренд еще не сформировался, то границы канала могут расширяться по мере движения цены
если в канале уже есть локальные вершины, то при следующем походе индикатора к границе канал возмен разворот тренда или коррекции в рамках данного канала  
--]]
Settings=              
        {                          
            Name = "Zigzag_channel_fast",   -- название индикатора
            Procent=5.0,               -- величина зигзага в % 
            k=2,			         -- коэффизиент ширины канала
            Ext=1, -- =0-канал стоится по средним =1-канал стоится по экстремуму
            shif=0,			
            line=                                     
                {                               
                    {  
                        Name = "zigzagline",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(120,90, 140)
                    },
					{  
                        Name = "cur1",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(0,0, 0)
                    },
					{  
                        Name = "cur2",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(0,200, 200)
                    },
					{  
                        Name = "cur3",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(200,200, 0)
                    },
					{  
                        Name = "cur4",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(0,0, 0)
                    },
					{  
                        Name = "cur5",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(0,0, 255)
                    },
					{  
                        Name = "cur6",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    },
					{  
                        Name = "cur7",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    },
					{  
                        Name = "cur8",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    },
					{  
                        Name = "cur9",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    },
					{  
                        Name = "cur10",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    },
					{  
                        Name = "cur11",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    }
                }
       }


function Init()

  y1 = nil
  y2 = nil
  y3 = nil  
  x1 = 1
  x2 = 1
  x3 = 1
  
  oldindex = 1
  
  a_01 = 0
  b_01 = 0
  a_02 = 0
  b_02 = 0
  
  vminus_01 = 0
  vplus_01 = 0  
  vminus_02 = 0
  vplus_02 = 0  
  vFrom_01 = 1
  vTo_01 = 1
  vFrom_02 = 1
  vTo_02 = 1
  
  vminus = 0
  vplus = 0
  vminus_n = 0
  vplus_n = 0  
  
  ret = 0
  
  last_ind = 1

  v1=nil
  v2=nil
  v3=nil
  v4=nil
  v5=nil
  v6=nil
  v7=nil
  v8=nil
  v9=nil
  v10=nil
  
  return 10
end

function recalcline(num, index, rec)

 if index == Size()-sh and rec == 0 then
   for i = 1, index do
     if m == 1 then 		
	   SetValue(i, 3, nil)
	   SetValue(i, 4, nil)
	 end
     if m == 2 then 		
	   SetValue(i, 6, nil)
	   SetValue(i, 7, nil)
	 end 	 
   end 
 end 

 if index == Size()-sh or rec == 1 then
	
  if num == 1 then 
	  vFrom = 0 --[[ --]] 
	  vTo = 0
	if x3 < x2 then 
	    vFrom = x3
	    vTo = x2
	  else
	    vFrom = x2
	    vTo = x3
	  end 
  end
  if num == 2 then 
	  vFrom = 0
	  vTo = 0
	  if x1 < x2 then 
	    vFrom = x1
	    vTo = x2
	  else
	    vFrom = x2
	    vTo = x1
	  end 
  end    
  
      if vFrom < 1 then
	    vFrom = 1
	  end 	
  
	  a1 = 0
	  a2 = 0
	  a3 = 0
	  a4 = 0
	  n = 0
	  a = 0
	  b = 0
      for i = vFrom, vTo do
        n=n+1	  
	    a1 = a1+i*C(i)
	    a2 = a2+i
	    a3 = a3+C(i)
	    a4 = a4+i*i	
	  end
	  if((n*a4 - a2*a2) ~= 0) then	  
	  
	  -- if oldindex ~= Size() then
	   a = (n*a1 - a2*a3)/(n*a4 - a2*a2)
	   b = (a3 - a*a2)/n

	   vminus = 0
	   vplus = 0
	   vminus_n = 0
	   vplus_n = 0
       for i = vFrom, index do
        y = a*i + b		
		if i>0  then 
		if C(i) < y and i <= vTo then
		  if ex == 0 then 
	        vminus = vminus + y - C(i)
            vminus_n = vminus_n + 1	
		  else 
		    if i == vFrom then 
			  vminus = 0
			end
            if y-C(i) > vminus then
              vminus = y-C(i) 			
            end				
		  end 
        end	
        end		
		if i>0  then 
		if C(i) > y and i <= vTo then
		  if ex == 0 then 
	        vplus = vplus + C(i) - y
	        vplus_n = vplus_n + 1
		  else 
		    if i == vFrom then 
			  vplus = 0
			end		  
            if C(i)-y > vplus then
              vplus = C(i)-y 			
            end			
		  end 
		end 
		end  
        m = 0
        if C(vTo) >	C(vFrom) and y < C(vTo)+0.1*(C(vTo)-C(vFrom)) and y > C(vFrom)-0.1*(C(vTo)-C(vFrom)) then
          m = 1
		end 	
        if C(vTo) <	C(vFrom) and y < C(vFrom)+0.1*(C(vFrom)-C(vTo)) and y > C(vTo)-0.1*(C(vFrom)-C(vTo)) then
          m = 1
		end 
        if m == 1 then 		
	      --SetValue(i, 2, y)
        end 		
	   end
	   --end
	  
	   if ex == 0 then  
	    if vminus_n ~= 0 then
	     vminus = kk*vminus/vminus_n          
	    end 
	    if vplus_n ~= 0 then
	     vplus = kk*vplus/vplus_n          
	    end 
	   end 	  
      end

  if num == 1 then 
    a_01 = a
    b_01 = b 
    vminus_01 = vminus
    vplus_01 = vplus
	vFrom_01 = vFrom
    vTo_01 = vTo
  end
  if num == 2 then 
    a_02 = a
    b_02 = b  
    vminus_02 = vminus
    vplus_02 = vplus
	vFrom_02 = vFrom
    vTo_02 = vTo	
  end  
  return 1 
 end
 
 return 0
end 

function levels(x, y, num, index)

  if y ~= nil and x ~= 1 then 
  
    for i = 1, index do	
	  if i > x then 
	    SetValue(i, num, y)
      else 		
	    SetValue(i, num, nil)
	  end 
    end
	
  end 

end


function OnCalculate(index)
  
  de = Settings.Procent
  kk = Settings.k 
  ex = Settings.Ext
  sh = Settings.shif
  
  v1=nil
  v2=nil
  v3=nil
  v4=nil
  v5=nil
  v6=nil
  v7=nil  
  v8=nil
  v9=nil
  v10=nil  
  
   
  if index > Size()-sh then  
    --return nil, nil, nil, nil, nil, nil, nil 	 
    return v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 
  end 
  
  vl = C(index)
  if vl~=nil then 
   if index == 1 then 
	y1 = vl
    y2 = vl
   else   
	  if C(index) > y1*(1+de/100) and y1 < y2 then 
	    x3 = x2
	    x2 = x1
		y3 = y2
	    y2 = y1	
	    x1 = index 
	    y1 = C(index)	
        ret = recalcline(1, index, 0)
        ret = recalcline(2, index, 0)   
        levels(x1, y1, 8, index)		
		levels(x2, y2, 9, index)
		levels(x3, y3, 10, index)
	  end 	
	  if C(index) > y1 and C(index) > y2 then 
	    x1 = index 
	    y1 = C(index)	  			  
	  end 
	  	  		
	  if C(index) < y1*(1-de/100) and y1 > y2 then 
	    x3 = x2
	    x2 = x1
		y3 = y2		
	    y2 = y1
	    x1 = index 
	    y1 = C(index)	  	
        ret = recalcline(1, index, 0)
        ret = recalcline(2, index, 0)
        levels(x1, y1, 8, index)		
		levels(x2, y2, 9, index)
		levels(x3, y3, 10, index)
	  end 	
	  if C(index) < y1 and C(index) < y2 then 
	    x1 = index 
	    y1 = C(index)	  			  
	  end 	  	  		
	end
  end 	
	
    --[[ 
  if x1 ~= index then 
    curfrom = x1
	curto = index
  else 
    curfrom = x2
	curto = x1
  end 
 
  if curto ~= curfrom and curfrom ~= nil and curto ~= nil then 
    if C(curto) ~= nil and C(curfrom) ~= nil then 
      k = (C(curto)- C(curfrom))/(curto- curfrom)  
      for i = curfrom, index  do
        curv = i*k + C(curto) - curto*k  		          
	    SetValue(i, 1, curv)
      end   	
	end 
  end 
  

 	--]]

	if index == Size()-sh and ret == 0 then
        lpr = C(Size()-sh)
        ret = recalcline(1, index, 1)
        ret = recalcline(2, index, 1)	
		
		if y1 ~= nil then 		
		 if y1 >	lpr*0.9 and y1 < lpr*1.1 then 
		  levels(x1, y1, 8, index)
         end 
        end 		
        if y2 ~= nil then 				
		 if y2 > lpr*0.9 and y2 < lpr*1.1 then 		
		  levels(x2, y2, 9, index)
         end 
		end 
        if y3 ~= nil then 		
		 if y3 > lpr*0.9 and y3 < lpr*1.1 then 		
		  levels(x3, y3, 10, index)
         end 		  
		end 
    
    end 	
	
	
	
	if index == Size()-sh  then  --- and index ~= last_ind
		  
	   if vTo_01 - vFrom_01 > 500 then
         vFrom_01 = vTo_01-500 
       end 	  
	   
       for i = 1, index do		   		
	     SetValue(i, 3, nil)	
         SetValue(i, 4, nil)	 
	     SetValue(i, 6, nil)	
         SetValue(i, 7, nil)	
		-- SetValue(i, 8, nil)	 
	   --  SetValue(i, 9, nil)	
        -- SetValue(i, 10, nil)	
       end	   
		  
       for i = vFrom_01, index do
        y = a_01*i + b_01 + vplus_01		
        m = 0
        if C(vTo_01) >	C(vFrom_01) and y < C(vTo_01)+0.3*(C(vTo_01)-C(vFrom_01)) and y > C(vFrom_01)-0.3*(C(vTo_01)-C(vFrom_01)) then
          m = 1
		end 	
        if C(vTo_01) <	C(vFrom_01) and y < C(vFrom_01)+0.3*(C(vFrom_01)-C(vTo_01)) and y > C(vTo_01)-0.3*(C(vFrom_01)-C(vTo_01)) then
          m = 1
		end 
        if m == 1 then 		
	      SetValue(i, 3, y)
		  if i == index then 
		    v3 = y 
		  end 
        end 	
		
        y = a_01*i + b_01 - vminus_01		
        m = 0
        if C(vTo_01) >	C(vFrom_01) and y < C(vTo_01)+0.3*(C(vTo_01)-C(vFrom_01)) and y > C(vFrom_01)-0.3*(C(vTo_01)-C(vFrom_01)) then
          m = 1
		end 	
        if C(vTo_01) <	C(vFrom_01) and y < C(vFrom_01)+0.3*(C(vFrom_01)-C(vTo_01)) and y > C(vTo_01)-0.3*(C(vFrom_01)-C(vTo_01)) then
          m = 1
		end 
        if m == 1 then 		
	      SetValue(i, 4, y)
		  if i == index then 
		    v4 = y 
		  end 
        end 			
	   end	  
	    
	   if vTo_02 - vFrom_02 > 500 then
         vFrom_02 = vTo_02-500  
       end 	 
	  
       for i = vFrom_02, index do
        y = a_02*i + b_02 + vplus_02		
        m = 0
        if C(vTo_02) >	C(vFrom_02) and y < C(vTo_02)+0.1*(C(vTo_02)-C(vFrom_02)) and y > C(vFrom_02)-0.1*(C(vTo_02)-C(vFrom_02)) then
          m = 1
		end 	
        if C(vTo_02) <	C(vFrom_02) and y < C(vFrom_02)+0.1*(C(vFrom_02)-C(vTo_02)) and y > C(vTo_02)-0.1*(C(vFrom_02)-C(vTo_02)) then
          m = 1
		end 
        if m == 1 then 		
	      SetValue(i, 6, y)
		  if i == index then 
		    v6 = y 
		  end 
        end 	
		
        y = a_02*i + b_02 - vminus_02		
        m = 0
        if C(vTo_02) >	C(vFrom_02) and y < C(vTo_02)+0.1*(C(vTo_02)-C(vFrom_02)) and y > C(vFrom_02)-0.1*(C(vTo_02)-C(vFrom_02)) then
          m = 1
		end 	
        if C(vTo_02) <	C(vFrom_02) and y < C(vFrom_02)+0.1*(C(vFrom_02)-C(vTo_02)) and y > C(vTo_02)-0.1*(C(vFrom_02)-C(vTo_02)) then
          m = 1
		end 
        if m == 1 then 		
	      SetValue(i, 7, y)
		  if i == index then 
		    v7 = y 
		  end 
        end 			
	   end	
	  
	  last_ind = index 
	end 
  
 
    return v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 

end

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