Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 14

 
Andrey F. Zelinsky:
здесь немного об этом сказано https://docs.mql4.com/ru/convert/normalizedouble

DoubleToString, IMHO...

Print же. 

 
Andrey F. Zelinsky:
здесь немного об этом сказано https://docs.mql4.com/ru/convert/normalizedouble
Вы не поверите, только изначально все данные, были приведены к нормализации, и после запятой стоял дижис. Я знаю о том что даже дабл значения надо приводить к нормализации. Попробуйте сами статические данные приведенные к нормализации пересчитать, я думаю что это ошибка компилятора, но надеюсь что ошибаюсь, пока что я решил эту проблему ф-цией MathRound, но это не правильно!
 
arhipov-76:
Вы не поверите, только изначально все данные, были приведены к нормализации, и после запятой стоял дижис. Я знаю о том что даже дабл значения надо приводить к нормализации. Попробуйте сами статические данные приведенные к нормализации пересчитать, я думаю что это ошибка компилятора, но надеюсь что ошибаюсь, пока что я решил эту проблему ф-цией MathRound, но это не правильно!

Я не знаю что такое дижис, просто попробуйте функцию DoubleToString(...)

Если вы проводите расчёты с тем, что у вас сейчас считает внутри советника, то расчёты проводятся правильно, даже с NormalizeDouble(), но если вы хотите вывести параметры наружу, к примеру Print, Alert, Comment то используйте нормализацию через DoubleToString(...)

DoubleToString - Преобразование данных - Справочник MQL4
DoubleToString - Преобразование данных - Справочник MQL4
  • docs.mql4.com
DoubleToString - Преобразование данных - Справочник MQL4
 

Как ни нормализуй число 0.0001, оно останется бесконечной периодической дробью в двоичном представлении, поскольку в нем есть деление на 5. В компьютере эту бесконечную дробь приходится обрезать до такой длины, которая помещается. В результате деления на нее получаем снова что-то очень длинное, которое тоже надо обрезать. Для "хорошего" вида полученного числа в десятичной форме надо в программе преобразовать его в строку с заданным подходящим числом дробных цифр. С помощью, например, DoubleToString, как здесь уже писали.

P.S. " результат выводит на одну десятую меньше чем должно быть" -  не было этого, зряшное обвинение. На одну стомиллионную было...

 
Timur1988:

Здравствуйте! Помогите, пжлста, с алгоритмом!
Написал простенький скрипт, вычисляющий коэффициент корреляции Пирсона. Массивы взял по ценам закрытия, начиная с первого бара

Массив цен взят, начиная с первого и заканчивая 24 баром.
Теперь я хочу вычислить корреляцию также за 24 бара, но массив цен взять со ВТОРОГО(!) бара.

Не зная алгоритм, вводил каждый массив цен вручную:

24 бара - запара, а если я хочу узнать корреляцию за 100 баров, то вводить каждый массив замучаешься.
Как быть, люди?)

Наверное, стоит еще поправить вычисление квадратного корня из строки Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w)));

 
Vladimir:

Наверное, стоит еще поправить вычисление квадратного корня из строки Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w)));

Вот рабочая функция по расчёту корреляции, нужно только дать массивы с ценами, и на выходе будет значение:

string Correlation1(double& CurOpen[], double& SubOpen[]) {
double sumXY2=0, sumX2=0, sumY2=0, sumXs2=0, sumYs2=0, res2=1;

int k=MathMin(ArraySize(CurOpen), ArraySize(SubOpen));
  if(k>2) {
   for(int i=0; i<k; i++) {
     sumXY2+=CurOpen[i]*SubOpen[i];
     sumX2 +=CurOpen[i];
     sumY2 +=SubOpen[i];
     sumXs2+=CurOpen[i]*CurOpen[i];
     sumYs2+=SubOpen[i]*SubOpen[i];    
    }
   res2 = (k*sumXY2-sumX2*sumY2) / MathSqrt( (k*sumXs2-sumX2*sumX2)*(k*sumYs2-sumY2*sumY2) );
  }
  return(DoubleToStr(res2,2));
}


 

 
 Здравствуйте! Поставил своего робота на демо счет, второй месяц работает. Сегодня открываю терминал, выставлены два ордера по одному сигналу, хотя до этого выставлялся один ордер. Ограничение на количество  ордеров есть. В чем может быть причина? 
 

 Вот что я использую

 

Вот что я использую

if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Buy<Low[1]&& sar>Close[1])
{SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);}
if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Sell>High[1] && sar<Close[1])
{SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);}


//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//--------------------------------------------------------------------------------//


bool ExistPositions(string sy="", int op=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symb;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if ( OrderMagicNumber()==Magik_number) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 
Neron_76:

 Вот что я использую

 

Циклы нужно в обратном порядке считать, от OrdersTotal()-1 до 0.
 
Vitalie Postolache:
Циклы нужно в обратном порядке считать, от OrdersTotal()-1 до 0.
    Спасибо буду переделывать.
Причина обращения: