1 (2023-07-04 13:51:06 отредактировано Alexey89)

Тема: добавить к цене акции число для стопа и профита.

Здравствуйте.

Пытался сделать универсальный скрипт. Он работает с любой акцией из последней заявки таблицы заявок. Автоматом считает стоп и тейк. Не могу задать цену на 0,5% выше или ниже текущей. Пытался задать стоп и тейк в количестве шагов цены, но у каждой бумаги разные шаги по отношению к ее цене. 30 шагов цены где-то это 0,2% а где-то 1,5%.  Не подходит. А если задавать цену процентом, то часто цена не попадает в шаг цены и ошибки не дают работать скрипту. Что посоветуете? наверняка я туплю и там одна маленькая строчка кода))


Колхоз что есть сейчас (грубый выбор числа шагов цены исходя из последней цены акции)

local buy_price = priceLAST + price_step * xxx



if priceLAST > 10000 then
        xxx = 20
    elseif priceLAST > 1000 then
        xxx = 25
         elseif priceLAST > 400 then
        xxx = 30  -- РОСНЕФТЬ 477.2   0,3    ЭН ГРУПП 481,8 30 ШАГОВ 1,33 ПРОЦЕНТОВ
         elseif priceLAST > 220 then
        xxx = 80  -- СБЕРБАНК 238,65  80 ШАГОВ 0,3 ПРОЦЕНТА
       
        elseif priceLAST > 190 then
        xxx = 6    -- М ВИДЕО 193,3  6 ШАГОВ   0,3 ПРИМЕРНО
        elseif priceLAST > 180 then
        xxx = 11  -- МЕЧЕЛ 189,45  11 ШАГОВ 0,3
        elseif priceLAST > 175 then
        xxx = 48 --  МЕЧЕЛ 179.26   48 ШАГОВ  0,3
       
end

2 (2023-09-05 10:42:34 отредактировано Alexey89)

Re: добавить к цене акции число для стопа и профита.

Задача решена, землекопа полтора.








-- получить параметры последней моей выставленной заявки
local n_orders = getNumberOf("orders")
local last_order = getItem("orders", n_orders - 1)
-- message('Номер последней  заявки: ' ..last_order.order_num.. 'Бумаге    ' ..last_order.sec_code.. ' Цена ' ..last_order.price.. 'Лотов ' ..last_order.qty )

local class_code = "TQBR"
local sec_code = last_order.sec_code
local lots = math.floor(last_order.qty)
local lots1 = tostring(lots)

-- Получаем минимальный шаг цены (также известен как шаг цены)
local price_step = tonumber( getParamEx(class_code, sec_code, "SEC_PRICE_STEP").param_value)


local priceLAST = tonumber( getParamEx(class_code, sec_code, "LAST").param_value )
-- Вычисляем цену, на которую выставим лимитную заявку на покупку


local xxx -- Объявляем переменную xxx

    if priceLAST/price_step > 40610 then xxx = 131
   
    elseif priceLAST/price_step >    40300    then xxx =    130
elseif priceLAST/price_step >    39990    then xxx =    129
elseif priceLAST/price_step >    39680    then xxx =    128
elseif priceLAST/price_step >    39370    then xxx =    127
elseif priceLAST/price_step >    39060    then xxx =    126
elseif priceLAST/price_step >    38750    then xxx =    125
elseif priceLAST/price_step >    38440    then xxx =    124
elseif priceLAST/price_step >    38130    then xxx =    123
elseif priceLAST/price_step >    37820    then xxx =    122
elseif priceLAST/price_step >    37510    then xxx =    121
elseif priceLAST/price_step >    37200    then xxx =    120
elseif priceLAST/price_step >    36890    then xxx =    119
elseif priceLAST/price_step >    36580    then xxx =    118
elseif priceLAST/price_step >    36270    then xxx =    117
elseif priceLAST/price_step >    35960    then xxx =    116
elseif priceLAST/price_step >    35650    then xxx =    115
elseif priceLAST/price_step >    35340    then xxx =    114
elseif priceLAST/price_step >    35030    then xxx =    113
elseif priceLAST/price_step >    34720    then xxx =    112
elseif priceLAST/price_step >    34410    then xxx =    111
elseif priceLAST/price_step >    34100    then xxx =    110
elseif priceLAST/price_step >    33790    then xxx =    109
elseif priceLAST/price_step >    33480    then xxx =    108
elseif priceLAST/price_step >    33170    then xxx =    107
elseif priceLAST/price_step >    32860    then xxx =    106
elseif priceLAST/price_step >    32550    then xxx =    105
elseif priceLAST/price_step >    32240    then xxx =    104
elseif priceLAST/price_step >    31930    then xxx =    103
elseif priceLAST/price_step >    31620    then xxx =    102
elseif priceLAST/price_step >    31310    then xxx =    101
elseif priceLAST/price_step >    31000    then xxx =    100
elseif priceLAST/price_step >    30690    then xxx =    99
elseif priceLAST/price_step >    30380    then xxx =    98
elseif priceLAST/price_step >    30070    then xxx =    97
elseif priceLAST/price_step >    29760    then xxx =    96
elseif priceLAST/price_step >    29450    then xxx =    95
elseif priceLAST/price_step >    29140    then xxx =    94
elseif priceLAST/price_step >    28830    then xxx =    93
elseif priceLAST/price_step >    28520    then xxx =    92
elseif priceLAST/price_step >    28210    then xxx =    91
elseif priceLAST/price_step >    27900    then xxx =    90
elseif priceLAST/price_step >    27590    then xxx =    89
elseif priceLAST/price_step >    27280    then xxx =    88
elseif priceLAST/price_step >    26970    then xxx =    87
elseif priceLAST/price_step >    26660    then xxx =    86
elseif priceLAST/price_step >    26350    then xxx =    85
elseif priceLAST/price_step >    26040    then xxx =    84
elseif priceLAST/price_step >    25730    then xxx =    83
elseif priceLAST/price_step >    25420    then xxx =    82
elseif priceLAST/price_step >    25110    then xxx =    81
elseif priceLAST/price_step >    24800    then xxx =    80
elseif priceLAST/price_step >    24490    then xxx =    79
elseif priceLAST/price_step >    24180    then xxx =    78
elseif priceLAST/price_step >    23870    then xxx =    77
elseif priceLAST/price_step >    23560    then xxx =    76
elseif priceLAST/price_step >    23250    then xxx =    75
elseif priceLAST/price_step >    22940    then xxx =    74
elseif priceLAST/price_step >    22630    then xxx =    73
elseif priceLAST/price_step >    22320    then xxx =    72
elseif priceLAST/price_step >    22010    then xxx =    71
elseif priceLAST/price_step >    21700    then xxx =    70
elseif priceLAST/price_step >    21390    then xxx =    69
elseif priceLAST/price_step >    21080    then xxx =    68
elseif priceLAST/price_step >    20770    then xxx =    67
elseif priceLAST/price_step >    20460    then xxx =    66
elseif priceLAST/price_step >    20150    then xxx =    65
elseif priceLAST/price_step >    19840    then xxx =    64
elseif priceLAST/price_step >    19530    then xxx =    63
elseif priceLAST/price_step >    19220    then xxx =    62
elseif priceLAST/price_step >    18910    then xxx =    61
elseif priceLAST/price_step >    18600    then xxx =    60
elseif priceLAST/price_step >    18290    then xxx =    59
elseif priceLAST/price_step >    17980    then xxx =    58
elseif priceLAST/price_step >    17670    then xxx =    57
elseif priceLAST/price_step >    17360    then xxx =    56
elseif priceLAST/price_step >    17050    then xxx =    55
elseif priceLAST/price_step >    16740    then xxx =    54
elseif priceLAST/price_step >    16430    then xxx =    53
elseif priceLAST/price_step >    16120    then xxx =    52
elseif priceLAST/price_step >    15810    then xxx =    51
elseif priceLAST/price_step >    15500    then xxx =    50
elseif priceLAST/price_step >    15190    then xxx =    49
elseif priceLAST/price_step >    14880    then xxx =    48
elseif priceLAST/price_step >    14570    then xxx =    47
elseif priceLAST/price_step >    14260    then xxx =    46
elseif priceLAST/price_step >    13950    then xxx =    45
elseif priceLAST/price_step >    13640    then xxx =    44
elseif priceLAST/price_step >    13330    then xxx =    43
elseif priceLAST/price_step >    13020    then xxx =    42
elseif priceLAST/price_step >    12710    then xxx =    41
elseif priceLAST/price_step >    12400    then xxx =    40
elseif priceLAST/price_step >    12090    then xxx =    39
elseif priceLAST/price_step >    11780    then xxx =    38
elseif priceLAST/price_step >    11470    then xxx =    37
elseif priceLAST/price_step >    11160    then xxx =    36
elseif priceLAST/price_step >    10850    then xxx =    35
elseif priceLAST/price_step >    10540    then xxx =    34
elseif priceLAST/price_step >    10230    then xxx =    33
elseif priceLAST/price_step >    9920    then xxx =    32
elseif priceLAST/price_step >    9610    then xxx =    31
elseif priceLAST/price_step >    9300    then xxx =    30
elseif priceLAST/price_step >    8990    then xxx =    29
elseif priceLAST/price_step >    8680    then xxx =    28
elseif priceLAST/price_step >    8370    then xxx =    27
elseif priceLAST/price_step >    8060    then xxx =    26
elseif priceLAST/price_step >    7750    then xxx =    25
elseif priceLAST/price_step >    7440    then xxx =    24
elseif priceLAST/price_step >    7130    then xxx =    23
elseif priceLAST/price_step >    6820    then xxx =    22
elseif priceLAST/price_step >    6510    then xxx =    21
elseif priceLAST/price_step >    6200    then xxx =    20
elseif priceLAST/price_step >    5890    then xxx =    19
elseif priceLAST/price_step >    5580    then xxx =    18
elseif priceLAST/price_step >    5270    then xxx =    17
elseif priceLAST/price_step >    4960    then xxx =    16
elseif priceLAST/price_step >    4650    then xxx =    15
elseif priceLAST/price_step >    4340    then xxx =    14
elseif priceLAST/price_step >    4030    then xxx =    13
elseif priceLAST/price_step >    3720    then xxx =    12
elseif priceLAST/price_step >    3410    then xxx =    11
elseif priceLAST/price_step >    3100    then xxx =    10
elseif priceLAST/price_step >    2790    then xxx =    9
elseif priceLAST/price_step >    2480    then xxx =    8
elseif priceLAST/price_step >    2170    then xxx =    7
elseif priceLAST/price_step >    1860    then xxx =    6
elseif priceLAST/price_step >    1550    then xxx =    5
elseif priceLAST/price_step >    1240    then xxx =    4
elseif priceLAST/price_step >    930    then xxx =    3
elseif priceLAST/price_step >    620    then xxx =    2

       
       



local buy_price = priceLAST - price_step * (xxx*4 + 5)  -- цена выставится при сработке стопа, лонг тоесть - и цена чуть ниже цены последних  сделок

local take_profit_offset = priceLAST + price_step * xxx
local take_profit_offset1 = math.floor(take_profit_offset)
local take_profit_offset2 = tostring(take_profit_offset1)

local stop_loss_offset = priceLAST - price_step * (xxx*4-2)-- цена сработки стопа
local stop_loss_offset1 = math.floor(stop_loss_offset)   --  math.floor много бед из за нее  tostring надо
local stop_loss_offset2 = tostring(stop_loss_offset1)








local order_params = {
ACCOUNT = "ххххххххххх",
CLASSCODE = "TQBR",
CLIENT_CODE = "ххххххх",
ACTION = "NEW_STOP_ORDER",
TRANS_ID = "1",
SECCODE = sec_code,


OPERATION = "S", -- Тип операции (B - покупка  «S» - продажа.)
PRICE = tostring(buy_price), -- цена для стопа
QUANTITY = lots1,


STOP_ORDER_KIND = "TAKE_PROFIT_AND_STOP_LIMIT_ORDER",
STOPPRICE = tostring(take_profit_offset), --профит - обязательно
STOPPRICE2 = tostring(stop_loss_offset), --стоп  tostring - обязательно
OFFSET_UNITS = "PERCENTS",
OFFSET = "0",
SPREAD_UNITS = "PERCENTS",
SPREAD  = "0",
--MARKET_TAKE_PROFIT = "YES",



EXPIRY_DATE = "TODAY"
}

--      OFFSET    -    Величина отступа от максимума (минимума) цены последнеи? сделки. Используется при «STOP_ORDER_KIND» = «TAKE_PROFIT_STOP_ORDER» или «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
-- OFFSET_UNITS    -    Единицы измерения отступа. Возможные значения: «PERCENTS» – в процентах (шаг изменения – одна сотая процента),«PRICE_UNITS» – в параметрах цены (шаг изменения равен шагу цены по данному инструменту)Используется при «STOP_ORDER_KIND» = «TAKE_PROFIT_STOP_ORDER» или «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
     -- SPREAD    -    Величина защитного спрэда. Используется при   
-- SPREAD_UNITS    -    Единицы измерения защитного спрэда. Возможные значения: «PERCENTS» – в процентах (шаг изменения – одна сотая процента),«PRICE_UNITS» – в параметрах цены (шаг изменения равен шагу цены
-- BASE_ORDER_KEY    -    Регистрационныи? номер заявки-условия. Используется при






-- отправляем заявку на сервер QUIK
local result = sendTransaction(order_params)

if result ~= "OK" then
--если при отправке заявки произошла ошибка, выводим сообщение об ошибке
message("Ошибка при отправке заявки: " .. result)
else
--если заявка была успешно отправлена, выводим сообщение об успешном выполнении
message("Заявка успешно отправлена")
end -- закрываем блок 'if'

3

Re: добавить к цене акции число для стопа и профита.

Когда-то давным-давно одни парни пилили библиотеку "вспомогательный функций" для роботов на Lua
[url]https://github.com/ahmpro/qllib[/url]

Хоть библиотека эта "8 лет не обновлялась", как это модно сейчас говорить, но на самом деле в ней много полезного и все абсолютно актуально. В том числе там точно была вычислялка/форматировалка цен заявок с учетом шага цен и точности цены.
Можно или целиком её взять, или, как минимум, подсмотреть/надергать многие полезные кусочки.