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

 
Уважаемый Игорь! Возможно ли в Вашем советнике e-CloseByPercentProfit.mq4 сделать дополнение чтобы он выставлял TP и SL на ту пару на графике которой он установлен.Это необходимо так как очень часто бывают разрывы связи с интернетом.
 

Добрый день всем.

Вопрос по функции 


//+------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                        |
//|  Описание : Возвращает количество позиций.      |
//+------------------------------------------------------------------+

int NumberOfPositions(string sy="", int op=-1, int mn=-1){
  int i, k=OrdersTotal(), kp=0;  if (sy=="0") sy=Symbol();
  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 (mn<0 || OrderMagicNumber()==mn) kp++;
          }}}}}  return(kp);}  
          

У меня мультивалютный совентник. Пары задаются во внешних параметрах. Со своим магиком (по каждой паре).

Среди условий входа по каждому инструменту присутствует вот такое:
if ( NumberOfPositions(Symbol_1, -1,Magic_1)<1){//если нет открытых
//позиций по 1-му инструменту, 
ИЛИ (для второй пары)
if ( NumberOfPositions(Symbol_2, -1,Magic_2)<1){//если нет открытых
//позиций по 2-му инструменту, проверяем ОСТАЛЬНЫЕ условия

Случилось так, что  я вчера оба символа зарядила - EURUSD,  и утром обнаружила, что открылась только одна  сделка, хотя, вроде бы, сигналы были в обоих случаях.

И тут мне пришло в голову. Что функция 

NumberOfPositions(string sy="", int op=-1, int mn=-1)
Сначала проверяет наличие открытой позиции по символу. А уж потом всё остальное.

Иначе говоря, если уже есть открытая позиция (этим советником) по инструменту EIRUSD, то вторая позиция, даже с другим магиком , по иному алгоритму - уже не откроется?

Скажите, пож., это так или нет ?

Или я ошибаюсь в своих рассуждениях?, - и функция оценивает все заданные критерии "суммарно", а не по очереди...

 

 

Часто использую эту функцию, возвращает все согласно входным параметрам. Перебираемые функцией позиции последовательно сортируются по параметрам. Да сами посмотрите.

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  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 (mn<0 || OrderMagicNumber()==mn) kp++; //внутри магика, и только здесь позиция учтена 
          }
        }
      }
    }
  }
  return(kp);
}
 

Т.е., это означает, что у меня советник не сможет открыть вторую позицию EURUSD, даже с другим магиком, пока открыта первая позиция ?

Видимо, так. Потому, что даже в тестере вроде бы не видно пересекающихся позиций. 

//--------------------------------------------------------

 
Rita >>:

Т.е., это означает, что у меня советник не сможет открыть вторую позицию EURUSD, даже с другим магиком, пока открыта первая позиция ?...

С точностью до наоборот :)) Это означает, что функция отдельно считает Ваши символы и магики. То есть, если открыта позиция по EURUSD c Magic_1 то NumberOfPositions("EURUSD", -1, Magic_2)==0;, конечно, если не существует еще одной позиции на EURUSD с Magic_2.

В общем виде функция считает открытые позиции по принципу (sy && op && mn), т.е. будут сосчитаны позиции, именно с этими параметрами. Несовпадение хотя бы одного параметра приведет к неучету ордера, функция его не увидит.

Выведите в Comment значения функций и Вы в реальном времени будете отслеживать количество ордеров и правильность работы функции. Скорее всего причина неправильной работы алгоритма находится в коде советника.

 
Ок. Я сейчас проверю код.
 
hope писал(а) >>

Добавление привязки к символу в вызове функции не помогает. Почему он считает профит для каждой позиции отдельно (рисунок выше)?

Не-е, я лучше предложу Вам свой рисунок...

...и скрипт...

 
KimIV писал(а) >>

Не-е, я лучше предложу Вам свой рисунок...

...и скрипт...

Понял, что "сам дурак"... Сплюсовав говядину и молоко, вымя получить не удастся...

 
KimIV писал(а) >>
Angela, компилятор не ожидал именно в этом месте встретить определение моей функции. Это значит, что где-то выше по коду у Вас чего-то нет. Может быть точки с запятой или закрывающей фигурной скобки. Вообщем, проверяйте внимательно код.

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

 
e-News-Lucky$.mq4

Lucky$ & KimIV

http://www.kimiv.ru

Здравствуйте, Игорь!

Пользуюсь Вашим советником, - очень хороший, вчера хотел прикрутить индикатор через iCustom, но он его не видит, как в него прописывать через iCustom индикаторы? Что интересно встроенные функции типа iHigh, iLow видит без проблем, а по индикатору ни в какую не хочет выставлять отложки, я уже голову сломал в чем может быть проблема?

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

Если будет время конечно, спасибо..

//глобальные переменные

double Hi_Bar;
double Lou_Bar;

//+------------------------------------------------------------------+
//| Установка ордеров                                                |
//+------------------------------------------------------------------+
void SetOrders() {
  Hi_Bar  = iHigh(Symbol(), PERIOD_D1, 0);
  Lou_Bar =  iLow(Symbol(), PERIOD_D1, 0);
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk=Hi_Bar+(DistanceSet+spr)*Point;
  double pBid=Lou_Bar-DistanceSet*Point;


Причина обращения: