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

 
Уважаемый Игорь! Извиняюсь, если кого-то обидел... На самом деле я не критиковал, жаль, что это так выглядит. В любом случае, выложенный прототип ещё не раз будет корректироваться и уточняться. Чтобы не было головомоек (на авторство я никогда не претендовал) в дальнейшем буду присылать Вам труд на авторскую правку. Для себя первым этапом вижу пока 25 страниц. Как закончу - пришлю на адрес, указанный на Вашем сайте. Спасибо за бесценный труд и бескорыстный обмен опытом!!!
 
rid писал (а) >>

Думаю, что возможно. Надо, видимо, на каждом уровне (при пересечении) проверять, - какой текущий размер лота у открытой позиции. И именно по этому критерию реализовать механизм закрытия !

Такие фунции (возвращают размер лота) есть в этой ветке. Посмотрите стр. 17 и 27

Очень вам благодарен ! Ура !Теперь я смогу двигаться дальше.Большое спасибо !

 

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

double ll=GetSizeLot();

может я пропустил.

Если рассчитывается вот так https://championship.mql5.com/2012/ru/news, то можно нарваться на 134 ошибку и допустим пролететь с чемпионатом :-)

 

Привет KimIV.отправлял одну вещь придется обратно писать. Короче в программировании бум-бум я. и вообще на трейдера учусь 3 неделю. грамматика тоже храмает.

вот. Вопрос такой.  Можно ли по индикатору CCi сделать советник? ча напишу какой и покажу.

Уровни CCi 250, 50, -50, -250. Смысл в том, чтоб допустим при достижении(пересекании) -50 и 50 соответственно, совершалась продажа и покупка соответствеено. Рассмотрим когда сделка должна прекратьтся:

1Тогда, когда (допустим идет продажа) график пересечев -250, пересекает в обратном направлении -250(на картинке видно)

2 График не достигнув -250 пересекает обратно -50

Для покупки то-же самое только наоборот.

Катировка Евро/Доллар, тайм фрейм любой.

Сколько будет стоить такой плюшевый советник????

Может за такую же цену можете предложить что-то получше???

Заранее спасибо. Надеюсь отправится. Ну а я пошел на курсы по FOREX.

Кстати, на forex е реально зарабатывать на хлеб с маслом????

 

Приветствую всех.

Вот нашел индикатор, изменил немного - строит неплохие трендовые.

Интересно было бы состряпать функцию... (это типа просьбы то KimIV).

Файлы:
tlbs.mq4  8 kb
 
Prival писал(а) >>

По поводу

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

Может лучше вызывать вот так OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44);

Данное предложение, Сергей, повышает удобство при пользовании стопов и тейков, задаваемых в пунктах. А как быть, в случаях, когда стопы и тейки задаются ценовыми уровнями? Например, стоп по хаю или лоу предыдущего бара. Или там по линии какой-нибудь. Переводить в пункты перед вызовом функции, а внутри функции обратно в цены? Это лишние операции. Так что я оставлю как есть.

Функцию GetSizeLot() рассмотрим позднее (кстати, она теперь у меня называется GetLots()). Сначала надо закончить с библиотеками b-ForTest.mqh и b-Positions.mqh

 

Функция CountOrders() для тестера.

В моих тестовых (предназначенных для использования исключительно в тестере МТ4) версиях советников функция CountOrders() заменяет следующие функции: ExistOrders(), ExistPositions(), NumberOfOrders() и NumberOfPositions(). То есть она может дать информацию о существовании позиции или ордера любого типа, а также сведения о количестве торговых операций каждого типа. Подобная замена имеет свои преимущества, которая выражается в однократном на один тик обращении к базе ордеров и получении всей необходимой информации за раз. А вышеупомянутые функции, особенно при использовании в комплексе, каждая самостоятельно работает с одной и той же базой ордеров и поэтому многократно выполняют одни и те же обращения. В итоге функция CountOrders() позволяет на несколько секунд уменьшить время одного прохода, что даёт часы экономии при оптимизациях.

Функция CountOrders() принимает следующие параметры:

  • mo - Массив количества ордеров по типам. После отработки функции массив будет иметь 6 (шесть) элементов. Нулевой элемент - количество торговых операций типа Buy, первый элемент - количество Sell, второй - BuyLimit, третий - SellLimit, четвёртый - BuyStop, пятый - SellStop.
  • mn - Идентификатор позиции или ордеров (MagicNumber). Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 03.08.2008                                                     |
//|  Описание : Рассчитывает количество ордеров по типам.                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mo - массив количества ордеров по типам                                 |
//|    mn - MagicNumber                          (-1 - любой магик)            |
//+----------------------------------------------------------------------------+
void CountOrders(int& mo[], int mn=-1) {
  int i, k=OrdersTotal();

  if (ArraySize(mo)!=6) ArrayResize(mo, 6);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (mn<0 || OrderMagicNumber()==mn) mo[OrderType()]++;
    }
  }
}

P.S. Во вложении скрипт для тестирования функции CountOrders() в онлайне.

Файлы:
 

Добрый день, Игорь и всем тоже. Возникла проблема при использовании функции GetFractalBar(NULL,0, 0). - Возвращает номер бара фрактала по его номеру. Точнее, проблема не с функцией. А где то рядом.

При отображении комментария вот при таком задании всё нормально. ЕСТЬ номер бара в углу графика.

int a;
... ...

int start()
  {
//----
if(Time[0] == prevtime)   return(0);//ждём нового бара
   prevtime = Time[0];//если появился новый бар , включаемся

if (isFractalUp() > isFractalDn() )  {//если это Down-фрактал

   a = iLow(NULL,0,GetFractalBar(NULL,0, 0));
   
Comment(GetFractalBar(NULL,0, 0));            }

И при таком вот - тоже всё норм. Отображаются в лев. углу мин. ценовые значения бара с фракталом.

if (isFractalUp() > isFractalDn() ) {//если это Down-фрактал
   a = iLow(NULL,0,GetFractalBar(NULL,0, 0));

Comment(iLow(NULL,0,GetFractalBar(NULL,0, 0)));          }

Но далее вообще непонятно ! Как только я вставляю в коммент вместо самой функции переменную "а", то коммент вместо ценового значения возвращает мне в углу единицу ! Вот тут :

if (isFractalUp() < isFractalDn() ) {
   a = iLow(NULL,0,GetFractalBar(NULL,0, 0));
   Comment(a);                        }
Третий час сижу, не пойму в чем дело! Пож, подскажите, кто может....
 
Rita писал(а) >>
Как только я вставляю в коммент вместо самой функции переменную "а", то коммент вместо ценового значения возвращает мне в углу единицу !

У Вас переменная "а" объявлена, как целочисленная, то есть:

int a;

А надо объявить, как вещественную, то есть:

double a;

 

Функция ModifyOrder() для тестера.

Это облегчённый вариант функции ModifyOrder(), опубликованной на странице 7, и предназначенной для изменения абсолютных ценовых уровней одного предварительно выбранного ордера или позиции.

Функция ModifyOrder() принимает следующие параметры:

  • pp - Цена установки ордера. Если передать значение меньше или равное нулю, то модификация данного ценового уровня выполнена не будет. Значение по умолчанию -1.
  • sl - Ценовой уровень стопа. Если передать значение меньше нуля, то модификация данного ценового уровня выполнена не будет. Значение по умолчанию 0.
  • tp - Ценовой уровень тейка. Если передать значение меньше нуля, то модификация данного ценового уровня выполнена не будет. Значение по умолчанию 0.
  • ex - Дата истечения отложенного ордера. Значение по умолчанию 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);

  if (pp!=op || sl!=os || tp!=ot) {
    if (MathMod(OrderType(), 2)==0) cl=clModifyBuy; else cl=clModifySell;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(",er,") modifying order: ",ErrorDescription(er));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
    }
  }
}
Причина обращения: