Полезные функции от KimIV - страница 30

 

Кому интересно, посмотрите, что я наваял относительно моды. А я пока на огород, картошку окучивать... вечером буду...

ЗЫ. Я вывел значение, которое встречается в числовом ряду максимальное количество раз.

Файлы:
 
KimIV писал (а) >>

Кому интересно, посмотрите, что я наваял относительно моды. А я пока на огород, картошку окучивать... вечером буду...

ЗЫ. Я вывел значение, которое встречается в числовом ряду максимальное количество раз.

Конечно, интересно, спасибо! Будем тестировать.

 
KimIV писал (а) >>

Кому интересно, посмотрите, что я наваял относительно моды. А я пока на огород, картошку окучивать... вечером буду...

ЗЫ. Я вывел значение, которое встречается в числовом ряду максимальное количество раз.

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

2 Idalgo: 

Если вы занимаетесь статистическим анализом (то чем я интересуюсь в настоящий момент), не хотели бы вы поделится совими мыслями по его применению? Можете создать отдельную ветку. С радостью поддержу тему.


 
sergeev писал (а) >>
Еще рекомендую внести для расчета моды вещественных чисел что-то типа погрешности (или по другому интервала попадания), который можно регулировать и таким образом настраивать точность выборки.

С Вас формулы, рисунки, пояснения, как и что сделать... :-) Надеюсь, Вы понимаете, что вариантов сделать то, что Вы предлагаете существует несколько. Опишите свой вариант.

А на первое время есть параметр d - точность значений числового ряда, количество знаков после запятой.

 

Да, точность значений d это вариант, но в этом случае у нас число прверяется на интервале 10^(-d).


// переменная exact определяет процент отклонения 
// элемента массива от требуемого числа e
// например для 40% exact=1.40; для 0% exact=1.0
int ArraySearchDouble(double& m[][], double e, double exact) 
{
    for (int i=0; i<ArrayRange(m, 0); i++) 
        if (m[i][1]<=e*exact && m[i][1]>=e/exact ) return(i);
    return(-1);
}
 
sergeev писал (а) >>

Да, точность значений d это вариант, но в этом случае у нас число прверяется на интервале 10^(-d).


Для float чисел лучше использовать жестко заданное значение разбега.

f1 + df > f2 > f1 - df ==> f1 == f2. Или использовать нормализацию.

В Вашем коде точно есть проблемы с числами близкими к нулю, а также со ВСЕМИ отрицательными числами.

Пересмотрите код.

 

Да, про отрицательный забыл малехо, спешил.

// переменная exact определяет процент отклонения 
// элемента массива от требуемого числа e
// например для 40% exact=1.40; для 0% exact=1.0
int ArraySearchDouble(double& m[][], double e, double exact) 
{
    for (int i=0; i<ArrayRange(m, 0); i++) 
        if (MathAbs(m[i][1])<=MathAbs(e)*exact && MathAbs(m[i][1])>=MathAbs(e)/exact ) return(i);
    return(-1);
}

Или

 



// переменная dExact определяет величину отклонения
// значения элемента массива от требуемого числа e
// например dExact=0.055
int ArraySearchDouble2(double& m[][], double e, double dExact) 
{
    for (int i=0; i<ArrayRange(m, 0); i++) 
        if (MathAbs(m[i][1])<=MathAbs(e)+dExact && MathAbs(m[i][1])>=MathAbs(e)-dExact) return(i);
    return(-1);
}
 
Здравствуйте Игорь. С удовольствием слежу за развитием ветки. Решил детально разобраться с вашей функцией установки ордера, а точнее с ее блоком
обработки ошибок:
......
      err=GetLastError();
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66);
        if (ExistOrders(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
        Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
        continue;
      }
      mp=MarketInfo(sy, MODE_POINT);
      pa=MarketInfo(sy, MODE_ASK);
      pb=MarketInfo(sy, MODE_BID);
      // Неправильные стопы
      if (err==130) {
        switch (op) {
          case OP_BUYLIMIT:
            if (pp>pa-msl*mp) pp=pa-msl*mp;
            if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
            if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
            break;
          case OP_BUYSTOP:
            if (pp<pa+(msl+1)*mp) pp=pa+(msl+1)*mp;
            if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
            if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
            break;
          case OP_SELLLIMIT:
            if (pp<pb+msl*mp) pp=pb+msl*mp;
            if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
            if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
            break;
          case OP_SELLSTOP:
            if (pp>pb-msl*mp) pp=pb-msl*mp;
            if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
            if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
            break;
        }
        Print("SetOrder(): Скорректированы ценовые уровни");
      }
      Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa,"  Bid=",pb,"  sy=",sy,"  ll=",ll,"  op=",GetNameOP(op),
            "  pp=",pp,"  sl=",sl,"  tp=",tp,"  mn=",mn);
      if (pa==0 && pb==0) Message("SetOrder(): Проверьте в обзоре рынка наличие символа "+sy);
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      // Слишком частые запросы (8) или слишком много запросов (141)
      if (err==8 || err==141) Sleep(1000*100);
      if (err==139 || err==140 || err==148) break;
      // Ожидание освобождения подсистемы торговли
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      // Обнуление даты истечения
      if (err==147) {
        ex=0; continue;
      }
      if (err!=135 && err!=138) Sleep(1000*7.7);
    }
  }
}

У меня возник такой вопрос.

Почему ошибку 131 (ERR_INVALID_TRADE_VOLUME: Неправильный объем) вы обрабатываете при помощи длительной паузы.

Это ошибка или я, что-то не понимаю.

 
ShestkoFF писал (а) >>
Здравствуйте Игорь. С удовольствием слежу за развитием ветки. Решил детально разобраться с вашей функцией установки ордера, а точнее с ее блоком
обработки ошибок:

У меня возник такой вопрос.

Почему ошибку 131 (ERR_INVALID_TRADE_VOLUME: Неправильный объем) вы обрабатываете при помощи длительной паузы.

Это ошибка или я, что-то не понимаю.

Здравствуйте, Василий! Вы совершенно правы! Это моя ошибка по рассеянности. Благодарю, что указали мне на неё. Ошибку 131 следует обрабатывать также, как ошибки 2, 64, 65 и 133, то есть блокировать работу советника.

 
Ну блокировать я бы конечно не стал. Я бы передал наверх эту ошибку и уже там решал, что с ней делать.

Если в этот момент заблокировать работу советника - то возможно останутся открытые позиции этим советником, а это будет катастрофа.