Практика no image

Опубликовано 12 июня | автор Forex Фактор

59

Как в Quik получить котировки по номеру свечи (бара)

Пржде чем критиковать кого-то, необходимо его за что то похвалить. Например: «Классный ты парень, но дураааак….». Я всегда придерживаюсь этого правила и Вам советую. Сейчас я немного покритикую разработчиков Quik.

Всегда идя навстречу ��ожеланиям трейдеров, они встроили в свой терминал возможность создавать механические торговые системы и разработали для этого новый язык программирования – Qpile. В этом языке они даже реализовали поддержку ассоциативных массивов, этого нет даже в моем, некогда любимом Delphi. Но при этом упустили из внимания настолько элементарные вещи, что написание хоть сколько-нибудь серьезных программ требует хорошей смекалки.

Например – если уж ты начал цикл, то не выйдешь из него, пока цикл не отработает полностью. Цикла типа “while ” нет вообще, а ведь он, в большинстве случаев, удобнее и универсальнее, чем “for“. Переменные превращаются из строковых в вещественные, и наоборот, совершенно незаметно для неподготовленных трейдеров, и даже сами разработчики в своих примерах прибавляют 0 к переменным, чтобы быть уверенными, что используют вещественный тип в условии.

Но это все мелочи, пока дело не доходит до самого главного инструмента трейдеров – графика котировок. В техническом анализе принято анализировать рынок за несколько последних баров (дней, часов или минут), и все программы технического анализа используют такой же подход. А в языке Qpile мы можем обращаться к свечам (барам) по дате и времени, но не по номеру. Хотите узнать, какая была цена закрытия три бара назад? Хотите узнать максимально высокую цену (экстремум) за последние 7 баров? Ох и непросто это вычислить.

Надеюсь, разработчики Quik со временем сделают возможность обращаться к свечам на графике по номеру. А пока мы вынуждены обходиться своими силами. Я написал программу, которая выводит в таблицу, а также записывает в файл, последние n свечей с графика.
Вот код программы:

Перед запуском программы (портфеля) выведите график по нужному вам инструменту (бумаге) в выбранном временном интервале.

Настройка таймфрема графика в Quik

В тексте программы укажите название инструмента, код класса и временной интервал.

Теперь мы имеем таблицу, в которой свечи с графика представлены в текстовом виде и имеют нумерацию от 1 до 10 (или сколько вы указали в параметрах).

Таблица OHLC в Quik

Эту таблицу можно экспортировать в Excel (с просьбы об этом от «Репликатора САС-П001-01», постоянного читателя блога, я и решил написать эту программу), а можно обращаться к этой табличке из своей программы, не заботясь о дате, а оперируя номером свечи (строки в таблице). Пожелания подобного рода часто встречаются от трейдеров на форуме Quik, надеюсь, эта программа будет полезна и им.

К сожалению, сейчас у меня нет возможности всесторонне протестировать программу, поэтому если обнаружите ошибку, напишите, пожалуйста, об этом в комментариях.

Метки: , ,


К статье Как в Quik получить котировки по номеру свечи (бара) 59 комментариев

  1. репликатор САС-П001-01 says:

    (улыбаясь)С Вами говорит САС-П001-01.Вы Человек?Моим сенсорам было приятно почувствовать уважение к своей просьбе.(серьёзно)Спасибо!Будет время обязательно протестируем.Мне очень приятно, что Вы проделали эту работу для меня…ну, и для других конечно!(Простите за глупый вопрос)А какой компилятор лучше использовать?

  2. Торговый робот says:

    Рад оказаться полезным :-)
    Компилятор никакой не нужен, qpile не компилируемый язык. Надо всего-лишь сохранить сей код в текстовый файл с расширением qpl и потом в Квике загрузить “портфель” (CTRL+F10 – “Загрузить локально”, CTRL+F11 – указать период расчета и “Применить”, CTRL+F12 – “Добавить все” и “Да”)
    Только график надо вывести заранее, в соответствии с интервалом, указанном в программе в 10 строке.

  3. репликатор САС-П001-01 says:

    (провокационно)Будущее за роботами?(Смех робота Вертера из к/ф “Гостья из будущегог”)

  4. Виктор says:

    Было бы интересно узнать поподробнее

  5. IAD says:

    Но следует учитывать, что в Excel вмещается только 65535 строк. Возможно на следующей строке будет ошибка.

  6. Торговый робот says:

    Виктор, подробнее о чем хотелось бы узнать?
    IAD, 65535 строк эта программа и не выведет, ввиду универсальности перебор свечек идет весьма не быстро, поэтому 65 тысяч строк будут просчитываться с минут 10 наверное.
    Я думаю, оптимальнее всего использовать эту программу для вывода 10-30 свечей, обычно больше и не надо.

  7. репликатор САС-П001-01 says:

    (огорчённо)Торговый робот, это САС-П001-01.Программа считает неверно, а именно, округляет котировки до целых чисел.Например, max=63.57,программа пишет 64.Ну, а в целом это то , что и надо.Я восхищён!Правда не проверял экспорт в Excel.

  8. Торговый робот says:

    Исправлю, я проверял на фьючерсах, там нет копеек. Вот только до компьютера доберусь :-)

  9. Торговый робот says:

    Поправил, теперь котировки показываются с точностью до 2 знаков после запятой.
    Если кому-то это не надо или наоборот, слишком мало – укажите сколько знаков вам надо, изменив 2 на количество знаков в PARAMETER_TYPE NUMERIC(10,2) (строки 107, 113, 119 и 125)

  10. репликатор САС-П001-01 says:

    (задумчиво)Мда-а-а…Есть проблемы.Чтобы использовать данную программу “внутри дня” необходимо ограничивать работу цикла не по количеству “Candle”, а по “Date”.Вот в таком виде она “залезает” на другую дату, а хотелось бы остановить её, как только, например, 09.06.2008 заканчивается и появляется 08.06.2008, независимо от того сколько “Candle” она нашла, но при этом оставить ввод параметра “Candle” так, как он есть сейчас, ну, самому задавать количество свечей.И ещё, что-то непонятно почему при экспорте в Excel в колонке “Open” совсем не то, что вижу в Quik.В целом конечно вещь нужная т.к. позволяет “лопатить кучу всякой чепухи” и использовать в дальнейшей обработке….(улыбаясь)Чёрт!Придётся почитать про Qpile.

  11. Торговый робот says:

    В этом и суть универсальной программы, что она собирает котировки “по штукам” независимо от дня. Если нужны котировки только за сегодня, то такая программа будет в 5 раз меньше.
    В твоем случае, коллега, можно в программе в 50 строке

    CurHour=23
    заменить на

    CandleCount=CandleToFind

    Таким образом при смене дня прекратится поиск котировок и потом еще немного погоняется пустой цикл.

    А про Qpile почитай обязательно :-)

  12. Alex says:

    Пардон, а какой интервал ставить, если данные дневные?

  13. Торговый робот says:

    Alex, сейчас у меня Quik нет под рукой, чтобы проверить, но осмелюсь предположить, что 1440 (24*60)
    Попробуйте, заодно проверим, действительно ли универсальная программа получилась?
    Если что-то не так будет – напишите здесь, я тогда исправлю.

  14. Alex says:

    Я тоже так подумал. Но выдает пустую таблицу в результате. На внутридневных данных вроде работает хорошо. Очень полезную работу Вы проделали. Хочется выразить искренний респект. Еще бы данные объемов приделать.

  15. kavolorn says:

    Спасибо автору за скрипт! Мне в данный момент нужен именно он :) и чтобы искал последние бары независимо от дня.. главное, чтобы последние!
    Еще раз благодарствую :)

    P.S. Qpile очень страшный язык, если приходится для таких вещей столько наворотов придумывать..

  16. Торговый робот says:

    Всегда пожалуйста, очень рад быть полезным. Последние бары по номеру нужны очень многим трейдерам, надеюсь, разработчики в конце концов внедрят такую возможность в Quik, на форуме тема поднималась не один раз.

    P.S. Да, язык я правда ужасный, но я на бейсике в свое время много писал программ, потому привык к подобного рода “ухищрениям” :-)

  17. Паша says:

    а как получить данные из окна котировок?

  18. Торговый робот says:

    Не совсем понятен вопрос. В Quik из любого окна можно получить данные в свою программу на Qpile (см.хелп к программе) либо в сторонние программы, вроде Excel через DDE или ODBC

  19. Паша says:

    Мне для программы на Qpile. Все, нашел такую функцию. Спасибо.

  20. QD says:

    Gracias! Реально помогло в написании робота! Спасибо еще раз! Внедряем))

  21. NRV says:

    Очень полезная вещь, qpile начал тока вникать, а пока не нашел твою чудо вещь извращался с периодами в эксель VBA. Возникла проблема с твоей табличкой хочу ее вывести в эксель “Вывести через DDE сервер” а он пишет ошибку и вообще закрывает квик иногда вроде все ок? не подскажешь в чем может быть ошибка?

  22. Торговый робот says:

    NRV, сказать по правде, вывод в Excel этой таблицы я не проверял, ибо был на все 100 уверен, что тут нет проблем. Таблица сформирована по всем “стандартам”… Сегодня доберусь до компьютера с quik’ом, проверю что к чему.

  23. Робот в Проекте says:

    Эта… А где продолжение марафоника.. Так все интересна шло, бац! и разрыв соединения (образна). Я вот только хотел бы сделать роботика и для меня все Ваши стататьи и комментарии оч и оч актуальны. Все аргументы и споры я воспринимаю оч положительно. Для меня это все! интересно. Спасибо большое за такой интересный и толерантный сайт!

    Мы (я) требуем продолжение “банкета”!

    PS
    Сорри, что не совсем по теме. Просто не нашел, где с этим можно было обратиться напрямую. Если подскажете, буду признателен и корректен.

  24. NRV says:

    Блин вывод в эксель гючит ваще не понятно почему то вы водит то ошибку выдает и ваще квик полностью закрывает!!!

  25. Робот в Проекте says:

    для NRV. А я вот читал на одном из форумов, что от версии Экселя зависеть может. Может попробовать предыдущую версию офиса? (как вариант, а вдруг поможет) В других вариантах я пока не специалист – буду учиться.

  26. NRV says:

    дык офис 2003 sp2 (11.6560), далеко не новый и такая трабла тока с этой табличкой до этого даж не знал что такой глюк есть

  27. Андрей says:

    Окажу помощь в написании программы на QPILE. Если кому-то интересно, обращайтесь – qpile@mail.ru

  28. Toshkin says:

    Хм.. не нашел в описании qpile функции get_candle. Не просветите случаем?

  29. Toshkin says:

    Уже нашел на сайте квика. А у тройки до сих пор старая версия лежит ((.

  30. urpok says:

    Добрый день, Торговый робрт!
    Не могли бы помочь написать робота на языке Qpile? Суть системы: Покупка при закрытие короткой скользящей средней выше длинной скользящей средней и продажа при закрытие короткой ниже длинной средней.

  31. Торговый робот says:

    Здравствуйте, urpok!
    Торговая система, которую вы предлагаете, очень примитивна, не вздумайте сразу торговать по ней настоящими деньгами, проверьте сперва, уверен, что разочаруетесь :-)
    Но для изучения qpile такая система в самый раз. В ближайшие дни напишу программу по вашему алгоритму и выложу на этом сайте

  32. Влад says:

    Все вроде сделал правильно:
    -ввел инструмент;
    -открыл график с нужным интервалом;
    – загрузил “портфель” (CTRL+F10 – “Загрузить локально”;
    период расчета указал 10 сек; и т.д.
    А при запуске таблицы: таблица со всеми названиями есть , а поля пустые

  33. Влад says:

    Проба пера! Оставил коммент. он попал

  34. NRV says:

    вопрос к разработчику: А как можно к этой табличке (просто замечательная) прикрутить еще и объем очень нужно?

  35. Штурман says:

    Спасибо тебе, добрый человек!
    Нет, реально я полный новичек в QPILE, поэтому твой код мне очень помог начать. Я посидел и понял, почему ты используешь некоторое количество дней назад, а потом гоняешь пустой цикл. Это не очень корректно и самое главное это можно исправить, путем некорректности самого QPILE. А все дело в том, что переменную цикла можно менять в самом теле цикла. Тогда в нашем случае он получается легче и быстрее. Вот, собственно, сам измененный код:

    ————————–
    PORTFOLIO_EX Ref;
    DESCRIPTION Ref;
    CLIENTS_LIST ALL_CLIENTS;
    FIRMS_LIST ALL_FIRMS;

    INCLUDE functions.inc;
    PROGRAM
    ‘ ————————————————
    ‘ Настраиваемые параметры
    ‘ ————————————————
    ClassCodeList=”SPBFUT” ‘ код класса инструмента
    Instrument=”RIM9″ ‘ название инструмента

    Interval=30 ‘ интервал (таймфрейм) на графике
    N=50 ‘ сколько свечей надо найти

    DELETE_ALL_ITEMS()

    InitDateTime()

    output=CREATE_MAP()

    for i from 1 to N

    TextData=fTextData(CurYear,CurMonth,CurDay) &””
    TextTime=fTextTime(CurHour,CurMin) & “”

    Candle=GET_CANDLE(ClassCodeList, Instrument, “”, Interval & “”, “PRICE”, TextData, TextTime)
    Open=GET_VALUE (Candle, “Open”)+0

    if (Open>0)
    Reference=GET_VALUE (Candle, “Close”)+0
    output=SET_VALUE(output,”Date”,TextData)
    output=SET_VALUE(output,”Time”,TextTime)
    output=SET_VALUE(output,”Price”,Reference)
    ADD_ITEM(i,output)
    else
    i = i – 1 ‘ Если бара нет (нет торгов), то счетчик баров уменьшаем
    end if

    ‘ откат на “интервал” назад
    CurMin=CurMin-Interval
    if CurMin<0
    CurMin=60+CurMin
    CurHour=CurHour-1
    if CurHour<0
    CurHour=23
    CurDay=CurDay-1
    if curDay<1
    CurDay=31
    CurMonth=CurMonth-1
    if CurMonth<1
    CurMonth=12
    CurYear=CurYear-1
    if CurYear<0
    message (“Не найдены котировки”,1)
    end if
    end if
    end if
    end if
    end if
    end if
    end for

    END_PROGRAM

    PARAMETER Date;
    PARAMETER_TITLE Дата;
    PARAMETER_DESCRIPTION Дата;
    PARAMETER_TYPE STRING(30);
    END

    PARAMETER Time;
    PARAMETER_TITLE Время;
    PARAMETER_DESCRIPTION Время;
    PARAMETER_TYPE STRING(30);
    END

    PARAMETER Price;
    PARAMETER_TITLE Price;
    PARAMETER_DESCRIPTION Price;
    PARAMETER_TYPE NUMERIC(10,2);
    END

    END_PORTFOLIO_EX
    ————————–

    И подгружаемый модуль с функциями (я всегда вспомогательное стараюсь вынести, чтобы читать легче было):
    ————————–
    ‘ Функция инициализации даты и времени
    func InitDateTime()
    CurYear=get_value(GET_DATETIME(), “YEAR”)
    CurMonth=get_value(GET_DATETIME(), “MONTH”)
    CurDay=get_value(GET_DATETIME(), “DAY”)
    CurHour = GET_VALUE(GET_DATETIME(), “Hour”)
    CurMin = GET_VALUE(GET_DATETIME(), “Min”)
    CurMin = Interval*Floor(CurMin/Interval) ‘ округляем минуты до “интервальных”
    end func

    ‘ функция перевода даты в текстовый формат
    func fTextData(Year,Month,Day)
    if (LEN(Month) < 2)
    Month = “0” & Month
    end if
    if (LEN(Day) < 2)
    Day = “0” & Day
    end if
    result = Year & Month & Day
    end func

    ‘ функция перевода времени в текстовый формат
    func fTextTime(Hour,Min,Sec)
    if (LEN(Hour) < 2)
    Hour = “0” & Hour
    end if
    if (LEN(Min) < 2)
    Min = “0” & Min
    end if
    result = Hour & Min & “00”
    end func
    ————————–

    P.S. Надеюсь, что внес свою посильную лепту. Лично я эту программу также оформил в виде функции Ref(массив,бары), которую использую для дальнейших расчетов.

  36. Торговый робот says:

    Штурман, спасибо за код!
    Признаюсь, про изменение переменной внутри цикла не знал, да даже ине думал о таком кощунстве. Вообще это ужасно, так, конечно, нельзя делать если хотеть соответствовать духу программирования. Но скорость работы реально прибавится.
    К сожалению в комментариях код немного испортился, например к��вычки. Я проверю на досуге, если все работает как надо – оформлю как положено и вставлю ваш код в основной текст.

  37. Toshkin says:

    В qpile давно уже есть оператор прерывания цикла, хватит фигней маяться )). Удачи!

  38. Штурман says:

    Во-первых, этого не т в мануале. Какой оператор? Приведи пример. Во-вторых, при чем тут прерывание цикла, если нам надо его наоборот продлить? Можно конечно сразу его пускать до царя гороха, а потом рвать, но имхо это бизнес логику нарушает. Если бы они сделали полноценный while, тогда другое дело.

  39. Toshkin says:

    В приложении 1 (Синтаксис команд) все есть – continue, break, return – все как обычно. Enjoy :)

  40. GLDA says:

    В модинге кода ошибка в строке где идут подряд все end if 6 штук.Один лишний,должно быть пять

  41. Сергей says:

    Есть собственная стратегия, закажу под неё MTC программу вязка quik ser-martynov@yandex.ru

  42. Чапаев says:

    Блин ниче не работает ((((( ни первый скрипт ни второй
    бьюсь как головой об стену!
    В первом скрипте гет кэндл нихера не возвращает? а во втором отказывается выполнять initdatetime

  43. Шаган says:

    В Квике работает таблица создается… Вот только – !

    Кто нить смог экспортировать эту таблицу в Эксель по DDE?
    Пишет – Ексель книга не открыта или отсутствует Лист… хотя все ��ткрыто и присутствует.
    комент по 1 -му коду.

  44. Штурман says:

    2 Чапаев
    Все работает. :)

    2 Шаган
    Открой новый файл в экселе и сохрани его, а в окне укажи название файла. Если просто запустить эксель, то квик не видит по-умолчанию не сохраненную книгу.

  45. Шаган says:

    2 Штурман
    не помогло, взял стрый фаил с макросами – вот его видит, а новые не видит хоть сохраняй, хоть не сохраняй… придется множить этот старый фаил. ))

    Народ помогите разобраться в коде, этот кусок рельно не работет… т.е. текущая поз. не определяется. уже голову сломал.. может свежим взглядом чего увидите?

    fu=GET_ITEM(“FUTURES_CLIENT_HOLDINGS”, i)
    IF GET_VALUE(fu, “TRDACCID”) = Account and GET_VALUE(fu, “SEC_SHORT_NAME”) = Sec_Code
    CurPos = GET_VALUE(fu, “TOTAL_NET”)
    VMargin= 0+GET_VALUE(fu, “VARMARGIN”)
    END IF

  46. Алексей says:

    Может кто подскажет как реализовать в QPILE возможность сравнивать две переменные (Double и Any)?

  47. index says:

    Всем привет. Я тоже голову сломал, пытаясь программно определить кол-во бумаг в текущей открытой позиции на рынке Фортс (по определенному инструменту). Добрые люди, подскажите, какую функцию использовать. Спасибо заранее.

  48. Гргорий says:

    Добрый день, Торговый робот!
    Alex уже поднимал вопрос:
    09 Июля 2008 в 16:43:
    “Пардон, а какой интервал ставить, если данные дневные?”
    Поддерживаю.
    Какой интервал ставить?
    (при 1440 выдает пустую таблицу в результате)

  49. Vadim says:

    Доброго времени суток, неподскажите одну весч, как в этой таблице вывести проценты в сточках, допустим между открытием и закратием в свечке?

  50. Спек says:

    а как быть если таймфрейм 2 или 4-х часовой ?!
    вроде бы логично ставить интервал 120 и 240, но данные выходят пустые и вроде бы понятно почему ( от 60 минус 120) = минус 60, да и время свечек “ломается” ..

  51. den says:

    С этого дня OHLC.qpl не работает.Сегодня 26.10.2009,а свечи выдаёт за 23.10.2009.В чем причина не знаю.

  52. Nick Cherry says:

    Для дневных свечек нужно ставить интервал “day” или “-1″ (это в справке есть), причем время должно быть 0.

    Функция Get_candle не подерживает 2-х и 4-х часовые интервалы. Возможные значения интервалов можно посмотреть в справке. 120 и 240 там нет.

  53. aksans says:

    Cкажите, пожалуйста, как можно эформить это в вункцию, что б о номеру свечи получать значение параметра, наприрер MY_UNC(n, OPEN), где n номер свечки, и еще первая свечка будет последними данными на графике?

  54. Иван says:

    А я вот не очень понимаю зачем использовать quik, если терминал metatrader более удобен(особенно в плане технических индикаторов и разработки собственных советников). Возможно кто-то пояснит? Просто я новичек и пока только анализирую этот рынок

  55. Коля says:

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

  56. Торговый робот says:

    Иван, дело в том, что metatrader не используется для торговли на фондовом рынке, только на форекс.

  57. Павел says:

    Меня зовут Панкратов Паве Сергеевич, я явлюсь программистом высокого уровня.
    Сейчас я покажу ВСЕМ как грамотно писать скрипты на “QPIL’E” птичий язык – надо заметить!

    http://narod.ru/disk/18112784000/Смотри%20и%20учисЬ.RAR.html

  58. 5sever9 says:

    Я считаю со своей стороны что Иван поднял очень хороший вопрос об использовании программы Метатрейдер для работы на фондовом рынке.
    У компании предлагающей работу на Форексе я использую для анализа 30 наименований акций самых ходовых.С предлагаемыми индикаторами получаю самый лучший анализ со всеми временными интервалами.
    Зайдите на сайт компании

  59. 5sever9 says:

    Компания Финам предлагает метатрейдер 4 для работы на фондовом рынке.

Back to Top ↑