Спасибо Алексею за проделанную работу. Вот несколько предложений и замечаний по коду OptimMA.mq4.
Предложения по увеличению быстродействия.
В ф-ции CreatTPSLData() строка 45, 46 добавить break; для выхода из цикла после нахождения первого TP/SL. Т.к. дальнейшие сравнения уже не нужны.
if (Low[k]<=LossPrice) { find = true; FileWriteInteger(hFile, -k); break;}//если нашли бар СЛ else if (High[k]>=ProfitPrice) { find=true; FileWriteInteger(hFile, k); break;}//если нашли бар ТП
В ф-ции CreatDataArray() строка 123 и 126 также добавить break; . Если веера уже не совпадают, зачем их сравнивать дальше?
while (_ma<MaxK && find && k<MaxI) // проходим по вееру и классифицируем его { if (Sign(Ma.Sub[_ma][j])!=Sign(Ma.Sub[_ma][i])) {find=false; break;}// если не совпало направление каждой МА else if (MathAbs(Ma.Sub[_ma][j])>=MathAbs(Ma.Sub[_ma][i])*1.4 || MathAbs(Ma.Sub[_ma][j])<=MathAbs(Ma.Sub[_ma][i])*0.714) {find=false; break;}// или если расстояния между ними не попадают в диапазон _ma++; }
Замечания о возможных ошибках.
Зачем определение ф-ции IsProfitFan() ? Она же нигде не используется.
Ф-ция CreatDataArray()
строка 96: op=(Open[i]+Close[i])/2.0; Почему используются цены Open и Close, а не High и Low? Ведь для расчета MA мы используем High и Low.
строка 98: Ma.Sub[0][i]=op-Ma[1]; Может надо использовать Ma[0](с периодом 2) вместо Ma[1](с периодом 5), т.к. мы берем разницу между соседними MA.
При подсчете Sum, ExpValue, nTP для всех идентичных вееров, мы не учитываем сам образец, а почему собственно?
При подсчете суммы TP и SL баров принадлежащих идентичным веерам есть логическая ошибка! Вполне возможно, что на нескольких подряд барах находятся точки входа для данного веера. Но если мы входим в первой точке, то остальные должны пропустить, пока не сработает TP/SL. И только после этого можем открываться снова. Этот момент пропущен.
строка 118: for (j=i+1; j<MaxI; j++) Кажется должно быть j=1 тогда мы полностью составим картину для всех вееров на всех 125000 барах. Т.е. берем веер на каждом баре и сравниваем его со всеми подряд веерами на всех барах. А так мы сравниваем статистику на разных кол-вах баров. Здесь же возникает вопрос как выбрать/извлечь веер-образец для дальнейшего использования, т.к. мы все же выбираем группу идентичных вееров?
Спасибо за все ваши корректировки. Очень приятно, что вы разобрались с кодом.
Большую часть из правок я нашел сам. А вот что касается вашего последнего замечания
строка 118: for (j=i+1; j<MaxI; j++)
Кажется должно быть j=1 тогда мы полностью составим картину для всех вееров на всех 125000 барах. Т.е. берем веер на каждом баре и сравниваем его со всеми подряд веерами на всех барах. А так мы сравниваем статистику на разных кол-вах баров.
здесь уже обсуждалось. Мы не должны заглядывать в будущее. Поэтому мой цикл правильный.
Спасибо за все ваши корректировки. Очень приятно, что вы разобрались с кодом.
Большую часть из правок я нашел сам. А вот что касается вашего последнего замечания
строка 118: for (j=i+1; j<MaxI; j++)
Кажется должно быть j=1 тогда мы полностью составим картину для всех вееров на всех 125000 барах. Т.е. берем веер на каждом баре и сравниваем его со всеми подряд веерами на всех барах. А так мы сравниваем статистику на разных кол-вах баров.
здесь уже обсуждалось. Мы не должны заглядывать в будущее. Поэтому мой цикл правильный.
А мы и не заглядываем в будущее. Мы просто проводим статистическое исследование на 125 000 барах. А при j=i+1 получится что для бара под номером 0 мы проводим 125 000 сравнений, а для бара под номером 120 000 только 5 000 сравнений. Причем и тот и другой могут входить в один веер. И что тогда получится, что для одного и того же веера разная статистика на 125 000 барах?
Было бы интересно увидеть насколько исправления влияют на отчеты.
Кстати для того чтобы увидеть статистику на разных промежутках времени можно для начала работы скрипта задавать время отсчета и от него уже отсчитывать определенное кол-во баров.
А мы и не заглядываем в будущее. Мы просто проводим статистическое исследование на 125 000 барах. А при j=i+1 получится что для бара под номером 0 мы проводим 125 000 сравнений, а для бара под номером 120 000 только 5 000 сравнений. Причем и тот и другой могут входить в один веер. И что тогда получится, что для одного и того же веера разная статистика на 125 000 барах?
Все с точностью до наоборот. Если вы например находителсь сейчас на баре номер 0, то ведь не знаете значения веера бара номер -1 или -2. Это ведь back to the future. А ограничением выборки от i+1 мы таким образом не смотрим на бары i, i-1, i-2 ...
Я понимаю где в таймсерии находится прошлое и будущее :-) Я говорю о том что статистическое исследование проведено неверно.
Если мы проводим его на 125 000 барах, то мы должны взять веер принадлежащий каждому бару и сравнить его с остальными 124 999 веерами.
И потом выбрать наиболее удачный шаблон веера. В варианте когда j=i+1 мы каждый следующий веерсравниваем с меньшим кол-вом вееров. Получается что для некоторых вееров мы проводим сравнение с 10, 11 ... 2000 и т.д. веерами. Мне кажется это не корректным.
я, наверное, опоздал к беседе. И я не профессионал. Мне просто хотелось понять, возможно с помощью вашей статьи или прикрепленных данных определить, например, время, когда та или иная валюта вообще становится более активна. Не важно, в каком направлении. Просто активна. Если да, то напишите, пожалуйста, как это сделать. Или может есть какой-то другой способ. Мне это, к сожалению, нужно, и я не могу решить этот вопрос. Мне надо определить статистически время ативности валюты, не направление и точку входа, а время входа.
// 3. Блок сравнения массивов М1 и М2. Вывод результатов в комментарии//**********************************************************************************....if(M2[i]==1.0&& BuyTP[i-1]==1.0) nBuy++;//число совпавших профитных баров и сигналов на покупкуif(M2[i]==-1.0&& SellTP[i-1]==-1.0) nSell++;//число совпавших профитных баров и сигналов на продажуif(M2[i]!=0.0&&(BuySL[i-1]==1.0|| SellSL[i-1]==-1.0)) N++;//число полученных убыточных баров
последняя строка сработает если M2[i]==1.0 и SellSL[i-1]==-1.0 (и наоборот)
т.е. сигнал на покупку и убыток от продажи, а зачем продавать если сигнал на покупку? )))
http://ruforum.forexpeoples.com/index.php?s=f3a21a8e902b46250912e7246ec5967d&showtopic=14530&view=findpost&p=295391
Если к ней добавить статистику, то результат может оказаться впечатляющим. Статистика хороша, когда обрабатывает некую базовую теорию.
Статья называется "Формула рыночной волны". С уважением и добрыми пожеланиями!
Вот несколько предложений и замечаний по коду OptimMA.mq4.
Предложения по увеличению быстродействия.
if (Low[k]<=LossPrice) { find = true; FileWriteInteger(hFile, -k); break;}//если нашли бар СЛ
else if (High[k]>=ProfitPrice) { find=true; FileWriteInteger(hFile, k); break;}//если нашли бар ТП
while (_ma<MaxK && find && k<MaxI) // проходим по вееру и классифицируем его
{
if (Sign(Ma.Sub[_ma][j])!=Sign(Ma.Sub[_ma][i])) {find=false; break;}// если не совпало направление каждой МА
else
if (MathAbs(Ma.Sub[_ma][j])>=MathAbs(Ma.Sub[_ma][i])*1.4 || MathAbs(Ma.Sub[_ma][j])<=MathAbs(Ma.Sub[_ma][i])*0.714)
{find=false; break;}// или если расстояния между ними не попадают в диапазон
_ma++;
}
Замечания о возможных ошибках.
Ф-ция CreatDataArray()
строка 96: op=(Open[i]+Close[i])/2.0;Почему используются цены Open и Close, а не High и Low? Ведь для расчета MA мы используем High и Low.
Может надо использовать Ma[0](с периодом 2) вместо Ma[1](с периодом 5), т.к. мы берем разницу между соседними MA.
Кажется должно быть j=1 тогда мы полностью составим картину для всех вееров на всех 125000 барах. Т.е. берем веер на каждом баре и сравниваем его со всеми подряд веерами на всех барах. А так мы сравниваем статистику на разных кол-вах баров.
Здесь же возникает вопрос как выбрать/извлечь веер-образец для дальнейшего использования, т.к. мы все же выбираем группу идентичных вееров?
Спасибо за все ваши корректировки. Очень приятно, что вы разобрались с кодом.
Большую часть из правок я нашел сам. А вот что касается вашего последнего замечания
строка 118: for (j=i+1; j<MaxI; j++)
Кажется должно быть j=1 тогда мы полностью составим картину для всех вееров на всех 125000 барах. Т.е. берем веер на каждом баре и сравниваем его со всеми подряд веерами на всех барах. А так мы сравниваем статистику на разных кол-вах баров.
здесь уже обсуждалось. Мы не должны заглядывать в будущее. Поэтому мой цикл правильный.
Спасибо за все ваши корректировки. Очень приятно, что вы разобрались с кодом.
Большую часть из правок я нашел сам. А вот что касается вашего последнего замечания
строка 118: for (j=i+1; j<MaxI; j++)
Кажется должно быть j=1 тогда мы полностью составим картину для всех вееров на всех 125000 барах. Т.е. берем веер на каждом баре и сравниваем его со всеми подряд веерами на всех барах. А так мы сравниваем статистику на разных кол-вах баров.
здесь уже обсуждалось. Мы не должны заглядывать в будущее. Поэтому мой цикл правильный.
Все с точностью до наоборот. Если вы например находителсь сейчас на баре номер 0, то ведь не знаете значения веера бара номер -1 или -2. Это ведь back to the future. А ограничением выборки от i+1 мы таким образом не смотрим на бары i, i-1, i-2 ...
Убедил?
Я понимаю где в таймсерии находится прошлое и будущее :-) Я говорю о том что статистическое исследование проведено неверно.
Если мы проводим его на 125 000 барах, то мы должны взять веер принадлежащий каждому бару и сравнить его с остальными 124 999 веерами.
И потом выбрать наиболее удачный шаблон веера. В варианте когда j=i+1 мы каждый следующий веер сравниваем с меньшим кол-вом вееров. Получается что для некоторых вееров мы проводим сравнение с 10, 11 ... 2000 и т.д. веерами. Мне кажется это не корректным.
я, наверное, опоздал к беседе. И я не профессионал. Мне просто хотелось понять, возможно с помощью вашей статьи или прикрепленных данных определить, например, время, когда та или иная валюта вообще становится более активна. Не важно, в каком направлении. Просто активна. Если да, то напишите, пожалуйста, как это сделать. Или может есть какой-то другой способ. Мне это, к сожалению, нужно, и я не могу решить этот вопрос. Мне надо определить статистически время ативности валюты, не направление и точку входа, а время входа.
с уважением, Азер.
Хорошая статья. Особенно подход необычен.
Что интересно, функция IsProfitFan, зачем там вставлена? Раз стоит значит что-то делала.
Спасибо за статью, хоть и давно это было.
обнаружил неточность в коде !IndoExp.mq4
последняя строка сработает если M2[i]==1.0 и SellSL[i-1]==-1.0 (и наоборот)
т.е. сигнал на покупку и убыток от продажи, а зачем продавать если сигнал на покупку? )))
надо расписать это условие
Жаль, что так никто и не создал ветку на форуме. А ведь обсудить есть что.
Интересный факт, если строку 96 заменить на: op=(High[i]+Low[i])/2.0;
а строку 98 заменить на: Ma.Sub[0][i]=op-Ma[0];
то результат получается намного скромнее.
Может для лучшего результата вообще стоит исключить из сравнения абсолютные значения малопериодных МА. Начать, например, с разницы МА5 и МА8?