ProRealCode - Trading & Coding with ProRealTime™
Hola,
Lo primero saludar a toda la gente ya que este es mi 1º post y creo que no sera el último ya que me estoy iniciando en la creación de mi primer sistema de trading, y lo segundo dar las gracias a cualquier persona que me lea y me responda.
Bueno, estoy intentando crear un sistema escalonado de stops, ya que por ejemplo cuando el precio alcance +10 puntos de beneficio, el stop se ponga ya automáticamente a +2 y el siguiente paso, si el precio alcance los +15 el stop se mueva a +5, etc..y ya alcanzado por ejemplo +20, que haya un tralling stop de 10 en 10 puntos o un seguimiento de porcentaje en 30%
He estado buscando y leyendo algo al respecto y encontre este hilo https://www.prorealcode.com/blog/trading/complete-trailing-stop-code-function/ y me puse manos al lio, pero siempre el stop se coloca a +10 y cuando va a corto ni me coloca el los stops, me podeis ayudar?
//trailing stop function
trailingstart = 10 //trailing will start @trailinstart points profit
trailingstep = 10 //trailing step to move the "stoploss"
//reset the stoploss value
IF NOT ONMARKET THEN
newSL=0
ENDIF
//manage long positions
IF LONGONMARKET THEN
//+10 a +2
IF newSL=0 AND close-tradeprice(1)>=trailingstart THEN
newSL = tradeprice(1)+2
ENDIF
//+15 a +5
IF newSL=tradeprice(1)+2 AND tradeprice(1)+15 THEN
newSL = tradeprice(1)+5
ENDIF
//+20 a +10
IF newSL=tradeprice(1)+5 AND tradeprice(1)+20 THEN
newSL = tradeprice(1)+10
ENDIF
//+20 a seguimiento de tralling 10p
IF newSL=tradeprice(1)+10 AND tradeprice(1)+20 THEN
newSL = tradeprice(1)+trailingstep
ENDIF
ENDIF
//manage short positions
IF SHORTONMARKET THEN
//+10 a +2
IF newSL=0 AND tradeprice(1)-close>=trailingstart THEN
newSL = tradeprice(1)-2
ENDIF
//+10 a +5
IF newSL=tradeprice(1)-2 AND tradeprice(1)-10 THEN
newSL = tradeprice(1)-5
ENDIF
//+20 a +10
IF newSL=tradeprice(1)-5 AND tradeprice(1)-20 THEN
newSL = tradeprice(1)-10
ENDIF
//+20 a seguimiento de tralling 10p
IF newSL=tradeprice(1)-10 AND tradeprice(1)-20 THEN
newSL = tradeprice(1)-trailingstep
ENDIF
ENDIF
//stop order to exit the positions
IF newSL>0 THEN
SELL AT newSL STOP
EXITSHORT AT newSL STOP
ENDIF
Gracias y un saludo
Hola moha85,
Bienvenido a Prorealcode. A continuación pongo un trailing que yo utilizo y que te permite como quieres tener muchos pasos de trailing. Ejemplo: Si estas en LARGO y el precio sube, al cierre de la vela captura el máximo valor y en relación a ese valor te pone un STOP. A medida que el precio sube va subiendo el STOP, pero ya nunca vuelve atrás.
Para poder personalizarlo, tienes que poner tus cantidades en pips/points en startbreakeven, que serán los valores del precio donde quieres que a partir de ahi, se empiecen a poner los STOP (pointstokeep).
Este código es una simple modificación de uno que he ido cogiendo de la librería de PRC. Cuando te familiarices con la programación, podrás modificarlo como quieras. El código, como puedes ver es para largos y cortos. Los puntos de trailing (startbreakeven y pointstokeep) son los mismos para las dos direcciones.
Espero que te sirva. Si tienes alguna duda, no tengas problema en volver a preguntar.
Saludos,
// TRAILING //////////////////////////////////////////////////////////////////////////////////////////////////////////
startBreakeven1 =2
startBreakeven2 =4
startBreakeven3 =6
startBreakeven4 =8
startBreakeven5 =10
startBreakeven6 =12
startBreakeven7 =14
startBreakeven8 =16
startBreakeven9 =18
startBreakeven10 =20
startBreakeven11 =22
startBreakeven12 =24
startBreakeven13 =26
startBreakeven14 =28
startBreakeven15 =30
startBreakeven16 =32
startBreakeven17 =34
startBreakeven18 =36
startBreakeven19 =38
startBreakeven20 =40
//////////////////////
PointsToKeep1 =2
PointsToKeep2 =3
PointsToKeep3 =4
PointsToKeep4 =6
PointsToKeep5 =7
PointsTokeep6 =8
PointsToKeep7 =8
PointsToKeep8 =8
PointsToKeep9 =10
PointsTokeep10 =10
PointsToKeep11 =10
PointsToKeep12 =10
PointsToKeep13 =12
PointsToKeep14 =12
PointsToKeep15 =12
PointsTokeep16 =12
PointsToKeep17 =14
PointsToKeep18 =14
PointsToKeep19 =14
PointsTokeep20 =14
//reset the breakevenLevel when no trade are on market
IF NOT ONMARKET THEN
breakevenLevel=0
maxprice=0
minprice=close
ENDIF
// LARGOS
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven1*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep1*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven2*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep2*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven3*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep3*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven4*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep4*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven5*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep5*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven6*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep6*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven7*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep7*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven8*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep8*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven9*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep9*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven10*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep10*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven11*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep11*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven12*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep12*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven13*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep13*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven14*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep14*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven15*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep15*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven16*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep16*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven17*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep17*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven18*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep18*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven19*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep19*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET THEN
maxprice=max(maxprice,close)
IF maxprice-tradeprice(1)>=startBreakeven20*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = maxprice-PointsToKeep20*pipsize
ENDIF
ENDIF
// CORTOS
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven1*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep1*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven2*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep2*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven3*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep3*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven4*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep4*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven5*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep5*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven6*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep6*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven7*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep7*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven8*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep8*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven9*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep9*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven10*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep10*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven11*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep11*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven12*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep12*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven13*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep13*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven14*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep14*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven15*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep15*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven16*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep16*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven17*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep17*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven18*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep18*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven19*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep19*pipsize
ENDIF
ENDIF
// test if the price have moved favourably of "startBreakeven" points already
IF SHORTONMARKET THEN
minprice=min(minprice,close)
IF tradeprice(1)-minprice>=startBreakeven20*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = minprice+PointsToKeep20*pipsize
ENDIF
ENDIF
//place the new stop orders on market at breakevenLevel
IF breakevenLevel>0 THEN
SELL AT breakevenLevel STOP
EXITSHORT AT breakevenLevel STOP
ENDIF
Muchisimas gracias de verdad Juan Salas,
Solo he usa 6 startBreakeven y PointsToKeep, pero no se si realmente está haciendo bien lo que yo le he determinado, hay alguna manera visualizar ese seguimiento a través de un graph?
Tambien me gustaria que pasado el starbreakeven6, este realice un trallingstop del 70%, pero imagino que esto sera ya otra función diferente, como sería esto?
Otra cosilla que estoy buscando pero todavía no la he encontrado, podría usar esta función de breakeven pero determinado pasados X periodos desde la entrada del trade?
Perdon por tantas preguntas, pero llevando tan solo 5 dias metido en el mundillo, me abrumo con tanta información en el foro
De nuevo gracias por todo 🙂
Un saludo
No sabría como verlo a través de la función graph en un backtest. En mi opinion, aunque rudimentaria, la mejor forma de visualizarlo es ponerlo en demo y ver como va moviéndose el stop loss a medida que avanza el precio.
Si solo utilizas 6 pasos, puedes borrar o descomentar el resto. En cuanto a lo que me comentas del trailing, no sabría ahora mismo como hacerlo.
En cuanto a que el breakeven entre después de x periodos, puedes probar lo siguiente:
//place the new stop orders on market at breakevenLevel
IF barindex-tradeindex(1)>=10 AND breakevenLevel>0 THEN
SELL AT breakevenLevel STOP
EXITSHORT AT breakevenLevel STOP
ENDIF
No lo he probado, pero sería algo parecido. Puedes cambiar el 10, por el numero de periodos que prefieras.
Saludos
Gracias de verdad,
Por lo que veo esa función está escrita para que entre el breakevenlevel1 a los 10 periodos, pero imagino que tendria que ponerlo también para el resto de breakeven,no? o ya solo con este afecta a los demás?
Lo de visualizar el movimiento del breakeven, en el codigo de mi primer post, utiliza la función graph enlazado a newSL y si que funcionaba, ahora en este caso, no se como enlazarlo 🙁
Lo de cubrir el 70% de ganancias después del breakeven6 ( es el ultimo que tengo puesto), quizás se podría reconducir esta función a un trallingstop que contenga esta función…
Un saludo y de nuevo mil gracias!!
El breakevenlevel afecta a todos los niveles. Como puedes ver en cada escalón de precio el valor del STOP es breakevenlevel, así que no hay breakevenlevel1, 2, etc.
En cuanto al graph, en vez de NewSL, ahora deberías poner “graph breakevenlevel”
En cuanto a mantener el 70% de ganancia, puedes calcularlo de esta manera:
si el startbreakeven8 (ejemplo) =100, el correspondiente pointstokeep8 sería=30. Dado que lo que hace el código es que una vez alcanza los 100 pips, pone el STOP LOSS a 100-30= 70pips en positivo desde el precio de compra. No tienes que hacerlo desde el principio. Los primeros pasos puedes poner los valores que creas, y a partir de un escalón determinado, podrías mantener la proporcionalidad del 70% en todos los pasos siguientes.
Ayuda para crear estrategia de stops
This topic contains 5 replies,
has 2 voices, and was last updated by Juan Salas
6 years, 1 month ago.
| Forum: | ProOrder: Trading Automático y Backtesting |
| Language: | Spanish |
| Started: | 12/11/2019 |
| 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.