Избранное трейдера Stels
Ишимоку — комплексная стратегия, предложенная Гойчи Хосода (Goichi Hosoda). Комплексная означает, что она может использоваться самостоятельно без других индикаторов. Ишимоку — стратегия следования тренду, что значит, что на не будет ловить вершины и днища, но будет говорить нам, что мы в тренде (не в коррекции). Эта стратегия в точности показывает точки входа и выхода! У нас есть несколько методов.
Чтобы быть честными, отметим, что это не святой грааль, поскольку встречаются ложные сигналы, но их влияние можно минимизировать.
Перейдем к делу.
Ишимоку имеет 5 линий:
1. Тенкан сен (формула (HH + LL)/2 за последние два периода)
Для нас это очень важная линия, мы открываем позиции только в соответствии с ней!
2. Киджун сен (формула (HH+LL)/2 за последние 26 периодов)
VWAP — это внутридневный расчет, используемый в основном HFT алгоритмами и институциональными трейдерами для оценки того, где акции торгуются относительно среднего значения объема за день. Внутридневные трейдеры также используют VWAP для оценки направления рынка и фильтрации торговых сигналов. Перед использованием VWAP, необходимо понять, как он рассчитывается, как его интерпретировать и использовать, а также какие недостатки у этого инструмента.
VWAP (Volume Weighted Average Price) — это аббревиатура от Средневзвешенной цены по объему. На первый взгляд, вы можете думать, что VWAP — это всего лишь индикатор средней цены. Но VWAP — это нечто большее.
Индикатор скользящей средней чаще всего основан только на одной цене (закрытия) актива, и он никогда не даст вам точной информации об истинной средней цене. Чтобы определить истинную среднюю цену акции (или другого актива), вам необходимо фактическое количество транзакций по целому ряду цен. Это то, что может делать VWAP.
require"QL" log = "sbrf.log" seccode = "SRM6" lots_in_trade = 80 accnt = "" better = -5 chart = "sberbankxxx" is_run = true prev_datetime = {} len = 100 basis = 9 k_bal = {0,1,2,3} sell = false buy = false id = 0 first = true function trade_signal(shift) number_of_candles = getNumCandles(chart) bars_temp,res,legend = getCandlesByIndex(chart,0,number_of_candles-2*len-shift,2*len) bars={} i=len j=2*len while i>=1 do if bars_temp[j-1].datetime.hour>=10 then sk=true if bars_temp[j-1].datetime.hour==18 and bars_temp[j-1].datetime.min==45 then sk=false end if sk then bars[i]=bars_temp[j-1] i=i-1 end end j=j-1 end t = len+1 do_sell = false do_buy = true value = 0 if do_sell then value = 1 end if do_buy then value = -1 end toLog(log,"value="..value.." on candle: "..bars[len].datetime.year.."-"..bars[len].datetime.month.."-"..bars[len].datetime.day.." "..bars[len].datetime.hour..":"..bars[len].datetime.min.." O="..bars[len].open.." H="..bars[len].high.." L="..bars[len].low.." C="..bars[len].close.." V="..bars[len].volume) return value end function mysplit(inputstr, sep) if sep == nil then sep = "%s" end local t={} ; i=1 for str in string.gmatch(inputstr, "([^"..sep.."]+)") do t[i] = str i = i + 1 end return t end function OnInit(path) log=getScriptPath()..'\\'..log toLog(log,"==========OnInit: START") toLog(log,"==========OnInit: FINISH") end function OnStop() is_run = false toLog(log,"==========OnStop: script finished manually") end function CheckBit(flags, bit) -- Проверяет, что переданные аргументы являются числами if type(flags) ~= "number" then error("Ошибка!!! Checkbit: 1-й аргумент не число!"); end; if type(bit) ~= "number" then error("Ошибка!!! Checkbit: 2-й аргумент не число!"); end; local RevBitsStr = ""; -- Перевернутое (задом наперед) строковое представление двоичного представления переданного десятичного числа (flags) local Fmod = 0; -- Остаток от деления local Go = true; -- Флаг работы цикла while Go do Fmod = math.fmod(flags, 2); -- Остаток от деления flags = math.floor(flags/2); -- Оставляет для следующей итерации цикла только целую часть от деления RevBitsStr = RevBitsStr ..tostring(Fmod); -- Добавляет справа остаток от деления if flags == 0 then Go = false; end; -- Если был последний бит, завершает цикл end; -- Возвращает значение бита local Result = RevBitsStr :sub(bit+1,bit+1); if Result == "0" then return 0; elseif Result == "1" then return 1; else return nil; end; end; function killorders(ccode,scode) for i=0,getNumberOf("orders")-1,1 do local t=getItem("orders", i) if t ~= nil and type(t) == "table" then if( t.seccode == scode and CheckBit(t.flags, 0) == 1) then local transaction={ ["TRANS_ID"]=tostring(math.random(2000000000)), ["ACTION"]="KILL_ORDER", ["CLASSCODE"]=ccode, ["SECCODE"]=scode, ["ACCOUNT"] = accnt, ["ORDER_KEY"]=tostring(t.ordernum), } res=sendTransaction(transaction) end end end end function killstoporders(ccode,scode) for i=0,getNumberOf("stop_orders")-1,1 do local t=getItem("stop_orders", i) if t ~= nil and type(t) == "table" then if( t.seccode == scode and CheckBit(t.flags, 0) == 1) then local transaction={ ["TRANS_ID"]=tostring(math.random(2000000000)), ["ACTION"]="KILL_STOP_ORDER", ["CLASSCODE"]=ccode, ["SECCODE"]=scode, ["ACCOUNT"] = accnt, ["STOP_ORDER_KEY"]=tostring(t.ordernum), } res=sendTransaction(transaction) end end end end function main() toLog(log,"==========main: START") while is_run do if isConnected() == 1 then ss = getInfoParam("SERVERTIME") if string.len(ss) >= 5 then hh = mysplit(ss,":") str=hh[1]..hh[2] h = tonumber(str) if (h>=1000 and h<1400) or (h>=1405 and h<1845) or (h>=1905 and h<2350) then if first then for ti = 50,2,-1 do trade_signal(ti) end if buy and not sell then message(seccode.." Current state: green and buy",1) end if sell and not buy then message(seccode.." Current state: red and sell",1) end if buy and sell then message(seccode.." ERROR: green and red",1) end if not buy and not sell then message(seccode.." WARNING: nothing",1) end first = false end prev_candle = getPrevCandle(chart,0) if not isEqual(prev_candle.datetime,prev_datetime) then current_value = trade_signal(1) if current_value ~= 0 then optn = "B" if current_value==1 then optn = "S" end curvol=0 no=getNumberOf("FUTURES_CLIENT_HOLDING") if no>0 then for i=0,no-1,1 do im=getItem("FUTURES_CLIENT_HOLDING", i) if im.sec_code==seccode then curvol=im.totalnet end end end trvol = -current_value*lots_in_trade-curvol if trvol ~= 0 then killorders("SPBFUT",seccode) killstoporders("SPBFUT",seccode) f = io.open(getScriptPath().."\\sbrf2_pos.txt","r") sbrf2_pos=f:read("*n") f:close() f = io.open(getScriptPath().."\\sbrf3_pos.txt","r") sbrf3_pos=f:read("*n") f:close() pr,n,l = getCandlesByIndex ("futsber", 0, getNumCandles("futsber")-1, 1) local trans = { ["ACTION"] = "NEW_ORDER", ["CLASSCODE"] = "SPBFUT", ["SECCODE"] = seccode, ["ACCOUNT"] = accnt, ["OPERATION"] = optn, ["PRICE"] = toPrice(seccode,pr[0].close+current_value*better), ["QUANTITY"] = tostring(math.abs(curvol-sbrf2_pos-sbrf3_pos)), ["TRANS_ID"] = tostring(getTradeDate().month*100+getTradeDate().day+id) } id = id+1 --res = sendTransaction(trans) message(seccode.." Send : " .. res, 2) toLog(log,"Send: ".. res) for btr=0,200,5 do local trans = { ["ACTION"] = "NEW_STOP_ORDER", ["CLASSCODE"] = "SPBFUT", ["SECCODE"] = seccode, ["ACCOUNT"] = accnt, ["OPERATION"] = optn, ["PRICE"] = toPrice(seccode,pr[0].close-current_value*btr), ["STOPPRICE"] = toPrice(seccode,pr[0].close-current_value*(btr+better)), ["QUANTITY"] = tostring(6), ["TRANS_ID"] = tostring(getTradeDate().month*100+getTradeDate().day+id), ["EXPIRY_DATE"] = "GTC" } id = id+1 --res = sendTransaction(trans) message(seccode.." Send : " .. res, 2) toLog(log,"Send: ".. res) end if current_value == 1 then message(seccode..' RED: buy->sell',1) toLog(log,"RED signal") else message(seccode..' GREEN: sell->buy',1) toLog(log,"GREEN signal") end else if current_value == 1 then message(seccode..' RED: buy->sell',1) toLog(log,"RED signal, but nothing to do") else message(seccode..' GREEN: sell->buy',1) toLog(log,"GREEN signal, but nothing to do") end end else if buy and not sell then toLog(log,"Nothing to do. Current state: green and buy",1) end if sell and not buy then toLog(log,"Nothing to do. Current state: red and sell",1) end if buy and sell then toLog(log,"Nothing to do. ERROR: green and red",1) end if not buy and not sell then toLog(log,"Nothing to do. WARNING: nothing",1) end end prev_datetime = prev_candle.datetime end end end end sleep(5*1000) end toLog(log,"==========main: FINISH") end
Статья с сайта www.miltonfmr.com, из которой можно взять некоторые приемы, пригодные даже для использования в высокочастотной торговле.
Многие трейдеры, создающие и правильно применяющие торговые системы с возвратом к среднему, получают хорошую прибыль. Факты говорят о том, что рынки двигаются в соответствии с паттернами, одним из которых является цикличность. Простыми словами, все, что двигалось вверх, должно пойти вниз и наоборот. Ничто не движется в одном направлении вечно. Применительно к рынкам, у нас есть два возможных исхода — тренд, либо определенный торговый диапазон с возвратом к среднему. В прошлых наших исследованиях было показано, что гэп на открытии определяет тренд на остаток дня в 30% случаев. Это значит что из 20 торговых дней мы имеем 6 трендовых дней без возврата к среднему. С другой стороны у нас есть 70% движения цены, которая имеет тенденцию к возврату к среднему значению несколько раз за день. Важно отметить, что эти 70% относятся к внутридневному движению цен.
Уоррен Баффет – самый известный и богатый в мире инвестор, который сделал свой капитал, инвестируя в акции. По версии Forbs, Баффет располагается вторым в списке миллиардеров планеты – после Билла Гейтса. Его состояние ныне составляет 46 млрд долларов…
Первый принцип Уоррена Баффета:
Инвестирование состоит в том, чтобы вложить деньги сегодня и завтра получить больше денег…
Уоррен Баффет всегда вёл достаточно скромный образ жизни: вместо того чтобы жить в дорогих коттеджах и питаться в ресторанах, он каждую свободную копейку (то есть цент) вкладывал в акции. За 35 лет он увеличил сумму со 100 тыс. долларов на 200 000 процентов.
Второй принцип Уоррена Баффета:
Покупайте акции только тех компаний, чья продукция нравится вам лично…
Например, сотовая связь МТС, удобство банкоматов Сбербанка или обслуживание в аптеке 36,6… Баффет рассказывает, что по утрам он любил читать газету «Вашингтон пост», в итоге, купив пакет ценных бумаг за 100 млн долларов, он заработал 1 млрд долларов. В 4,5 раза он увеличил сумму, и купив 9-процентный пакет акций компании, изготавливающей его любимую бритву «Жиллет».
Эта оценочная функция может быть эффективно вычислена и она нечувствительна к выбросам. Она может быть существенно более точна, чем неробастный метод наименьших квадратов для несимметричных и гетероскедастичных данных и хорошо конкурирует с неробастным методом наименьших квадратов даже для нормально распределенных данных в терминах статистической мощности.
Метод признан «наиболее популярной непараметрической техникой оценки линейного тренда»