В алгоритмическом  языке  QPILE  программирования для QUIK  согласно руководству пользователя имеется возможность отображать на графиках метки, вид которых задается в формате BMP.

 В качестве примера приведу график с изображением уровней сопротивления и поддержки

Вычисляемых программой на языке QPILE по значениям свечей изображенных на графике.

При реализации отображения меток встретилась следующая проблема. Как выяснилось у разработчиков нет возможности программно управлять флагом   «Прозрачный фон». По умолчанию, данный флаг должен быть сброшен, что не создавало бы проблем. Так это и происходит при запуске программы.

Однако, при дальнейшей работе программы, флаг  «Прозрачный фон» становиться активным.  С этого момента, выводимые на график метки становятся не видимыми.

Я решил эту проблему следующим образом:

В начале программы на график выводится максимальное количество меток на уровень «ноль». Так как задано нулевое значение цены, то метки остаются вне экрана.

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

   Для отображения уровней поддержки и сопротивления при большом  объеме истории метки использую циклически.

Автор: Николай Камынин

В алгоритмическом  языке  QPILE  программирования для QUIK  согласно руководству пользователя имеются два типа операторов ЦИКЛ:

FOR переменная IN список значений
                последовательность инструкций
END FOR

выполняет «последовательность инструкций» для каждого значения «переменной», входящего в «список значений». «Список значений» определяется переменной типа «STRING» со значениями, перечисленными через  запятую.

———————————————

FOR переменная FROM значение1 TO значение2
    последовательность инструкций
END FOR

выполняет последовательность инструкций для каждого значения переменной в диапазоне от «значение1» до «значение2» с шагом 1, в качестве которых могут выступать математические выражения. Если «значение2» < «значение1», цикл не обрабатывается.

Вложенность операторов цикла не ограничена.

————————————

Для организации цикла типа WHILE  я использую следующую конструкцию:

    FOR переменная FROM  1   TO    10  (граница цикла любая)

 В тело ЦИКЛА ставим следующий условный блок:

IF   условие цикла BREAK     ELSE  переменная=1  END IF

   последовательность инструкций
END FOR

Если надо, чтобы цикл исполнялся хотя бы раз,  то условный блок ставим  в конце цикла,

иначе условный блок помещаем сразу после оператора FOR.

   ПЕРЕМЕННАЯ   в теле цикла (последовательность инструкций)   для вычислений не используется.

Если такой цикл применяется в функции и надо выйти из функции,

 то оператор BREAK заменяем на RETURN

Цикл на убывание переменной делается следующим образом:

FOR переменная  FROM значение1  TO   значение2

   переменная2 = значение2  + значение1   — переменная

В теле цикла для вычислений используется переменная2, которая убывает от значение2 до значение1.

Tags: ,

Автор: Николай Камынин

Учитывая, указанные ранее  ограничения, рассмотрим примеры функций из библиотеки автора:

БИБЛИОТЕКА ФУНКЦИЙ NK

Функции преобразования даты и времени:

FUNC DateTimeSesLoc() ‘определение даты сессии локального времени и текущей даты

MAP=GET_TRADE_DATE () ‘дата торговой сессии

Y_M_D1() ‘распаковка даты торговой сессии

DateTrade=DATE(YEAR,MONTH,DAY) ‘дата торговой сессии в формате YYYYMMDD

MAP=GET_DATETIME ()  ‘текущая дата и время

Y_M_D()  ‘распаковка текущей даты

DateLast=DATE(YEAR,MONTH,DAY) ‘дата в формате YYYYMMDD

H_M_S()  ‘распаковка текущего времени

T=0+TIME(HOUR,MIN,SEC‘текущее время в формате hhmmss

LOCALTIME=GET_INFO_PARAMLOCALTIME«)    ‘локальное время компьютера hh:mm:ss

Time_ID=0+HMS(LOCALTIME‘время hh:mm:ss в hhmmss будем использовать как код транзакции

‘—————

END FUNC

‘——————————

FUNC Y_M_D1()  ‘распаковка даты

YEAR=GET_VALUE(MAP, «YEAR»)

MONTH=GET_VALUE(MAP, «MONTH»)

DAY=GET_VALUE(MAP, «DAY»)

DW=GET_VALUE(MAP, «DAYOFWEEK»)

END FUNC

‘——————————

FUNC Y_M_D()  ‘распаковка текущей даты

Y_M_D1()  ‘распаковка даты

DW=GET_VALUE(MAP, «DAYOFWEEK«)

DD_MM_YYYY=GET_VALUE(MAP, «DATETIME»)

DateLastString=SUBSTR (DD_MM_YYYY, 6,4) & SUBSTR (DD_MM_YYYY, 3,2) & SUBSTR (DD_MM_YYYY,0,2) 

END FUNC

‘——————-

FUNC H_M_S()  ‘распаковка текущего времени

HOUR=GET_VALUE(MAP, «HOUR»)

MIN=GET_VALUE(MAP, «MIN»)

SEC=GET_VALUE(MAP, «SEC»)

‘MLS=GET_VALUE(MAP, «MILLISEC»)

END FUNC

‘——————-

FUNC HMS(LTime‘распаковка времени из формата hh:mm:ss в формат hhmmss

result=SUBSTR (LTime,0,2) & SUBSTR (LTime, 3,2) & SUBSTR (LTime, 6,2)

END FUNC

‘——————-

FUNC Y_M_D_H_M(LDat‘распаковка текущего времени

Y_M_D(LDat)  ‘распаковка текущей даты

H_M_S(LDat)  ‘распаковка текущего времени

END FUNC

‘——————-

FUNC DATE(YEAR,MONTH,DAY )  ‘дата в формате YYYYMMDD

  result=(YEAR*100+MONTH)*100+DAY

END FUNC

‘——————-

FUNC TIME(HOUR,MIN,SEC )      ‘время в формате hhmmss

 result=(HOUR*100+MIN)*100+SEC 

END FUNC

‘——————-

FUNC DecrTIME(HHMMSS,STEP )  ‘перевод назад на STEP минут, вывод hhmmss

HM1=FLOOR (HHMMSS/100)

H1=FLOOR (HM1/100)

M1=HM1-H1*100

S1=HHMMSS-100*(H1*100+M1)

S1=H1*3600+M1*60+S1- STEP*60

IF S1>0

result=SEC_TO_HHMMSS(S1)

ELSE

result=0

END IF

END FUNC

‘——————-

FUNC IncTIME(HHMMSS,STEP )  ‘перевод вперед на STEP минут, вывод hhmmss

HM1=FLOOR (HHMMSS/100)

H1=FLOOR (HM1/100)

M1=HM1-H1*100

S1=HHMMSS-100*(H1*100+M1)

S1=H1*3600+M1*60+S1+STEP*60

result=SEC_TO_HHMMSS(S1)

END FUNC

‘——————

FUNC SEC_TO_HHMMSS(TimeToSec)        ‘перевод из секунд в формат HHMMSS

TEMP=TimeToSec

H2=FLOOR (TEMP/3600)

MS2=TEMP-H2*3600

M2=FLOOR (MS2/60)

S2=MS2-60*M2

 result=(H2*100+M2)*100+S2 

END FUNC

‘————

FUNC HHMMSS_TO_MIN(HHMMSS)        ‘перевод времени из HMMSS в минуты

H2=FLOOR (HHMMSS/3600)

MS2=HHMMSS-H2*3600

M2=FLOOR (MS2/60)

 result=H2*60+M2 

END FUNC

 

Tags: ,