Избранное трейдера Олег
Вижу, мода на роботов никуда не ушла, раз народ покупает готовых роботов в надежде на то, что они получат грааль. Попробую внести ясность в эту тему, а именно, почему бессмысленно покупать каких-либо роботов как товар или программу для заработка.
Так же расскажу, почему никто не будет распространяться, как работает алгоритм и как он зарабатывает деньги.
Возможно, еще что-нибудь интересное по ходу расскажу :)
Уверен, кому-нибудь и интересно будет. Это мой первый блог. Давно думал, что делать с моими знаниями, но идей пока нет, может кто предложит :) Правда, скорее всего, что-то и устарело уже (инфраструктура биржи, скорее всего), давно этим занимался — более трех лет назад перестал.
Вообще, должен признать, нынешним алготрейдерам очень тяжело и будет еще тяжелее. Информацию приходится собирать по крупицам. Если лет 5-6 назад все достаточно легко делились информацией и подходами, то сейчас действительно стоящей информации вообще нет. Все, что есть на смартлабе по поводу алго и hft — настолько не значительно, а в 99% — ерунда. Помню, на конфе в Геленджике можно было получить больше практической информации, чем во всех книжках по hft :)
На волне историй об успешности сформулировал 6 простых фактора успеха:
Поехали.
1. Москва и ближнее Подмосковье.
Если тебе «повезло» родиться не в этих Богом благословенных местах, тебе уже придется тяжело.
Родиться в Москве/Подмосковье означает:
— иметь родителей в Москве (с повышенной среднероссийской пенсией)
— иметь большие возможности в плане учебы
— иметь большие возможности в плане работы
— иметь самую развитую инфраструктуру в стране
— иметь круг знакомых, знать нужных людей
— иметь наследственную недвижимость (от родителей и/или бабушек/дедушек). В потенциале это означает, что А. тебе не надо работать «на квартиру». Б. тебе не надо снимать квартиру
2. Удача.
Оказаться в нужное время в нужном месте. Попросту говоря, важен фарт.
Например, BigAlex оказался в спорный момент с низкой зп и избежал сокращения. Или оказался в нужный момент единственным с английским языком (хоть и с низкими компетенциями). Или зачем-то вложил деньги в акции в 2008 году. Мог ведь потерять еще полкапитала, но повезло.
Или история моей знакомой; приехала в Москву никем. Мыкалась по углам, пока случайно (подчеркиваю слово случайно), не встретила на улице знакомого из своей провинциальной школы. Случайно (подчеркиваю слово случайно) знакомый ее узнал, а узнав, что она ищет работу, тут же предложил ей свободную вакансию зам.депа в крупной компании, где он был топ-манагером. Она, конечно. согласилась. Как вы понимаете, все прошло всяких собеседований. Итог: 500k зарплаты. Сыграл ли тут «женский» фактор история умалчивает.
Человек ранее предложил делиться историями успеха. Чтож, поделюсь и я. Страдаю паранойей, деньги любят тишину, потому зарегил новый ник и вхожу на смарт под VPN. Это реальная история, врать под анонимным, одноразовым ником смысла нет. Просто тянет поделиться, да и похвалиться, чего уж там, пусть и анонимно.
40 лет, женат-дети. Заработал 31,7 млн. плюс 100 кв.м квартира в мск без ипотеки, сам купил наполовину (после продажи унаследованной поменьше, больше 5 млн. докладывал, плюс ремонт 2 млн.), черный джип за полтора ляма (до девальвации купленный), машина жены (чуть менее ляма) и прочее по мелочам. Взяток не брал, не украл ни рубля за свою жизнь, получал белую зарплату, не имел своего бизнеса, не имел стартового капитала от родителей, только квартиру, биток не покупал. Впрочем по порядку.
Про фондовый рынок узнал в 1999 году. Накупил, помню, акций долларов на тыщу примерно, отложенных с зп. в течение года, а то и двух. Первая зп 200 долл. была. По диалап модему с брокером соединялся, хотя брокер был в соседнем доме. Нынче нет того брокера много лет.
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