インストゥルメントごとの同時トレード数上限を許可するwhatif用スニペット
1件の返信
本日、1日あたりの最大トレード数をテストする可能性があります。1日1トレードに設定しても、場合によっては1日3トレード実行されることがあるため、言われた通りに機能するかどうかは確信が持てません。ポートフォリオを構築する際、同じ銘柄に対する相関関係は常に問題になります。トレードは非常に近いタイミングで行われますが、エグジットが異なるため、QA(QuantAnalyzer)はそれらが無相関であると判断してしまいますが、実際には、特にドローダウンの期間中において非常に高い相関があります。コピートレーダーを使用することで、同じ銘柄での同時トレードを1回だけに制限する方法はありますが、QAには、その場合のパフォーマンスがどうなるかを検証するための「もしも(what if)」機能がありません。.
大型ポートフォリオのドローダウンを大幅に軽減できる機能だと思われるため、この機能について誰かにお手伝いいただければ幸いです。availのリアル口座でこれをテストしてきましたが、確認できることとして、これを使用していない口座と比較して、資産曲線(EQカーブ)がはるかに滑らかになり、ドローダウンが大幅に小さくなり、利益も向上しています。.
0
What-if分析で同時にオープンできるトレードの数を制限するためのコードはこちらです。私はプログラマーではないので、最も効率的な方法でも最高のやり方でもありません。しかし、機能する方法ではあるので、誰かの役に立つかもしれないと思いシェアします:
package 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(“一度に行う最大トレード数を設定”));
addIntParameter(“Trades”, L.t(“トレード”), 1, 1, Integer.MAX_VALUE, 1);
setFormatedName(L.t(“一度に最大 {Trades} 件のトレードを実行”));
}
public void filter(SQOrderList originalOrders) throws Exception
{
int trades = getIntParameterValue(“Trades”);
long[] Closedatetime = new long[1];
int FirstRun = 0;
Collections.sort(originalOrders, new OrderComparatorByOpenTime());
for(Iterator i = originalOrders.listIterator(); i.hasNext();)
{
SQOrder order = i.next();
if(order.isBalanceOrder())
続ける。;
long closedatetime = order.CloseTime;
if (FirstRun == 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;
}
その他
{
Arrays.sort(Closedatetime);
long opendatetime = order.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;
}
その他
i.remove();
}
}
}
private long[] removeElement(long[] arr, int index)
{
long[] anotherArray = new long[arr.length – 1];
for (int l = 0, k = 0; l < arr.length; l++)
{
if (l == index)
続ける。;
anotherArray[k] = arr[l];
k++;
}
return anotherArray;
}
}
0
1件の返信を表示中 - 1 - 1件目 (全1件中)