bsn
Гость
Зарегистрирован: 27/02/2010
Сообщений: 11
|
|
Помогите пожалуйста. Только начал осваивать 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
|
|
Для тех,кто только начинает осваивать VBA из личного опыта советую: в разделе Альфа Директа "Программное обеспечение" откройте "Возможные способы взаимодействия с системой".Далее будут нужны 1-Экспорт в Excel и 2-Открытый интерфейс терминала. С 1 все очень просто, а для 2-го нужно почитать тоненькие брошюрки по VBA(они обычно страниц 900) И после 2-3 дней игры с лежащим в 2 файлом Excel,появится куча идей по созданию МТС,на реализацию которых уйдут долгие... Для тех,кто бросил изучат VBA по просьбе bsn прикладываю файл на торговлю 1 лотом, расчет проходит каждые 10 сек. Удалил все ,что смог.(Хотя на мой взгляд в Альфовском роботе нет ничего лишнего и даже кучи чего не хватает) Файл создавался в 2003 Экселе (в других не проверял, но думаю будет работать). Поддержку и разяснения не обещаю. Все вопросы в этот форум.
|
prohogij
Гость
Зарегистрирован: 19/01/2009
Сообщений: 5
|
|
ДОСЫЛАЮ ФАЙЛ
|
|