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

 

Да вопросов то немерянно...
в смысле они постоянно возникают, НО по обстоятельствам.

По тем функциям что публикуются сейчас пока нет, ибо просто смотрю без "пощупать" в едиторе.
Так-же помимо них есть вопросы по ранним кодам, в частности по трейлингу, который перекликается
с вышенаписанным: как, зачем передавать в функции, например меня озадачил этот участок трейлинга:

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm) PlaySound("expert.wav");
}
Непонятна роль ldStopLoss ...
 

у-у-у... :-) это такая древняя функция. Она была предназначена для изменения уровня стопа открытой ранее позиции или установленного ордера. Была ещё аналогичная функция для тейка. Их обе заменила более совершенная и более функциональная ModifyOrder().

kombat:
Непонятна роль ldStopLoss ...

Это локальная переменная, посредством которой в функцию ModifyStopLoss передаётся ценовой уровень, на который нужно установить StopLoss. Например, вызовем функцию ModifyStopLoss таким образом:

ModifyStopLoss(1,5662);

Тогда локальная переменная ldStopLoss примет значение 1,5662. Это можно проверить таким образом:

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
 
  Print("ldStopLoss=",ldStopLoss);
 
  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm) PlaySound("expert.wav");
}

В протоколе будет такая запись:

<Время> <Эксперт> <Инструмент>,<таймфрейм>: ldStopLoss=1.5662
 
KimIV:

у-у-у... :-) это такая древняя функция. Она была предназначена для изменения уровня стопа открытой ранее позиции или установленного ордера. Была ещё аналогичная функция для тейка. Их обе заменила более совершенная и более функциональная ModifyOrder().


Ну, так вот... древние... (типа смущённо :)))
Бегло прошелся по папкам, самый старый файл датирован 22.01.2006г.
И вроде даж не ковыряный моими криворучками...
Каюсь, простые вещи уже давненько практикую, там цифирь поменять например.
Простенькие вычислялки, и т.д...

Всё началось с просбы на одном приДЦовом форуме советника нписать, но...
Потом вот индикатор выводящий инфу на график понадобился, с него то и пошло-поехало.
Теперь как наркоша, подсел... ;) я что? удобно... всё есть... едитор, и прочее, компактно, переносимо.

Как вспомню первую и последнюю попытку Дельфу 6 поставить... так вздрогну.
До сих пор та пара дисков на полке пылятся... :))) сорри за офтоп.


То есть, то что внутри скобок функции(), это своего рода "форма" для передачи ей неких параметров?


Ибо почему-то в голову втемяшилось обратное: это тот парамер что функция возвращает в результате обработки.
А так-же то, что функция получает параметры для обработки внутри фигурных скобок...{}

void TrPos() {
if (OrderType()==OP_BUY) {
    if ( (Bid-OrderOpenPrice())>TrailingStop*Point) {
      if (OrderStopLoss()<Bid-TrailingStop*Point) {
        ModifyStopLoss(Bid-TrailingStop*Point);
        return;
      }
    }
  }
// в качестве примера !!! просто выдраный кусок кода!

т.е. все эти Bid, Point и прочее и есть входными параметрами.

Видимо дико ошибался... и то, что в скобках() позволяет передать параметры для обработки в функцию,
при этом сама функция может находится в любом (или другом) месте собственно кода скрипта...

Так?

 
Вопрос такои - почему в отличии от OpenPosition, в ModifyOrder нет обработки ошибок? При модификации также бывают самые различные ошибки. Мне как раз хотелось бы отдельно функции Установки, Модификации и Закрытия, и отдельно для всех Блок обработки ошибок - и кода меньше, и писать легче, да и работать будет шустрее... если я в чем то ошибаюсь - поправте..
 
Добрый день, Игорь! На реале (ДЦ Альпари) возникли проблемы использования Ваших советников и скриптов, использующих тралы любых форм. Особенно меня интересует e-News-Lucky$ (для моей системы вообще идеал), e-TFL_v2, Set2StopOrders, e-SotTrailing. На демо работают (тоже Альпари). Сообщения об ошибках не выводятся. Что это может быть? И еще один вопрос. Как в e-News-Lucky$ отключить привязку к времени, чтобы входить и выходить в любое время? Спасибо!
 
ag-forex писал (а):
Добрый день, Игорь! На реале (ДЦ Альпари) возникли проблемы использования Ваших советников и скриптов, использующих тралы любых форм. Особенно меня интересует e-News-Lucky$ (для моей системы вообще идеал), e-TFL_v2, Set2StopOrders, e-SotTrailing. На демо работают (тоже Альпари). Сообщения об ошибках не выводятся. Что это может быть?
Такая проблема уже неоднократно решалась обращением в службу тех.поддержки данного ДЦ.
 
kombat писал (а):
То есть, то что внутри скобок функции(), это своего рода "форма" для передачи ей неких параметров?

Ну да... что-то типа контейнера :-)

kombat писал (а):
Ибо почему-то в голову втемяшилось обратное: это тот парамер что функция возвращает в результате обработки.

То, что функция возвращает, это и есть возвращаемое значение. Приведу простой пример. Определяем функцию сложения двух чисел:

int f(int a, int b) {
  int x;
  x=a+b;
  return(x);
}

Так вот, если мы вызовем эту функцию таким образом:

int y;
y=f(3, 5);

то числа 3 и 5 - это параметры функции f. В качестве параметров функции могут выступать числа, переменные, выражения. Переменные a и b - это локальные переменные, которые принимают значения параметров и дают их функции. Переменная x - это возвращаемое значение функции f, то есть после нашего вызова функции f переменная y примет значение, которое ей передала переменная x, то есть 8.

kombat:

А так-же то, что функция получает параметры для обработки внутри фигурных скобок...{}

void TrPos() {
if (OrderType()==OP_BUY) {
    if ( (Bid-OrderOpenPrice())>TrailingStop*Point) {
      if (OrderStopLoss()<Bid-TrailingStop*Point) {
        ModifyStopLoss(Bid-TrailingStop*Point);
        return;
      }
    }
  }
// в качестве примера !!! просто выдраный кусок кода!

т.е. все эти Bid, Point и прочее и есть входными параметрами.

нет... параметром функции ModifyStopLoss будет значение выражения Bid-TrailingStop*Point.

kombat:

Видимо дико ошибался... и то, что в скобках() позволяет передать параметры для обработки в функцию,
при этом сама функция может находится в любом (или другом) месте собственно кода скрипта...

Так?

да

 
sasa999:
Вопрос такои - почему в отличии от OpenPosition, в ModifyOrder нет обработки ошибок?

Я где-то слышал выражение, что мол правила дорожного движения писались кровью. И лишнего в них нет. За каждым словом стоит чуть ли не чья-то жизнь, потерянная в ДТП.

Я свои функции пишу, сообразуясь со своим опытом, и включаю в них обработку тех ошибок, которые имели место быть в моей практике и без этой обработки никак не обойтись. Максимум "вежливости" (обработки ошибок) я проявляю при попытке входа в рынок. При модификации большинство ошибок устраняется нормализацией цен и несложными проверками значений. Если при самой модификации и возникает какая-то ошибка, то на следующем тике модификация уже проходит нормально. На закрытии то же самое.

 

с какой целю в эту функцию передается рр - цена открытия ордера ?

void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)

цвет тоже как бы уже в самом начале обявлен... test_ModifyOrder.mq4 (12.14 KB) ..почему его неизпользуете, а заново посылаете в функцию

color clModifyBuy = Aqua; // Цвет значка модификации покупки
color clModifySell = Tomato; // Цвет значка модификации продажи
в чем преимущество
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
pp=NormalizeDouble(pp, dg);

перед короткой формой

pp=NormalizeDouble(pp, Digits);

для чего надо нормализовать OrderOpenPrice()? разве оно не в таком формате каk в ордере?

op=NormalizeDouble(OrderOpenPrice() , dg);
пока незамечал ошыбки если при модификации вставлять обратно то же самое. так же с OrderStopLoss(), и OrderTakeProfit()
 
sasa999:

с какой целю в эту функцию передается рр - цена открытия ордера ?

void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)

С целью перемещения ордеров OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT и OP_SELSTOP.

sasa999:

цвет тоже как бы уже в самом начале обявлен... test_ModifyOrder.mq4 (12.14 KB) ..почему его неизпользуете, а заново посылаете в функцию

color clModifyBuy = Aqua; // Цвет значка модификации покупки
color clModifySell = Tomato; // Цвет значка модификации продажи

Спасибо! Буду использовать!

sasa999:
в чем преимущество
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
pp=NormalizeDouble(pp, dg);

перед короткой формой

pp=NormalizeDouble(pp, Digits);

в универсальности, которая позволяет работать советнику с позициями и ордерами не только текущего инструмента, но и с другими. Например, советник работает на графике EURUSD. Вариант с Digits не позволит работать с позициями, открытыми на USDJPY.

sasa999:

для чего надо нормализовать OrderOpenPrice()? разве оно не в таком формате каk в ордере?

op=NormalizeDouble(OrderOpenPrice() , dg);

Для того, чтобы успешно сравнивать значения типа double. Если не нормализовать, то сравнивать нельзя, вернее бессмысленно.

sasa999:
незамечал ошыбки если при модификации вставлять обратно то же самое. так же с OrderStopLoss(), и OrderTakeProfit()
Без нормализации в функции возникают ошибки 1 (OrderModify пытается изменить уже установленные значения такими же значениями.)
Причина обращения: