Documentación

Aplicaciones

Última actualización el 21. 12. 2021 por clonex / Ivan Hudec

Ejemplo de comisión mínima

Este es un método simple de cálculo de comisiones - utiliza comisiones en $ por lote y lo multiplica por el tamaño real de la operación. Si la comisión final está por debajo del umbral, entonces se utiliza la comisión mínima. Puede descargar el fragmento aquí.

 

 

Paso 1 - Clonar nueva columna Comercio

Abra CodeEditor, en el Navegador bajo Builtin/Snippets/Trading/Commissions, encuentre el snippet SizeBased, haga clic con el botón derecho y clónelo. En la carpeta User/Snippets/Trading/Commission, verá el snippet clonado que puede editar.

 

 

Paso 2 - Definir parámetros

En este punto es necesario especificar los parámetros que se utilizarán para el cálculo. En nuestro caso, especificamos una comisión para todo el lote y una comisión mínima en caso de que el importe de la comisión sea inferior al mínimo especificado.

@ClassConfig(name="Comisión por tamaño con valor mínimo", display="#Comisión# con mínimo #MComisión#")
@Ayuda("<b>Comisión por operación con valor mínimo</b><br/>Utilizado principalmente para acciones, o Forex.")
public class ComisiónMínima extends MétodoDeComisiones {

    @Parameter(defaultValue="0", minValue=-100000d, name="Comisión", maxValue=100000d, step=1d, category="Por defecto")
    @Help("Comisión en $ por lote completo")
    public double Comisión;

    @Parameter(defaultValue="0.5", minValue=0, name="ComisiónMínima", maxValue=100000d, step=1d, category="Por defecto")
    @Help("Comisión mínima en $ por operación")
    public double ComisiónMínima;

 

Paso 3 - Aplicar el método computeCommissionsOnOpen

 

En este punto tiene dos opciones. O bien calcular la comisión al abrir una operación, utilizando el método computeCommissionsOnOpen, o bien calcular la comisión al cerrar una operación, utilizando el método computeCommissionsOnClose. Ambos métodos tienen como argumentos ILiveOrder order , double tickSize, double pointValue.

En nuestro caso, utilizamos la primera opción y modificamos este método para calcular la comisión mínima cuando la comisión calculada es inferior al mínimo que hemos fijado.

    @Override
    public double computeCommissionsOnOpen(ILiveOrder order, double tickSize, double pointValue) throws Exception {
        // la comisión está en $ por lote completo
        double resultado = 0;
        double comisión = Comisión * orden.getSize();
        if(comisión<ComisiónMínima){resultado = ComisiónMínima;}
        si no resultado = Comisión * orden.getSize();
        
        devolver resultado;
    }
    //------------------------------------------------------------------------

    @Override
    public double computeCommissionsOnClose(ILiveOrder order, double tickSize, double pointValue) throws Exception {
        return 0;
    }
    
}

 

Paso 4 - Compilar el fragmento y utilizarlo

Después de reiniciar StrategyQuant X, vemos el nuevo método de cálculo de comisiones en la sección Datos.

 

En la siguiente figura, puede ver que la comisión por lote debería ser en realidad $10, pero como hemos fijado la comisión mínima más arriba, la comisión final es $20 por operación.

 

 

Código completo del fragmento

 

/*
 * Copyright (c) 2017-2018, StrategyQuant - Todos los derechos reservados.
 *
 * Código en este archivo se hizo de buena fe que es correcto y hace lo que debe.
 * Si ha encontrado un error en este código O tiene una sugerencia de mejora O desea incluir
 * su propio fragmento de código en nuestra biblioteca estándar por favor póngase en contacto con nosotros en:
 * https://roadmap.strategyquant.com
 *
 * Este código sólo puede ser utilizado dentro de los productos StrategyQuant.
 * Cada propietario de una licencia válida (gratuita, de prueba o comercial) de cualquier producto StrategyQuant
 * se le permite utilizar libremente, copiar, modificar o hacer trabajos derivados de este código sin limitaciones,
 * para ser utilizado en todos los productos StrategyQuant y compartir sus modificaciones o trabajos derivados
 * con la comunidad StrategyQuant.
 *
 * EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA,
 * INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN DETERMINADO
 * PROPÓSITO Y NO INFRACCIÓN. EN NINGÚN CASO SERÁN LOS AUTORES RESPONSABLES DE CUALQUIER RECLAMACIÓN, DAÑO
 * U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, EXTRACONTRACTUAL O DE OTRO TIPO, QUE SURJA DE,
 * O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS OPERACIONES CON EL SOFTWARE.
 *
 */
paquete SQ.Trading.Commissions;

importar com.strategyquant.lib.*;
import com.strategyquant.datalib.*;
import com.strategyquant.tradinglib.*;

@ClassConfig(name="Comisión basada en tamaño con valor mínimo", display="$ #Comisión# por operación")
@Ayuda("<b>Comisión por operación con valor mínimo</b><br/>Utilizado principalmente para acciones, o Forex.")
public class ComisiónMínima extends MétodoDeComisiones {

    @Parameter(defaultValue="0", minValue=-100000d, name="Comisión", maxValue=100000d, step=1d, category="Por defecto")
    @Help("Comisión en $ por lote completo")
    public double Comisión;

    @Parameter(defaultValue="0.5", minValue=0, name="Comisión mínima", maxValue=100000d, step=1d, category="Por defecto")
    @Help("Comisión mínima en $ por operación")
    public double ComisiónMínima;

    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    
    @Override
    public double computeCommissionsOnOpen(ILiveOrder order, double tickSize, double pointValue) throws Exception {
        // la comisión está en $ por lote completo
        double resultado = 0;
        double comisión = Comisión * orden.getSize();
        if(comisión<MinimumComission){result = MinimumComission;}
        else result = Commission * order.getSize();
        
        return result; 
    }
    //------------------------------------------------------------------------

    @Override
    public double computeCommissionsOnClose(ILiveOrder order, double tickSize, double pointValue) throws Exception {
        return 0;
    }
    
}

 

¿Le ha resultado útil este artículo? El artículo era útil El artículo no era útil

Suscríbase a
Notificar a
0 Comentarios
Feedbacks de Inline
Ver todos los comentarios