МГС  Московская Гигабитная Сеть
 www.umos.su info@umos.su  Выделенные линии Ве/б-Студия Хостинг Collocation
 Тарифы Вопросы и ответы Полезная информация Контакты

Софт >> Excel

Страниц в ветке: 1
bsn
Гость


Зарегистрирован: 27/02/2010
Сообщений: 11
Пример робота в Ехел для Альфы
      #292466 - 20/03/2010 09:10 прикреплённые файлы (156 загрузок)

Помогите пожалуйста. Только начал осваивать VBA. Вот есть готовый код робота для Альфы (разработчик Альфа). Я так понимаю в этом коде есть несколько систем и они генерируют сигналы на вход/выход в рынок. Может кто-нибудь выкинуть все лишнее из этого кода, оставить только простейший сигнал допустим если данные в ячейке А1 > данных в ячейке А2 то ...
и оставить также только процедуру покупки/продажи, а также выставления стоп и профит ордеров.
Заранее благодарю

Код:
' Option Explicit
Public glNumOrder, glNumData, glCount As Long
Public glDATA(2000) As Double
Public glWB As Worksheet

Public Type typeMTS
Market As String ' Код Площадки (задаем)
PName As String ' Код Инструмента (задаем)
TF As Integer ' Файм-Фрейм (задаем)
Slp As Double ' Проскальзование (задаем)
AutoTrade As Integer ' Флаг торговли (задаем)

TypeSys As String ' Название Типа системы (задаем)
curNum As Long ' Текущее кол-во цб (задаем и далее рассчитываем)
maxNum As Long ' Максимальное кол-во цб (задаем)
minNum As Long ' Минимальное кол-во цб (задаем)
Quantity As Long ' Кол-во бумаг в конкретной сделке (рассчитываем)

Par(4) As Double ' Список параметров (задаем)

Pos As Integer ' Текущая позиция (задаем и далее рассчитываем)
Signal As Integer ' Сигнал (рассчитываем)
PriceSignal As Double ' Цена возникновения сигнала (рассчитываем)
PriceLast As Double ' Последняя цена (рассчитываем)
End Type

Public Type typeSYSTEM
pAD As AlfaDirect ' Указатель на Альфа-Директ
Account As String ' Номер портфеля
NumSys As Integer ' Число систем (задаем)
TimeReset As Integer ' Частота обновления (задаем)
Run As Boolean ' Флаг запуска (внутренний)
MTS(9) As typeMTS '
LastTime As Date ' Время следующего запуска (внутренний)
Sound As Boolean ' Флаг звука
Message As Boolean ' Флаг сообщения

End Type

Public glS As typeSYSTEM

Sub mts_Stop()
' Кнопка остановки программы расчета
' Останавливаем, если программа запущенна
If glS.Run = True Then
glS.Run = False ' Флаг запуска
' Снимаем расписание запуска
Application.OnTime EarliestTime:=glS.LastTime, Procedure:="mts_Timer", Schedule:=False ' Стираем расписание запуска
glWB.Range("A2").Value = "Расчет окончен..." ' Отображаем состояние
End If

End Sub

Sub mts_Start()
' Кнопка запуска программы расчета
curRowPor = 20
glCount = 0 ' Обнуляем счетчик запусков
' + создание указателя на текущий лист
Set glWB = Workbooks("MTS_Alfadirect_v004.xls").Worksheets("MTS")
' + создание указателя на AD
Set glS.pAD = New AlfaDirect
' Просмотр списка поручений и определение числа поручений
glNumOrder = 0
While glWB.Cells(curRowPor + 1 + glNumOrder, 1).Value > 0
glNumOrder = glNumOrder + 1
Wend
'StartButton.Enabled = False ' ДеАктивируем кнопку

' Запуск программы
glS.Run = True ' Флаг запуска
mts_Timer ' Первичное выполнение программы

End Sub

Private Sub mts_Timer()
' Программа расчета
Dim i As Integer, j As Integer, curRow As Integer, curRowPor As Integer
Dim OrderNo As Long
'Dim BS As String, Data As String, Fields As String, Comments As String
Dim BS, Data, Fields, Comments As String

curRow = 10
curRowPor = 20

' Проверяем подключение системы АД к серверу
glWB.Range("C6").Value = glS.pAD.Connected
If glS.pAD.Connected = False Then
' Подключение отсутствует
Beep
glS.pAD.Connected = True ' Пытаемся подключиться и ничего не делаем
Else
' Подключение есть
' Считываем данные СИСТЕМЫ --------------------------------------------------------------------------------
glS.Account = glWB.Range("C3").Value ' Счет
glS.NumSys = glWB.Range("C4").Value ' Число систем
glS.TimeReset = glWB.Range("C5").Value ' Время обновления данных
glS.Sound = glWB.Range("F3").Value ' Звук
glS.Message = glWB.Range("F4").Value ' Сообщения
For i = 0 To glS.NumSys - 1
' Считываем данные для каждой МТС ----------------------------------------------------------
glS.MTS(i).TypeSys = glWB.Cells(curRow + i, 1).Value ' Название Торговой Системы
glS.MTS(i).Market = glWB.Cells(curRow + i, 2).Value ' Рынок
glS.MTS(i).PName = glWB.Cells(curRow + i, 3).Value ' Инструмент
glS.MTS(i).TF = glWB.Cells(curRow + i, 4).Value ' Тайм-фрейм
glS.MTS(i).AutoTrade = glWB.Cells(curRow + i, 5).Value ' Автоматическая торговля
glS.MTS(i).Pos = glWB.Cells(curRow + i, 6).Value ' Позиция [-1-short, 0-cash, +1-long]
glS.MTS(i).curNum = glWB.Cells(curRow + i, 7).Value ' Текущее кол-во
glS.MTS(i).maxNum = glWB.Cells(curRow + i, 8).Value ' Максимальное кол-во
glS.MTS(i).minNum = glWB.Cells(curRow + i, 9).Value ' Минимальное кол-во
glS.MTS(i).Slp = glWB.Cells(curRow + i, 11).Value ' Проскальзование
For j = 0 To 4
glS.MTS(i).Par(j) = glWB.Cells(curRow + i, 12 + j).Value ' Параметры системы
Next
' Считываем данные для каждой МТС ----------------------------------------------------------
Select Case glS.MTS(i).TypeSys
Case "SS", "EE", "ES", "SE"
' Функция торговой системы SS, ES, EE, SE
glWB.Range("B1").Value = mts_Cross_SS(i, glS.MTS(i).TypeSys)
If glWB.Range("B1").Value <> "Ok" Then
glWB.Range("A2").Value = "Расчет окончен..." ' Отображаем состояние
glS.Run = False ' Флаг запуска
Exit Sub
End If
Case "MACD"
' Функция торговой системы MACD
glWB.Range("B1").Value = mts_Cross_MACD(i)
If glWB.Range("B1").Value <> "Ok" Then
glWB.Range("A2").Value = "Расчет окончен..." ' Отображаем состояние
glS.Run = False ' Флаг запуска
Exit Sub
End If
' Сюда всатвить функции расчета MACD
Case Else
glWB.Range("B1").Value = "Ошибка: Нет такой системы!"
glWB.Range("A2").Value = "Расчет окончен..." ' Отображаем состояние
glS.Run = False ' Флаг запуска
Exit Sub
End Select


If glS.MTS(i).Signal <> 0 Then
If glS.Sound = True Then
Beep
End If
If glS.Message = True Then
glWB.Activate
Application.WindowState = xlMaximized
AppActivate "Microsoft Excel"
End If
End If
' Выставление Поручений ----------------------------------------------------------------------
If glS.MTS(i).AutoTrade = 1 Then
' Если покупка ---------------------------------------------------------------------------
If glS.MTS(i).Signal = 1 Then
If glS.MTS(i).Quantity > 0 Then
Comments = ("mts_" & Str(glNumOrder) & "_" & Str(Date) & "_" & Str(Time))
BS = "B"
glNumOrder = glNumOrder + 1
OrderNo = glS.pAD.CreateLimitOrder(glS.Account, glS.MTS(i).Market, glS.MTS(i).PName, CDate(Now + 1), _
Comments, "RUR", BS, CInt(glS.MTS(i).Quantity), CDbl(glS.MTS(i).PriceLast * (1 + glS.MTS(i).Slp / 100)), _
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, CInt(5))
glWB.Cells(curRowPor + glNumOrder, 1).Value = glNumOrder
glWB.Cells(curRowPor + glNumOrder, 2).Value = OrderNo
glWB.Cells(curRowPor + glNumOrder, 3).Value = Now
glWB.Cells(curRowPor + glNumOrder, 4).Value = glS.MTS(i).PName
glWB.Cells(curRowPor + glNumOrder, 5).Value = BS
glWB.Cells(curRowPor + glNumOrder, 6).Value = glS.MTS(i).Quantity
glWB.Cells(curRowPor + glNumOrder, 7).Value = glS.MTS(i).PriceLast
glWB.Cells(curRowPor + glNumOrder, 8).Value = Comments
glWB.Cells(curRowPor + glNumOrder, 9).Value = i
glWB.Cells(curRowPor + glNumOrder, 12).Value = Now & ": " & glS.pAD.LastResultMsg
End If
ElseIf glS.MTS(i).Signal = -1 Then
' Если продажа ---------------------------------------------------------------------------
' Часть 1. Закрытие лонга
If glS.MTS(i).Quantity >= glS.MTS(i).curNum Then
Q1 = glS.MTS(i).curNum
Else
Q1 = glS.MTS(i).Quantity
End If
If Q1 > 0 Then
Comments = ("mts_" & Str(glNumOrder) & "_" & Str(Date) & "_" & Str(Time))
BS = "S"
glNumOrder = glNumOrder + 1
OrderNo = glS.pAD.CreateLimitOrder(glS.Account, glS.MTS(i).Market, glS.MTS(i).PName, CDate(Now + 1), _
Comments, "RUR", BS, CInt(Q1), CDbl(glS.MTS(i).PriceLast * (1 - glS.MTS(i).Slp / 100)), _
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, CInt(5))
glWB.Cells(curRowPor + glNumOrder, 1).Value = glNumOrder
glWB.Cells(curRowPor + glNumOrder, 2).Value = OrderNo
glWB.Cells(curRowPor + glNumOrder, 3).Value = Now
glWB.Cells(curRowPor + glNumOrder, 4).Value = glS.MTS(i).PName
glWB.Cells(curRowPor + glNumOrder, 5).Value = BS
glWB.Cells(curRowPor + glNumOrder, 6).Value = Q1
glWB.Cells(curRowPor + glNumOrder, 7).Value = glS.MTS(i).PriceLast
glWB.Cells(curRowPor + glNumOrder, 8).Value = Comments
glWB.Cells(curRowPor + glNumOrder, 9).Value = i
glWB.Cells(curRowPor + glNumOrder, 12).Value = Now & ": " & glS.pAD.LastResultMsg
End If
' Часть 2. Открытие шорта
If glS.MTS(i).Quantity > glS.MTS(i).curNum Then
Q2 = glS.MTS(i).Quantity - glS.MTS(i).curNum
If Q2 > 0 Then
Comments = ("mts_" & Str(glNumOrder) & "_" & Str(Date) & "_" & Str(Time))
BS = "S"
glNumOrder = glNumOrder + 1
OrderNo = glS.pAD.CreateLimitOrder(glS.Account, glS.MTS(i).Market, glS.MTS(i).PName, CDate(Now + 1), _
Comments, "RUR", BS, CInt(Q2), CDbl(glS.MTS(i).PriceLast * (1 - glS.MTS(i).Slp / 100)), _
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, CInt(5))
glWB.Cells(curRowPor + glNumOrder, 1).Value = glNumOrder
glWB.Cells(curRowPor + glNumOrder, 2).Value = OrderNo
glWB.Cells(curRowPor + glNumOrder, 3).Value = Now
glWB.Cells(curRowPor + glNumOrder, 4).Value = glS.MTS(i).PName
glWB.Cells(curRowPor + glNumOrder, 5).Value = BS
glWB.Cells(curRowPor + glNumOrder, 6).Value = Q2
glWB.Cells(curRowPor + glNumOrder, 7).Value = glS.MTS(i).PriceLast
glWB.Cells(curRowPor + glNumOrder, 8).Value = Comments
glWB.Cells(curRowPor + glNumOrder, 9).Value = i
glWB.Cells(curRowPor + glNumOrder, 12).Value = Now & ": " & glS.pAD.LastResultMsg
End If
Else
Q2 = 0
End If
Else
'"Ждем сигнала ..."
End If ' Signal
End If ' AutoTrade
glWB.Cells(curRow + i, 6).Value = glS.MTS(i).Pos ' Позиция [-1-short, 0-cash, +1-long]
glWB.Cells(curRow + i, 7).Value = glS.MTS(i).curNum ' Текущее кол-во
glWB.Cells(curRow + i, 10).Value = glS.MTS(i).PriceLast ' Последняя цена

Next i
' Проверка отправленных ордеров ----------------------------------------------------------------------------------
For j = 0 To glNumOrder - 1
' запрос статуса только для неисполненного поручения
If glWB.Cells(curRowPor + 1 + j, 10).Value <> "исполнена" Then
Comments = glWB.Cells(curRowPor + 1 + j, 8).Value ' Идентификация поручения по коментарию
idSys = glWB.Cells(curRowPor + 1 + j, 9).Value ' Номер системы гнерирующее поручение
glS.pAD.GetDBData "orders", "status_desc, rest", "comments=" & Comments, Data, Fields
' Order_No = glWB.Cells(curRowPor + 1 + j, 2).Value
If Data <> "" Then
Arr = Split(Data, "|")
glWB.Cells(curRowPor + 1 + j, 10).Value = Arr(0)
glWB.Cells(curRowPor + 1 + j, 11).Value = CInt(Arr(1))
If glWB.Cells(curRowPor + 1 + j, 10).Value = "исполнена" Then
If glWB.Cells(curRowPor + 1 + j, 5).Value = "S" Then
glS.MTS(idSys).curNum = glS.MTS(idSys).curNum - glWB.Cells(curRowPor + 1 + j, 6).Value
ElseIf glWB.Cells(curRowPor + 1 + j, 5).Value = "B" Then
glS.MTS(idSys).curNum = glS.MTS(idSys).curNum + glWB.Cells(curRowPor + 1 + j, 6).Value
End If
End If
glWB.Cells(curRow + idSys, 7).Value = glS.MTS(idSys).curNum ' Текущее кол-во
End If
End If
Next j ' Цикл по поручениям
End If ' Connected

'----- Если нет флага остановки, то повторный Запуск Программы через N сек. ------------------------------------------'
If glS.Run Then
glS.LastTime = Now + (glS.TimeReset / 24 / 60 / 60)
Application.OnTime glS.LastTime, "mts_Timer"
glWB.Range("A2").Value = "Расчет..."
Else
glWB.Range("A2").Value = "Расчет окончен..."
glS.Run = False ' Флаг запуска
End If
glCount = glCount + 1 ' счетчик запусков
glWB.Range("A1").Value = glCount
End Sub

Private Function mts_Cross_SS(ByVal id As Integer, inType As String) As String
' inType - тип системы SS, EE, ES, SE
' Торговая система на пересечении двух скользящих средних
' glS.MTS(id).Par(0) - fast SMA (параметр 1)
' glS.MTS(id).Par(1) - slow SMA (параметр 2)
' Торговая система должна присвоить:
' glS.MTS(id).Pos = {1 если Long, -1 если Short, 0 - если cash}
' glS.MTS(id).Signal = {присвоить 1 если покупка, -1 если продажа, 0 - если нет операции}
' glS.MTS(id).Quantity - присвоить кол-во бумаг в сделке
' glS.MTS(id).PriceLast - присвоить последнюю цену
' glS.MTS(id).PriceSignal - присвоить

Dim Value As String
Dim iN1, iN2 As Integer
Dim sma1, sma2 As Double

mts_Cross_SS = "Ok"

' Определить длину истории в запросе!!!!!!!!!!!!!!
' 1. Чтение данных из Локальной базы АД -------------------------------------------------------------------
' В Альфа-Директ долженбыть открыт график Интсрумента соответствующего тайм-фрейма
' Определить длину истории в запросе!!!!!!!!!!!!!!
If glS.MTS(id).TF = 0 Then nDay = 4
If glS.MTS(id).TF = 1 Then nDay = 15
If glS.MTS(id).TF = 2 Then nDay = 30
If glS.MTS(id).TF = 3 Then nDay = 40
If glS.MTS(id).TF = 4 Then nDay = 60
If glS.MTS(id).TF = 5 Then nDay = 90
If glS.MTS(id).TF > 5 Or glS.MTS(id).TF < 0 Then
mts_Cross_SS = "Ошибка: неверный тайм-фрейм"
Exit Function
End If

Value = glS.pAD.GetArchiveFinInfoFromDB(glS.MTS(id).Market, glS.MTS(id).PName, CInt(glS.MTS(id).TF), CDate(Now - nDay), CDate(Now) + 1)
' Проверка ошибки чтения данных из Локальной базы АД
If Value = "" Then
mts_Cross_SS = "Ошибка " & glS.pAD.LastResultMsg
If glS.pAD.LastResultMsg = "" Then
mts_Cross_SS = "Ошибка " & "Нет данных"
End If
Exit Function
End If
' Разбор запроса: записываем цены закрытия (5ая колонка) в переменную glDATA
mts_GetPrice Value, "datetime|float|float|float|float|int"
' 2. ------------------------------------------------------------------------------------------
glS.MTS(id).PriceLast = glDATA(glNumData)
glS.MTS(id).PriceSignal = glDATA(glNumData - 1)
' Расчет индикаторов --------------------------------------------------------------------------------------
iN1 = glS.MTS(id).Par(0) ' Fast SMA
iN2 = glS.MTS(id).Par(1) ' Slow SMA
If glNumData < 2 * iN1 Or glNumData < 2 * iN2 Then
mts_Cross_SS = "Ошибка " & "Короткая история данных..."
Exit Function
End If

If inType = "SS" Then
sma1 = 0
For j = 0 To iN1 - 1
sma1 = sma1 + glDATA(glNumData - j - 1) ' Рассчитываем значения SMA на предыдущем баре (предпоследнем) !!!!!!!!!!
Next
sma1 = sma1 / iN1
sma2 = 0
For j = 0 To iN2 - 1
sma2 = sma2 + glDATA(glNumData - j - 1) ' Рассчитываем значения SMA на предыдущем баре (предпоследнем) !!!!!!!!!!
Next
sma2 = sma2 / iN2
' Расчет новой позиции -------------------------------------------------------------------------------------
Old_Pos = glS.MTS(id).Pos ' Сохраняем старую позицию
glS.MTS(id).Pos = Sgn(sma1 - sma2) ' Новая позиция по Индикатору
'glWB.Range("L7").Value = sma1
'glWB.Range("M7").Value = sma2
'glWB.Range("N7").Value = ""
End If
If inType = "EE" Then
ema1 = glDATA(0)
ema2 = glDATA(0)
KC1 = 2 / (iN1 + 1)
KE1 = 1 - KC1
KC2 = 2 / (iN2 + 1)
KE2 = 1 - KC2
For j = 1 To glNumData - 1
ema1 = KE1 * ema1 + KC1 * glDATA(j)
ema2 = KE2 * ema2 + KC2 * glDATA(j)
Next
' Расчет новой позиции -------------------------------------------------------------------------------------
Old_Pos = glS.MTS(id).Pos ' Сохраняем старую позицию
glS.MTS(id).Pos = Sgn(ema1 - ema2) ' Новая позиция по Индикатору
glWB.Range("L7").Value = ema1
glWB.Range("M7").Value = ema2
glWB.Range("N7").Value = ""
End If
If inType = "ES" Then
ema1 = glDATA(0)
KC1 = 2 / (iN1 + 1)
KE1 = 1 - KC1
For j = 1 To glNumData - 1
ema1 = KE1 * ema1 + KC1 * glDATA(j)
Next
sma2 = 0
For j = 0 To iN2 - 1
sma2 = sma2 + glDATA(glNumData - j - 1) ' Рассчитываем значения SMA на предыдущем баре (предпоследнем) !!!!!!!!!!
Next
sma2 = sma2 / iN2
' Расчет новой позиции -------------------------------------------------------------------------------------
Old_Pos = glS.MTS(id).Pos ' Сохраняем старую позицию
glS.MTS(id).Pos = Sgn(ema1 - sma2) ' Новая позиция по Индикатору
'glWB.Range("L7").Value = ema1
'glWB.Range("M7").Value = sma2
glWB.Range("N7").Value = ""
End If
If inType = "SE" Then
' Расчет индикаторов SMA iN1-------------------------------------------------------------------------------
sma1 = 0
For j = 0 To iN1 - 1
sma1 = sma1 + glDATA(glNumData - j - 1) ' Рассчитываем значения SMA на предыдущем баре (предпоследнем) !!!!!!!!!!
Next
sma1 = sma1 / iN1
ema2 = glDATA(0)
KC2 = 2 / (iN2 + 1)
KE2 = 1 - KC2
For j = 1 To glNumData - 1
ema2 = KE2 * ema2 + KC2 * glDATA(j)
Next
' Расчет новой позиции -------------------------------------------------------------------------------------
Old_Pos = glS.MTS(id).Pos ' Сохраняем старую позицию
glS.MTS(id).Pos = Sgn(sma1 - ema2) ' Новая позиция по Индикатору
'glWB.Range("L7").Value = sma1
'glWB.Range("M7").Value = ema2
'glWB.Range("N7").Value = ""
End If

'Правила ----------------------------------------------------------------------------------------------------------
glS.MTS(id).Signal = 0
' Если текущая позиция отличается от предыдущей
If glS.MTS(id).Pos <> Old_Pos Then
glS.MTS(id).Signal = Sgn(glS.MTS(id).Pos - Old_Pos) ' Направление изменения позиции = сигнал
End If
' ----------------------------------------------------------------------------------------------------------
' Сигналы и Количество Бумаг
' ----------------------------------------------------------------------------------------------------------
' NewPos Signal Type Новое кол-во бумаг
' +1 +1 Buy MaxNum
' 0 +1 Buy 0
' 0 -1 Sell 0
' -1 -1 Sell MinNum
' ----------------------------------------------------------------------------------------------------------
If glS.MTS(id).Signal = 1 Then
' покупка
If glS.MTS(id).Pos = 1 Then
' лонг: новое состояние должно быть .maxNum
glS.MTS(id).Quantity = glS.MTS(id).maxNum - glS.MTS(id).curNum
ElseIf glS.MTS(id).Pos = 0 Then
' кэш: новое состояние должно быть 0
If glS.MTS(id).curNum < 0 Then
glS.MTS(id).Quantity = -glS.MTS(id).curNum
End If
End If
ElseIf glS.MTS(id).Signal = -1 Then
' продажа
If glS.MTS(id).Pos = -1 Then
' шорт: новое состояние должно быть .minNum
glS.MTS(id).Quantity = glS.MTS(id).curNum - glS.MTS(id).minNum
ElseIf glS.MTS(id).Pos = 0 Then
' кэш: новое состояние должно быть 0
If glS.MTS(id).curNum > 0 Then
glS.MTS(id).Quantity = glS.MTS(id).curNum
End If
End If
End If
' ----------------------------------------------------------------------------------------------------------
If glS.MTS(id).Quantity <= 0 Then glS.MTS(id).Signal = 0
' ----------------------------------------------------------------------------------------------------------

End Function

Private Sub mts_GetPrice(ByVal Data As String, ByVal Fields As String)
' Модуль разбора данных
' glDATA, glNumData - используются глобальные данные
Dim i As Integer, j As Integer
Dim Str As String, Field As String

i = 0
While Data <> ""
Str = mts_GetNextField(Data, vbNewLine)
j = 1
While Str <> ""
Field = mts_GetNextField(Str, "|")
If j = 5 Then
glDATA(i) = CDbl(Field)
End If
j = j + 1
Wend
If glDATA(i) <> 0 Then
i = i + 1
End If
Wend
glNumData = i - 1
End Sub

Function mts_GetNextField(ByRef Source As String, Optional Delimiter As String = "|") As String
' Модуль разбора строки данных
Dim EndField As Integer
EndField = InStr(Source, Delimiter)
If EndField > 0 Then
mts_GetNextField = Left(Source, EndField - 1)
Source = Mid(Source, EndField + Len(Delimiter), Len(Source))
Else
mts_GetNextField = Trim(Source)
Source = ""
End If
End Function

Private Function mts_Cross_MACD(ByVal id As Integer) As String
' Торговая система на пересечении MACD
' glS.MTS(id).Par(0) - fast EMA (параметр 1)
' glS.MTS(id).Par(1) - slow EMA (параметр 2)
' glS.MTS(id).Par(2) - EMA from MACD (параметр 3)
' Торговая система должна присвоить:
' glS.MTS(id).Pos = {1 если Long, -1 если Short, 0 - если cash}
' glS.MTS(id).Signal = {присвоить 1 если покупка, -1 если продажа, 0 - если нет операции}
' glS.MTS(id).Quantity - присвоить кол-во бумаг в сделке
' glS.MTS(id).PriceLast - присвоить последнюю цену
' glS.MTS(id).PriceSignal - присвоить цену в момент сделки

Dim Value As String
Dim iN1, iN2, iN3 As Integer
Dim ema1, ema2, ema3 As Double
Dim macd As Double

mts_Cross_MACD = "Ok"

' Определить длину истории в запросе!!!!!!!!!!!!!!
' 1. Чтение данных из Локальной базы АД -------------------------------------------------------------------
' В Альфа-Директ долженбыть открыт график Интсрумента соответствующего тайм-фрейма
' Определить длину истории в запросе!!!!!!!!!!!!!!
If glS.MTS(id).TF = 0 Then nDay = 4
If glS.MTS(id).TF = 1 Then nDay = 15
If glS.MTS(id).TF = 2 Then nDay = 30
If glS.MTS(id).TF = 3 Then nDay = 40
If glS.MTS(id).TF = 4 Then nDay = 80
If glS.MTS(id).TF = 5 Then nDay = 130
If glS.MTS(id).TF > 5 Or glS.MTS(id).TF < 0 Then
mts_Cross_MACD = "Ошибка: неверный тайм-фрейм"
Exit Function
End If

Value = glS.pAD.GetArchiveFinInfoFromDB(glS.MTS(id).Market, glS.MTS(id).PName, CInt(glS.MTS(id).TF), CDate(Now - nDay), CDate(Now) + 1)
' Проверка ошибки чтения данных из Локальной базы АД
If Value = "" Then
mts_Cross_MACD = "Ошибка " & glS.pAD.LastResultMsg
If glS.pAD.LastResultMsg = "" Then
mts_Cross_MACD = "Ошибка " & "Нет данных"
End If
Exit Function
End If
' Разбор запроса: записываем цены закрытия (5ая колонка) в переменную glDATA
mts_GetPrice Value, "datetime|float|float|float|float|int"
' 2. ------------------------------------------------------------------------------------------
glS.MTS(id).PriceLast = glDATA(glNumData)
glS.MTS(id).PriceSignal = glDATA(glNumData - 1)
' Расчет индикаторов --------------------------------------------------------------------------------------
iN1 = glS.MTS(id).Par(0) ' Fast EMA
iN2 = glS.MTS(id).Par(1) ' Slow EMA
iN3 = glS.MTS(id).Par(2) ' Slow EMA
If glNumData < 2 * iN1 Or glNumData < 2 * iN2 Then
mts_Cross_MACD = "Ошибка " & "Короткая история данных..."
Exit Function
End If
' Расчет индикаторов EMA iN1-------------------------------------------------------------------------------
' Рассчитываем значения EMA на предыдущем баре (предпоследнем) !!!!!!!!!!
ema1 = glDATA(0)
ema2 = glDATA(0)
ema3 = 0
KC1 = 2 / (iN1 + 1)
KE1 = 1 - KC1
KC2 = 2 / (iN2 + 1)
KE2 = 1 - KC2
KC3 = 2 / (iN3 + 1)
KE3 = 1 - KC3
' add glNumData - 1
For j = 1 To glNumData - 1
ema1 = KE1 * ema1 + KC1 * glDATA(j)
ema2 = KE2 * ema2 + KC2 * glDATA(j)
macd = ema1 - ema2
ema3 = KE3 * ema3 + KC3 * macd
Next
'glWB.Range("L7").Value = macd
'glWB.Range("M7").Value = ema3
'glWB.Range("N7").Value = ""
' Расчет новой позиции -------------------------------------------------------------------------------------
Old_Pos = glS.MTS(id).Pos ' Сохраняем старую позицию
glS.MTS(id).Pos = Sgn(macd - ema3) ' Новая позиция по Индикатору
'Правила ----------------------------------------------------------------------------------------------------------
glS.MTS(id).Signal = 0
' Если текущая позиция отличается от предыдущей
If glS.MTS(id).Pos <> Old_Pos Then
glS.MTS(id).Signal = Sgn(glS.MTS(id).Pos - Old_Pos) ' Направление изменения позиции = сигнал
End If
' ----------------------------------------------------------------------------------------------------------
' Сигналы и Количество Бумаг
' ----------------------------------------------------------------------------------------------------------
' NewPos Signal Type Новое кол-во бумаг
' +1 +1 Buy MaxNum
' 0 +1 Buy 0
' 0 -1 Sell 0
' -1 -1 Sell MinNum
' ----------------------------------------------------------------------------------------------------------
If glS.MTS(id).Signal = 1 Then
' покупка
If glS.MTS(id).Pos = 1 Then
' лонг: новое состояние должно быть .maxNum
glS.MTS(id).Quantity = glS.MTS(id).maxNum - glS.MTS(id).curNum
ElseIf glS.MTS(id).Pos = 0 Then
' кэш: новое состояние должно быть 0
If glS.MTS(id).curNum < 0 Then
glS.MTS(id).Quantity = -glS.MTS(id).curNum
End If
End If
ElseIf glS.MTS(id).Signal = -1 Then
' продажа
If glS.MTS(id).Pos = -1 Then
' шорт: новое состояние должно быть .minNum
glS.MTS(id).Quantity = glS.MTS(id).curNum - glS.MTS(id).minNum
ElseIf glS.MTS(id).Pos = 0 Then
' кэш: новое состояние должно быть 0
If glS.MTS(id).curNum > 0 Then
glS.MTS(id).Quantity = glS.MTS(id).curNum
End If
End If
End If
' ----------------------------------------------------------------------------------------------------------
If glS.MTS(id).Quantity <= 0 Then glS.MTS(id).Signal = 0
' ----------------------------------------------------------------------------------------------------------
End Function


Опции: Распечатать пост   Напомнить мне!   Оповестить модератора  
prohogij
Гость


Зарегистрирован: 19/01/2009
Сообщений: 5
Re: Пример робота в Ехел для Альфы [re: bsn]
      #326193 - 23/02/2011 20:03

Для тех,кто только начинает осваивать VBA из личного опыта советую:
в разделе Альфа Директа "Программное обеспечение" откройте "Возможные
способы взаимодействия с системой".Далее будут нужны 1-Экспорт в Excel и 2-Открытый интерфейс терминала. С 1 все очень просто, а для
2-го нужно почитать тоненькие брошюрки по VBA(они обычно страниц 900)
И после 2-3 дней игры с лежащим в 2 файлом Excel,появится куча идей
по созданию МТС,на реализацию которых уйдут долгие...
Для тех,кто бросил изучат VBA по просьбе bsn прикладываю файл на
торговлю 1 лотом, расчет проходит каждые 10 сек.
Удалил все ,что смог.(Хотя на мой взгляд в Альфовском роботе нет
ничего лишнего и даже кучи чего не хватает)
Файл создавался в 2003 Экселе (в других не проверял, но думаю будет работать).
Поддержку и разяснения не обещаю.
Все вопросы в этот форум.


Опции: Распечатать пост   Напомнить мне!   Оповестить модератора  
prohogij
Гость


Зарегистрирован: 19/01/2009
Сообщений: 5
Re: Пример робота в Ехел для Альфы [re: prohogij]
      #326194 - 23/02/2011 20:06 прикреплённые файлы (134 загрузок)

ДОСЫЛАЮ ФАЙЛ

Опции: Распечатать пост   Напомнить мне!   Оповестить модератора  
Страниц в ветке: 1



Дополнительная информация
0 зарегистрированных и 1 незарегистрированных пользователей просматривает форум.

Модератор:  michaelus, SGN, EVM, x4x, 000, Akelo, Socol, Ленивый, Ptem, Kadavr, podval, untoxa, VovaM, Asd, Igonter 

Распечатать тему

Доступ и ограничения:
      Вы не можете начать новую тему
      Вы не можете отвечать на тему
      HTML включён
      UBBCode включён

Рейтинг: **
Тема прочитана: 2818

Рейтинг темы

Перейти на

Send letter to Poul | Предупреждение Poul Trade Forum

Powered by UBB.threads™ 6.5.4

Generated in 0.019 seconds in which 0.005 seconds were spent on a total of 12 queries. Zlib compression enabled.