から移管されました。
R. Vince氏の著書にあるように、最適なfを計算するために、次のようなfを作りました。
//---------переменные для расчета лота по оптимальному f Ральфа Винса int Mas_Outcome_of_transactions [10000]; // Массив профитов/убытков закрытых позиций extern double D = -628; // максимальный убыток по сделке //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- if(Monitor==true) { for(int a=0;a<=3;a++) { string N=DoubleToStr(a,0); ObjectDelete(N); } } //---- //--- Расчет оптимального f --- int Qnt=0; // Счётчик количества ордеров ArrayInitialize(Mas_Outcome_of_transactions,0); // Обнуление массива double f=0.01, SUMM, MUL, HPR, TWR_Rez=0, TWR=1.0, G; int orderIndex; for (orderIndex = 0; orderIndex<OrdersHistoryTotal(); orderIndex++) { if (!OrderSelect(orderIndex, SELECT_BY_POS, MODE_HISTORY)) { Print("Ошибка при доступе к исторической базе (",GetLastError(),")"); continue; } if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic) || (OrderCloseTime()==0)) { continue; } Qnt++; // увеличиваем счетчик закрытых ордеров int lastType = OrderType(); double lastLots = OrderLots(); double lastProfit = OrderProfit() + OrderSwap(); Mas_Outcome_of_transactions[Qnt] = lastProfit; // Заполняем массив профитом/лоссом по всем закрытым позициям SUMM=SUMM+lastProfit; //TWR = TWR*(1+f*(-lastProfit/(D))); } // Print("Закрытых позиций = ", Qnt, " Профит/лосс = ", SUMM); for (f = 0.01; f<=1.0; f=f+0.01)//цикл перебора переменной f для поиска оптимального ее значения,при котором TWR-максимально { for ( orderIndex = 1;orderIndex<Qnt; orderIndex++) //при заданной f проходим по всем закрытым ордерам { // и считаем относительный конечный капитал (TWR) TWR = TWR*(1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D))); // TWR - это произведение всех HPR //if (TWR>TWR_Rez) {TWR_Rez = TWR; Print(" TWR = ",TWR_Rez, " при f = ", f);} // else break; } if (TWR>TWR_Rez) { TWR_Rez = TWR; G=MathPow (TWR_Rez, 0.001988); // 1/503 сделки по данной торговой системе, как в книжке: в степени 1/N Print(" TWR = ",TWR_Rez," G = ",G, " при f = ", f);} // если текущий TWR > результирующего, else break; // то результирующий делаем равным текущему, иначе переходим на след итерацию цикла по f } Print("Закрытых позиций = ", Qnt, " Нетто Профит/лосс = ", SUMM, " У последней ",Qnt, " закрытой позы профит/лосс = ", Mas_Outcome_of_transactions[Qnt]); return(0); }
EAをテストした後のログブックで、上から2行目のTWR=1.#INFは どういう意味か教えてください。
何ですか?- アウトオブレンジダブル ?
この場合、最適なfはどのように算出するのでしょうか?
R. Vinceの著書に従って、最適なfを計算するために、以下のような関数を作りました。
EAをテストした後のログブックで、上から2行目のTWR=1.#INFという のはどういう意味か、教えてください。
何ですか?- アウトオブレンジダブル?
その場合、最適なfはどのように算出するのでしょうか?
3289 | ロッシュ 2005.10.26 20:49 また、「1.INF」「1.IND」という数字は、モジュロ値が高すぎるか、0/0型の未定義値である(と私は考えている)。 |
4464 | スラワ 2005.10.27 09:59 また、「1.INF」「1.IND」は、モジュール内の値が大きすぎるか、0/0型の未定義値(だと思う)のどちらかです。 浮動小数点数のオーバーフロー(1.INF)と倍数のオーバーフロー(1.IND)です。 |
Anton Trefolevhttp://forum.alpari.ru/member.php?u=56027 最適なfを研究していたので、彼に聞いてみるといい。かつて(私の記憶では)3ヶ月で11000%上げた無名の人。そして、一夜漬けの十字架に広がりを持たせることで、彼への酸素を遮断したのです。それでも彼は10万円以上まで口座を増やしたが、その後、口座を閉鎖せざるを得なくなった。
3289 | ロッシュ 2005.10.26 20:49 また、「1.INF」「1.IND」という数字は、モジュロ値が大きすぎるか、0/0のような未定義の値(だと思う)を意味しています。 |
4464 | スラワ 2005.10.27 09:59 また、「1.INF」「1.IND」という数字は、モジュロ値が高すぎるか、0/0型の未定義値という意味です(そうだと思います)。 これは浮動小数点数のオーバーフロー(1.INF)と2桁目のオーバーフロー(1.IND)です。 |
そこがミソで、割り算はなく、掛け算だけ(ヴィンスの公式を使用、以上) です。
つまり、mqlを使っても、この問題(TWRの正しい計算)は解けないのですね?
I.e. ddlやmatcadなどを使って?
3289 | ロッシュ 2005.10.26 20:49 また、「1.INF」「1.IND」という数字は、モジュロ値が大きすぎるか、0/0のような未定義の値(だと思う)を意味しています。 |
4464 | スラワ 2005.10.27 09:59 また、「1.INF」「1.IND」の数値は、モジュロ値が高すぎるか、0/0型の未定義値である(と私は考えています)。 これは浮動小数点数のオーバーフロー(1.INF)と2桁目のオーバーフロー(1.IND)です。 |
オーダーフロート(1.INF)がオーバーフローした場合はどうなるのでしょうか?
fループの後続の繰り返しは、現在の結果で中断されるのでしょうか、それともループはカウントし続けるのでしょうか?TWRの数値に興味があるのではなく、累積総TWRとの掛け算で得られるfの数値に興味があるのです。
このコードの一部では
for (f = 0.01; f<=1.0; f=f+0.01)//цикл перебора переменной f для поиска оптимального ее значения,при котором TWR-максимально { for ( orderIndex = 1;orderIndex<Qnt; orderIndex++) //при заданной f проходим по всем закрытым ордерам { // и считаем относительный конечный капитал (TWR) TWR = TWR*(1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D))); // TWR - это произведение всех HPR } if (TWR>TWR_Rez) { TWR_Rez = TWR; G=MathPow (TWR_Rez, 0.001988); // 1/503 сделки по данной торговой системе, как в книжке: в степени 1/N Print(" TWR = ",TWR_Rez," G = ",G, " при f = ", f);} // если текущий TWR > результирующего, else break; // то результирующий делаем равным текущему, иначе переходим на след итерацию цикла по f }
要は割り算がなく、掛け算だけ(ヴィンスの公式を使えば、ですが)。
では、mqlはこの問題(TWRの正しい計算)を解決できないのですか?
I.e. ddlやmatcadなどを使って解く?
乗算もオーバーフローを起こすことがあります。
それは分かっています。では、その幾何平均法を用いて最適なfを計算するにはどうすればよいのでしょうか。計算式は全て正しくコードに書きました。
おそらく、最適化について考える必要があるのでしょう。計算のバリエーションを見つけることができます。
TWRと前回値(TWR_Rez)ではなく、それらの幾何平均GとあるG_Rezを比較するのはどうでしょうか。結局、数_1の次数Kの根が数_2の同じ次数Kの根より大きければ、数_1は数_2より大きい ということになるのです:))))
また、積を要素に分割し(なぜ分割するのか)、各要素から根を求めると、すでに根(変数G)を計算しているので、オーバーフローすることはありません。結局、積の根は、その因子の根の積に等しい のです:)))
計算時間は増えますが、オーバーフローすることもなく、大騒ぎすることもないでしょう。また、計算精度の向上も顕著です。
TWR変数を表示したい場合は、int型の 追加変数にそのサイズを格納し、PrintでTWRのサイズを表示するなどの工夫をします。"89605994539435e+1234121".でも、必要ですか?
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
から移植されました。
ローマン 14.08.2011 06:37
R.Vinceの方法を使って幾何平均法で最適なf(ロットボリューム計算用)を探しているのですが、皆さん、アドバイスをお願いします。
課題:注文履歴を調べ、0.01から1までf=0.01の増分で、TWRが最大となる最適値を求める。
という2つの式があり、トレードの最大損失の値はD=-458 であることが知られています。
どの列挙サイクル、特に最適なfを見つけるために、さらに、コード内の場所を整理する。
以下は、int deinit() の開始コードです。ストラテジーテスターにちゃんと利益について印刷される。