Перенесено
Изготовил следующую ф-ию, для расчета оптимального 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); }
Подскажите, что означает в журнале, после тестирования советника, вторая строчка сверху, а именно TWR=1.#INF ?
Что это? - Выход за границы диапазона double?
Если это так, в таком случае, как рассчитать оптимальную f ?
Изготовил следующую ф-ию, для расчета оптимального f по Р. Винсу, как у него в книжке:
Подскажите, что означает в журнале, после тестирования советника, вторая строчка сверху, а именно TWR=1.#INF ?
Что это? - Выход за границы диапазона double?
Если это так, в таком случае, как рассчитать оптимальную 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 (я так думаю). да, именно так. это - переполнение порядка float (1.INF) и переполнение порядка double (1.IND). перед делением надо проверять делитель на 0 |
Антон Трефолев http://forum.alpari.ru/member.php?u=56027 работал по оптимальному f, можете у него спросить. Небезызвестный человек, в свое время поднявший 11000% за (насколько помню) 3 месяца. Затем ему перекрыли кислород путем расширения спреда на ночном кроссе. Тем не менее удалось разогнать счет до больше 100к, после чего памм пришлось закрыть.
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 (я так думаю). да, именно так. это - переполнение порядка float (1.INF) и переполнение порядка double (1.IND). перед делением надо проверять делитель на 0 |
В том то и дело, что там нет деления, сплошное умножение (по его Р.Винса формуле и все).
Т.е. средствами mql данный вопрос (правильного рассчета TWR) не решить?
Т.е. решать через ddl, маткад и т.д.?
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 (я так думаю). да, именно так. это - переполнение порядка float (1.INF) и переполнение порядка double (1.IND). перед делением надо проверять делитель на 0 |
Что происходит при переполнении порядка float (1.INF)?
Прерываются последующие итерации цикла по f с выдачей текущего результата? или дальше цикл считает? Меня не интересует численное значение TWR, меня интересует значение f, полученное через умножение с накопительным итогом TWR.
В этом участке кода:
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, маткад и т.д.?
При умножении тоже можно получить переполнение.
При умножении тоже можно получить переполнение.
Я это знаю. А как тогда рассчитать оптимальное f по его метОде среднего геометрического? Я все формулы, все правильно в коде прописАл.
Я это знаю. А как тогда рассчитать оптимальное f по его метОде среднего геометрического? Я все формулы, все правильно в коде прописАл.
Наверно просто подумать надо над оптимальностью. Варианты расчета можно найти.
А если сравнивать не TWR с предыдущим значением (TWR_Rez), а сравнивать их среднее геометрическое G и какое-то G_Rez? Ведь если корень степени K из числа_1 больше корня той же степени K из числа_2, то и число_1 больше числа_2! :))))))
А уже рассчитывая корень (переменную G) не будет никакого переполнения, если произведение и правда разбить по элементам (зачем возиться с частями) и от каждого элемента брать корень. Ведь корень произведения равен произведению корней его сомножителей! :)))
Существенно увеличится время расчёта, но зато не будет никакого переполнения и возни с ним. Плюс заметно увеличится точность вычислений.
А если Вы задумаете выводить переменную TWR, то тогда придётся хранить её разрядность в дополнительной переменной типа int, и в Print'е выводить разрядность TWR, например: "89605994539435e+1234121". Но надо ли Вам это?
Я это знаю. А как тогда рассчитать оптимальное f по его метОде среднего геометрического? Я все формулы, все правильно в коде прописАл.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Перенесено
Roman 14.08.2011 06:37
Ребята, подскажите, сейчас по Р.Винсу ищу оптимальное f (для вычисления объема лота) методом среднего геометического.
Задача: необходимо пройти по истории ордеров и с шагом f = 0,01 от 0,01 до 1, найти ее оптимальное значение, при котором TWR - максимально, при этом переложИть в код
две нижние формулы, причем значение наибольшего проигрыша по сделке известно D=-458:
какие циклы перебора, в частности по поиску оптимального f и где в коде, дополнительно, организовать.
Вот стартовый код в int deinit(). Принтует в тестере стратегий о профите исправно.