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

 

В функции https://forum.mql4.com/ru/38949/page5#434241 ошибка.

Надо так

double PriceOpenNearPos(string sy="", int op=-1, int mn=-1) {
  double mi, oop=0, p;
  int    i, k=OrdersTotal(), pp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderType()==OP_BUY)  mi=MarketInfo(OrderSymbol(), MODE_ASK);
            if (OrderType()==OP_SELL) mi=MarketInfo(OrderSymbol(), MODE_BID);
            p=MarketInfo(OrderSymbol(), MODE_POINT);
            if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
            if (pp==0 || pp>MathAbs(OrderOpenPrice()-mi)/p) {
              pp=MathAbs(OrderOpenPrice()-mi)/p;
              oop=OrderOpenPrice();
              if(pp==0) break;
            }
          }
        }
      }
    }
  }
  return(oop); 

} 

Просьба перезалить. 

 

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

При исправлении советников (в связи с обновлениями MQL)  обнаружилось, что многие функции Игоря Кима перестали работать. В т.ч. самые востребуемые. Например, 

NumberOfPositions - Возвращает количество позиций.

 ExistPositions - Возвращает флаг существования позиций

Еще функция, я вчера упоминала в ветке: Функция NumberOfBarCloseLastPos().
Эта функция возвращает номер бара закрытия последней позиции 

Вывожу на график тестера  комментарий и видно, что функции всё время возвращают постоянные значения (-1 и/или 0), несмотря на наличие  сделок (текущих, закрытых). И советник, словно не видит в своем коде   условия заданные этими функциями.

Кроме того, перестали работать так наз. "исполняемые" функции, например набор функций по закрытию позиций: ClosePosBySelect (Закрывает одну предварительно выбранную позицию) и сопуствующие:
ClosePositions - Закрытие позиций по рыночной цене и проч.

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

 
Rita:

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

При исправлении советников (в связи с обновлениями MQL)  обнаружилось, что многие функции Игоря Кима перестали работать. В т.ч. самые востребуемые. Например, 

NumberOfPositions - Возвращает количество позиций.

 ExistPositions - Возвращает флаг существования позиций

Еще функция, я вчера упоминала в ветке: Функция NumberOfBarCloseLastPos().
Эта функция возвращает номер бара закрытия последней позиции 

Вывожу на график тестера  комментарий и видно, что функции всё время возвращают постоянные значения (-1 и/или 0), несмотря на наличие  сделок (текущих, закрытых). И советник, словно не видит в своем коде   условия заданные этими функциями.

Кроме того, перестали работать так наз. "исполняемые" функции, например набор функций по закрытию позиций: ClosePosBySelect (Закрывает одну предварительно выбранную позицию) и сопуствующие:
ClosePositions - Закрытие позиций по рыночной цене и проч.

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

 

NumberOfPositions() у меня нормально работает! Правда, я продолжаю работать с MQL4 без плюсов! Если Вы пишите на обновлённом языке, тогда, наверно, всё нужно подгонять под него или обращаться во Фриланс! Сейчас всё коммерцилизируется со страшной силой! Искренне Вам сочувствую!

Если сможете как-то подогнать NumberOfPositions(), то ExistPositions() и не нужен! Сделаете проверку так:

if(NumberOfPositions() > 0) //вместо if(ExistPositions() == true)
----------------------------//или
if(NumberOfPositions() == 0)//вместо if(ExistPositions() == false)

Удачи!

 
borilunad:

NumberOfPositions() у меня нормально работает! Правда, я продолжаю работать с MQL4 без плюсов! Если Вы пишите на обновлённом языке, тогда, наверно, всё нужно подгонять под него или обращаться во Фриланс! Сейчас всё коммерцилизируется со страшной силой! !

 

 

Нечасто здесь бываю, поэтому не знаю, то значит " MQL4 без плюсов"?

Вы считаете, что те, кто может здесь ответить, не делают этого, чтобы принудить посетителя заплатить за ответ на несложный вопрос на фрилансе?

 Интересно, и в какую же сумму оценили бы местные программеры-коммерсанты исправление  такой функции И.Кима для работы в посл.версии мт4  с обновленным MQL:

//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
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);
}
Напомню, что при выводе  Comment( NumberOfPositions(NULL, -1, Magic) ); видно, - что  постоянно возвращается -1 даже при наличии откр. советником позиций.
 
Rita:

Нечасто здесь бываю, поэтому не знаю, то значит " MQL4 без плюсов"?

Вы считаете, что те, кто может здесь ответить, не делают этого, чтобы принудить посетителя заплатить за ответ на несложный вопрос на фрилансе?

 Интересно, и в какую же сумму оценили бы местные программеры-коммерсанты исправление  такой функции И.Кима для работы в посл.версии мт4  с обновленным MQL:

Напомню, что при выводе  Comment( NumberOfPositions(NULL, -1, Magic) ); видно, - что  постоянно возвращается -1 даже при наличии откр. советником позиций.

 

NULL в качестве параметра функции обозначает отсутствие параметров.

Так лучше будет) Comment( NumberOfPositions(Symbol(), -1, Magic) ); 

 
Rita:

Нечасто здесь бываю, поэтому не знаю, то значит " MQL4 без плюсов"?

Вы считаете, что те, кто может здесь ответить, не делают этого, чтобы принудить посетителя заплатить за ответ на несложный вопрос на фрилансе?

 Интересно, и в какую же сумму оценили бы программеры-коммерсанты исправление  такой функции:

Напомню, что при выводе  Comment( NumberOfPositions(NULL, -1, Magic) ); видно, - постоянно возвращается -1 даже при наличии откр. советником позиций.

 

MQL4++ обновлённый, как тут его называют!

У меня та же функция выдаёт корректное число позиций! Но у Вас ошибка в Comment()! Уверен, что  функция работает!

Попробуйте так: 

int start()// или что у Вас там, как в обновлённом MQL4


  int BuyPos = NumberOfPositions(Symbol(),OP_BUY, Magic); //это вызов этой функции, чтобы знать, сколько у Вас баев
  int SellPos = NumberOfPositions(Symbol(),OP_SELL,Magic);//а это для селлов



  Comment("Buy ",BuyPos," Sell ",SellPos);

Так увидете на графике всё точно, переменные BuyPos и SellPos применяйте для проверок в условиях! Смотрите, как у меня:

      if(BuyPos == 0 && SellPos == 0) 
      {
// и так далее ...

Удачи!

 

Благодарю, borilunad и vadynik, за подсказку!

Действительно, заработала функция!  Вот вам скромный подарочек за полезный совет: https://www.youtube.com/watch?v=SFJeHI2LVX4&feature=related !

 
borilunad:

 Сейчас всё коммерцилизируется со страшной силой! Искренне Вам сочувствую!

Борис, тебе не стыдно такое заявлять? Посчитай-ка сколько страниц исписали в попытках тебе помочь. И это твоя благодарность всем тем кто тебе помогал? Всех не помню, но Артём (artmedia70) по доброте души с твоей проблемой нянчился и в ответ попал туда-же...
 
Rita:

Вот альтернатива. Функция вызывается только если количество ордеров изменилось. Дополнительно можно вызвать если тип ордера изменился. 

// переменные глобального уровня
int Total[6];
int ot;

void OnTick()
{
 if(ot != OrdersTotal())
  CountTrades();

  Comment("Ордеров BUY ", Total[OP_BUY], "\n"
        , "Ордеров SELL ", Total[OP_SELL], "\n"
        , "Ордеров BUYLIMIT ", Total[OP_BUYLIMIT], "\n"
        , "Ордеров SELLLIMIT ", Total[OP_SELLLIMIT], "\n"
        , "Ордеров BUYSTOP ", Total[OP_BUYSTOP], "\n"
        , "Ордеров SELLSTOP ", Total[OP_SELLSTOP], "\n"
}
void CountTrades()
{/*********************Подсчёт открытых ордеров**********************/
  ArrayInitialize(Total, 0);
           int type, total = OrdersTotal(); ot = 0;
            for(int i = 0; i < total; i++)
             {
              if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
                type = OrderType();
                 Total[type] += 1;
                ot++;
               }
             }
}/*******************************************************************/
 
Rita:

Благодарю, borilunad и vadynik, за подсказку!

Действительно, заработала функция!  Вот вам скромный подарочек за полезный совет: https://www.youtube.com/watch?v=SFJeHI2LVX4&feature=related !

Спасибо! Только предложенная Вам следом другая функция может заглючить у Вас, т.к. написана на MQL4++!