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

 

Вопрос можно.

как получить число без минуса, если окажется что Open[1] < Close[1] и при вычитании Open[1]-Close[1] я получу значение с минусом, как сделать что бы было всегда положительное значение, мне нужно высчитать расстояние между Open и Close может есть другой способ?

Спасибо.

 
Martingeil >>:

Вопрос можно.

как получить число без минуса, если окажется что Open[1] < Close[1] и при вычитании Open[1]-Close[1] я получу значение с минусом, как сделать что бы было всегда положительное значение, мне нужно высчитать расстояние между Open и Close может есть другой способ?

Спасибо.

https://docs.mql4.com/ru/math/MathAbs

 

;) Спасибо!

 

Добрый день!

При написании советника для МТ4 – возникла необходимость определять программно (т.е в коде самого советника) был ли открыт хотя бы один ордер этого советника – или нет. Подскажите, есть ли такая функция? Возможно, если есть она выглядела бы как-то так:

Bool (был ли открыт ордер советника с этим магическим номером)

{ответ = True/False}

?

Спецы - помогите пожалуйста, – сами уже голову сломали

P.S. – пробовали вариант с учетом номеров ордеров – не прокатило

 
waitra >>:

Добрый день!

При написании советника для МТ4 – возникла необходимость определять программно (т.е в коде самого советника) был ли открыт хотя бы один ордер этого советника – или нет. Подскажите, есть ли такая функция? 

Вот эта ф-я подойдет ?

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                  |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    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);
}

Пример использования : Саму функцию ставим в самом конце кода (вне ф-и СТАРТ), а при открытии позиции проверяем :



if (NumberOfPositions(NULL,OP_BUY,Magic)< 1) {
// если нет окрытых OP_BUY позиций с заданным магиком, покупаем
ticket=OrderSend(Symbol(),0,Lots,Ask,Slippage,Bid-SL*Point,
                      Ask+TP*Point, NULL,Magic ,0,Blue);
                                              }

Если нужны не позиции а отложенные ордера, то можно использовать ф-ю 

Функция NumberOfOrders().
Эта функция возвращает количество ордеров . Ограничить перечень проверяемых ордеров можно параметрами функции:
sy - Наименование инструмента. Если задать этот параметр, то функция проверит ордера только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
op - Тип отложенного ордера. Допустимые значения: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 - означает любой ордер.
mn - Идентификатор ордера (MagicNumber). Значение по умолчанию -1 - любой магик.

https://www.mql5.com/ru/forum/107476/page12

 

Объясните пожалуйста, что дают файлы:

#include <stdlib.mqh>
#include <stderror.mqh>

Если можно, то как-нибудь по простому.

Спасибо.

 
Serbov писал(а) >>

Объясните пожалуйста, что дают файлы:

Если можно, то как-нибудь по простому.

Спасибо.

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

 
Serbov >>:

Объясните пожалуйста, что дают файлы:

Если можно, то как-нибудь по простому.

Спасибо.

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

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

ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,3,SL,TP,"Name_Expert",Magic,0,clOpenBuy );
   if(ticket < 0)
 {Print("Ошибка открытия ордера BUY #", GetLastError());  } 

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

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

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

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

 
rid писал(а) >>

Вот эта ф-я подойдет ?


Пример использования : Саму функцию ставим в самом конце кода (вне ф-и СТАРТ), а при открытии позиции проверяем :



Если нужны не позиции а отложенные ордера, то можно использовать ф-ю

Функция NumberOfOrders().
Эта функция возвращает количество ордеров . Ограничить перечень проверяемых ордеров можно параметрами функции:
sy - Наименование инструмента. Если задать этот параметр, то функция проверит ордера только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
op - Тип отложенного ордера. Допустимые значения: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 - означает любой ордер.
mn - Идентификатор ордера (MagicNumber). Значение по умолчанию -1 - любой магик.

https://www.mql5.com/ru/forum/107476/page12

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

bool Open_Buy()

{

   bool res=false;    


if(условие_1)        { 

       if (NumberOfPositions(NULL,Magic)< 1) // если нет открытых позиций с заданным магиком

          { res=true; }}

else  

   {

    if(условие_1) 

       { 

       if (NumberOfPositions(NULL,Magic)> 1) // если советник уже открывал позиции

       {

          if (условие_2)              { 

             res=true; }

           } 

}}

return(res);

}

Идея в том, что если если советник еще не открывал никаких ордеров (их нет ни открытых ни закрытых) – то в условии на покупку срабатывает только первое условие. А если советник уже открывал ордера в прошлом – то при открытии ордера должны срабатывать первое + второе условия.

Посмотрела по указанный Вами ссылке, может быть больше подходит функция ExistOrders(); ?

(но если честно не удалось ее поставить, видимо, навыка пока не хватает)

 

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

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

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

if(условие_1)        { 

       if (NumberOfPositions(NULL,-1,Magic)< 1) 
// если нет открытых позиций с заданным магиком

          { res=true; }}

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

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

Comment ("Количество текущих открытых советником позций = ",
                                  NumberOfPositions(NULL,-1,Magic)  );
Magic_2=Magic*3;
Что же касается вашего второго условия, то я бы ("не мудрствуя лукаво") задал бы для открытия позиций по второму условию другой магик и отдельную функцию Open_Buy_2() !

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

 if (условие_2)                          { 
  if (NumberOfPositions(NULL,-1,Magic)== 1)   {
    if (NumberOfPositions(NULL,-1,Magic_2)< 1) { 
..... ..... 
Причина обращения: