Regístrate o inicia sesión para ver el curso gratuito.

Gestión del capital: Cálculo automático del apalancamiento en EasyLanguage

Luismi
Luismi 164 puntos
editado 16 de enero en Plataformas

Buenas


Una consulta para los que ya estais operando.


¿Como haceis la gestion de capital? Me refiero al numero de contratos a operar por activo, lo tenéis definido de una manera fija, es decir entro con 1 contrato o 2 o los que sean siempre o lo tenéis programado en el tradestation.


Es que yo me he puesto, y me encuentro con que si quiero decirle que calcule los puntos de stop que tengo en una operacion, en la operativa lo calcula justo cuando entra, pero para saberlo una vela antes no me vale esa parte del codigo, y tendria que complicarlo bastatnte me da a mi.

Por eso antes de liarme con algo que no se si va por el buen camino, me gustaria me dijeseis como lo estais haciendo.


Y si hay que programarlo unas pequeñas nociones de como no estaría mal tampoco😅

Comentarios

  • luis
    luis 349 puntos
    editado 14 de enero

    Hola @Luismi ,

    Cuando vamos a tomar una operación, sabemos que nuestro precio de entrada es X y de stop es Y.

    Supongamos que entro al precio de 500 y pongo mi stop en 450. Sé que mi stop son 50 puntos.

    Si tengo 50 puntos de stop y al comprar una acción, por ejemplo, el punto vale 1€, si quiero arriesgar 25e tendré que meter media acción.

    Matemáticamente con los datos que maneja el algoritmo es fácil:

    Stop_en_puntos * Valor_punto * Tamaño_posición = Valor_de_stop_buscado
    

    Si mi incógnita es Tamaño_posición, despejo y me queda:

    Tamaño_posición = Valor_de_stop_buscado / (Stop_en_puntos * Valor_punto)
    

    ¿Y si me da decimales? Redondeo al apalancamiento mínimo.

    Por ejemplo, si no puedo operar fracciones, redondeo a la unidad. Si me diese un tamaño de 1.2, compraría una sola acción. Si me diese 1.6, compraría dos.

    Si busco un stop de 200€ por operación, va a ser difícil que todas arriesguen 200€. Unas arriesgarán 180 y otras 220€.

    Cuanto mayor sea tu cuenta, menor será esta diferencia por lo que como las comisiones, es un problema para cuentas pequeñas pero no para cuentas grandes.

    Un saludo!

  • Luismi
    Luismi 164 puntos

    Si, ese calculo ya le se,el problema me le encuentro a la hora de programarlo, cuando calculo un stop( y el profit en consecuencia) empiezo por una sentencia if marketposition=1 entonces segun el precio de entrada calculo el stop.

    por ejemplo:

    // SALIDA SETUP INTENCION ALCISTA ++++

    if marketposition=1 and RIA=10 then begin
    
    if Barssinceentry=0  then mistop= giro1a;

    Puntos_Stop_Ea= Entryprice - mistop ;

    miprofit = (Puntos_Stop_Ea * ratio) + entryprice;

    sell ("Stop_Int_Alcista") nc contracts next bar at mistop stop ;

    SEll ("Take_Int_Alcista") nc contracts next bar at miprofit limit;

    Entonces para calcular la variable nc que son el numero de contratos , tengo que saber el stop antes de que entre al mercado, en la vela de antes.

    Entonces como en los setups en todos tengo como stop miStop y como profit miProfit, no puedo usar esas variables que seria un calculo de una vez para todos los setups, porque cada setup pude tener puntos de stop diferentes, y tendre que programarlos uno a uno, por eso era mi pregunta , no sea que despues de liarme a hacer todo eso, alla un metodo mas sencillo o ni siquiera esteis utilizando esta gestion y lo esteis usando a mano

    No se si me explicado muy bien, si no repreguntar😎

  • Luismi
    Luismi 164 puntos

    Me respondo parcialmente , he resuleto el codigo para el caso que he puesto anteriormente del setup intencionalcista y seria algo asi

    PUNTO = Bigpointvalue ;
    
    if SetUpIntencionAlcista=10 then begin
    	puntosstop= Absvalue(close-giro1a);

    riesgo= puntosstop*punto ;

    end;

    nc= floor(iff (SetUpIntencionAlcista=10 ,Riesgo_por_operacion/riesgo,1));

    if SetUpIntencionAlcista=10 then Buy( "Intencion_alcista") nc Shares next bar at close limit ;

    if SetUpIntencionAlcista=10 then RIA= 10;// para representacion

    Donde SetupIntencionAlcista es cuando cumple las condiciones de entrada, he probado con round, y me quita los decimales pero si pasa de 0.5 te coge un contrato de mas (redondea el numero pero no el calculo) , es decir si te da nc = 4,6 te coge 5, y poniendo floor no te coge ningun decimal es decir si te da 2.8 te coge 2

    Por favor decirme si es asi , para seguir implantandolo en todos los setups y si hay otra forma mas sencilla soy todo oidos

    Gracias

  • luis
    luis 349 puntos

    Aclaro un concepto: Generamos la señal en una vela y es al cierre de esta cuando, si se cumplen las condiciones, ponemos las órdenes para que se tomen en la siguiente vela.

    Quizás esto simplifique mucho todo lo que estás haciendo. :)

  • Luismi
    Luismi 164 puntos

    No se si me estas corrigiendo o confirmando😁

    Yo calculo en SetupIntencionAlcista que es cuando se dan las condiciones al cierre de esta para entrar(a la siguiente vela) y ahi calculo el stop. Pero hasta ahora (que sigue igual no lo he cambiado) la orden de stop la calculo justo cuando entra que es la vela siguiente,

    con marketposition=1 y Entryprice, cosas que solo se dan una vez entra y que creo viene bien hacer asi, para diferenciar las entradas de cada setup

    No se si con la aclaracion del concepto me estas queriendo decir otra cosa(como si se puede hacer mas sencillo y con menos complicaciones)

  • luis
    luis 349 puntos
    editado 14 de enero

    Quiero decir: cuando generamos una señal con una gestión (incluido su precio de stop y demás) estos se mantienen hasta que la operación se tome o se descarte.

    Para poner un stop diferente tiene que descartarse la señal y generarse una nueva.

    En una misma señal solo hay un punto de stop posible, pase lo que pase.

    No estoy del todo seguro si estamos hablando de lo mismo.

  • Luismi
    Luismi 164 puntos

    No acabo de entenderte

    Voy a poner un ejemplo en pseudocodigo

    en la vela1 se me da señal de entrada por setup1

    al cierre de la vela1 se manda una orden de compra Buy( "setup1") nc Contract next bar at close limit ;

    en la siguiente vela que ya ha entrado a mercado se mandan las ordenes stop y profit usando algo asi:

        if marketposition=1 and RIA=10 then begin
    
    	if Barssinceentry=0  then mistop= giro1a;

    Puntos_Stop_Ea= Entryprice - mistop ;

    miprofit = (Puntos_Stop_Ea * ratio) + entryprice;

    sell ("Stop_Int_Alcista") nc contracts next bar at mistop stop ;

    SEll ("Take_Int_Alcista") nc contracts next bar at miprofit limit;

    cunado van pasando cosas ,como que salga un volumen de parada o pasen x velas, pongo una orden de sell a breakeven

    Que me estas queriendo decir , que cuando pongo esa orden por ejemplo de breakeven tengo que anular la de stop anterior?

    Si es asi, ¿como se hace?, porque he visto en la ayuda con cancelorder o algo asi, pero empezamos con las clases de easylenguaje y no se si sabre hacerlo

  • luis
    luis 349 puntos
    editado 15 de enero

    Todo se manda en la misma vela. No mandas una entrada y el stop en la siguiente. Pones todo en la misma: orden limit asociada con stop y take. Si una se cancela las cancelas todas.

    Sí, cuando mueves un stop tienes que modificar la orden.

    Al cierre de la vela haces simplemente

    sell ("B_S1") next bar at precio_stop;
    sell ("B_S2") next bar at precio:limit;
    

    Si antes B_S1 estaba en X y ahora le pones Y, el stop se mueve a Y.

    Las decisiones se toman a vela cerrada en nuestro sistema, por tanto, siempre modificaremos al cierre de la vela con efecto en la siguiente.

  • Luismi
    Luismi 164 puntos
    editado 15 de enero

    Como se pone esas ordenes , es como programar una bracketorder, ponme un ejemplo si las pongo todas seguidas no me las coje, asi

    if SetUpIntencionAlcista=10 then begin
    
    	puntosstop= Absvalue(close-giro1a);

    riesgo= puntosstop*punto ;

    mistop= giro1a;

    miprofit = (puntosstop * ratio)+ close;

    nc= floor(iff (SetUpIntencionAlcista=10 ,Riesgo_por_operacion/riesgo,1));


    Buy( "Intencion_alcista") nc Contract next bar at close limit ;

    sell ("Stop_Int_Alcista") nc contracts next bar at mistop stop ;

    SEll ("Take_Int_Alcista") nc contracts next bar at miprofit limit;

    como se pone para que se asocie la entrada con las de salida

    y despues de eso , cuando quiera cambiar el stop como se cambia la orden, sin hacer una orden nueva, o si hago una orden nueva como cancelo la anterior(que como va asociada al profit tambien habria que volver a poner supongo)

    Lo que yo veo por la ayuda del tradestation es complejo y no creo que vallan por ahoi los tiros . Clases y cosas asi

    Por cierto en la caja de herramientas hay muchas funciones ,pero no he usado nada ,ni se como se usa, no se si esto ayuda o es para otras cosas

    El caso es que como yo lo tenia hecho funcionaba😅, pero bueno depuraremos el codigo

    asi tampoco me funciona

          Buy( "Intencion_alcista") nc Contract next bar at close limit 	;
    
    	sell from entry("Intencion_alcista") nc contracts next bar at mistop stop ;

    SEll from entry("Intencion_alcista") nc contracts next bar at miprofit limit;

  • luis
    luis 349 puntos

    Te va a simplificar mucho: Haz como hago yo, crea un indicador que muestre las líneas de take, stop y entrada y las vaya moviendo visualizando en todo momento la entrada, dónde está cada orden y si estamos o no con una operación activa.

    Cuando tengas esto será mucho más fácil porque tendrás en todo momento controlada la posición que quieres tener.

    Lo siguiente es simplemente esto, pero vamos por pasos.

  • Luismi
    Luismi 164 puntos
    editado 15 de enero

    Pones todo en la misma: orden limit asociada con stop y take. Si una se cancela las cancelas todas.

    Como haces esto,lo de asociar las ordenes a la entrada, que me da que no es como lo estoy haciendo yo

  • luis
    luis 349 puntos
    editado 15 de enero

    No, me he explicado mal.

    En TradeStation no se guardan las órdenes en el servidor del broker sino en tu propia plataforma.

    Entonces eres tú el responsable de mantenerlas y de moverlas. Si cierras la plataforma o apagas el algoritmo sin cerrar la operación se queda ahí desprotegida.

    Primero dibuja las líneas como te digo para tener controlados los valores.

    Y después tan solo mantén actualizadas las órdenes.

    Ejemplo

    Vela 1: pongo stop en x

    sell ("B_S1") next bar at precio_stop;
    

    Vela 2: Stop sigue en X

    sell ("B_S1") next bar at precio_stop;
    

    Vela 3, stop se mueve a Y. precio_stop ahora vale Y.

    sell ("B_S1") next bar at precio_stop;
    

    El precio de la orden stop se movió a Y.

    Si se ha cerrado la posición, dejas de poner las órdenes y listo, ya no existen.

    Lo primero

    Vuelvo a lo mismo:

    Dibuja primero la posición y cuando lo tengas entonces piensas en esto.

    Así podrás depurar lo que haces de forma óptima.

  • Luismi
    Luismi 164 puntos
    editado 16 de enero

    Ahora si que me estoy liando.

    Vamos a aclarar cosas poco a poco

    Hasta ahora como yo lo hago, y le vamos viendo las pegas para no perderme

    Defino condiciones de entrada y acaba en una orden tal que asi:

    if S_rupturaPocAlcista=1 then buy ("Ruptura POC") nc contract next bar at close limit ;
    
    If S_rupturaPocAlcista=1 then RPA = 10 else rpa=0 ; // para representacion
    

    S_rupturaPocAlcista=1 es cuando se dan las condiciones de entrada

    y las ordenes de salida las pongo asi:

    // SALIDA RUPTURA POC ALCISTA
    
    IF marketposition=1 and RPA=10 then Begin
    
    if Barssinceentry=0  then mistop = giro1a ;

    miprofit = ((Entryprice-mistop)+Entryprice)* ratio ;

    sell ("Stop Ruptura-POC") nc contract next bar at mistop stop;

    sell ("Take Ruptura POC") nc contract next bar at miprofit limit ;

    Trail= (((Entryprice-mistop) * ratio_breakheaven) + entryprice) ;

    If high>trail then FijoTrail=1;

    if trail=1 then sell("Bk.4.1") nc contracts next bar at Breakheaven stop; end;

    Como las ordenes de salida van con el marketposition=1 entiendo que se ponen en la vela siguiente a la de entrada.

    Cuando se dan las condiciones para subir el sto(variable Trail) pongo otra orden de venta al precio del breakheaven

    Yo lo que te entendido es que deberian entrar las 3 ordenes a la vez y si se ejecuta stop o profit se cancela la otra. asi cuando marketposition=0 se deja de presentar las ordenes y estan canceladas, pero lo vamos viendo.

    hasta aqui lo que tengo. Ahora seguimos proceso

    El indicador de las ordenes, supongo que hay que ponerlo en el mismo strategy, si es un "indicador " no puedo usar marketposition. y si es asi ya lo tengo implantado, or eso me salen las rayas roja y verde y blanca en el grafico, es asi:

    // REPRESENTACION SEÑAL ENTRADA
    
    if marketposition<>0 and representacion_Entrada=1 then Begin
    
    value7= tl_new(d[0],t[1],Entryprice,d,t,Entryprice);
    Tl_setcolor(value7,white);
    Tl_setstyle(value7,5);
    end;
    
    //REPRESENTACION STOPS ,BREAKHEAVENS Y  PROFIT==========================================================================================
    
    // REA = Estructura   REAC=estruct confirmacion  RparA=Parada Alcista RIA=Intencion Alcista RPA= Ruptura POC RpreA=PrePoc  RpreAl=PrePoc lento or RGiA=Giro en rango Alcista(minimos)
    
    // REB = Estructura   REBc=estruct confirmacion  RParB=Parada Bajista RIB=Intencion Bajista RPB= Ruptura POC RpreB=PrePoc  RpreBl=PrePoc lento or RgiB=Giro en rango Bajista(maximos)If ((marketposition = 1  and representacion_Entrada=1 ) and REA = 10 or REAC=10 Or RparA=10 or RIA=10 or RPA=10 or RpreA=10 or RpreAl=10 or RGiA=10   )
    
    Or
    
    ((marketposition  = -1 and  representacion_Entrada=1) and REB = 10 or REBc=10 or RParB=10 or RIB=10 or RPB=10 or  RpreB=10 or RpreBl=10 or RgiB=10    )
    
    then begin
    
    if 	heaven=true or fijotrail=1 or (volumen_parada and close>Entryprice)  then 

    VALUE8 = tl_new(d[0],t[1],Breakheaven,d,t[0],Breakheaven)
    Else
    VALUE8 = tl_new(d[0],t[1],mistop,d,t[0],mistop);
    Tl_setcolor(value8,red);
    Tl_setstyle(value8,1);

    VALUE9 = tl_new(d[0],t[1],miprofit,d,t,miprofit);
    Tl_setcolor(value9,green );
    Tl_setstyle(value9,1);


    end;

    Y a partir de aqui , soy todo oidos, a ver si nos vamos entendiendo

  • luis
    luis 349 puntos

    Vuelvo al inicio.

    Lo primero

    Dibuja primero la posición y cuando lo tengas entonces piensas en esto.

    Así podrás depurar lo que haces de forma óptima.

    Primero un indicador que marque las operaciones y ya después se automatizará.

    Sino te va a costar mucho más y la depuración va a ser un infierno interminable.

  • Luismi
    Luismi 164 puntos
    editado 16 de enero

    Luis, me quieres simplificar tanto que no te entiendo

    Te estoy diciendo que ya tengo la representacion hecha, que quieres que haga un indicador en la seccion indicador no strategy?

    si es asi,no puedo usar las instrucciones de informacion de la posicion como Entryprice o Barssinceentry, creo que sera complicado

    Yo voy a estar toda la mañana en el ordenador por si quieres que hablemos directamente, porque creo que no nos estamos entendiendo,por lo menos yo a ti

  • luis
    luis 349 puntos

    ¿Puedes poner una captura de cómo está representando las operaciones ese indicador?

  • Luismi
    Luismi 164 puntos

    si claro ,por ejemplo la ultima del foro, que se ve como pasa el stop a breakeven y sale por profit

    y el codigo te lo puse un poco mas arriba

  • luis
    luis 349 puntos

    Vale, pues desde ahí, solo tienes que hacer una vez sabes que estás dentro con marketposition los buytocover en el caso de la posición corta.

    Si sigo dentro, buytocover next bar at.

    De lo contrario, dejo de hacerlo y la orden desaparece.

    Pruébalo así de sencillo.

    Debes distinguir el caso alcista del bajista.

  • Luismi
    Luismi 164 puntos

    Si ,es asi como lo tengo hecho!!!

    A ver de que estamos hablando, que ya no se por donde hemos empezado😂

    Yo tengo las ordenes y la representacion funcionando, y diria que bien, de la manera que he descrito y lo que estaba añadiendo que es cuando ha empezado este lio era la gestion del capital, para calcular el numero de contratos, tengo uno hecho que es el de intencionalcista y esta asi:

    PUNTO = Bigpointvalue ;
    if SetUpIntencionAlcista=10 then begin
    	puntosstop= Absvalue(close-giro1a);
    	riesgo= puntosstop*punto ;
    end;
    
    nc= floor(iff (SetUpIntencionAlcista=10 ,Riesgo_por_operacion/riesgo,1));
    if SetUpIntencionAlcista=10 then  Buy( "Intencion_alcista") nc Shares next bar at close limit 	;
    if SetUpIntencionAlcista=10 then RIA= 10;// para representacion 
    
    

    como las ordenes de stop y profit las meto con marketposition=1, el numero de contratos "nc" lo tengo que calcular en la vela que da entrada (como en este trozo de codigo que he puesto), y por eso preguntaba,por si habia manera mas sencilla

    Que no es que esta sea complicada ,sino que la tengo que ir poniendo en todos los setups porque cada uno tiene su punto de stop distinto.

    A ver si me has entendido ahora😄, si te parece correcto lo hago asi, y si no le damos las vueltas que haga falta , yo quiero hacerlo bien, no tener razon

  • luis
    luis 349 puntos

    Creo que soy yo el que no te estaba entendiendo y me he ido por las ramas, disculpa. 😅

    Se hace utilizando "shares".

    https://help.tradestation.com/10_00/eng/tsdevhelp/elword/word/buy_reserved_word_.htm

    Orden (ID) X shares cuándo

    Ejemplos:

    Buy ("My Entry") 100 shares next bar at open;

    Y esos shares los calculamos como te comentaba aquí.

    No sé si te estoy entendiendo ahora o aún no sé bien de qué hablamos.

    Realmente lo que dices en el anterior post es lo mismo que te estaba comentando, esa es la forma de hacerlo.

    ¿Es esto de lo que hablamos o sigo perdido?

  • Luismi
    Luismi 164 puntos

    Vale ,pues lo rematare asi