QLUA

Страницы: Пред. 1 2 3 4 5 След.
RSS
QLUA, вопросы начинающих.
 
Самый сверхпримитивный пример на эту тему,

Код
...
function main()    
  while is_run do    
    sleep(1000)    
  end 
end
можно переписать так,
Код
DefaultSleepTimeout = 1000
...
function main()    
  while is_run do    
    sleep(DefaultSleepTimeout)    
  end 
end
Вот уже отделили, когда потом захотим изменить не придется искать где там нужное число в 10000 строк программы, вот оно в самом начале с понятным обозначением. Это разумеется не для быстродействия или чего-то еще связаного с работой программы а чтобы самому не запутаться в большом тексте, только и всего.
 
Спасибо за подробные ответы,  
 
Цитата
Алексей Орешкин написал:
в 4 разделе "Структуры данных" есть пункт 4.24 который называется Транзакции и там есть некоторое описание таблицы транзакций
Здравствуйте, а где взять полное описание таблицы транзакций, что бы написать код отправки условной заявки "тейк профит и стоп-лимит"? С последующим чтением статуса отправленной транзакции?
 
Цитата
RLarisa написал:
Цитата
Алексей Орешкин написал:
в 4 разделе "Структуры данных" есть пункт 4.24 который называется Транзакции и там есть некоторое описание таблицы транзакций
Здравствуйте, а где взять полное описание таблицы транзакций, что бы написать код отправки условной заявки "тейк профит и стоп-лимит"? С последующим чтением статуса отправленной транзакции?
Текст для транзакций можно взять из справки QUIK.
Раздел 6. Совместная работа с другими приложениями/Импорт транзакций/Примеры строк, которые могут содержаться в файле
 
Цитата
Egor Zaytsev написал:
Раздел 6. Совместная работа с другими приложениями/Импорт транзакций/Примеры строк, которые могут содержаться в файле
Спасибо, мне казалось там частные случаи...
 
В каких случаях в скриптах используются функции
Код
function Init() 
   func = AD()
   return #Settings.line
end

function OnCalculate(Index) 
   return func(Index, Settings)
end 

а в каких случаях?

Код
function OnInit()
    DS = CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL);
     return;
   end;
   
 
function main()
    -- "Бесконечный" цикл
...
 
Почему не работает код?
Код
SEC_PRICE_STEP = getParamEx("SPBFUT", "CVZ8", "SEC_PRICE_STEP").param_value;
message(tostring(SEC_PRICE_STEP))
 
Цитата
RLarisa написал:
Почему не работает код?
Код
  SEC_PRICE_STEP  =   getParamEx ( "SPBFUT" ,  "CVZ8" ,  "SEC_PRICE_STEP" ).param_value;
 message (tostring(SEC_PRICE_STEP))
  

Работает.


У Вас ошибка появляется? Какая?
Описывайте в вопросе сразу симптомы проблемы, чтобы быстрее получить ответ.
 
Цитата
vgi написал:
У Вас ошибка появляется? Какая?
Спасибо за ответ) у меня так же выходит, но шаг цены не может быть ноль)
 
Цитата
RLarisa написал:
у меня так же выходит, но шаг цены не может быть ноль)

Возможно, у Вас так же, как у меня, нет этого инструмента в QUIKе?
Поиск по коду не даёт результатов. Отсюда и 0.
 
Цитата
vgi написал:
Возможно, у Вас так же, как у меня, нет этого инструмента в QUIKе?
Интересное предположение), но у меня они вроде бы есть
 
Цитата
RLarisa написал:
    [QUOTE]vgi написал:
у меня они вроде бы есть
Вы показываете на скриншоте SVZ8, а в lua запрашиваете инфу по CVZ8.

По SVZ8 даёт такое:
 
Цитата
vgi написал:
Вы показываете на скриншоте SVZ8
Спасибо) буквы как-то переставились)
 
Обязательно ли в рыночной заявке на покупку указывать цену? В примере указано, что надо устанавливать нулевую цену заявки, но если тип стоит, что заявка на покупку рыночная TYPE=M, то вроде как цена не нужна PRICE=0? Или нужно обязательно цену указывать?
Код
Заявка на покупку Русгидро, рыночная, 15 лотов
ACCOUNT=NL0080000043; CLIENT_CODE=467; TYPE=M; TRANS_ID=7;
CLASSCODE=TQBR; SECCODE=HYDR; ACTION=NEW_ORDER; OPERATION=B;
PRICE=0; QUANTITY=15;
 
маска-пленка с лифтинг-эффектом
Новейшая разработка - маска с коллоидным золотом для эффективной безоперационной подтяжки кожи лица и шеи.
Реанимирует выработку коллагена, разглаживает морщины и подтягивает кожу, а также очищает поры и избавляет от черных точек. 100% натуральный состав.
Инновационная маска с коллоидным золотом для безоперационной подтяжки кожи лица и шеи
 
здравствуйте, где можно взять документацию или пример по установке метки на график, над текущей свечкой по номеру индекса, просто в виде любой картинки?
человек (не робот)
 
Что квику могло в коде не понравиться? вот код
Код
Settings=

{ Name = "Example4",
 period = 5,
 line = {
    {    Name = "MA1",
      Color = RGB(255, 0, 0),
    Type = TYPE_LINE,
    Width = 1
    },
   {    Name = "MA2",
      Color = RGB(255, 0, 0),
    Type = TYPE_LINE,
    Width = 1
    }
    }
 }

 function Init()
 period1=14
 period2=7
   return 2
 end 

function OnCalculate(index)
    if index < Settings.period then
      return nil
    else 
      local sum = 0
      local sum1 = 0
       for i = index-period1+1, index do
         sum = sum +C(i);
       end 
       for i = index-period2+1, index do
         sum1 = sum1 +C(i);
       end 
      return sum/period1,sum1/period2
    end
 end
человек (не робот)
 
Понял, надо было период увеличть
человек (не робот)
 
Цитата
Андрей написал:
пример по установке метки на график
вот нашел пример
Код
labelparams1 = {
            TEXT = "",
            IMAGE_PATH = getScriptPath() .. "заведомо отсутствующий файл и путь", 
            ALIGNMENT = "RIGHT",
            YVALUE = 0,
            DATE = "19000101",
            TIME = "100000",
            R = 0,
            G = 0,
            B = 255,
            TRANSPARENCY = 0,
            TRANSPARENT_BACKGROUND = 0,
            FONT_FACE_NAME = "Arial",
            FONT_HEIGHT = 18,
            HINT = ""
            }

function Init()
lab1 = AddLabel(Settings.ChartID1, labelparams1)
return 1
end            
но не могу понять зная номер индекса свечи на графике, как из свечи получить время и дату?
человек (не робот)
 
Цитата
но не могу понять зная номер индекса свечи на графике, как из свечи получить время и дату?
..
..
t1 = ds:T(index).day;
t2 = ds:T(index).hour;
t3 = ds:T(index).min;
..
 
Цитата
Андрей написал:
Что квику могло в коде не понравиться?  

В ошибке же написано, что ему не нравится, что к sum прибаляется C(i), который равен nil.

Цитата
Андрей написал:
Понял, надо было период увеличть

Возможно, стоило сделать так:
sum = sum + ( C(i) or 0 )
 
Цитата
Игорь Б написал:
t1 = ds:T(index).day;
Спасибо большое, попробую, такое мне не попадалось кажется)
Цитата
vgi написал:
В ошибке же написано, что ему не нравится,
Конечно написано, ) но не понял , спасибо большое за метод , так конечно лучше
Код
sum = sum + ( C(i) or 0 )
человек (не робот)
 
Вывожу номер свечи по порядку и цены закрытия двух МА на момент пересечения кривых и на 1 индекс вперед в лог файл для анализа срабатывания и данные получаются с очень большой точностью, что информация читается визуально очень плохо, можно ли как то привести разрядность после запятой до 3х знаков или 2х. Функции пробовал разные , но что-то не получается()
Цитата
ПК > 16/15;14.593333333333,14.575,14.594166666667,14.605
ПР < 22/16;14.601666666667,14.6075,14.605,14.6025
человек (не робот)
 
Попробуй так

price = 14.593333333333
pointplace = string.find(price,". "); --нашли поз. точки (если разделитель - точка)
   if pointplace then
       price = string.sub(price,1,pointplace + 2); -- для двух знаков
   end;
 
Цитата
price = 14.593333333333
Sorry


p = 14.593333333333;
price = tostring(p);
pointplace = string.find(price,". "); --нашли поз. точки (если разделитель - точка)
   if pointplace then
       price = string.sub(price,1,pointplace + 2); -- для двух знаков
  end;
 
для вывода c двумя знаками после запятой string.format("%.2f",x)
 
Сохранил изменения через notepad++ с помощью-" сохранить как". Выбрал *.lua. В итоге русские буквы сохранились как то так- -- "‘ункци¤ ¬џ«џ¬ј?“—я “?–ћ»ЌјЋќћ  остановки скрипта" Все перекодировки и преобразования не исправляют изменения. Может что надо подгрузить?
На работу не повлияло так как код исполнения не тронут.
 
 
Подскажите пожалуйста, что значит функция майн работает в отдельном потоке и не нагружает терминал? Никакого отдельного процесса для этой функции нет в диспетчере задач, а вся нагрузка как раз ложится на процесс info
 
Цитата
Дмитрий написал:
Подскажите пожалуйста, что значит функция майн работает в отдельном потоке и не нагружает терминал? Никакого отдельного процесса для этой функции нет в диспетчере задач, а вся нагрузка как раз ложится на процесс info
На самом деле это значит буквально то что написано.
Обьектами выполнения в винде являются потоки а не процессы. В документации микрософта они называются thread. Процесс можно считать просто контейнером в котором содержится один или более потоков.

Так вот для выполнения функции мэйн создается такой отдельный поток, который будет работать параллельно с остальными. На отдельном процессорном ядре если такое доступно. И в этом смысле он "не нагружает" терминал. В отличие от коллбэков которые вызываются в одном из "основных" потоков терминала. Если у вас ядер достаточно он будет работать на отдельном ядре. А если недостаточно то может таки и терминалу мешать.
Диспетчер задач показывает именно процессы, чтобы увидеть потоки придется использовать что-нибудь попродвинутее.
 
Скажите пожалуйста как сделать чтобы в простом скрипте. Который выводит сообщение. Когда цена вышла за границы индикатора. Условие сработало один раз на последней свече. Получается цена вышла. Видим сообщение. Цена вернулась и снова вышло еще сообщение.  Надо использовать ds:size(). Но не понимаю как без сделок то. Как то находил информацию про это, но сейчас вот не нашел пока.
Скрытый текст
 
Здравствуйте.
Возник вопрос с приведением типов: из типа DOUBLE (цена, в формате 113300.000000) требуется привести в строковый формат без нулей после точки (113300), чтобы использовать в таблице транзакции (стоп-ордера).
Пробовал использовать mathfloor; по декоде выглядит, как будто нули убрались, на деле - по-прежнему выводит ошибку. Подскажите, каким образом выполнить эту задачу?
Цена в формате DOUBLE у меня в виде переменной
Код
StopLong.yvalue
.
 
Олег,
Не понятно чем не устраивает tostring?
Код
X = 113300.000000
message(tostring(X))

 
Цитата
Sergey Gorokhov написал:
Олег,
Не понятно чем не устраивает tostring?
Код
  X  =   113300.000000 
 message (tostring(X))
  
Когда беру просто число, как Вы сделали, то tostring работает. Но когда беру свою переменную YVALUE,
Код
local price = tostring(StopShort.yvalue)
нули остаются...
yvalue - это параметр метки "Значение параметра на оси Y, к которому будет привязана метка", формат, судя по справочнику - DOUBLE.
 
Олег,
Понятно, на самом деле число у Вас не 113300.000000 а 113300.0000000001 (или как то так)
Это особенность чисел с плавающей точкой (в википедии есть целая статья на тему)
Для решения, Вам надо округлять число с заданной точностью
 
Например
Код
string.format("%.0f", StopShort.yvalue)
 
Цитата
Sergey Gorokhov написал:
Например
Код
   string.format ( "%.0f" , StopShort.yvalue)  

Теперь нулей нет (проверяю по декоде и сообщению), но квик выдаёт сообщение с прежней ошибкой:
 
Олег,
Просьба выложить пример кода на котором воспроизводится проблема
 
Цитата
Sergey Gorokhov написал:
Олег,
Просьба выложить пример кода на котором воспроизводится проблема
Разобрался, благодарю!
Ошибка была теперь уже в коде транзакции; ваш код помог, всё работает.
 
Подскажите пожалуйста ещё с одним вопросом.

Открыта сделка (допустим, в бай), и выставлен стоп-ордер (стоп-лосс) в селл. Условие выставления стоп-ордера по роботу - "если PosNow>0 и нет стоп-ордеров, то выставляется стоп-ордер по определённой цене". Столкнулся с проблемой: когда цена доходит до стопа, между моментом отправки приказа на сервер и моментом закрытия сделки в бай проходит какое-то время, т.е. есть момент, когда стоп-ордера уже нет, а сделка ещё открыта. И в этот момент робот выставляет новый стоп-ордер, и сразу же его открывает, т.е. вместо одного стоп-ордера срабатывают два, и получается разворот позиции. А нужно - просто закрыть сделку в бай.
Подскажите, как этот вопрос решить?
Поможет ли, если я заменю стоп-ордер на обычную заявку (то есть, при открытой сделке стоп-лосс не будет выставляться, а просто будет открываться заявка в противоположную сторону, если цена доходит до определённого уровня)?
Период сна sleep -1000 мс.
 
Олег,
К сожалению без кода не ясно что и как у Вас происходит, следовательно и рекомендовать что либо затруднительно.
Просьба предоставить исходный код скрипта.
 
Олег,
Скорее всего у Вас отсутствует кусок, отвечающий за контроль исполнения стопа. После
Цитата
моментом отправки приказа на сервер
необходимо убедиться, что заявка выставлена и исполнена. И только потом все остальное, что у Вас написано в коде.
Этот контроль можно организовать по-разному. (таблица заявок, таблица сделок, соответствующие им функции обратного вызова, флаги ...).
Сколько людей столько и будет алгоритмов. Лучше разобраться и написать самому.
Цитата
Поможет ли, если я заменю стоп-ордер на обычную заявку
Поможет, если проскальзывание будет достаточным для исполнения всех контрактов сразу. Если будет остаток, возникнет та же проблема, но в меньшем объеме. Т.е. опять возвращаемся к блоку скрипта, который контролирует исполнения сделки, о котором я писал выше.
 
Подскажите, пожалуйста.
Пытаюсь получить данные из тестового QUIK

local Limit = getFuturesLimit("SPBFUT", "SPBFUT00a43", 0, "SUR").cbplplanned

выдает nil. Значение SPBFUT00a43 проверил несколько раз.
Если этот же код запускаю на реальном счете (естественно меняя SPBFUT00a43 на другой счет), то значение на выходе получаю.
В чем может быть проблема?
 
Цитата
Pavel написал:
Подскажите, пожалуйста.
Пытаюсь получить данные из тестового QUIK

local Limit = getFuturesLimit("SPBFUT", "SPBFUT00a43", 0, "SUR").cbplplanned

выдает nil. Значение SPBFUT00a43 проверил несколько раз.
Если этот же код запускаю на реальном счете (естественно меняя SPBFUT00a43 на другой счет), то значение на выходе получаю.
В чем может быть проблема?
Добрый день.
Исправьте SPBFUT на SPBFUT000000
 
Спасибо! Заработало. :smile:  
 
Всех приветствую, ребята подскажите в чем может быть проблема - вообщем только начал изучать Qlua и создание скриптов на нем для квика, создал для начала пробный скрипт
по простой схеме -

IsRun = true;
function main()
while is_run do
       sleep(50)
   end;
 
end;

function ontrade (trade_data)

file = io.open("res_ontrade.txt", "a")
   
   for key,v in pairs(trade_data) do
   file:write(key .. " = " ..tostring(v).. "\n")
   end
   file:close()

end
function OnStop()
  IsRun = false;
end;

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


 
То есть получается что при выполнении сделки функция ontrade ( )  у меня выполняется трижды, либо ее тело трижды, странно
 
Цитата
Анатолий написал:
То есть получается что при выполнении сделки функция ontrade ( )  у меня выполняется трижды, либо ее тело трижды, странно
Здравствуйте,
Это нормально, т.к. сервер может обновлять некоторые параметры сделки, он присылает ее несколько раз.
Тоже самое с заявками.
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,Это нормально, т.к. сервер может обновлять некоторые параметры сделки, он присылает ее несколько раз.Тоже самое с заявками.
И как же мне отфильтровать дублирующиеся мне ответы от сервера? Можно это делать вручную сидя за компом но тогда и смысла скрипты писать нет, я ведь пишу скрипт как раз для того чтобы автоматизировать различные действия и не сидеть для этого за компом, уже перепробовал много раз - Ontrade все время выполняется три раза,
для интереса даже переписал скрипт для изучения происходящего, примерно вот в такой вид

IsRun = true;
function main()
while is_run do
      sleep(50)
  end;

end;

function Oninit ()
n=0
end

function OnOrder (neworder)

       file = io.open("C:\\FinamJunior\\logs\\res_onorder.txt", "a")
     n=n+1
   file:write(tostring (n).."\n")
   file:close()

end

function OnTransReply (transorder)

       file = io.open("C:\\FinamJunior\\logs\\res_ontransreply.txt", "a")
       n=n+1
   file:write(tostring (n).."\n")
   file:close()

end

function OnTrade(trade_data)

       file = io.open("C:\\FinamJunior\\logs\\res_ontrade.txt", "a")
       n=n+1
   file:write(tostring (n).."\n")
   file:close()

end

function OnStop()
 IsRun = false;
end;

Далее делаю следующее - формирую завку на покупку одного лота некоторых  акций по рыночной цене, чтобы заявка быстро была выполнена, и отправляю  ее и вижу следующий результат:
функция OnTrade выполняется первой, причем три раза, в файле res_ontrade.txt  я увидел 1 2 3
Затем выполняется два раза функция OnOrder, два раза - в res_onorder.txt я увидел 4 5
Функция OnTransReply вообще не была выполнена ни разу - в файле res_ontransreply.txt  пусто

 
Цитата
Анатолий написал:
И как же мне отфильтровать дублирующиеся мне ответы от сервера?
Просто добавить условие фильтрации. Если сделка с таким номером по данному классу уже была то игнорировать.
 
Цитата
Sergey Gorokhov написал:
Просто добавить условие фильтрации. Если сделка с таким номером по данному классу уже была то игнорировать.
Извините за глупый вопрос - как это сделать? Для этого есть какие то функции qlua? или же обычными средствами lua
Во втором случае примерно понятно как это сделать
Страницы: Пред. 1 2 3 4 5 След.
Читают тему (гостей: 1)
Наверх