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

 
borisych писал(а) >>

...

3. Здесь под регрессией подразумевается уравнение линейной регрессии и его график.

спрашивали про угол наклона ур.лин регресии. Я показал, что его можно расчитать и по другому. Если нужно то что Вы говорите пунк 3. То смотрите 'Полезные функции от KimIV' там 2 вида функций расчет идет по МНК, если нужен полином большей степени то используйте вот этот алгоритм 'Теория случайных потоков и FOREX'

 

Функция StrTran().

Данная функция выполняет замену подстроки. Заменяются все найденные вхождения. Например, можно одним махом заменить все запятые на точки или наоборот. Функция StrSplit() возвращает результирующую строку и принимает следующие обязательные параметры:

  • str - Строка, в которой выполняется замена подстроки strFrom.
  • strFrom - Заменяемая подстрока. Если подстрока strFrom будет найдена в строке str, то она будет заменена на подстроку strTo.
  • strTo - Заменяющая подстрока.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  описание : Замена подстроки                                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    str     - текстовая строка, в которой производится замена               |
//|    strFrom - заменяемая подстрока                                          |
//|    strTo   - заменяющая подстрока                                          |
//+----------------------------------------------------------------------------+
string StrTran(string str, string strFrom, string strTo) {
  int    n;
  string strOut="", strTemp;

  for (n=0; n<StringLen(str); n++) {
    strTemp=StringSubstr(str, n, StringLen(strFrom));
    if (strTemp==strFrom) {
      strOut=StringConcatenate(strOut, strTo);
      n=n+StringLen(strFrom)-1;
    } else strOut=StringConcatenate(strOut, StringSubstr(str, n, 1));
  }
  return(strOut);
}
 

Примеры использования функции StrTran().

  1. Замена десятичной точки на запятую:
    string s=DoubleToStr(Close[1], Digits);
    Print(s);
    s=StrTran(s, ".", ",");
    Print(s);
  2. Удаление пробелов
    string s="1 2 3 4 5 6 7 8";
    Print(s, " ", StrToInteger(s));
    s=StrTran(s, " ", "");
    Print(s, " ", StrToInteger(s));
  3. Замена слова
    string s="листья жёлтые весной";
    Print(s);
    s=StrTran(s, "весной", "осенью");
    Print(s);

Результаты исполнения примеров:

ЗЫ. Во вложении скрипт для тестирования функции StrTran().

Файлы:
 

Обновлённый список функций:

Файлы:
f_kimiv.rar  12 kb
 
zhuki писал(а) >>
..
Если позволите хочу предложить Функцию которая показывает что либо в ярлыке панели задач .
Я её использую для наблюдения за работой советников на работе не окрывая терминал (много посторонних любопытных глаз).

Я для этих целей в свое время написал отдельную программку - http://www.miraxem.com/rqids.htm


Калькулятор Форекс трейдера автоматически вычисляет текущую прибыль/убыток по открытым позициям и прибыль/убыток, получаемую при частичном закрытии позиции или перевороте.

Котировки и графики реал-тайм по 12 валютным парам

Отображется в виде полоски поверх всех окон и показывает текущую котировку по выбранным валютным парам, пункты прибыли\убытка и календарь новостей с таймером, подающим сигнал перед наступлением важных событий.

 
KimIV писал(а) >>
ааа... ну если в принципе, то можно воспользоваться массивом, передаваемым по ссылке. Тогда количество возвращаемых параметров будет ограничено размером массива.

Ааа... Это как это?

"Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение xl, . . ., xn вычисляется и значение передается функции...."
Пример из хелпа

int start()
  {
   double some_array[4]={0.3, 1.4, 2.5, 3.6};
   double a=linfunc(some_array, 10.5, 8);
   //...
  }
double linfunc(double x[], double a, double b)
  {
   return (a*x[0] + b);
  }
А если попытаться в функции присвоить x[0]=999; то насколько я помню ругается при компиляции.
'x' - array item cannot be assigned

 
KimIV писал(а) >>
[...]
Это торговые операции OP_BUY и OP_SELL, а ордера в моём понимании - это торговые операции OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT и OP_SELLSTOP. Позиции я открываю, а ордера я устанавливаю. А Вы что открывали? Функция NumberOfOrders() предназначена для работы с ордерами.

Вообще-то не должно быть разницы. Должна работать и с позициями.
В функции сравнивается ot
=OrderType();

а OrderType()
"Возвращает тип операции текущего выбранного ордера. Mожет быть одной из следующих величин:
OP_BUY - позиция на покупку,
OP_SELL - позиция на продажу,
...

 
diakin писал(а) >>
Ааа... Это как это?

Я имел в виду буквально следующее:

void start()
{
  double some_array[];
  string st="";
  linfunc(some_array);
  for (int i=0; i<ArraySize(some_array); i++)
  {
    st=StringConcatenate(st, "some_array[", i, "]=", some_array[i], "\n");
  }
  Comment(st);
}
void linfunc(double& x[])
{
  ArrayResize(x, 7);
  for (int i=0; i<ArraySize(x); i++)
  {
    x[i]=0.7*(i+0.1);
  }
}

diakin писал(а) >>
'x' - array item cannot be assigned

вместо:

double linfunc(double x[], double a, double b)

нужно

double linfunc(double& x[], double a, double b)
 
diakin писал(а) >>
Вообще-то не должно быть разницы. Должна работать и с позициями.

Разделение на позиции и ордера искусственное. Оно было придумано мной для моего личного удобства. И основано такое разделение на следующих различиях:

1. У ордера можно изменить цену открытия/установки (OrderOpenPrice()), а у позиции нельзя.

2. Ордер нужно удалять (OrderDelete()), а позицию закрывать (OrderClose()).

3. У ордера можно изменить размер лота (комментарий, магик-номер) без потерь для депозита. Удалить старый ордер и выставить новый с новым размером лота (комментарием, магик-номером). Если такое же проделать с позицией, то будет убыток в размере спрэда, умноженного на размер лота и на стоимость пункта.

4. У ордера есть время жизни, а у позиции - нет.

 
KimIV писал(а) >>

Я имел в виду буквально следующее:

вместо:

нужно

Спасибо! Теперь буду знать, что можно и по ссылке...

Ну вот зачем в хелпе MQL в одном разделе писать, что параметры передаются по значению, а в другом - что " есть возможность передавать по ссылке"....

omg!

Насчет ордеров я дальше прочитал в чем заковыка (>1 && <6), то есть OP_BUY,OP_SELL сюда не входят

Кстати магик-номер через OrderModify() не изменить. Или опять ячто-то пропуcтил? ;-()