Избранное трейдера Петр Петров
не мое, но в свете постов о здоровье от 50-летных, думаю, актуально
10 советов 40-летнего 20-летним.
Достигнув сорока начинаешь поражаться, сколько же людей даже не дожило твоего возраста. Илья Ильф умер в 39. Максим Горький в 37. Да много кто умер.
Дожив до сорока начинаешь задумываться, достиг ли ты всего чего хотел, и много ли ты успел сделать.
Ты поражаешься, что Александр Македонский до твоего возраста не дожил, но уже успел завоевать полмира, оставив тысячелетние наследие. Осознавая свои достижения, ты понимаешь, что великие люди в твоем возрасте тебя превзошли многократно. Читая книги начинаешь ловить себя на мысли, что автор тебя явно младше (и думаешь, ну чему этот сопляк может тебя научить?).
Анализируя свой опыт хочется кое что посоветовать нынешним 20-летним с высоты, так сказать, прожитых лет.
Итак,
1. Перестань бухать. Перестань курить. Как бы круто тебе это сейчас не казалось, бухать и курить это не айс. Больше того, я скажу тебе то, что может показаться банальностью, но бухать и курить крайне вредно для здоровья. Да, сейчас здоровье у тебя железное и никак тебя не беспокоит. Но будь уверен, что если продолжишь бухать/курить, через 20 лет ты поймешь, что здоровье свое ты загубил безвозвратно. Помни, что даже пиво ведет к выработке не свойственного тебе женского гормона эстрогена. К каким последствиям это приводит нагуглишь сам. Или можешь посмотреть на большинство нынешних сорокалетних. Хочешь быть таким — продолжай.
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
Ликвидность в еврооблигациях, если сравнить с любой ходовой бумагой, очень низкая. Объем торгов нестабильный. Бывает 2 месяца объем за день от 0 до 10 штук, а потом в один день 40'000 штук, причем цена не практически не сдвинулась:
Имхо, все сделки большого объема совершаются по предварительной договоренности по телефону, так как заявки объемом в 50 лотов стоят неделями без исполнения, а бОльшие исчезают очень быстро.
Могу дать следующие рекомендации:
1) Чем ближе к закрытию (18:40) тем полнее стаканы на еврооблигациях и уже спреды. Поэтому для ознакомления открываем стаканы после 18. Вы можете увидеть там как пустоту, так и некоторое количество заявок (см. нестабильность), но те что ближе к спреду редко объемом больше 50, чаще 10-30.
Вот некоторые вечерние стаканы:
Приветствую!!!
Если еще не надоел со своими Паттернами :)
Для начала рекомендую ознакомиться с моей старой статьей :Pattern искусственного обвала цен Buy&Sell
И еще обратить, Ваше внимание вот на эту статью :Лучший месяц или день? Пример фьючерс на австралийца или AUDUSD
Мы приближаемся хорошей возможности не много подзаработать :)
Сегодня хочу рассказать еще об одном интересном Паттерне называться NEW LOW PATTETN.
Эта модель хорошо работала в прошлом и почему бы ей не работать и в будущем ?
Вы скорее всего торговали эту комбинацию и были не на той стороне …. Вы вероятно поймали стоп, когда эта модель давала сигнал на покупку!
У большинства всегда есть аргумент что за нашими стопами охотятся или что рынки сфальсифицированы.
Я никогда не соглашался с подобным мышлением… Я думаю, что рынки делают то, что они собираются делать. Наверняка, публика становится очень эмоциональной, когда цены идут до новых минимумов и выходят из своих позиций. Умные деньги, видя, что это происходит, входят в рынок с длинной стороны… вот и появляется такой эмоциональный паттерн. Я назвал это Новый Лоу Паттерн. Он основан на сценарии, который я только что изложил.
Приветствую всех!
Данная статейка просто изложение в тексте моих мыслей при создании алгоритма. Пусть это будет продолжение предыдущей статьи о том как собирал свой велосипед.
После того как собрал алгоритм, внес в него не мало коррективов, в частности закрываю тейком, это позволило сэкономить чутьчуть денег, так как алгоритм «случайно» мог достигнуть равновесной цены, и при закрытии по рынку могли сталкиваться с ситуацией когда равновесная была достигнута в пике и далее рынок сильно отскочил от него. Понятно что тейком, внес новый риск что сделка может не закрыться по расчетной цене, но благо это можно обойти ожидая новую равновесную цену (я в своем алгоритме предусмотрел ситуацию, если тейк не сработает то на след баре крыть по рынку).
Итак теперь график эквити выглядет так
Понятно вроде бы красиво, но бывают слишком крутые просадки. Иследующим шагом стало изучение ситуаций, при которых алгоритм лосит.