Вопрос-ответ

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 5, среднее: 5,00 из 5)
Загрузка...
LogoNew
Если Ваш вопрос не имеет отношения к какой-то определенной статье на данном сайте, то, пожалуйста, задавайте его в комментариях здесь.

Добавить комментарий

Вопрос-ответ: 2 127 комментариев

  1. Доброго времени суток, а подскажите - у квика есть какой-то программный интерфейс, чтобы получать данные и выполнять транзакции без необходимости открывать несколько окошек?

      1. Я с SQLite давно пробовал работать, никаких проблем не увидел. Вообще, можно на C++ написать DLL, которую можно к скрипту подцепить, а в этой DLL можно что угодно подцеплять. Для SQLite есть уже готовое решение, как и для многих других технологий. Погуглите LuaForWindows, это гугловская библиотека для Lua

  2. Привет. Как посчитать значение МА в скрипте понятно вот код

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
     function Mashka() -- Функция считает значение МА по индексу свечи (Simple, Close)
       if Index == nil then
          DS = CreateDataSource("SPBFUT", Fut, TF) -- Получает доступ к свечам графика
          Index = DS:Size() -- Индекс текущей свечи
       elseif DS:Size() > Index then -- Появилась новая свеча
          Index = DS:Size() -- Индекс текущей свечи
          local Ind = Index - 1 -- Индекс последней сформированной свечи
          MA = 0 -- МА
          for i = Ind, Ind - (Period - 1), -1 do -- Перебирает последние свечи
             MA = MA + DS:C(i)
          end
          MA = RtS(MA / Period)
       end
    end

    Вопрос как посчитать волатильность фьючерса?

  3. Дмитрий, привет.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    function CheckDeal() -- Функция проверяет таблицу сделок
       local trade = getItem("trades",i) -- Параметры сделки
       if Name == trade.brokerref then -- Сделка моего бота по комментарию и номер сделки из таблицы сделок больше Deal
          if Call == trade.sec_code then -- Сделка моего бота по Call
             if bit.test(trade.flags, 2) then -- Сделка "Sell", закрыли Long
             else -- Сделка "Buy", открыли Long
             end
          end
       end
    end

    Часть кода урезанная конечно ни кому не пользоваться
    Вопрос: может ли демо от квика проигнорировать эти строки

    1
    
     Name == trade.brokerref
    1
    
    Call == trade.sec_code
    1
    
    bit.test(trade.flags, 2)

    голову уже сломал всю.
    Вопрос задаю по тому что увидел уже один глюк может это то же из этой же серии?

      1. Name это комментарий к сделке/заявке - и она всегда не nil на реале схема проверки таблицы сделок работает безотказно не один бот уже сделал по такой проверке

        1. А ты уверен что в поле комментарий, которое отображается в таблице, кроме твоего комментария больше ничего нет, например код клиента сервер не добавляет через слеш перед твоим комментарием?

        2. а глюк я видел такой - ну это в другом боте - кидаю заявку на демо он мне говорит - цена вне лимита - проверил цену заявки все в лимитах - и на реале работает, а на демо ошибку выдает - убрал поле Проверять лимиты на нет - заработало - по этому и спрашиваю может все таки глюки - прежде чем спрашивать я сам знаешь все досконально проверяю и уже думал в первую очередь что я сам дурак чё то накосячил в боте - ну вроде нет - все правильно

          1. Возможно в момент, когда ты проверяешь сделку, у нее еще не все поля подгрузились с сервера, делай на это тоже проверку, если увидел что какого-то поля нет, или у него некорректное значение, то проверяй сделку повторно позже.

            1. ну как ты и сказал сделал логирование уже в понедельник (18.02.2019) проверять буду - там какой то параметр все таки не проходит - примерно есть предположения (проверю - отпишусь) - но это только на демке - на реале то ни разу не видел

  4. Здравствуйте Дмитрий.
    Ниже код индикатора. Задача простая - вывести две метки на график. Согласно отладочным сообщениям функция вывода меток срабатывает успешно и выдает идентификатор метки. Но самой метки на чарте нет. В чем засада?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    
    Settings={
    	Name = "_Labels",--имя индикатора
    	AssetID = "sber",--идентификатор иструмента
    	LabelName = "down-254095_1280",--имя файла метки
    	stopper = false,--обработка на каждом тике 
    	complect = 0,
    -- начальное местоположение меток
    	fplace = 3,
    	splace = 1,
    	Yvalue = 0,
          line=
             {
                {
                   Name = "High",
                   Type =TYPE_LINE,
                   Width = 1,
                   Color = RGB(120,90, 140)
                }--,
                --{
                   --Name = "Low",
                   --Type =TYPE_LINE,
                   --Width = 1,
                   --Color = RGB(120,90,140)
                --},
                --{
                   --Name = "Close",
                   --Type =TYPE_LINE,
                  -- Width = 1,
                   --Color = RGB(120,90, 140)
                --},
                --{
                  --Name = "Open",
                   --Type =TYPE_LINE,
                   --Width = 1,
                   --Color = RGB(120,90,140)
                --}
    			--}
             }
    }
     
    --глобальные переменные
    -- Внимание, название всех параметров меток должны писаться большими буквами
    	label1={
    	             --TEXT="метка";
    	             IMAGE_PATH="";
    	             --TRANSPARENCY=100,
    	             TRANSPARENT_BACKGROUND=1,
    	             --YVALUE=Settings.Yvalue,
    	             DATE=0,
    	             TIME=0
                }
        label2={
    	             --TEXT="";
    	             IMAGE_PATH="";
    	             --TRANSPARENCY=100,
    	             TRANSPARENT_BACKGROUND=1,
    	             YVALUE=Settings.Yvalue,
    	             DATE=0,
    	             TIME=0
                }
     
     
    Label_Id = {}--массив с идентификаторами меток			
    ScriptPath=""--путь к иконке (для метки)
    NumCandles=0--количество свечек на графике
    Yvalue=0
     
    --функция подставляет нули при их отсутствии на первой позиции даты-времени
    	FTEXT = function (V)
    		V=tostring (V)
    		if string.len (V) == 1 then V = "0".. V end
    		return V 
    	end			
     
    function Init()
        if Settings.AssetID=="" then 
            message("Необходимо установить идентификатор инструмента")
        end
    	ScriptPath = getScriptPath().."\\"..Settings.LabelName; --путь к файлу метки
        NumCandles=getNumCandles(Settings.AssetID)-1; --номер последней справа свечи на графике
     
    --объявление переменных. Присваиваем начальные значения чтобы сразу типизировать.
    	local t={}--таблица данных свечек
    	local TableSize=0--размер таблицы данных
    	local n=0--количество строк в таблице (количество свечек)
    	local l=""--подпись инструмента
    	local Date=""--дата свечки
    	local Time=""--время свечки
     
    	t,n,l = getCandlesByIndex(Settings.AssetID,0,NumCandles-3,3); --беру три предпоследние свечки
    --t - таблица значений свечек
    --n - количество полученных свечек(строк таблицы)
    --l - подпись к инструменту
    	TableSize = #t+1; --длина массива свечек
    --дата и время свечи 1
    	Date=t[1].datetime.year..FTEXT(t[1].datetime.month)..FTEXT(t[1].datetime.day); --дата
    	Time=FTEXT(t[1].datetime.hour)..FTEXT(t[1].datetime.min)..FTEXT(t[1].datetime.sec);
    --привязка к оси У
    	Yvalue=Settings.Yvalue+t[1].high;
     
    --заполнить структуру данных меток
    	label1={
    			IMAGE_PATH=ScriptPath;
    			YVALUE=Yvalue;
    			DATE=Date,
    	        TIME=Time			
    			};
    message(label1.IMAGE_PATH.."");
    message(label1.YVALUE.."");
    message(label1.DATE.."");
    message(label1.TIME.."");
     
    --дата и время свечи 2		
    	Date=t[2].datetime.year..FTEXT(t[2].datetime.month)..FTEXT(t[2].datetime.day); --дата
    	Time=FTEXT(t[2].datetime.hour)..FTEXT(t[2].datetime.min)..FTEXT(t[2].datetime.sec);			
    	label2={
    			IMAGE_PATH=ScriptPath;
    			YVALUE=Yvalue;
    			DATE=Date,
    	        TIME=Time			
    			};
    --добавляем метки на чарт			
    	Label_Id[1]=AddLabel(Settings.AssetID,label1);
    	message(tostring(Label_Id[1]));
    	Label_Id[2]=AddLabel(Settings.AssetID,label2);			
    	message(tostring(Label_Id[1]));			
     
    	return 1
    end
     
    function OnCalculate(index)
     
    	return Yvalue
    end
    function OnDestroy ()
    	DelAllLabels(Settings.AssetID)
    end
      1. Дмитрий, мне текст не нужен, только картинка из файла. Кстати, есть ли ограничения на размер картинки? И правомерен ли вывод метки из функции Init?

        1. Попробуйте для начала текстовые метки вывести, чтобы исключить ошибку неправильной установки меток, потом добавьте картинку, если не появится, значит формат не верный, я, честно говоря, давно разбирался какие картинки подходят, не помню уже, раньше, вроде бы, в картинке должна была быть цветность не выше 8 бит и формат только bmp, вроде допускался, из Init попробуйте вывести, я не пробовал.

          1. Ага, попробую сначала текстом.
            Там в документации сказано, что картинки могут быть формата jpeg или bmp. Про размер картинки ничего не сказано. У меня картинка формата bmp, а вот размер я пробовал разный, вплоть до 15 пикселей. Насчет цветности не скажу, даже не задумывался об этом.
            Пробовал зарегистрироваться на форуме поддержки Quik, но почему-то письма со ссылками на регистрацию назад не возвращаются. Причем на 2 разные почты в разных доменах. чо за беда, не знаете?

              1. Дмитрий, спасибо за советы,, все получилось.
                Может кто-то еще столкнется с такой проблемой. Косяки были следующие:
                - неверный формат файла картинки. Создать в любом редакторе, обрезать до актуального размера, обязательно указать допустимое расширение.
                - текстовая метка без указания цвета шрифта выводится черным, у меня фон был тоже черный.
                - путь к файлу нужно выбирать так. чтобы квик его находил файл даже если вы работаете без прав администратора. В этом был главный косяк. как только я переместил файл на другой диск, все пошло как надо.
                Еще раз спасибо и удачи.

  5. Доброго времени суток!
    Подскажите, пожалуйста...
    Можно ли из LUA обратиться к таблице QUIK, созданной пользователем?
    Например, я создал в QUIK таблицу "Облигации" (Создать окно/Текущие торги) с двумя колонками "Цена последней сделки" и "Доходность последней сделки", добавил в нее несколько инструментов. Можно ли из LUA получить данные строк этой таблицы, поменять программно в ней что-то?
    В справочнике QLUA подобного не нашел.

    1. Здравствуйте, для получения доступа к таблице "Текущие торги" служит функция getParamEx, пример здесь: https://quikluacsharp.ru/?p=258, программно стандартными средствами QLua менять таблицы квика нельзя, только если использовать WinAPI, но это сложно и ненадежно, т.к. в каждой последующей версии квика все может меняться, и то, что Вы написали ранее на WinAPI, может перестать работать.

  6. Привет, Дмитрий. Вопрос на засыпку - сегодня день с этим воюю - ни че не пойму у меня брокер Открытие, в квике демо - все путем - в сбере не проходит тема что к чему поясни пожалуйста?
    "tonumber(getParamEx("SPBFUT", Fut, "bid").param_value)" в сбере показывает ноль

                    1. да я уже щас по ходу так и скажу - уже говорил - 2 человека - ведутся на комиссию типа - ну ладно - я то просто думал что я че то не так в боте сделал - да все так - все работает - у всех - брокеры косячат и это факт - я сто процентов знаю про другого брокера - там косяки есть - по этому ну не мой косяк - это точно

          1. Так то на прикол я пол дня убил - вчера - я то просто само сабой разумеется подразумевал что поток то есть - ой - ну век живи век учись - человек то еще сказал - типа извинился вот такие есть - ладно проехали - а то мы тут на брокера стали гнать волну - ну "ХХХ" как брокер - все не очень хорошо отзываются это факт

              1. дак я о том же - ладно буду и это учитывать - ну там человек пока еще не очень опытный - да ладно разобрались и то хорошо - а то я то думал что я дебил че то не так в боте нарисовал - хотя этому боту уже год и кто его приобретал - все пропали - ну ни кто не жаловался - значит все хорошо

  7. Здравствуйте Дмитрий!
    Подскажите, какой параметр нужно добавить в функцию Заполнения структуры для отправки транзакции, что бы в Таблице сделок в столбце Комментарии отражались указанные Комментарии?
    добавил "T['BROKERREF'] = NAME1 -- Комментарий" в
    SetMarketOrder = function(
    operation, -- Операция ('B' - buy, 'S' - sell)
    qty -- Количество
    )
    -- Выставляет рыночную заявку
    -- Получает ID для следующей транзакции
    trans_id = trans_id + 1
    -- Заполняет структуру для отправки транзакции
    local T = {}
    T['TRANS_ID'] = tostring(trans_id) -- Номер транзакции
    T['ACCOUNT'] = ACCOUNT -- Код счета
    T['CLASSCODE'] = CLASS_CODE -- Код класса
    T['SECCODE'] = SEC_CODE -- Код инструмента
    T['ACTION'] = 'NEW_ORDER' -- Тип транзакции ('NEW_ORDER' - новая заявка)
    T['TYPE'] = 'L' -- Тип ('L' - лимитированная, 'M' - рыночная)
    T['OPERATION'] = operation -- Операция ('B' - buy, или 'S' - sell)
    T['PRICE'] = GetPriceForMarketOrder(operation) -- Цена
    T['QUANTITY'] = tostring(qty) -- Количество
    T['BROKERREF'] = NAME1 -- Комментарий
    -- Отправляет транзакцию
    local Res = sendTransaction(T)
    -- Если при отправке транзакции возникла ошибка
    if Res ~= '' then
    -- Выводит сообщение об ошибке
    message('Ошибка транзакции открытия/закрытия по рынку: '..Res)
    end
    end
    результат в Таблице сделок в столбце Комментарии без изменений
    Спасибо.

        1. В некоторых языках есть такая команда goto, но все современные языки давно отказались от такой команды и в современном программировании использование этого оператора считается правилом плохого тона. В Lua данный оператор так же отсутствует.