[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 284

 
hoz:
Так не важно. Я же абсолютное значение возвращаю, по модулю через MathAbs..


Если ищешь точку входа MathAbs() вносит размазанность. По мне надо указывать от и до, чтобы было ясно когда и с каким допуском! 
 
borilunad:

Если ищешь точку входа 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

А это значит, что должно выполнится условие  

 if (crossDir[i] == CROSS_DN)

и дальше...

 
borilunad:

Если ищешь точку входа MathAbs() вносит размазанность. По мне надо указывать от и до, чтобы было ясно когда и с каким допуском! 

Еще с кем и почему. 
 
tara:

Еще с кем и почему. 

Разве что визуально восприятие проще, если без MathAbc() от непривычки, а так.. разницы нет. Но мы отвлеклись от темы. Есть какие-н. замечения к моему коду? Ведь вопрос остаётся открытым...
 
У меня нет замечаний к коду. 
 
Тогда почему условие не выполняется? К логике замечание есть?
 

Нет. 

 
Мда. Утро вечера мудреннее, надеюсь завтра что-н. проясниться.
 

Всем добрый день!

Я тестирую пару USD / JPY в МТ-4 от Альпари.

Загрузил минутную историю USD/JPY

Примечание:После загрузки в архиве котировок минутной истории  при двойном щелчке по "1 минута"

в окне Архива котировок в Базе данных список минутных котировок почему-то не появился.


ТФ-1 час.

Все тики

Период 01.01.2000. - 01.01.2013.

В конце тестирования вкладка ОТЧЕТ показывает красную полосу и говорит,что качество моделирования 25%

Я протестировал этот же период с этими же параметрами ......но отдельно по каждому месяцу

и по каждому месяцу - полоса - зеленая и качество моделирования 90%

Затем я протестировал то же период но разбив его на 2 равные части 2000-2006 и 2006-2013.

По каждой части - полоса зеленая и качество моделирования 90%


ВОПРОС

Что нужно сделать,что бы качество тестирования на периоде 13 лет в целом так же было 90%?

Спасибо

 

Так. Вроде закончил. Вот переделанный сборщик тиков с упаковкой их в секундные свечи.

 Было:

int start()
  {  
//----
if(flag == true)
  {
  if(tick.time.local == true)
    {
    time = TimeLocal();
    }
    else{
    time = TimeCurrent();
    }
  if(t < time)
    { 
         t = time; 
    }
    else{ 
         t ++;
    }   

  if(FileSeek(hand1e, fpos, SEEK_SET) == false)
           { 
           error = GetLastError();
           Print("out: error(",error,"): ",ErrorDescription(error));
           flag = false;
           return;
           }
           else{
           bid = MarketInfo(symbol, MODE_BID);
           ask = MarketInfo(symbol, MODE_ASK);
           
                FileWriteInteger(hand1e,    t,   LONG_VALUE);            
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);          
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);            
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);    
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);                            
                FileWriteDouble (hand1e, time, DOUBLE_VALUE);                   
      FileFlush       (hand1e);  

      fpos = FileTell (hand1e);

 Стало:

int i;//аналогично i=0
        while((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();
    }

 в первый раз я объявил в самом конце init().

4.  В начале init() динамические массивы

   IndicatorBuffers(2);
   SetIndexBuffer(0, bid);
   SetIndexBuffer(1, ask);

 вместо используемых переменных.

 5. Для оптимизации можно теоретически использовать файловые функции WinAPI и записывать в историю сразу блоком по 44 байта (длина структуры MarketInfo или как её там в .hst).

6. Полностью убрал авторское моделирование времени для записи в ячейку Time[]. По той же причине в головном цикле while нет никакой проверки на TimeLocal(), только на TimeCurrent().

7. Что ещё вы предложите для оптимизации кода?