Incidencia en Trading Machine

Foro genérico sobre programas relacionados con el trading: gráficos, ejecución de órdenes, automatización, etc.
arruinao
Mensajes: 735
Registrado: 26 Abr 2005 18:32

Incidencia en Trading Machine

Mensaje por arruinao »

Hola X-Trader,

Me ha surgido un problema en el funcionamiento de la TM y me pregunto si me podrías echar una mano. Resulta que la función "makeId()" da un error del tipo 6 (Desbordamiento) al intentar asignar valor a la variable "sec = (Date - 37000) * 1000000 + (Time * 1000000)". Este error lo da desde ayer, de tal modo que si cambio la fecha al día 5 no lo da pero, lógicamente, la TWS no ejecuta las órdenes por tratarse de una fecha anterior a la actual.

Parece como si el número que se genera en la linea "sec" estuviera fuera del rango que soporta el tipo de la variable que, como sabes, es del tipo "Long".

La pregunta va dirigida a X-Trader por ser el autor de la TM, pero cualquier aclaración al respecto será bien recibida.

S2
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12798
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

Prueba a cambiar:

Código: Seleccionar todo

Dim sec As Long
Por esto otro:

Código: Seleccionar todo

Dim sec As Double
Dime si con ello se soluciona el problema.

Un saludo
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12798
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

Ah se me olvidaba que debes hacer tambien este cambio:

Código: Seleccionar todo

Dim oldsec As Long
Por esto otro:

Código: Seleccionar todo

Dim oldsec As Double
Un saludo
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
arruinao
Mensajes: 735
Registrado: 26 Abr 2005 18:32

Mensaje por arruinao »

Hola de nuevo,

He probado lo que me has comentado y ahora me da el mismo error que cuando asigno tipo "Variant". El error lo genera al componer la orden y es el '1004'. Es que asigna un valor decimal a la variable "OrderId", es decir, algo así como "id2148781446,75926", y creo que tiene que ser un número entero.

Me refiero concretamente a la instrucción 'Range("E2").Value = server & "ord!" & OrderId & "?place?" & "SELL_"......'

Un saludo y gracias por la rapidez en la respuesta.
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12798
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

arruinao escribió:Hola de nuevo,

He probado lo que me has comentado y ahora me da el mismo error que cuando asigno tipo "Variant". El error lo genera al componer la orden y es el '1004'. Es que asigna un valor decimal a la variable "OrderId", es decir, algo así como "id2148781446,75926", y creo que tiene que ser un número entero.

Me refiero concretamente a la instrucción 'Range("E2").Value = server & "ord!" & OrderId & "?place?" & "SELL_"......'

Un saludo y gracias por la rapidez en la respuesta.
Te doy una solucion de andar por casa, aunque creo que en breve tendré que sacar una nueva versión de la hoja ya que se está quedando bastante desfasada.

Simplemente redondea la variable "sec" a cero decimales y después sumale 1 para evitar complicaciones del redondeo. Es decir, busca la siguiente linea:

Código: Seleccionar todo

sec = (Date - 37000) * 1000000 + (Time * 1000000)
y cambiala por esta:

Código: Seleccionar todo

sec = Round(((Date - 37000) * 1000000 + (Time * 1000000)),0) + 1 
Con esto por ahora deberías poder funcionar...

El problema parece ser que está en que los de IB han cambiado profundamente el funcionamiento de la hoja de cálculo, así que me toca ponerme las pilas ;-)

Un saludo
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."

arruinao
Mensajes: 735
Registrado: 26 Abr 2005 18:32

Mensaje por arruinao »

Hola X-Trader,

Me he bajado la última API, he probado la nueva función "makeId()" y da el mismo error 6 (Desbordamiento) que con la antigua. En concreto, salta en la línea "ongoingID = Round((datePart + timePart) * orderMult, 0)" que es la equivalente a la "sec" antigua.

Me comenta mi hijo que las variables tipo "Long" manejan un máximo de 2147483648 números enteros positivos, y la variable "sec" sobrepasa esta cifra (2149483648), lo que explicaría por qué funcionaba el día 5 de Marzo y ya no funciona hoy. Para solventar este problema he hecho un pequeño arreglo que compone las cifras de DATE y TIME de forma independiente para salvar el obstáculo del desbordamiento. Y lo salva, la macro se ejecuta correctamente, pero la orden no se lanza a la TWS.

Si descubro algo lo comento.

S2
arruinao
Mensajes: 735
Registrado: 26 Abr 2005 18:32

Mensaje por arruinao »

Hola de nuevo,

Por lo que he visto, los cambios introducidos en la función "makeId()" no son significativos y por eso producen el mismo errror 6 (Desbordamiento). El error se produce porque las variables ongoingID (en la nueva) y sec (en la antigua) son del tipo Long y, como ya he comentado, este tipo de datos no pueden sobrepasar la cifra de 2147483648. Efectivamente, este problema se puede solventar asignando tipo Double a estas variables y redondeando luego, tal y como has apuntado anteriormente, con la expresión sec = Round(((Date - 37000) * 1000000 + (Time * 1000000)),0). Ya no se produce desbordamiento y todas las macros se ejecutan correctamente, pero la TWS no lanza la orden.

En realidad, la función makeId entrega el mismo valor en ambos casos (tanto en la nueva como en la antigua), y no puede ser de otro modo porque esa Id lleva la información de fecha y hora en que se lanza la orden. La parte de la fecha son los 4 dígitos de mayor peso 2147, y la horaria el resto.

En cuanto a las modificaciones introducidas en la nueva API, por lo que he podido ver, cambian el nombre de las variables pero el proceso es idéntico al procesar esta función:

EN LA ANTIGUA:
Function makeId() As String

Dim sec As Long
sec = (Date - 37000) * 1000000 + (Time * 1000000)
' Esta expresión se podría simplificar y quedaría: sec = (((Date - 37000) + Time) * 1000000)
If sec > oldsec Then
offset = 0
oldsec = sec
Else
offset = offset + 1
End If
makeId = "id" & (sec + offset)
End Function
EN LA NUEVA:
Function makeId() As String
Dim newId As Long
If ongoingID = 0 Then
Dim datePart As Double, timePart As Double
datePart = Date - DAYS_PRIOR_TO_DDE_API
timePart = Time
ongoingID = Round((datePart + timePart) * orderMult, 0)
End If
newId = ongoingID + idsCreated
idsCreated = idsCreated + 1
makeId = util.IDENTIFIER_PREFIX & newId
End Function
En donde:
DAYS_PRIOR_TO_DDE_API = 37000
orderMult = 1000000
util.IDENTIFIER_PREFIX = "id"

Por lo tanto, las expresiones ongoingID y sec son idénticas al asignar valores a las variables. Por otro lado, la inclusión del Round tendría sentido si la variable ongoingID fuera del tipo Double, pero como sigue siendo Long no necesita redondeo, y por eso se produce el error 6 (Desbordamiento).

Es decir, parece que el problema ahora está en la TWS que no es capaz de realizar la operación inversa (conversión de número a fecha-hora). Y es que sin esta función, tal y como comentaste en tu primera TM, no se pueden enviar órdenes válidas a la TWS via DDE.

S2

P.D. No sé si he conseguido expresarme con suficiente claridad.
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12798
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

Muy claro, arruinao... Houston tenemos un problema!!! Creo que tengo que actualizar la Trading Machine lo antes posible...

Un saludo
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12798
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

Una posible solución que he visto por el Foro de IB:
The problem occurs inside DDE makeId() function, the final number generated for order id exceeds maximum limit.

Workaround:

Inside makeId() function, there are two prominent constant variables use for calculating a random number:

Código: Seleccionar todo

Const orderMult = 1000000 
AYS_PRIOR_TO_DDE_API = 37000 
You need to decrease these values so that it will not go beyond the maximum limit. Unfortunately, once you decrease these values, it is inevitable you will experience duplicate order id when placing an order. You can reset the order id to avoid duplication which is stored within TWS.XML file. If you do not know the process, just create a new JTS or IBJTS setting folder, enable DDE client within workstation. Then try again.

Otra posible solución:
Open TWSdde.xls
Tools/Macro/VisualBasicEditor
Open an existing Module (anyone)
Edition/Search : "DAYS_PRIOR_TO_DDE_API" and choose in "Project"
Then change 37000 to 39000
A ver si lo resolvemos pero parece que ni de coña somos los unicos:

http://www.interactivebrokers.com/cgi-b ... 40893.html

Un saludo
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12798
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

Lo que acabo de comentar es para la nueva hoja de IB, en la X-Trader Trading Machine hay que cambiar lo que está en rojo:
Function makeId() As String
' Con esta función generamos una Id nueva y creciente para cada orden que enviemos a la TWS
' Sin esta función es imposible generar órdenes válidas
Dim sec As Long
sec = (Date - 37000) * 1000000 + (Time * 1000000)

If sec > oldsec Then
offset = 0
oldsec = sec
Else
offset = offset + 1
End If

makeId = "id" & (sec + offset)
End Function
Después hay que resetear el id de la TWS haciendo lo siguiente:
Try doing the following:

First determine what your unique settings folder location is for this account you can do this by:
1. Log into the TWS account you are connecting this API to
2. Select a blank row on the TWS trading screen, make sure you click in the Exchange column
3. Press the following keys Ctrl+Alt+U

This will bring up a pop-up window with your settings folder for this account, navigate to this folder and look for a file called TWS.xml. Open this file in a text editor and search for the following lines
<mapofstrings>
<string> 189839 </string>
</mapofstrings>

If you wish to reset your order id to start at a number less than the last used ID you can replace the number encased by <string> </string> tags with 0.

<mapofstrings>
<string> 0 </string>
</mapofstrings>
Un saludo
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
arruinao
Mensajes: 735
Registrado: 26 Abr 2005 18:32

Mensaje por arruinao »

Efectivamente X-Trader, la clave está en modificar el ficheroTWS.xml

S2
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12798
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

Otra contestación que he encontrado por ahi:
The issue was linked with the orderID calculated derived on the
current date. You need to do 2 things.

1. Reduce the constant variable orderMult = 1000000 down to 100000 in
Twsdde.xls.

2. The TWS.xml file has to be modified. This will eliminate duplicate
orderID occurrence. Please look at the instruction below.

The last used order ID is stored within the TWS.xml file located
within the settings folder for your account login.

Try doing the following:

First determine what your unique settings folder location is for this
account you can do this by:
1. Log into the TWS account you are connecting this API to
2. Select a blank row on the TWS trading screen, make sure you click
in the Exchange column
3. Press the following keys Ctrl+Alt+U

This will bring up a pop-up window with your settings folder for this
account, navigate to this folder and look for a file called TWS.xml*.
Open this file in a text editor and search for the following lines
"mapofstrings"
"string" 189839 "string"
"mapofstrings"

If you wish to reset your order id to start at a number less than the
last used ID you can replace the number encased by "string" "string"
tags with 0.

"mapofstrings"
"string" 0 "string"
"mapofstrings"

NOTE: *you need to edit tws.xml, not tws.day.xml
Vamos, que está más que claro de donde venía el problema 8)

Un saludo
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
arruinao
Mensajes: 735
Registrado: 26 Abr 2005 18:32

Mensaje por arruinao »

Buenas,

Lo esencial es editar el fichero TWS.xml. Una vez hecho ésto resulta indiferente que modifiques 37000 ó 1000000, o incluso ambas a la vez. El error de Overflow lo producía Excel al no poder procesar números superiores al rango soportado. Salvado este obstáculo, era el fichero mencionado (TWS.xml) el que impedía lanzar la orden porque al decrementar cualquiera de estos dos números, la nueva Id era menor que la última almacenada. En el log se reflejaba perfectamente la incidencia: 14:36:38:969 JTS-Dde Monitor-9: [-1:11:5:0:0:0:0:ERR] OrderId {214860885} is <= 2147350637.

Muchas gracias, X-Trader, por estar siempre al "quite".

S2
anscari70
Mensajes: 18
Registrado: 06 Dic 2007 19:55
Ubicación: Caldes

Para X-Trader....

Mensaje por anscari70 »

Para X-Trader:

Hola X-Trader, antes de nada felicitaros por la estupenda página web que habéis creado entre todos. Soy bastante novato en el mundo del tranding, aunque hace ya bastante tiempo que estoy en periodo de simulaciones. Buscando por los foros, encontré una estupenda herramienta llamada "X-Trader Machine 2" en formato EXCEL para trabajar directamente con la TWS. Yo tengo una cuenta de simulación y estoy intentando simular con la TM para poder ver como funciona, pero me aparece el mismo mensaje "Error 6" que le aparecía a Arruinao. Leyendo vuestro post, he probado de modificar el fichero TWS.xml pero no consigo encontrar las líneas

<mapofstrings>
<string> 189839 </string>
</mapofstrings>

La versión descargada desde IB para las conexiones API es la última (v9.41) y parece que estas lineas no están. Agradecería que me orientases sobre cómo poder enviar órdenes a mi cuenta simulador desde la TM.

Muchas gracias por adelantado.
arruinao
Mensajes: 735
Registrado: 26 Abr 2005 18:32

Mensaje por arruinao »

Hola anscari70, tienes que poner a "0" la linea <string>189839</string>. Es decir, cambia "189839" por "0".

Ya te contesté el privado con todos los pasos.

S2

P.D. El número "189839" no tiene por qué coincidir. Es más, no coincide porque está relacionado con fecha y hora de lanzamiento de orden. En el privado está explicado.
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Software”