Respuesta

Snipped para whatif permitir max simultainios oficios por instrumento

1 respuesta

mabi

Cliente, bbp_participant, comunidad, 261 respuestas.

Visitar el perfil

hace 5 años #238012

Hoy en día existe la posibilidad de probar el máximo de operaciones por día, pero no estoy seguro de que funcione como se dice, ya que incluso si se establece en 1 operación por día, a veces hay 3 operaciones por día. Cuando se crea una cartera, la correlación es siempre un problema en el mismo instrumento. Las operaciones se toman muy cerca una de la otra pero con diferentes salidas lo que hace que QA piense que no están correlacionadas pero de hecho están muy correlacionadas especialmente durante periodos de pérdidas. Hay formas de evitar tomar más de 1 operación en el mismo instrumento simultáneamente utilizando un copiador, pero no hay una función what if en QA para comprobar cuál sería el rendimiento.

Espero que alguien me pueda ayudar con esta función ya que creo que puede ser una característica que puede bajar mucho el drawdown de grandes carteras. He estado probando esto en una cuenta real paravail y lo que puedo ver es que la curva EQ se vuelve mucho más suave y drawdown mucho más pequeño y el beneficio mejor que en la cuenta donde no se utiliza.

0

stearno

Cliente, bbp_participant, comunidad, 379 respuestas.

Visitar el perfil

hace 2 años #270964

Aquí está el código para limitar el número de operaciones abiertas a la vez en What-if Analysis. Yo no soy un codificador, por lo que no es la forma más eficiente y no la mejor manera. Pero es una manera que funciona, así que lo comparto en caso de que ayude a alguien:

 

paquete com.strategyquant.extend.WhatIf;

import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.Arrays;

import com.strategyquant.lib.comparators.OrderComparatorByOpenTime;
import com.strategyquant.lib.language.L;
import com.strategyquant.lib.results.SQOrder;
import com.strategyquant.lib.results.SQOrderList;
import com.strategyquant.lib.snippets.WhatIf;
import com.strategyquant.lib.time.SQTime;

public class TakeMaxTradesAtOneTime extends WhatIf
{

public TakeMaxTradesAtOneTime()
{
setName(L.t("Tomar el máximo de operaciones a la vez"));

addIntParameter("Operaciones", L.t("Operaciones"), 1, 1, Integer.MAX_VALUE, 1);
setFormatedName(L.t("Tomar un máximo de {Trades} operaciones a la vez"));
}

public void filter(SQOrderList originalOrders) throws Exception
{
int operaciones = getIntParameterValue("Operaciones");
long[] Closedatetime = nuevo long[1];
int PrimeraCarrera = 0;

Collections.sort(originalOrders, new OrderComparatorByOpenTime());

for(Iterator i = originalOrders.listIterator(); i.hasNext();)
{
SQOrder order = i.next();

if(order.isBalanceOrder())
continuar;
long closedatetime = orden.CloseTime;

si (PrimeraCarrera == 0)
{
Closedatetime[0] = closedatetime;
FirstRun = 1;
}
int count = Closedatetime.length;
if (count <= trades)
{
Closedatetime = Arrays.copyOf(Closedatetime, Closedatetime.length + 1);
Closedatetime[Closedatetime.length - 1] = closedatetime;
}
si no
{
Arrays.sort(Closedatetime);
long opendatetime = orden.OpenTime;
for (int j = 0; j < Closedatetime.length; j++)
{
if (opendatetime > Closedatetime[j])
Closedatetime = removeElement(Closedatetime,j);
}
count = Closedatetime.length;
if (count <= trades)
{
Closedatetime = Arrays.copyOf(Closedatetime, Closedatetime.length + 1);
Closedatetime[Closedatetime.length - 1] = closedatetime;
}
si no
i.eliminar();
}
}
}

private long[] removeElement(long[] arr, int index)
{
long[] anotherArray = new long[arr.length - 1];
for (int l = 0, k = 0; l < arr.length; l++)
{
si (l == índice)
continuar;
otroArray[k] = arr[l];
k++;
}
devolver otroArray;
}
}

0

Viendo 1 respuesta (de un total de 1)