Crear backtest en 2 marcos temporales
Forums › ProRealTime foro Español › Soporte ProOrder › Crear backtest en 2 marcos temporales
- This topic has 8 replies, 2 voices, and was last updated 1 year ago by robertogozzi.
-
-
04/28/2023 at 5:37 PM #213829
Buenas tardes y gracias por la ayuda de antemano.
Estoy intentando hacer un backtest que cumpla condiciones en los 2 marcos temporales (semanal y diario).
Basicamente lo que quiero es que cuando en el diario, la media 20 y 40 sean inferior a la media de 200, si el precio toca la media de 200, compre cuando cruce a la baja la media de 200 el precio.
A su vez en el semanal, el precio de la vela semanal, debe de estar por debajo de la media 20 semanal.
Este es el codigo:
12345678910111213141516171819202122232425262728293031323334353637383940//Definir variablesTIMEFRAME(weekly)mS20 = average[20](close)CondicionSemanal=close<mS20TIMEFRAME(default)avgv5 = average[5](volume)avgv20 = average[20](volume)avgv50 = average[50](volume)avgv100 = average[100](volume)avgv200 = average[200](volume)m200 = average[200](close)m1 = average[1](high)m20 = average[20](close)m40 = average[20](close)VolumenK=300minimoVolumen = avgv5>VolumenK*1000 and avgv20>VolumenK*1000 and avgv50>VolumenK*1000 and avgv100>VolumenK*1000 and avgv200>VolumenK*1000//Condiciones a cumplirCondicionPrecioVol=close>1 and open>1 and minimoVolumenCondicionMedias=m200>m20 and m200>m40if CondicionPrecioVol and CondicionMedias thenCondicionCortos=m1 crosses under m200endif//Condiciones take profitCondicionCompraCortos=m1 crosses under m40 and CondicionSemanal// Condiciones de entrada de posiciones cortasIF NOT ShortOnMarket AND CondicionCortos THENSELLSHORT 1000 share AT MARKETENDIF// Condiciones de salida de posiciones cortasIF ShortOnMarket AND CondicionCompraCortos THENEXITSHORT AT MARKETENDIF// Stops y targets: introduzca aquí sus stops de protección y targets de beneficiosY en la imagen, como vemos, compra cuando cumple la parte diaria, no las 2 a la vez.
Y quiero que cumpla las 2 a la vez, como hace pocos dias.
04/30/2023 at 11:50 AM #213882Reemplace la línea 31 con esto:
1IF NOT ShortOnMarket AND CondicionCortos AND CondicionSemanal THEN1 user thanked author for this post.
04/30/2023 at 6:22 PM #213908Vaya! Cierto, se me escapo!
Ahora al código de antes, quiero añadir un bucle FOR, que es el que usare para tener los máximos relevantes crecientes (te lo marco en la imagen).
Que es para mi el máximo relevante?: es aquel máximo que es su high es mayor que los 3 de su derecha y los 3 de su izquierda (de ahí el bucle for).
Una vez tenga identificados los máximos relevantes, quiero que sean crecientes por debajo de la media de 200 (serian los que te marco en la imagen).
Ese bucle FOR, si lo pongo en un proscreener si me funciona (sustituyo barindex por 0) pero al ponerlo en backtest, imagino que el 0 lo deberé sustituir por barindex, pero no me funciona.
Muchas Gracias por la ayuda de antes y con esto!
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364//Definir variablesTIMEFRAME(weekly)mS20 = average[20](close)CondicionSemanal=close<mS20TIMEFRAME(default)avgv5 = average[5](volume)avgv20 = average[20](volume)avgv50 = average[50](volume)avgv100 = average[100](volume)avgv200 = average[200](volume)m200 = average[200](close)m1 = average[1](high)m20 = average[20](close)m40 = average[40](close)VolumenK=300minimoVolumen = avgv5>VolumenK*1000 and avgv20>VolumenK*1000 and avgv50>VolumenK*1000 and avgv100>VolumenK*1000 and avgv200>VolumenK*1000CondicionMaxCrecientesDebajoM200=0c1M200=0c2M200=0max1=0max2=0for maxi=barindex to barindex+251if maxi>=3 thenmaxRel=(high[maxi]>=high[maxi-3]) AND (high[maxi]>=high[maxi-2]) AND (high[maxi]>=high[maxi-1]) AND (high[maxi]>=high[maxi+1]) AND (high[maxi]>=high[maxi+2]) AND (high[maxi]>=high[maxi+3])if maxRel thenif max1=0 thenmax1=high[maxi]c1M200=high[maxi]<m200elsif max2=0 thenmax2=high[maxi]c2M200=high[maxi]<m200breakendifendifendifnextif (max1>max2 and c1M200 and c2M200) thenCondicionMaxCrecientesDebajoM200=1endif//Condiciones a cumplirCondicionPrecioVol=close>1 and open>1 and minimoVolumen and CondicionMaxCrecientesDebajoM200CondicionMedias=m200>m20 and m200>m40if CondicionPrecioVol and CondicionMedias thenCondicionCortos=m1 crosses under m200endif//Condiciones take profitCondicionCompraCortos=m1 crosses under m40// Condiciones de entrada de posiciones cortasIF NOT ShortOnMarket AND CondicionCortos AND CondicionSemanal THENSELLSHORT 1000 share AT MARKETENDIF// Condiciones de salida de posiciones cortasIF ShortOnMarket AND CondicionCompraCortos THENEXITSHORT AT MARKETENDIF// Stops y targets: introduzca aquí sus stops de protección y targets de beneficios05/01/2023 at 3:05 PM #213932No está muy claro lo que quieres hacer.
¿Puedes explicar mejor cuáles son las condiciones para entrar en una operación?05/01/2023 at 4:51 PM #213939No se como usar el bucle FOR, en un proscreener si, pero en backtest no.
En el proscreener le suelo poner de 0 a 251. En el backtest como seria? BarIndex?Las condiciones que quiero hacer es:
Quiero detectar que las medias de 20 y 40 esten por debajo de la media de 200.
Antes de que el precio cruce la media de 200, quiero que tenga 2 maximos relevantes crecientes (lo que te marco con las flechas rojas).
Una vez, el precio cruza la media de 200, en el momento que la cruza hacia abajo es cuando buscaria la compra.En la imagen, las flechas rosas, es un indicador que me cree para detectar los maximos relevantes (que los 3 maximos a su izquierda sean menor y que los 3 maximos de su derecha tambien).
Te añado el codigo del indicador por si sirve.Te adjuntare el codigo proscreener que uso.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283//maximo mimino relevante.m20 = average[20]centro=3maximo = high[centro]minimo = low [centro]maxrelevante= 1minrelevante= 1//vela verde max y roja inhalacionrangoCuerpoME2=close[centro]-open[centro]rangoCuerpoE2=open[2]-close[2]cumpleE2Inhalacion=rangoCuerpoME2>0 and rangoCuerpoE2>0rcE2=0if (close[2] < close[centro] and cumpleE2Inhalacion) thenrcE2=1endif//vela verde y roja max y inhalacionrangoCuerpoME2=close[centro+1]-open[centro+1]rangoCuerpoE2=open[centro]-close[centro]cumpleE2Inhalacion=rangoCuerpoME2>0 and rangoCuerpoE2>0rcE2a=0if (rcE2=0 and close[centro]<close[centro+1] and cumpleE2Inhalacion) thenrcE2a=1endif//vela roja min y verde inhalacionrangoCuerpoME4=open[centro]-close[centro]rangoCuerpoE4=close[2]-open[2]cumpleE4Inhalacion=rangoCuerpoME4>0 and rangoCuerpoE4>0rcE4=0if (close[2] > close[centro] and cumpleE4Inhalacion) thenrcE4=1endif//vela roja y verde min y inhalacionrangoCuerpoME4=open[centro+1]-close[centro+1]rangoCuerpoE4=close[centro]-open[centro]cumpleE4Inhalacion=rangoCuerpoME4>0 and rangoCuerpoE4>0rcE4a=0if (rcE4=0 and close[centro]>close[centro+1] and cumpleE4Inhalacion) thenrcE4a=1endiffor i=0 to centro*2if i<>centro thenif low[i] < minimo thenminrelevante=0endifif high[i] > maximo thenmaxrelevante=0endifendifnextIF minrelevante=1 THEnDRAWARROWUP (barindex-centro,minimo-(minimo*0.01)) coloured(231, 155, 208)m20bajista=(m20[centro]-m20)>0if rcE4 and m20bajista then//DRAWELLIPSE(barindex-centro-1, low[centro]-(low[centro]*0.01), barindex-1, high[centro-1]+(high[centro-1]*0.01)) coloured(102, 178, 255)endifif rcE4a and m20bajista then//DRAWELLIPSE(barindex-centro-2, high[centro+1]+(high[centro+1]*0.01), barindex-centro+1, low[centro]-(low[centro]*0.01)) coloured(102, 178, 255)endifENDIFIF maxrelevante=1 THEnm20alcista=(m20-m20[centro])>0DRAWARROWDOWN (barindex-centro,maximo+(maximo*0.01)) coloured(231, 155, 208)if rcE2 and m20alcista then//DRAWELLIPSE(barindex-centro-1, maximo+(maximo*0.01), barindex-1, low[2]-(low[2]*0.01)) coloured(231, 155, 208)endifif rcE2a and m20alcista then//DRAWELLIPSE(barindex-centro-2, low[centro]-(low[centro]*0.01), barindex-centro+1, high[centro]+(high[centro]*0.01)) coloured(231, 155, 208)endif//if (open[2] > close[centro]) and (range[2] > range[centro]*0.5) then//DRAWARROWDOWN (barindex-2,maximo+(maximo*0.01)) coloured(255, 255, 255)//endifENDIFreturn12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697patron=0TIMEFRAME(daily)avgv5 = average[5](volume)avgv20 = average[20](volume)avgv50 = average[50](volume)avgv100 = average[100](volume)avgv200 = average[200](volume)minimoVolumen = avgv5>VolumenK*1000 and avgv20>VolumenK*1000 and avgv50>VolumenK*1000 and avgv100>VolumenK*1000 and avgv200>VolumenK*1000TIMEFRAME(weekly)if close>1 and open>1 and minimoVolumen thenmin1=0min2=0for mini=0 to 251if mini>=3 thenEsMini=(low[mini]<=low[mini-3]) AND (low[mini]<=low[mini-2]) AND (low[mini]<=low[mini-1]) AND (low[mini]<=low[mini+1]) AND (low[mini]<=low[mini+2]) AND (low[mini]<=low[mini+3])if EsMini thenif min1=0 thenmin1=low[mini]elsif min2=0 thenmin2=low[mini]breakendifendifendifnextif min1<min2 thendistanciaRentabilidad=((close-min1)/close)*100if distanciaRentabilidad>rentabilidad thenpatron=1endifendifendifif patron thenpatron=0TIMEFRAME(daily)m200 = average[200](close)if close<m200 thenc1M200=0c2M200=0c3M200=0max1=0max2=0for maxi=0 to 251if maxi>=3 thenmaxRel=(high[maxi]>=high[maxi-3]) AND (high[maxi]>=high[maxi-2]) AND (high[maxi]>=high[maxi-1]) AND (high[maxi]>=high[maxi+1]) AND (high[maxi]>=high[maxi+2]) AND (high[maxi]>=high[maxi+3])if maxRel thenif max1=0 thenmax1=high[maxi]c1M200=high[maxi]<m200elsif max2=0 thenmax2=high[maxi]c2M200=high[maxi]<m200breakendifendifendifnextmin1t=0min2t=0for minit=0 to 251if minit >=3 thenEsMinit = (low[minit]<=low[minit-3]) AND (low[minit]<=low[minit-2]) AND (low[minit]<=low[minit-1]) AND (low[minit]<=low[minit+1]) AND (low[minit]<=low[minit+2]) AND (low[minit]<=low[minit+3])if EsMinit thenif min1t=0 thenmin1t=low[minit]c3M200=low[minit]<m200elsif min2t=0 thenmin2t=low[minit]breakendifendifendifnextif (max1>max2 and c1M200 and c2M200 and min1t>min1t and c3M200) or (close>max1 and close>max2 and c1M200 and c2M200 and c3M200) thenmaximo=0minimo=9999for i=0 to 3if maximo<high[i] thenmaximo=high[i]endifif minimo>low[i] thenminimo=low[i]endifnextif m200>minimo and m200<maximo thenpatron=1endifendifendifendifscreener[patron]05/02/2023 at 10:44 AM #213970He solucionado lo del bucle for.
Como podria poner el stop?
En la imagen, la flecha roja seria la vela que quiero que haga de estop, en verde te marco la entrada en cortos.
Para indicar la flecha roja, le digo que cuando haga la compra, coja el maximo de las ultimas 10 velas (highest[10](close), pero como ves en la imagen, no hace caso y se “compra” al dia siguiente.
Como le puedo indicar que quiero el maximo del precio que estaba por encima de la m200?
Muchas gracias!
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071TIMEFRAME(default)avgv5 = average[5](volume)avgv20 = average[20](volume)avgv50 = average[50](volume)avgv100 = average[100](volume)avgv200 = average[200](volume)m200 = average[200](close)m1 = average[1](high)m20 = average[20](close)m40 = average[40](close)// Condicion de minimo volumenVolumenK=300minimoVolumen = avgv5>VolumenK*1000 and avgv20>VolumenK*1000 and avgv50>VolumenK*1000 and avgv100>VolumenK*1000 and avgv200>VolumenK*1000// Condicion de tener maximos crecientes o etapa 2CondicionMaxCrecientesDebajoM200=0c1M200=0c2M200=0max1=0max2=0for maxi=0 to 251if maxi>=3 thenmaxRel=(high[maxi]>=high[maxi-3]) AND (high[maxi]>=high[maxi-2]) AND (high[maxi]>=high[maxi-1]) AND (high[maxi]>=high[maxi+1]) AND (high[maxi]>=high[maxi+2]) AND (high[maxi]>=high[maxi+3])if maxRel thenif max1=0 thenmax1=high[maxi]c1M200=high[maxi]<m200elsif max2=0 thenmax2=high[maxi]c2M200=high[maxi]<m200breakendifendifendifnextif ((max1>max2 or (close>max1 and close>max2)) and c1M200 and c2M200 ) thenCondicionMaxCrecientesDebajoM200=1endif//Condiciones de que la m200 este por encima de la m20 y m40CondicionMedias=m200>m20 and m200>m40// Condicion para comprarCondicionCortosCondicionesMinimas=close>1 and open>1 and minimoVolumen and CondicionMaxCrecientesDebajoM200 and CondicionMediasif CondicionCortosCondicionesMinimas thenif m1 crosses under m200 thenCondicionCortos=m1 crosses under m200// Ponemos el stoplossStoploss=highest[10](close)endifendif//Condiciones take profitCondicionCompraCortos=max2// Condiciones de entrada de posiciones cortasIF NOT ShortOnMarket AND CondicionCortos THENSELLSHORT 1000 share AT MARKETENDIF// Condiciones de salida de posiciones cortasIF ShortOnMarket AND close>Stoploss THENEXITSHORT AT MARKETENDIF// Stops y targets: introduzca aquí sus stops de protección y targets de beneficios05/02/2023 at 11:03 AM #213973No puedo entender muy bien lo que hace tu código, si no me escribes tus condiciones no puedo ayudarte.
05/03/2023 at 7:52 AM #214023No importa, lo he conseguido hacer funcionar. Empiezo a entender que es muy parecido al proscreener.
Una ultima duda, en el backtest, cuando tengo puesto que compre o venda, lo hace en la vela siguiente, como puedo hacer que sea cuando toque el precio? Y no esperar a que se ejecute en la siguiente vela?
Y muchas gracias por todo.
05/03/2023 at 8:46 AM #214032Debe usar órdenes pendientes (STOP o LIMIT) para colocar órdenes a un precio exacto.
Pero necesita saber cuándo colocar una orden pendiente por adelantado, lo cual, en la mayoría de los casos, no es posible. En este escenario, debe usar varios marcos de tiempo, el que usa actualmente y uno más pequeño que reacciona rápidamente cuando se detecta una señal. -
AuthorPosts
Find exclusive trading pro-tools on