[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 276

Alexey Subbotin
4970
Alexey Subbotin  
rid >>:

При использовании (вызове) функции из этих файлов (уже изначально заложенных в мт4) мы, в случае некорректоной работы советника можем в журнале видеть номер ошибки, допущенной нами в коде .

Например, вызываем ф-ю GetLastError() :

В данном случае, если нами допущена в коде ошибка или мы неправильно задаем внешние параметры, - в журнале будет указываться номер этой ошибки.

Например, - 130.

А расшифровку номера можно глянуть на страничке -https://book.mql4.com/ru/appendix/errors

И нам уже не нужно будет перелопачивать весь код, т.к. мы по этому номеру уже знаем - где именно допущена ошибка !

Немного подправлю: функция GetLastError вызывается и без заголовочного файла, а вот для получения описания ошибки без ползания по сайтам уже нужно подключать библиотеку:

#include <stderr.mqh>
#include <stdlib.mqh>

...
Print("Ошибка открытия ордера BUY #", ErrorDescription(GetLastError()));
...
Xenia
421
Xenia  
rid писал(а) >>

Вы неправильно вызвали функцию .

У вас она вызвана вот так : if (NumberOfPositions(NULL,Magic)> 1)

А надо вот так :


Почувствуйте разницу (вы пропустили "-1") ! и ИСПРАВьТЕ ВАШ КОД.

А для контроля можно вывести на график коммент. Например, вот такой (В самом начале функцмм СТАРТ)

Что же касается вашего второго условия, то я бы ("не мудрствуя лукаво") задал бы для открытия позиций по второму условию другой магик и отдельную функцию Open_Buy_2() !

Тогда код второго условия выглядел бы так :

rid,

Спасибо, ошибку поправила, так же стало понятно, почему не срабатывает второе условие, наверно я задачу объяснила не корректно:

Нужно что бы советник отличал, были ли в принципе открыты им ордера или нет, даже если эти ордера давно закрыты . NumberOfPositions работает, но он считает количество текущих открытых позиций, если позиция закрыта – то значение соответственно нуль. (поэтому и не срабатывает)

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

Можно ли так настроить функцию?

alderru
117
alderru  

Скажите, пожалуйста, что показывает функция iTime.

Что это за абра-кадабра из 10 цифр? Секунды?

Как бы их перевести в год-месяц-день-час-минута.

Rid
3170
Rid  

Понятно. Определить, были ли позиции на истории можно вот так:

  for (int i=0; i< OrdersTotal(); i++)                          {
    if (!(OrderSelect(i, SELECT_BY_POS,MODE_HISTORY ))) continue;
//выбираем из истории счета
    if (OrderSymbol() != Symbol()) continue;    
     if ( OrderMagicNumber()==Magic)                            {
              позиции = true;
                                                             }}
                  



Но тогда ваш код будет работать только в тестере. Т.к. вам иначе в онлайне придется при каждом включении советника менять магик.

Видимо, вам нужно задать время, за которое берется история счета.

Т.е. когда была открыта/закрыта последняя сделка с заданным магиком? Полгода назад или сутки назад?

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


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }}}}} }  return(iBarShift(sy, tf, t, True));}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара закрытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) t=OrderCloseTime();
            } } }} }  }  return(iBarShift(sy, tf, t, True));}

Для примера. Я использовал в своем коде эти функции так:
//======================================================================
// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 1440,-1, Magic)==0 
     ||  NumberOfBarCloseLastPos(NULL, 1440,-1, Magic)==0 )
    Trade=false;       else Trade=true;
//================================================================

Или вот так:
//======================================================================
// запрет торговли  , если за последние 85 баров графика Н1
//т.е. за посл.85 часов)уже были открыты   позиции  или
// закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 60,-1, Magic)<=85 
     ||  NumberOfBarCloseLastPos(NULL,60,-1, Magic)<=85 )
    Trade=false;       else Trade=true;
arkadiy
8
arkadiy  
Господа! помогите. как правильно прописать код чтоб выводилось сообщение. что закрытая последняя свеча белая(вверх) или черная(вниз). я понимаю что это бессмыслица но все-таки.....

Morok
8
Morok  

Хмм.мучаюсь с той же простой проблемой..открывает море позиций а нужно всего 1 не более и когда закрывается buy и наступает сигнал открывать селл... Большая просьба подскажи и исправь что не так.в коде ниже.. И где нужно прописать магик? Сделай если тебе не трудно тупой тестовый пример Чтобы при пересечении вверх бай(не более 1 ордера) и вниз селл тоже не более 1. Я думаю это сразу решит вопросы многих новичков. Заранее спасибо

//---- input parameters
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   
   int ticket;
  if (NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1>Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
   if (NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1<Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
   return(0);
  }

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);
}
alderru
117
alderru  

Ещё один дурацкий вопрос:

- Как обьявить массив, число элементов которого задаётся внешней переменной.

Rid
3170
Rid  
chaynik_1 >>:
Господа! помогите. как правильно прописать код чтоб выводилось сообщение. что закрытая последняя свеча белая(вверх) или черная(вниз). я понимаю что это бессмыслица но все-таки.....

Вот так примерно - 

if ((Open[1]-Close[1])<0  ) Comment ("1 свеча =  бычья");
JDA
481
JDA  
alderru >>:

Ещё один дурацкий вопрос:

- Как обьявить массив, число элементов которого задаётся внешней переменной.

https://docs.mql4.com/ru/array/ArrayResize

Rid
3170
Rid  
morok >>:

Хмм.мучаюсь с той же простой проблемой..открывает море позиций а нужно всего 1 не более и когда закрывается buy и наступает сигнал открывать селл... Большая просьба подскажи и исправь что не так.в коде ниже.. И где нужно прописать магик? Сделай если тебе не трудно тупой тестовый пример Чтобы при пересечении вверх бай(не более 1 ордера) и вниз селл тоже не более 1. Я думаю это сразу решит вопросы многих новичков. Заранее спасибо

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

(внимательнее нужно задавать значения ф-и NumberOfPositions(), ведь не зря в шапке указано:

/| Описание : | Описание : Возвращает количество позиций.  
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+

extern int       Magic=5675;
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);   
   int ticket;
//------------------------------------------------
 if (NumberOfPositions(NULL,OP_BUY,Magic)< 1 && Ema_1>Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   if (NumberOfPositions(NULL,OP_SELL,Magic)< 1 && Ema_1<Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

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);
}