转自
做了以下f,根据R.Vince的说法,计算出最佳的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之后,从顶部开始的第二行,TWR=1.#INF,在日志中是什么意思?
它是什么?- 超出范围的双?
如果是这样的话,那么如何计算出最佳的F?
我做了以下函数,按照R.Vince的说法,计算出最佳的F,正如他书中所说。
你能告诉我,在测试EA后,日志中从头开始的第二行,TWR=1.#INF 是什么意思?
它是什么?- 超出范围的替身?
如果是这样,在这种情况下,如何计算出最佳的F?
3289 | Rosh 26.10.2005 20:49 数字 "1.INF"、"1.IND "意味着模数值太高或0/0类型的未定义值(我想是这样)。 |
4464 | Slawa 27.10.2005 09:59 而 "1.INF"、"1.IND "意味着模块中的数值太大,或者是0/0类型的未定义值(我认为如此)。 是的,这是正确的。它是一个浮点数的溢出(1.INF)和一个双数的溢出(1.IND)。 |
安东-特雷福列夫http://forum.alpari.ru/member.php?u=56027,从事最优F的工作,你可以问他。一个不知名的人,曾经在(我记得的)3个月内筹集了11000%。然后通过扩大隔夜十字架上的散布,切断了对他的氧气。尽管如此,他还是设法让自己的账户达到了10万以上,之后他不得不关闭账户。
3289 | Rosh 26.10.2005 20:49 数字 "1.INF"、"1.IND "意味着模数值过大,或者像0/0这样的未定义值(我想是这样)。 |
4464 | Slawa 27.10.2005 09:59 而 "1.INF "和 "1.IND "的数字意味着要么是太高的数值模数,要么是0/0类型的未定义值(我想是这样)。 是的,完全正确。这是一个浮点数的溢出(1.INF)和一个双倍数的溢出(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)?
即用ddl、matcad等解决?
乘法也会导致溢出。
我知道。那么我如何用其几何平均法计算出最佳的f?我已经写好了所有的公式,在代码中全部正确。
可能只需要考虑优化的问题。你可以找到计算的变体。
不比较TWR与前一个值(TWR_Rez),而是比较它们的几何平均数G和一些G_Rez如何?毕竟,如果数_1的K度根大于数_2的相同K度的根,那么数_1就大于数_2!:))))))
而且已经计算了根(变量G),就不会有溢出,如果乘积确实被分成了几个元素(为什么要用部分呢),从每个元素中取根。毕竟,积的根等于其因子的根的乘积!:)))
这将增加计算时间,但不会有溢出,也不会有大惊小怪的情况。此外,计算精度也会有明显的提高。
如果你想打印TWR变量,把它的大小存储在一个额外的int类型的 变量中,然后用Print来打印TWR的大小,比如说。"89605994539435e+1234121".但你需要它吗?
移植自
罗曼 14.08.2011 06:37
嘿,伙计们,请指点迷津,我正在用R.Vince的方法通过几何平均法寻找最佳f(用于计算手数)。
任务:通过订单历史,以增量f=0.01从0.01到1,找到其最佳值,其中TWR是最大的。
底部两个公式,已知交易中最大损失的价值为D=-458。
哪些枚举循环,特别是要找到最佳的f,以及在代码的什么地方,另外,要组织好。
下面是int deinit() 的起始代码。它在策略测试器中正确地打印了有关利润。