andrewso (andrewsoa) wrote,
andrewso
andrewsoa

Объёмы на FX.

        Распределение объёмов торгов на FX в зависимости от часа суток (для мажоров), пара графиков, текст макроса на VBA для Excel и сам файл для желающих поэкспериментировать с котировками иных тикеров.
        "Объёмы", естественно - условно. Будем считать что волатильность тесно связана с активностью торгов. ))

        Гистограмма среднего размера часового бара EURUSD, в пунктах.
EURUSD_HourSize

       Исходные данные - часовые котировки выгруженные из торгового терминала MT4 одной кухни. Время торгового сервера GMT+3. Объём базы котировок, период расчёта ~ 2012 год, 6370 баров.
        Номер бара - это номер часа суток, например бар под номером "15"  соответствует изменению котировки за время с 15:00:00 до 15:59:59.
        Для уменьшения объёма базы данных и удобства пользования бары в файле представлены рядом Close вместо стандарта - OHLC (Open-High-Low-Close, 4-е ряда). Таким образом котировка Close в ряду является Open для следующего бара. А бар это разность (Close-Close-1). Поэтому размер бара, следовательно и результат расчёта, будет немного отличаться от реального в меньшую сторону.
        Торговый сервер, насколько помню, не практикует перевод часов с летнего на зимнее время и обратно. По конкретной стране и городу рабочее время и был/не-был перевод часов можно посмотреть на ресурсе:  (24timezones.com) .

        Для EURUSD, как видно,  максимальный размер волатильности соответствует началу торговой сессии в Нью-Йорке. А для 4-х из 7-ми рассмотренных валютных пар максимум волатильности совпадает с концом рабочего дня в Лондоне, Франфуркте, Париже, Цюрихе. Время основных торговых  сессий от OANDA, здесь: (fxtrade.oanda.co.uk).

        Таблица средних размеров часовых баров мажоров в зависимости от часа суток. В пунктах котировок и в нормированных величинах. Нормировка произведена "по-простому" - делением значений в ряду на максимальное значение.
Stat_HourSize

        Сводный график нормированных величин.
Majors_HourSize

Excel файл с зашитым макросом для расчётов и прочими "кнопками" можно скачать по ссылке, (486 КБ): (DateHour.rar)


[Текст макроса VBA для Excel]
Sub HourSize()
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Макрос вычисления статистики среднего размера бара по часам суток
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'On Error Resume Next
Dim ticker As String 'название тикера
Dim iClm As Integer 'номер столбца тикера на листе данных "DataHour"
Dim rowStart As Long 'номер начальной строки данных
Dim rowEnd As Long 'номер конечной строки данных
Dim trigger1 As Integer 'триггер переключения представления результата расчёта
Dim nRow As Long 'количество обрабатываемых строк данных
Dim i, j, k As Long 'счётчики циклов
Dim HourValue As Integer 'час бара
Dim OpenValue As Double 'цена открытия бара(Close предыдущго бара)
Dim CloseValue As Double 'цена закрытия бара
Dim bar As Double 'размер бара в пунктах
Dim Value_ As Double 'средний абсолютный размер бара в пунктах
Dim statArray() As Double 'массив данных
Dim statArray_() As Double 'массив данных
Dim sumValue As Double 'сумма абсолютных знаений баров для конкретного часа
Dim startingRow As Integer 'первая строка вывода результата расчёта на листе "Bufer"
Dim startingColumn As Integer 'первый столбец вывода результата расчёта на листе "Bufer"

Application.ThisWorkbook.Worksheets("Settings").Select 'переход на лист "Settings"
'считывание заданных на листе "Settings" параметров
iClm = Application.ThisWorkbook.Worksheets("Settings").Range("B2").Value '
rowStart = Application.ThisWorkbook.Worksheets("Settings").Range("B3").Value '
rowEnd = Application.ThisWorkbook.Worksheets("Settings").Range("B4").Value '
trigger1 = Application.ThisWorkbook.Worksheets("Settings").Range("B5").Value '
startingRow = 3
startingColumn = 3

If rowStart < 3 Then rowStart = 3 'проверка шапки таблицы

nRow = rowEnd - rowStart - 1 '

Application.Calculation = xlManual 'выключаем автоматический пересчёт в книге
Application.ScreenUpdating = False 'отключить обновление экрана

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Application.Run "ClearBuferSheet" 'запуск макроса удаление прежних данных с листа "Bufer"
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Application.ThisWorkbook.Worksheets("DataHour").Select 'переход на лист "DataHour"

ticker = Application.ThisWorkbook.Worksheets("DataHour").Cells(1, iClm).Value '

ReDim statArray(Round(nRow / 24, 0), 23) 'объявление массива "statArray"
ArrayRow = UBound(statArray, 1) 'размер, количество строк в массиве "statArray"
ArrayCol = UBound(statArray, 2) 'размер, количество столбцов в массиве "statArray"

'первоначальное заполнение массива "statArray"
For i = 0 To ArrayRow Step 1
For j = 0 To ArrayCol Step 1
statArray(i, j) = -1 'для последующей проверки существования такого бара в базе (актуально для конца базы)
Next j
Next i
'сортировка баров по часам, заполнение массива "statArray"
For i = 0 To 23 Step 1
k = 0 'счётчик заполненных строк в массиве "statArray"
For j = 0 To nRow Step 1
HourValue = Hour(Application.ThisWorkbook.Worksheets("DataHour").Cells(rowStart + j, 1).Value)
If i = HourValue Then
OpenValue = Application.ThisWorkbook.Worksheets("DataHour").Cells(rowStart + j - 1, iClm).Value
CloseValue = Application.ThisWorkbook.Worksheets("DataHour").Cells(rowStart + j, iClm).Value
bar = Abs(OpenValue - CloseValue)
statArray(k, i) = Round(bar, 4)
k = k + 1
End If
Next j
Next i

ReDim statArray_(1, 23) 'объявление массива "statArray_"

'вычисление среднего размера бара
For i = 0 To ArrayCol Step 1
sumValue = 0
k = 0 'здесь счётчик баров для конкретного часа
For j = 0 To ArrayRow Step 1
iValue = statArray(j, i)
If iValue >= 0 Then 'проверка существования такого бара в базе (актуально для конца базы)
sumValue = sumValue + iValue
k = k + 1
End If
Next j
Value_ = sumValue / k
statArray_(0, i) = i
statArray_(1, i) = Round(Value_, 5) 'запись в массив "statArray_"
Next i

'приведение к диапазону(0;1)
If trigger1 = 1 Then
'поиск максимального значения
maxValue = 0
For i = 0 To 23 Step 1
iValue = statArray_(1, i)
If iValue > maxValue Then maxValue = iValue
Next i
'приведение к диапазону(0;1)
For i = 0 To 23 Step 1
iValue = statArray_(1, i)
statArray_(1, i) = Round(iValue / maxValue, 5) 'с округлением до "5" знаков
Next i
End If

Application.ThisWorkbook.Worksheets("Bufer").Select 'переход на лист "Bufer"

'вывод массива "statArray_" на лист "Bufer"
With ThisWorkbook.Worksheets("Bufer")
.Range(.Cells(startingRow, startingColumn), .Cells(startingRow + 1, _
startingColumn + ArrayCol)).Value = statArray_()
End With

startingRow = startingRow + 5 'промежуток между выводимыми массивами

'вывод массива "statArray" на лист "Bufer"
With ThisWorkbook.Worksheets("Bufer")
.Range(.Cells(startingRow, startingColumn), .Cells(startingRow + ArrayRow, _
startingColumn + ArrayCol)).Value = statArray()
End With

Application.ThisWorkbook.Worksheets("Bufer").Cells(1, 3).Value = ticker 'вывод имени тикера

Erase statArray() 'удаление массива из памяти
Erase statArray_() 'удаление массива из памяти

MsgBox "Готово!", Title:="Макрос: HourSize" '& vbNewLine _
& "Время завершения макроса: " & Now
'
Application.Calculation = xlAutomatic 'включаем автоматический пересчёт в книге
Application.ScreenUpdating = True 'включить обновление экрана

End Sub

.
Tags: excel, fx, image, oanda, statistics, vba
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments