ProRealCode - Trading & Coding with ProRealTime™
Hola quo, vamos a ver si aquí, más tranquilos (menos “ojos”) y sin que se nos trabe la lengua por el idioma, logramos aclarar de una vez las ideas.
Voy a ir separando por pasos, según tenga tiempo, el ejemplo1 del otro foro para dilucidar si y dónde me pierdo yo solico, que dirían tus vecinos de arriba, o si y dónde tú me escondes el mapa para que yo me pierda. Un poco en plan “Estrategia para torpes”. Nos va a llevar más tiempo pero “chi va piano va sicuro e va lontano”. No, esto no es otro dicho murciano.
Paso 1. Figura Paso_1. Compra y primer stop
Describo cómo transcurre el proceso:
(H es high, L es low y C es close. H(1) es high de barra 1, etc.).
H(1) es un máximo histórico. Como H(a) < H(1) y L(a) < L(barra anterior; 1 en este caso) el código establece, al cierre de a, como precio stop de compra H(1)=0.19.
H(2) > H(1). El sistema abre posición en su correcto precio y momento, día y hora (es una orden stop enviada al broker, ya no depende de cuando se ejecuta el código). El código establece, al cierre de 2, L(b)=0.11 como precio stop de venta.
Caso problema 1: L(2) < L(b). Es el caso tratado en el ejemplo-2 del foro anterior, donde tus comentarios son totalmente pertinentes. Dos posibles subcasos:
Vale la pena complicarse tanto? Esto es bolsa, no una ciencia exacta y al final todo se compensa y tanto vale una cosa como la otra. Mi propuesta es incluir siempre la barra del máximo derecho al calcular el mínimo entre máximos consecutivos.
Por tanto al final de dic 1990 estamos comprados en 0.19 y tenemos como precio de salida 0.11. Estamos de acuerdo?
Saludos
Aqui otra vez,
b) 🙂 silly me!
c) pensé que la solución a esta cuestión sería quitar el signo “=” de la línea 31. Estaré equivocado. No hay problema con que el broker no lo entienda, las señales las traslado al mercado manualmente.
2) Genial, haré otra versión sustituyendo las lineas que comentas por las propuestas. Si quieres continuamos con la original.
gracias
Hola,
c) No, el problema no está en la línea 31.
No se trata de que el bróker lo entienda sino de que acepte o rechace la orden stop (manual o automática) a ese precio calculado, porque cada acción tiene un cambio mínimo posible en su cotización: un céntimo, cinco céntimos, etc. Por ejemplo, caso real de hace unos días en mi sistema, el cambio mínimo de CPLA es 5 céntimos de dólar. Si el máximo histórico fuera, digamos, 90.25 e intentara poner una orden de compra stop a 90.251 (90.25+0.001), mi bróker (Interactive Brokers) la rechazaría. Para que funcionara tendría que usar 90.30 ( o sea buyPrice+0.05 en el código). Por eso, preferí permitir abrir posición al precio exacto del máximo histórico, aunque en algún caso raro como el que me presentas (qué puntería!!), el high del precio toque el máximo y se dé la vuelta sin llegar a hacer la ruptura o breakout.
Quedan pendientes un par de temas. Los iré mirando, sin prisa pero sin pausa. Si considero que son de algún interés general, los comentaría en el foro en inglés; si son, como temo, un problema de falta de entendimiento (todavía!), aunque sea de detalles, de tu estrategia, se aclararían en este hilo.
Salud y paciencia.
Saludos sabatinos, de vuelta al tajo.
Teniendo a la vista el gráfico EBAY.png, dos cuestiones relativas a los 2 puntos pendientes de la estrategia:
Punto 3.- Change 2000 cash into shares following this formula: Number of shares will be (Equity line*0,6%)/(Entryprice-Stopprice) and if the result multipied by the price of the stock is less than 1000 don´t buy. Equityline is 50.000 when we start and later what i have in the equity line or equity curve (the result of add to 50.000 previous trades).
Con el actual código v.3.1 entramos en la barra 2 a 12.31 (máximo de barra 1) y a posteriori, al cierre de la barra, actualizamos el stop desde un valor inicial de 0.21 a 3.70 (mínimo de barra b). Entiendo que, ahora, al calcular número de acciones a comprar habrá que utilizar ya el mínimo de la barra b como StopPrice y no 0.21, con el consiguiente cambio en la forma de ir actualizando el stop. Es así?
Punto a.- Sometimes there is a low<low[1] but the stop is not risen. It is because in the same candle we got a high>high[1]. Examples Citigroup (feb1993), Sabadell (may2016), ENGI(jan2008), ESRX (may2015).
Esto es un poco embarazoso después de tantísimos posts en todos los idiomas pero, desde el primer momento, he supuesto que debía haber “aire” a izquierda y derecha de un máximo, como en la barra 1, para que disparara los eventos de compra o actualización de stop. Digamos que tu primer gráfico-ejemplo de VISA y mi previa idea de esta bien conocida estrategia de ruptura de máximos me empujaban a ello.
Para ir dejando aclarado el tema, más vale tarde que nunca, en el gráfico de eBay, ¿debemos comprar en la barra 0 (cero) al precio del máximo de la barra -1 con stop en el mínimo de barra -1 (confieso que no me acaba de gustar, pero es tu idea de la estrategia la que cuenta) o esto sólo se aplica al movimiento de stops cuando estamos comprados y no al momento de la compra?
Vale. Ya estamos cerca.
Buenos días,
Punto 3) Es asi, en la compra de la barra 2 tenemos en cuenta el stop de la barra b para el calculo de acciones a comprar.
Quiero hacer un comentario. Comentas “entramos en la barra 2 y a posteriori, al cierre de la barra actualizamos el stop” Decir que manualmente,el stop lo pongo en el mismo momento de la compra, no a posteriori ni al cierre de la barra. Lo digo porque si la barra 2 bajara lo suficiente como para ir mas abajo de la barra b, el sistema no te sacaría porque como no ha llegado el cierre no se ha actualizado el stop. Entiendo que lo haces al cierre de la barra porque no queda otra a la hora de programar y creeme que es suficiente y perfectamente válido porque, como ves, los stops son muy amplios y es muy improbable que lo que te digo aqui pase asi que este matiz es para que lo sepas pero está bien tal y como está.
Punto a) no acabo de entender a lo que te refieres con “aire” pero efectivamente en el ejemplo que pones tenemos una compra que no se produce con la versión actual porque el dia que hace máximos tambien hace mínimos (esto yo lo resuelvo yendo a la grafica semanal a ver qué se produce antes si el máximo o el mínimo pero aqui no podemos). Voy a ponerte como lo hago pero no quiero liarte. Si la barra -1 abre, hace el mínimo (ya tengo min<min) y luego hace máximo, compro en esa misma barra. Si la barra -1 abre hace máximo y luego hace el mínimo, la compra se produce en la siguiente vela cuando se produzca el máximo (porque cuando hizo máximo en la barra -1 no teníamos min<min y por tanto no podimos comprar).
Dicho esto. Por no poder saber qué va antes en la barra si el máximo o el mínimo en PRT (por lo menos en esta versión, tengo entendido que en futuras, sí sera posible), consideremos que la compra siempre es a la vela siguiente como tu propones en el ejemplo (estamos suponiendo que en la vela anterior el máximo se produce antes que el mínimo y si eso es así en semanal dará la misma compra entiendo). Por tanto es correcto lo que dices. Se compra en la barra 0 en el máximo de la -1 poniendo el stop en el mínimo de la misma barra -1. (he tenido que ir a mi grafico para observar que minbarra-1<minbarra-2).
Por último, el razonamiento es el mismo para comprar que para subir el stop, de hecho, cada vez que uno que esté dentro sube el stop, uno que esté fuera puede comprar.
Una opción que aumenta el riesgo pero también la rentabilidad es cada vez que se produce una nueva ruptura, además de subir el stop se vuelve a comprar otra posición más. Algo que tambien me gustaria testear y que supongo que habría que hacer con Defparam Cumulate orders=true
gracias, como bien dices, estamos cerca…y es que no hay nada como la lengua vernácula.
Hola,
la nueva versión v.04 recogiendo todos los cambios está terminada (a expensas del punto tratado en el siguiente párrafo), y pendiente de probar exhaustivamente a la caza de algún gazapo, bastante probable, especialmente a la vista del galimatías que me ha supuesto programar el punto (a). Si no se complica ni la prueba ni mi tiempo disponible, confío en que sea un asunto de unos pocos días.
Mientras tanto, una duda me ha surgido sobre un punto que no se ha comentado: admitir o no una actualización de stop hacia abajo, una posibilidad real usando un exit filter mayor que 0. Parece claro que el primer stop, usado en el cálculo de acciones a comprar, no se puede modificar a la baja, para no incurrir en posibles pérdidas superiores al riesgo permitido por posición abierta (50000*0.6/100 = 300), pero y el resto?
Saludos
Disculpa no pude logarme en todo el fin de semana, me daba error y he tenido que restaurar la contraseña.
Efectivamente, no habíamos hablado de ello pero puede darse el caso que el stop vaya a la baja. En ese caso, que no es muy frecuente, estaría asumiendo un riesgo superior al tenido inicialmente. Quizá no es muy correcto, lo sé, pero asi es como lo hago, reduzco riesgo en la siguiente entrada de otro valor puesto que tengo en cuenta el riesgo total de toda mi cartera. Que no te importe/afecte a efectos de programación. El tema de la gestión del dinero es secundario para mi programarlo en PRT. Es mas importante el resto, punto a) etc.
gracias
Buen día,
he aquí la versión v.04, la penúltima!?, de la estrategia, recién salida de cocina (no ha resultado precisamente una sopa al cuarto de hora).
Como los cambios que se han ido incorporando, respetando la estructura lógica del código inicial, lo habían convertido bastante en lo que en el argot se conoce como código-spaghetti, difícil de entender y depurar, decidí reescribirlo desde cero, aprovechando que ya tenía la idea completa de las necesidades del sistema y también mi mayor dominio de esta plataforma de programación. El resultado es un código bastante diferente, más corto y más claro, y hasta donde lo he probado parece funcionar como debería.
Para cualquier aclaración, ya sabes dónde estamos, aunque no estemos siempre. Saludos.
// TS name: Historical Maximum Breakout
// Description: Buy at pivot highs breakouts.
// Sell at relative minimums (or lows) between the
// breakout of a pivot high and that pivot high
// A pivot high is confirmed by a correction in the low
// of the bar(s) after a new historical maximum
// Instruments: Stocks/ETFs
// Time frame: Daily / Weekly / Monthly (preferred)
// Features: Only long system. Risk and money management
// Version: 04.1
// ****************************************************************************//
REM customizable and optional parameters
once initialCapital= 50000 // initial capital
once exitFilter = 3 // % below relative minimum to exit
once risk = 0.6 // % equity risk
once minimalCashSize = 1000 // minimal cash position size
once upForBreakeven = 10 // % above entry price to move stop to breakeven
once gainAtBreakeven = 1 // % marginal profit at breakeven
//
REM variables declaration
once historicalMax = 0 // pivot high
once currentMax = 0 // current maximum candidate to pivot high
once exitPrice = 0 // sell stop price
once buyPrice = 0 // buy stop price
once currentMin = 0 // current minimum candidate to sell stop
once breakevenStop = 0 // breakeven stop
once barLow = 0 // stores low of certain bars
once equity = 0 // current equity
once positionSize = 0 // number of shares to buy
once cashSize = 0 // cash investment
//
REM special treatment for 2 first loaded bars
if barIndex = 0 then
currentMax = high
currentMin = low
endif
if barIndex = 1 then
if high > currentMax then
currentMax = high
endif
if low < currentMin then
currentMin = low
exitPrice = low * (1 - exitFilter/100)
historicalMax = currentMax
buyPrice = historicalMax
endif
endif
//
REM normal coding body
if barIndex > 1 then
currentMin = min(low, currentMin)
if not onmarket then
exitPrice = currentMin * (1 - exitFilter/100)
endif
if high > currentMax then
barLow = 0 // reset barLow
currentMax = high
if low < low[1] then
currentMin = low
exitPrice = currentMin * (1 - exitFilter/100)
endif
endif
if low < low[1] and currentMax > historicalMax then
historicalMax = currentMax
if barLow > 0 then
currentMin = min(low, barLow)
else
currentMin = low
endif
if not onmarket then
exitPrice = currentMin * (1 - exitFilter/100)
endif
buyPrice = historicalMax
endif
if high < high[1] and currentMax > historicalMax then
barLow = low
endif
if high > historicalMax then
exitPrice = currentMin * (1 - exitFilter/100)
endif
endif
// cleaning
if not onmarket then
breakevenStop = 0 // reset breakEvenStop
endif
//
REM money and risk management
equity = initialCapital + STRATEGYPROFIT
// calculate breakeven stop price
if onmarket and upForBreakeven > 0 then
if high >= tradeprice * (1 + upForBreakeven/100) then
breakevenStop = tradeprice * (1 + gainAtBreakeven/100)
endif
endif
// calculate number of shares and cash size
positionSize = ROUND((equity * risk/100) / (buyPrice - exitPrice))
cashSize = positionSize * buyPrice
//
REM set buy and sell stop orders
if not onmarket and positionSize > 0 and cashSize >= minimalCashSize then
buy positionSize shares at buyPrice + 0.001 stop
endif
if onmarket and exitPrice > 0 then
exitPrice = max(breakevenStop, exitPrice)
sell at exitPrice stop
endif
//*****************************************************************
//graph currentmin
//graph historicalmax
//graph buyPrice
//graph exitprice
Ayayayayay, Tikitaka, gracias por el enorme esfuerzo lo primero pero creo que por arreglar el punto a), es decir alguna salida errónea que ocurria de vez en cuando (tenia que coincidir que hacia minimo la misma barra que hacia maximo para que no actualizara el stop y no ocurria muchas veces), hemos estropeado la entrada. Ahora siempre entra tarde. Si superpones el anterior código con el nuevo lo ves. A modo de ejemplo pongo el gráfico de citi que te decía que en feb93 no salia correctamente. Ahora sale donde debe, como ves, pero no entra bien y el problema de entrar tarde ocurre siempre en cada entrada de cada valor.
Es probable que el tema de la gestion del dinero te haya llevado a reprogramarlo todo de nuevo y por eso dan fallo todas las entradas. Antes de que me mandes a paseo con razón te propongo, si te parece, que si puedes arreglar el punto a) con el anterior código perfecto, y si no no pasa nada lo dejamos asi. Perderíamos la gestión del dinero pero como siempre te he dicho, es un tema menor que si no lo tengo no importa, no quiero que por ello te vuelvas loco y tampoco que cuando lo teníamos ya casi vayamos para atrás.
Verás, yo antes salvo el punto a) estaba y estoy encantado porque arreglaste el problema c) añadiendo 0,001 y el problema 2) dándome unas lineas para sustituir por otras, lo que me permitía tener dos versiones, asegurando entrada y sin asegurarla. Ahora al cambiar todo el código no sé que lineas cambiar por otras para tener estas dos versiones y lo mas importante, la entrada falla siempre y todo por una gestión del dinero que te ha hecho cambiar todo desde el principio. No quiero que eso lo estropee todo por lo que, si te parece, si no puedes arreglar el punto a) en el código antiguo comprando 2000 eur, lo dejamos terminado como está, quedando en todo caso y si quieres, (entiendo que esto no te llevaría mucho tiempo) la versión bajista.
Tengo que hablar con Nicolás para que te meta en plantilla, no he visto nada igual en el foro y tenemos la suerte de que eres español. Después de esto el agradecimiento no se puede quedar solo en palabras, son muchas horas ayudando las que metes.
Espero si lo lees ahora no haberte dado la noche.
Gracias de verdad
// TS name: Historical Maximum Breakout
// Description: Buy at pivot highs breakouts.
// Sell at relative minimums (or lows) between the
// breakout of a pivot high and that pivot high
// A pivot high is confirmed by a correction in the low
// of the bar(s) after a new historical maximum
// Instruments: Stocks/ETFs
// Time frame: Daily / Weekly / Monthly (preferred)
// Features: Only long system. Risk and money management
// Version: 04.2
// ****************************************************************************//
REM customizable and optional parameters
once initialCapital= 50000 // initial capital
once exitFilter = 3 // % below relative minimum to exit
once risk = 0.6 // % equity risk
once minimalCashSize = 1000 // minimal cash position size
once upForBreakeven = 10 // % above entry price to move stop to breakeven
once gainAtBreakeven = 1 // % marginal profit at breakeven
//
REM variables declaration
once historicalMax = 0 // pivot high
once currentMax = 0 // current maximum candidate to pivot high
once exitPrice = 0 // sell stop price
once buyPrice = 0 // buy stop price
once currentMin = 0 // current minimum candidate to sell stop
once breakevenStop = 0 // breakeven stop
once barLow = 0 // stores low of certain bars
once equity = 0 // current equity
once positionSize = 0 // number of shares to buy
once cashSize = 0 // cash investment
//
REM special treatment for 2 first loaded bars
if barIndex = 0 then
currentMax = high
currentMin = low
endif
if barIndex = 1 then
if high > currentMax then
currentMax = high
endif
if low < currentMin then
currentMin = low
exitPrice = low * (1 - exitFilter/100)
historicalMax = currentMax
buyPrice = historicalMax
endif
endif
//
REM normal coding body
if barIndex > 1 then
currentMin = min(low, currentMin)
if not onmarket then
exitPrice = currentMin * (1 - exitFilter/100)
endif
if high > currentMax then
barLow = 0 // reset barLow
currentMax = high
// bullish engulfing bar
if low < low[1] and close > open then
currentMin = low
exitPrice = currentMin * (1 - exitFilter/100)
endif
endif
if low < low[1] and currentMax > historicalMax then
historicalMax = currentMax
if barLow > 0 then
currentMin = min(low, barLow)
else
currentMin = low
endif
if not onmarket then
exitPrice = currentMin * (1 - exitFilter/100)
endif
buyPrice = historicalMax
endif
if high < high[1] and currentMax > historicalMax then
barLow = low
endif
if high > historicalMax then
exitPrice = currentMin * (1 - exitFilter/100)
endif
endif
// cleaning
if not onmarket then
breakevenStop = 0 // reset breakEvenStop
endif
//
REM money and risk management
equity = initialCapital + STRATEGYPROFIT
// calculate breakeven stop price
if onmarket and upForBreakeven > 0 then
if high >= tradeprice * (1 + upForBreakeven/100) then
breakevenStop = tradeprice * (1 + gainAtBreakeven/100)
endif
endif
// calculate number of shares and cash size
positionSize = ROUND((equity * risk/100) / (buyPrice - exitPrice))
cashSize = positionSize * buyPrice
//
REM set buy and sell stop orders
if not onmarket and positionSize > 0 and cashSize >= minimalCashSize then
buy positionSize shares at buyPrice + 0.001 stop
endif
if onmarket and exitPrice > 0 then
exitPrice = max(breakevenStop, exitPrice)
sell at exitPrice stop
endif
//*****************************************************************
//graph currentmin
//graph historicalmax
//graph buyPrice
//graph exitprice
Aclaraciones sobre una estrategia propuesta por quo en el forum en inglés
This topic contains 21 replies,
has 2 voices, and was last updated by quo
9 years, 1 month ago.
| Forum: | Soporte ProOrder |
| Language: | Spanish |
| Started: | 10/29/2016 |
| Status: | Active |
| Attachments: | No files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.