Страницы: 1 2 3 След.
RSS
Как в функции макроса сделать ссылки на ячейки с параметрами
 
Извиняюсь за дилетантский вопрос (я не очень разбираюсь в VBA) - Как в функции макроса сделать ссылку на ячейки с параметрами для макроса?

Сам пытался, но не получилось в строке:
Код
    uidSPX = TwsLink2.REGISTER_CONTRACT2("SPX", "OPT", "USD", "SMART", 20190510, "PUT", 2920, 100)

как сделать чтобы параметры: 20190510 - числовой, PUT - текстовый задавались из ячеек на неактивном листе (т.е. изменять можно было в ячейках, а не в макросе и чтобы лист с параметрами не обязательно был активным).
Например первый числовой параметр брать из ячейки A1=20190510, второй текстовый из B1=CALL как в приведённом файле примере.

Макрос файла такой:
Код
Private Sub btRunSample_Click()
    Dim ret As Long
    Dim uidSPX As Long
    Dim uidSPXOrder As Long
    Dim TwsLink2 As Object
        
    ' create twslink2 object
    Set TwsLink2 = CreateObject("TwsLink2.TwsLinkCom")
    ' connect to TWS at localhost and standardprot
    ret = TwsLink2.Connect("", 7496, 1, 20000)
    ' register SPX OPT contract
    uidSPX = TwsLink2.REGISTER_CONTRACT2("SPX", "OPT", "USD", "SMART", 20190510, "PUT", 2920, 100)
    ' place BUY BUY 1 order
    uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, 0.05, 0#, "GTC", 1, 0)
    ret = Disconnect
End Sub
 
Числовой параметр получилось сделать путём добавления строки:
Код
    Dim DT As Range
    Set DT = Range("A1")

Не получается добавить второй текстовый параметр из B1=CALL

Предполагаю нужно поменять тип Range ?
Изменено: SamIndy - 09.05.2019 16:01:31
 
Код
Private Sub btRunSample_Click()
    Dim ret As Long
    Dim uidSPX As Long
    Dim uidSPXOrder As Long
    Dim TwsLink2 As Object
    Dim DT As Range
    Set DT = Range("A1")
    Dim TP As Range
    Set TP = Range("B1")
        
    ' create twslink2 object
    Set TwsLink2 = CreateObject("TwsLink2.TwsLinkCom")
    ' connect to TWS at localhost and standardprot
    ret = TwsLink2.Connect("", 7496, 1, 20000)
    ' register SPX OPT contract
    uidSPX = TwsLink2.REGISTER_CONTRACT2("SPX", "OPT", "USD", "SMART", DT, "TP", 2920, 100)
    ' place BUY BUY 1 order
    uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, 0.05, 0#, "GTC", 1, 0)
    ret = Disconnect
End Sub

В чём ошибка текстового параметра?
Код
    Dim TP As Range
    Set TP = Range("B1")
 
Set -  присвоение переменной объекта. Но Вам объект не нужен, только его значение.
Код
Dim DT As Long
   DT = Range("A1").Value

Второй параметр так же, но переменную декларируем как строковую
Код
Dim TP As String
   TP = Range("B1").Value
 
vikttur, спасибо,получилось как вы написали.
 
Не знаю почему, не могу подобрать тип данных для переменной функции из вышеприведённого примера (ещё раз спасибо vikttur за помощь)

Оригинал:
Код
    ' place BUY BUY 1 order
    uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, 0.05, 0#, "GTC", 1, 0)

где пытаюсь вместо параметра 0.05 вставить переменную:
Код
    Dim PR As Double
    PR = Range("C1").Value

характеристики параметра 0.05: Type - double, Format - >=0 (на правтике параметр изменяется от 0.05 с шагом в 0.05 в большую сторону)

т.е в итоге
Код
    Dim PR As Double
    PR = Range("C1").Value
    ' place BUY BUY 1 order
    uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, PR, 0#, "GTC", 1, 0)

Читая справки единственным вариантом при котором хоть как-то получается ставить тип данных Long, но там нет десятичных частей он округляет до целого, например при параметре 0.45 тип данных Long ставит значение 0, а при 0.55 ставит значение 1.
Если ставить другие типы данных, то программа вообще не принимает данные.
Также пробовал через # и через принудительный тип литерала R - может как-то не правильно делал.

Если использовать оригинал (без переменной):
Код
    ' place BUY BUY 1 order
    uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, 0.05, 0#, "GTC", 1, 0)

то программа параметр указанный как 0.05, так и понимает/определяет как 0.05 (т.е. как и нужно) - это для исключения ошибки в функции, и понимания того что проблена именно в "параметре".

Кто имеет опыт в написании макросов подскажите в чём я делаю ошибку?  
 
А какое значение переменной PR с типом double в момент ошибки?
 
Юрий М, ошибки в микрософтском редакторе не выдаёт ни какой, программа не принимает значение 0.05 через переменную, а напрямую принимает, т.е через:
Код
' place BUY BUY 1 order    
uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, 0.05, 0#, "GTC", 1, 0)
даже если не указывать # или через принудительный тип литерала R.
Т.е. я предполагаю что неправильное написание именно через:
Код
Dim PR As Double
PR = Range("C1").Value
потому что другие переменные которые я добавлял нормально работают например:
Код
Dim OD As String
OD = Range("D1").Value
Dim SZ As Long
SZ = Range("E1").Value
Юрий М, или я неправильно понял суть вашего вопроса?
Изменено: SamIndy - 19.05.2019 11:36:43
 
Т.е. насколько я понимаю, если напрямую принимается 0.05 (без # и R), а через введённую мной переменную то же значение не принимается, то это, на мой взгляд, моё неправильное построение логики самого языка VBA для передачи значения в программу, а не не проблема понимания данных программы.
 
Пусть ошибки нет, но чему равно значение переменной? И как Вы определяете, что программа не принимает значение?
 
Значение переменной 0.05, а определяю когда в программе появляется ордер отправленный из экселя.

Например если при параметре PR 0.45 тип данных Long ставит значение 0, а при 0.55 ставит значение 1
Код
    Dim PR As Long
    PR = Range("C1").Value
    ' place BUY BUY 1 order
    uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, PR, 0#, "GTC", 1, 0)
Макрос хоть с ошибками, но отправит ордер, а если поставить Double, то он вообще не примет его.
 
Приложите файл-пример с исправленным, проблемным макросом, а то так можно долго гадать, что, да как там у Вас
Согласие есть продукт при полном непротивлении сторон
 
Цитата
SamIndy написал:
Значение переменной 0.05
Именно точка в качестве разделителя целой и дробной части?
 
Да, точка в качестве разделителя.
Привожу Файл-пример.
 
Цитата
SamIndy написал:
Да, точка в качестве разделителя
Как Вы проверяли? У меня запятая (и это правильно). Проверить Ваш макрос нет возможности: что такое TwsLink2.TwsLinkCom?
 
Из всех параметров из файла-примера не работает только:
Код
    Dim PR As Long
    PR = Range("R35").Value
т.е когда данные - не целое число, т.е например 0.05
 
TwsLink2.TwsLinkCom - это Com-мост экселя для программы Tws, т.е. две программы устанавливать нужно.

Цитата
Юрий М написал:
У меня запятая (и это правильно)
Я вас не понял как правильно?

Если напрямую отправлять как:
Код
    ' place BUY BUY 1 order
    uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, 0.05, 0#, "GTC", 1, 0)
то значение 0.05 указано без запятой (т.е. через точку)

Или нужно какой-то формат ячейки задавать?
 
Вы нет ответили - как проверили значение переменной?
Никакой формат задавать не нужно: в ячейке значение с запятой - и переменная будет с аналогичным разделителем. А уж VBA разберётся, что с ней делать.
Введите в ячейки А1 и А2 дробные значения и выполните пошагово этот простенький макрос. И посмотрите, какое значение принимают переменные.
Код
Sub qqq()
Dim x As Double, y As Double, z As Double
    x = Range("A1").Value
    y = Range("A2").Value
    Debug.Print x
    z = y + x
    MsgBox z
End Sub
 
Цитата
SamIndy написал: Из всех параметров из файла-примера не работает только:
Не увидел проблем с этой переменной. Может Ваша
Код
TwsLink2.PLACE_ORDER
в этом месте, в качестве аргумента что-то другое должна принимать?
Согласие есть продукт при полном непротивлении сторон
 
Пишу ответы
 
SamIndy, забудьте про TwsLink2.TwsLinkCom и набросайте пример, где с константой работает, а с переменной нет.
 
Для параметра PR спецификация (зелёным)

Function PLACE_ORDER

 

IN

Param #
 
Type
 
Name
 
Description
 
Format
 
Value Range
 
1
 
int
 
contract id
 
unique id of   order contract
 
>0
 
2
 
int
 
order id
 
0 for new   orders or unique id of order to be changed
 
>=0
 
3
 
string
 
action
 
action or side   of order
 
BUY SELL
 
4
 
string
 
ordertype
 
type of order ibot
 
5
 
int
 
size
 
size of order
 
> 0
 
6
 
 
double
 
 
limit price
 
 
limit price of order
 
 
>=0
 
 
7
 
double
 
aux. price
 
aux.-/stop-   price of order
 
>=0
 
8
 
string
 
tif
 
time in force   of order ibtif
 
9
 
int
 
transmit
 
possible   values are: -1=create only, 0=send to TWS, 1=send to IB. If you need to   provide more attributes by function SET_ORDER_VAL let this value -1 or 0.
 
10
 
int
 
uid parent order
 
0 for NO   parent, > 0 =unique id of parent order. This is used for attached or   bracket orders
 
>=0
Если напрямую ввести 0.05 (здесь именно точка стоит) то нормально посылает ордер:
Код
' place BUY BUY 1 order   
  uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, 0.05, 0#, "GTC", 1, 0)
т.е. не делать так (чтобы из ячейки можно было менять, а не напрямую в макросе, в чём и собственно смысл):
Код
    Dim PR As Double
    PR = Range("C1").Value
    ' place BUY BUY 1 order
    uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, PR, 0#, "GTC", 1, 0)
PR для того и делается чтобы из ячейки менять можно было.


Пишу далее ответы на остальные вопросы ...
 
Цитата
SamIndy написал: здесь именно точка стоит
Измените системный разделитель целой и дробной частей с запятой на точку
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Юрий М написал:
набросайте пример, где с константой работает, а с переменной нет
Вот так работает:
Код
Private Sub btRunSample_Click()    Dim ret As Long
    Dim uidSPX As Long
    Dim uidSPXOrder As Long
    Dim TwsLink2 As Object
         
    ' create twslink2 object
    Set TwsLink2 = CreateObject("TwsLink2.TwsLinkCom")
    ' connect to TWS at localhost and standardprot
    ret = TwsLink2.Connect("", 7496, 1, 20000)
    ' register SPX OPT contract
    uidSPX = TwsLink2.REGISTER_CONTRACT2("SPX", "OPT", "USD", "SMART", 20190510, "PUT", 2920, 100)
    ' place BUY BUY 1 order
    uidSPXOrder = TwsLink2.PLACE_ORDER(uidSPX, 0, "BUY", "LMT", 1, 0.05, 0#, "GTC", 1, 0)
    ret = Disconnect
End Sub
 
Пишу далее ...
 
Цитата
SamIndy написал:
Вот так работает:
Зачем нам эта спецификация в #22?
И зачем Вы в третий раз показываете, что вариант с константой работает? Мы и так это знаем.
Вы мой вариант из #18 попробовали? Каков результат?
Проверьте версию из #23.
 
Цитата
Юрий М написал:
вариант из #18
Как на изображении 1 макрос плюсует число с разделителем точка и число с разделителем запятая (но я вас всё равно не понял что вы хотели этим сказать)

Цитата
Sanja написал:
Измените системный разделитель целой и дробной частей с запятой на точку
На изображении 2 там видно что разделитель точка, а не запятая, как и в файле-примере из #14

Или вы имели ввиду что визуально отображается точка, а на самом деле разделитель запятая?
 
Посмотрите в настройках, какой символ у Вас используется в качестве разделителя.
 
Цитата
Юрий М написал:
какой символ у Вас используется в качестве разделителя.
Вроде точка стоит стандартно
 
А у меня запятая. И тоже стандартно ))
Страницы: 1 2 3 След.
Наверх