Избранное трейдера Игорь В.
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Как запустить и настроить:
Приветствую!
В данном посте распишу подробно свою торговую систему, без которой уровни которые я даю сильно теряют эффективность. Ссылку на данный пост я буду прикреплять в каждом своем посте с обзором дня, как дополнение к уровням и логике движения.
ТОЧКА ВХОДА
Вход всегда только от уровня. Цена уровня — это цена входа. Люфт может быть максимально 3-5 пунктов, в зависимости от ситуации, и при условии что все это помещается в размер стопа.
Предпочтительно работать от ключевых уровней или их спутников.
Классификация уровней
ключевые — это месячные, недельные, дневные и 4часовые уровни
остальные — 15мин уровни.
спутники — как правило это 15мин уровни, которые формируются сверху и снизу ключевых уровней, в связи с тем что, цена периодически пробивает этот ключевой уровень. И образуется так называемая
зона.
План (А)
Когда на пятиминутном тайм фрейме менее 50-и пунктов то ставим лимитные заявки на покупку и на продажу
около 25% от депозита, на расстоянии 10 пунктов от текущей цены. Стоп лос ставим по 20 пунктов от лимитных заявок.
После того как сработала одна из лимитных заявок переносим встречную заявку (тейк профит) на 10 пунктов от цены
исполнения, ждем исполнения лоса или профита. Если профит то повторяем, если лос то переходим к плану (Б)
План (Б)
Ставим лимитные заявки в 20-и пунктах от текущей цены, на 50% от депозита, после того как сработала одна
из заявок переносим встречную заявку на 10 пунктов от цены исполнения. Если профит то повторяем план (Б) до признаков
узкого боковика, после этих признаков переходим к плану (А), если лос то переходим к плану (В).
План (В)
Ставим лимитные заявки по 40 пунктов от текущей цены на 100% от депозита, после исполнения одной из заявок
переносим встречную заявку на 10 пунктов от цены исполнения.Если профит повторяем до признака узкого боковика,
если и в третий раз сработал лос то ждем признаков узкого боковика и переходим к плану(А) и т.д. по кругу.
Признак узкого боковика:
Три прилипшие свечки к средней скользящий, moving average 8 периодов, на пяти минутном тайм фрейме.
Работает на фьючерсе доллар рубль.
Не работает в более широком временном тайм фрейме.
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, "Портфель: прибыли и убытки © ramirzaev@mail.ru") -- исполнять цикл, пока пользователь не остановит скрипт или не закроет окно таблицы 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
В рамках рассматриваемого сценария, цена по золоту выполнила минимальные условия для завершения импульса вверх, и хотя рост все еще может быть продолжен, все же можно начинать готовить торговый план.
Ниже будут приведены схематическое построение торгового плана, и размещение ордеров.
В EWP торговые планы не имеют каких-либо мудреных изысканий, и они в принципе очень простые. Качество построение торгового плана зависит не от совокупности, каких либо сигналов, которые дают индикаторы, качество торгового плана зависит от качества проведенного анализа структуры движения цены.
Схема начала построения торгового плана будет выглядеть, так как показано на картинке ниже из книги: Wayne Gorman & Jeffrey Kennedy — Visual Guide to Elliott Wave Trading 2013.c
В EWP основным паттерном является пяти волновая действующая модель. Таких, действующих моделей всего две, это импульс и диагональ. Ранее уже было описана модель диагональ, и в ближайшее время заметка о диагоналях будет продолжена. В данный момент речь пойдет об импульсах.
Импульс – это наиболее распространенный вид действующей волны, и так как импульс является основным паттерном в EWP то, все, абсолютно все модели как начинаются с импульсов так ими и заканчиваются.
Существует всего несколько простых правил интерпретации ценового поведения внутри импульсов. Правило потому и называются правилом, что не допускает исключений и выполняется всегда.