Избранное трейдера gvv
В своё время активно пользовался. Робот для выставления стопа и тейк профита.
Как только видит открытые позиции. Выставляет стоп. Может кому надо. Пользуйтесь
Нужно заполнить только
cAccount=«7600lll» ВАШ СЧЕТ
cClassName=«SPBFUT» ЧТО ТОРГУЕТЕ
cProfit=7500 ТЕЙК ПРОФИТ
cProfShift=100 ОТСТУП ОТ ЦЕНЫ
cProfSpr=500 СПРЕД
cStopLoss=400 ЗНАЧЕНИЕ СТОПА
cSLSpr=500 СПРЕД
Файл:
PORTFOLIO_EX VFAutoStop;
DESCRIPTION VFAutoStop;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
New_Global(«CurLogLine»,1)
New_Global(«gLastPos»,CREATE_MAP ()) 'коллекция крайних позиций
ClassesList = get_classes_list()
cAccount=«7600lll»
cClassName=«SPBFUT»
cProfit=7500
cProfShift=100
cProfSpr=500
cStopLoss=400
cSLSpr=500
cLogFile=«C:\VFAutoStop.log»
FUNC WriteLog (pTitle, pMessage)
writeln(cLogFile, get_value(GET_DATETIME(), «Datetime») & " " & pTitle & " > " & pMessage)
END FUNC
func SendTrans(pTransParams)
trans_result = SEND_TRANSACTION (30, pTransParams)
'LogData(pTransParams,trans_result)
if get_value (trans_result, «RESULT»)+0.0=0 then
' WriteLog(pTransParams,get_value (trans_result, «RESULT_EX») & "|" & get_value (trans_result, «DESCRIPTION»))
WriteLog(pTransParams,trans_result)
end if
end func
Func ActiveStopOrder(pSecCode)
nOrd=Get_number_of(«STOP_ORDERS»)
result=CREATE_MAP ()
for iOrd from 1 to nOrd
asoOrder = get_item(«STOP_ORDERS», iOrd)
if get_value(asoOrder, «STATUS»)=«ACTIVE» and get_value(asoOrder, «SECCODE»)=pSecCode
result = asoOrder
end if
end for
End Func
Сегодняшняя тема была выбрана не случайно, дело в том, что современные трейдеры и инвесторы все чаще отказываются от надежных долгосрочных стратегий в пользу среднесрочных спекулятивных систем, построенных на различных индикаторах, объёмах и прочих похожих инструментах.

На мой взгляд, это серьезная проблема, так как при подобном подходе человек просто перестает развиваться, т.е отказывается узнавать новую информацию, которая могла бы ему пригодиться на более высоких уровнях карьерной лестницы в финансовом секторе.
Вот и получается что у простого рядового спекулянта всего 2 пути:
1) Торговать на небольших счетах и постоянно искать новые паттерны, так как прежние методы могут перестать работать
2) Изучать фундаментальные закономерности, которые будут актуальны всегда.
Но закончим с лирикой и перейдем к более серьезным вещам. Первым делом нужно разобраться с терминологией, в частности, под облигацией понимается ценная бумага, держатель которой получает от её эмитента либо купонный доход, либо разницу между ценой размещения и номиналом.
Всё изложенное мной ниже — основано на моём личном опыте и по мере возможности применяется мной на практике.
Некоторые рекомендации покажутся вам параноидальными и\или противоречащими моим недавним декларациям.
Хочу пояснить, что эта статья имеет очень специальное назначение и является ориентиром, к которому желательно максимально приблизиться.
Сам я пока ещё весьма далёк от чёткого выполнения всех пунктов этой статьи.
Эта удалённость возникла изза недостатка знаний и изза моих заблуждений, которые сопутствовали мне во время моего продвижения в крипто-мире.
Недавно я осознал, что надо двигаться в направлении максимальной децентрализованности.
В свое время, лет 5-6 назад, на смартлабе был опубликован очень хороший пост. Не знаю, попал ли он к кому-либо в избранное. Я на его основе сделал этот.
Известный многим пример: представим, что объявлена лотерея. Каждый участник может назвать число от 1 до 100. Ценный приз выигрывает тот, чей ответ окажется ближе всего к 2/3 среднего арифметического ответов всех участников.
Как все будет происходить? В первую очередь, найдутся люди, которые невнимательно прочитают задание, и в качестве ответов назовут случайным образом числа от 1 до 100.
Люди с образованием учтут, что большинство невнимательно прочитают задание, и решат использовать математическую статистику для участников лотереи как статистической совокупности, для чего применят центральную предельную теорему для моделирования нормальных случайных величин. Проще говоря, они примут, что распределение независимых ответов публики будет случайным со средним около 50 (при нормальном распределении), а значит надо взять 2/3 от 50 и получить в виде ответа 33.
В продолжении первой статьи
Не каждый заказчик может написать техническое задание по ГОСТу, но всегда можно написать своими словами, либо скриншотами или привести примеры с помощью цифр, чтоб разработчику стало понятно, что нужно от торгового робота.
Какие основные моменты нужно отразить в техническом задании по созданию торгового робота:

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