Если ищешь точку входа MathAbs() вносит размазанность. По мне надо указывать от и до, чтобы было ясно когда и с каким допуском!
Исправил... Всё-равно условие ни одно не выполняется.
//+-------------------------------------------------------------------------------------+//| Получение значений МА на указанном баре |//+-------------------------------------------------------------------------------------+double GetMA(int index, int maPeriod)
{
return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, index));
}
//+-------------------------------------------------------------------------------------+//| Имеет ли место отскок? |//+-------------------------------------------------------------------------------------+void IsRebound(int crossDir[], bool& returnSign[])
{
for (int i = 0; i < 4; i++)
{
if (crossDir[i] == CROSS_NO)
continue;
returnSign[i] = false;
double ema = GetMA(1, g_maPeriod[i]);
// VrPr (ND(MathAbs(ema - Ask)));// VrPr (i_thresholdFromMa * pt);if (crossDir[i] == CROSS_UP)
{
if (ND(Ask - ema) <= i_thresholdFromMa * pt) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
{
// VrPr (ND(MathAbs(ema - Ask)) <= i_thresholdFromMa * pt);
returnSign[i] = true;
VrPr (" returnSign["+0+"]"+" = "+ returnSign[0]);
VrPr (" returnSign["+1+"]"+" = "+ returnSign[1]);
VrPr (" returnSign["+2+"]"+" = "+ returnSign[2]);
VrPr (" returnSign["+3+"]"+" = "+ returnSign[3]);
}
}
if (crossDir[i] == CROSS_DN)
{
if (ND(ema - Bid) <= i_thresholdFromMa * pt) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
{
returnSign[i] = true;
VrPr (" returnSign["+0+"]"+" = "+ returnSign[0]);
VrPr (" returnSign["+1+"]"+" = "+ returnSign[1]);
VrPr (" returnSign["+2+"]"+" = "+ returnSign[2]);
VrPr (" returnSign["+3+"]"+" = "+ returnSign[3]);
}
}
}
}
до returnSign[i] = true; и соответственно до функции VrPr (это функция, которая выводить на экран данные, которые я мониторю)не испольняются. Хотя пересечение вниз уже началось.. Вот на скрине видно, что массив crossDir[] заполняется по мере пересечения каждой быстрой машкой медленную..
Заметь, что 2 машки пересекли самую толстую, и 2 элемента массива уже принчли значение 1. А это значит, что их значение и есть CROSS_DN
Разве что визуально восприятие проще, если без MathAbc() от непривычки, а так.. разницы нет. Но мы отвлеклись от темы. Есть какие-н. замечения к моему коду? Ведь вопрос остаётся открытым...
int i;//аналогично i=0while((TimeCurrent()-time)>1){//то заносим старые значения столько раз, сколько было пропущено секунд минус одинif(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
error = GetLastError();//если ошибкаPrint("out: error(",error,"): ",ErrorDescription(error));//записываем её в лог
flag = false;
return;//и выходим
}else{//выдумываем несуществующую свечу (т.к. тика в эту секунду не было)
time++;
FileWriteInteger(hand1e, time, LONG_VALUE);//TimeCurrent()//выбор выдуманной свечи (секунда, при которой тика не было)://прочерк на Close[]/*
FileWriteDouble (hand1e, ask[last.index], DOUBLE_VALUE);//Open[]
FileWriteDouble (hand1e, ask[last.index], DOUBLE_VALUE);//High[]
FileWriteDouble (hand1e, ask[last.index], DOUBLE_VALUE);//Low[]
FileWriteDouble (hand1e, ask[last.index], DOUBLE_VALUE);//Close[]
FileWriteDouble (hand1e, 0, DOUBLE_VALUE);//Volume[]
*///свеча без теней/*
FileWriteDouble (hand1e, bid[0], DOUBLE_VALUE);//Open[]
FileWriteDouble (hand1e, bid[0], DOUBLE_VALUE);//High[]
FileWriteDouble (hand1e, ask[last.index], DOUBLE_VALUE);//Low[]
FileWriteDouble (hand1e, ask[last.index], DOUBLE_VALUE);//Close[]
FileWriteDouble (hand1e, last.index+1, DOUBLE_VALUE);//Volume[]
*///такая же свеча, как и была (не прочерк и не без теней)FileWriteDouble (hand1e, bid[0], DOUBLE_VALUE);//Open[]FileWriteDouble (hand1e, bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]FileWriteDouble (hand1e, ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]FileWriteDouble (hand1e, ask[last.index], DOUBLE_VALUE);//Close[]FileWriteDouble (hand1e, last.index+1, DOUBLE_VALUE);//Volume[]//конец выбораFileFlush (hand1e);
fpos = FileTell (hand1e);//запоминаем позицию записи в файле
}
}
ArrayResize(bid, 1);//урезаем и обнуляем использованные нмассивыArrayResize(ask, 1);
if(flag==true){
if(tick.time.local==true){//если флаг работы с историей поднят
time = TimeLocal();//работаем с локальным временемwhile(time==TimeLocal()){//пока секунда не прошла
bid[i]=MarketInfo(symbol, MODE_BID);//заносим в индикаторный массив данные тиков
ask[i]=MarketInfo(symbol, MODE_ASK);
i++;
}
}else{//иначе
time = TimeCurrent();//работаем с временем сервераwhile(time==TimeCurrent()){//пока секунда не прошла
bid[i]=MarketInfo(symbol, MODE_BID);//заносим в индикаторный массив данные тиков
ask[i]=MarketInfo(symbol, MODE_ASK);
i++;
}
}
}
//Вышли из цикла, т.к. время изменилось. Заносим в файл:if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
error = GetLastError();//если ошибкаPrint("out: error(",error,"): ",ErrorDescription(error));//записываем её в лог
flag = false;
return;//и выходим
}else{
int last.index=ArraySize(ask)-1;
FileWriteInteger(hand1e, time, LONG_VALUE);//TimeCurrent()FileWriteDouble (hand1e, bid[0], DOUBLE_VALUE);//Open[]FileWriteDouble (hand1e, bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]FileWriteDouble (hand1e, ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]FileWriteDouble (hand1e, ask[last.index], DOUBLE_VALUE);//Close[]FileWriteDouble (hand1e, last.index+1, DOUBLE_VALUE);//Volume[]FileFlush (hand1e);
fpos = FileTell (hand1e);//запоминаем позицию записи в файле
}
Замечания по коду.
1. Не стал делать switch-case в выборе виртуальной свечи, чтобы сэкономить процессорное время, вместо этого закомментировал участки с выбором (т.к. выбор делается для конкретных нужд один раз до компиляции).
2. На работу с локальным временем (в оффлайне то есть) до ума не довёл. В цикле "while(time==TimeLocal()){//пока секунда не прошла", так подозреваю, должна быть MarketInfo в FileWriteDouble (по мне, это верх идиотизма). Если подскажите что там логичней будет смотреться, буду благодарен.
3. Авторскую конструкцию
if(flag == true)
{
if(tick.time.local == true)
{
time = TimeLocal();
}
else{
time = TimeCurrent();
}
5. Для оптимизации можно теоретически использовать файловые функции WinAPI и записывать в историю сразу блоком по 44 байта (длина структуры MarketInfo или как её там в .hst).
6. Полностью убрал авторское моделирование времени для записи в ячейку Time[]. По той же причине в головном цикле while нет никакой проверки на TimeLocal(), только на TimeCurrent().
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Так не важно. Я же абсолютное значение возвращаю, по модулю через MathAbs..
Если ищешь точку входа MathAbs() вносит размазанность. По мне надо указывать от и до, чтобы было ясно когда и с каким допуском!
Если ищешь точку входа MathAbs() вносит размазанность. По мне надо указывать от и до, чтобы было ясно когда и с каким допуском!
Исправил... Всё-равно условие ни одно не выполняется.
до returnSign[i] = true; и соответственно до функции VrPr (это функция, которая выводить на экран данные, которые я мониторю)не испольняются. Хотя пересечение вниз уже началось.. Вот на скрине видно, что массив crossDir[] заполняется по мере пересечения каждой быстрой машкой медленную..
Заметь, что 2 машки пересекли самую толстую, и 2 элемента массива уже принчли значение 1. А это значит, что их значение и есть CROSS_DN
А это значит, что должно выполнится условие
if (crossDir[i] == CROSS_DN)
и дальше...
Если ищешь точку входа MathAbs() вносит размазанность. По мне надо указывать от и до, чтобы было ясно когда и с каким допуском!
Еще с кем и почему.
Еще с кем и почему.
Разве что визуально восприятие проще, если без MathAbc() от непривычки, а так.. разницы нет. Но мы отвлеклись от темы. Есть какие-н. замечения к моему коду? Ведь вопрос остаётся открытым...
Нет.
Всем добрый день!
Я тестирую пару USD / JPY в МТ-4 от Альпари.
Загрузил минутную историю USD/JPY
Примечание:После загрузки в архиве котировок минутной истории при двойном щелчке по "1 минута"
в окне Архива котировок в Базе данных список минутных котировок почему-то не появился.
ТФ-1 час.
Все тики
Период 01.01.2000. - 01.01.2013.
В конце тестирования вкладка ОТЧЕТ показывает красную полосу и говорит,что качество моделирования 25%
Я протестировал этот же период с этими же параметрами ......но отдельно по каждому месяцу
и по каждому месяцу - полоса - зеленая и качество моделирования 90%
Затем я протестировал то же период но разбив его на 2 равные части 2000-2006 и 2006-2013.
По каждой части - полоса зеленая и качество моделирования 90%
ВОПРОС
Что нужно сделать,что бы качество тестирования на периоде 13 лет в целом так же было 90%?
Спасибо
Так. Вроде закончил. Вот переделанный сборщик тиков с упаковкой их в секундные свечи.
Было:
Стало:
Замечания по коду.
1. Не стал делать switch-case в выборе виртуальной свечи, чтобы сэкономить процессорное время, вместо этого закомментировал участки с выбором (т.к. выбор делается для конкретных нужд один раз до компиляции).
2. На работу с локальным временем (в оффлайне то есть) до ума не довёл. В цикле "while(time==TimeLocal()){//пока секунда не прошла", так подозреваю, должна быть MarketInfo в FileWriteDouble (по мне, это верх идиотизма). Если подскажите что там логичней будет смотреться, буду благодарен.
3. Авторскую конструкцию
в первый раз я объявил в самом конце init().
4. В начале init() динамические массивы
вместо используемых переменных.
5. Для оптимизации можно теоретически использовать файловые функции WinAPI и записывать в историю сразу блоком по 44 байта (длина структуры MarketInfo или как её там в .hst).
6. Полностью убрал авторское моделирование времени для записи в ячейку Time[]. По той же причине в головном цикле while нет никакой проверки на TimeLocal(), только на TimeCurrent().
7. Что ещё вы предложите для оптимизации кода?