как получить число без минуса, если окажется что Open[1] < Close[1] и при вычитании Open[1]-Close[1] я получу значение с минусом, как сделать что бы было всегда положительное значение, мне нужно высчитать расстояние между Open и Close может есть другой способ?
как получить число без минуса, если окажется что Open[1] < Close[1] и при вычитании Open[1]-Close[1] я получу значение с минусом, как сделать что бы было всегда положительное значение, мне нужно высчитать расстояние между Open и Close может есть другой способ?
При написании советника для МТ4 – возникла необходимость определять программно (т.е в коде самого советника) был ли открыт хотя бы один ордер этого советника – или нет. Подскажите, есть ли такая функция? Возможно, если есть она выглядела бы как-то так:
Bool (был ли открыт ордер советника с этим магическим номером)
{ответ = True/False}
?
Спецы - помогите пожалуйста, – сами уже голову сломали
P.S. – пробовали вариант с учетом номеров ордеров – не прокатило
При написании советника для МТ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 - любой магик.
это так называемые "файлы библиотек". в этих файлах хранятся часто используемые функции. используются для того, чтобы не загружать исходник. если файл библиотек "объявлен", то функциями из объявленного файла можно пользоваться как если бы они были включены в исходник.
При использовании (вызове) функции из этих файлов (уже изначально заложенных в мт4) мы, в случае некорректоной работы советника можем в журнале видеть номер ошибки, допущенной нами в коде .
Например, вызываем ф-ю GetLastError() :
ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,3,SL,TP,"Name_Expert",Magic,0,clOpenBuy );if(ticket <0){Print("Ошибка открытия ордера BUY #",GetLastError());}
В данном случае, если нами допущена в коде ошибка или мы неправильно задаем внешние параметры, - в журнале будет указываться номер этой ошибки.
Пример использования : Саму функцию ставим в самом конце кода (вне ф-и СТАРТ), а при открытии позиции проверяем :
Если нужны не позиции а отложенные ордера, то можно использовать ф-ю
Функция NumberOfOrders(). Эта функция возвращает количество ордеров . Ограничить перечень проверяемых ордеров можно параметрами функции: sy - Наименование инструмента. Если задать этот параметр, то функция проверит ордера только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент. op - Тип отложенного ордера. Допустимые значения: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 - означает любой ордер. mn - Идентификатор ордера (MagicNumber). Значение по умолчанию -1 - любой магик.
Спасибо большое за подсказку, попробовали так сделать, но почему то не срабатывает, посмотрите пожалуйста может где-то в коде ошибка:
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(); ?
(но если честно не удалось ее поставить, видимо, навыка пока не хватает)
Что же касается вашего второго условия, то я бы ("не мудрствуя лукаво") задал бы для открытия позиций по второму условию другой магик и отдельную функцию Open_Buy_2() !
Вопрос можно.
как получить число без минуса, если окажется что Open[1] < Close[1] и при вычитании Open[1]-Close[1] я получу значение с минусом, как сделать что бы было всегда положительное значение, мне нужно высчитать расстояние между Open и Close может есть другой способ?
Спасибо.
Вопрос можно.
как получить число без минуса, если окажется что Open[1] < Close[1] и при вычитании Open[1]-Close[1] я получу значение с минусом, как сделать что бы было всегда положительное значение, мне нужно высчитать расстояние между Open и Close может есть другой способ?
Спасибо.
https://docs.mql4.com/ru/math/MathAbs
https://docs.mql4.com/ru/math/MathAbs
;) Спасибо!
Добрый день!
При написании советника для МТ4 – возникла необходимость определять программно (т.е в коде самого советника) был ли открыт хотя бы один ордер этого советника – или нет. Подскажите, есть ли такая функция? Возможно, если есть она выглядела бы как-то так:
Bool (был ли открыт ордер советника с этим магическим номером)
{ответ = True/False}
?
Спецы - помогите пожалуйста, – сами уже голову сломали
P.S. – пробовали вариант с учетом номеров ордеров – не прокатило
Добрый день!
При написании советника для МТ4 – возникла необходимость определять программно (т.е в коде самого советника) был ли открыт хотя бы один ордер этого советника – или нет. Подскажите, есть ли такая функция?
Вот эта ф-я подойдет ?
Пример использования : Саму функцию ставим в самом конце кода (вне ф-и СТАРТ), а при открытии позиции проверяем :
Если нужны не позиции а отложенные ордера, то можно использовать ф-ю
Функция 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
Объясните пожалуйста, что дают файлы:
Если можно, то как-нибудь по простому.
Спасибо.
Объясните пожалуйста, что дают файлы:
Если можно, то как-нибудь по простому.
Спасибо.
это так называемые "файлы библиотек". в этих файлах хранятся часто используемые функции. используются для того, чтобы не загружать исходник. если файл библиотек "объявлен", то функциями из объявленного файла можно пользоваться как если бы они были включены в исходник.
Объясните пожалуйста, что дают файлы:
Если можно, то как-нибудь по простому.
Спасибо.
При использовании (вызове) функции из этих файлов (уже изначально заложенных в мт4) мы, в случае некорректоной работы советника можем в журнале видеть номер ошибки, допущенной нами в коде .
Например, вызываем ф-ю GetLastError() :
В данном случае, если нами допущена в коде ошибка или мы неправильно задаем внешние параметры, - в журнале будет указываться номер этой ошибки.
Например, - 130.
А расшифровку номера можно глянуть на страничке -https://book.mql4.com/ru/appendix/errors
И нам уже не нужно будет перелопачивать весь код, т.к. мы по этому номеру уже знаем - где именно допущена ошибка !
Вот эта ф-я подойдет ?
Пример использования : Саму функцию ставим в самом конце кода (вне ф-и СТАРТ), а при открытии позиции проверяем :
Если нужны не позиции а отложенные ордера, то можно использовать ф-ю
Функция 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
Спасибо большое за подсказку, попробовали так сделать, но почему то не срабатывает, посмотрите пожалуйста может где-то в коде ошибка:
Идея в том, что если если советник еще не открывал никаких ордеров (их нет ни открытых ни закрытых) – то в условии на покупку срабатывает только первое условие. А если советник уже открывал ордера в прошлом – то при открытии ордера должны срабатывать первое + второе условия.
Посмотрела по указанный Вами ссылке, может быть больше подходит функция ExistOrders(); ?
(но если честно не удалось ее поставить, видимо, навыка пока не хватает)
Вы неправильно вызвали функцию .
У вас она вызвана вот так : if (NumberOfPositions(NULL,Magic)> 1)
А надо вот так :
Почувствуйте разницу (вы пропустили "-1") ! и ИСПРАВьТЕ ВАШ КОД.
А для контроля можно вывести на график коммент. Например, вот такой (В самом начале функцмм СТАРТ)
Comment ("Количество текущих открытых советником позций = ", NumberOfPositions(NULL,-1,Magic) ); Magic_2=Magic*3;Что же касается вашего второго условия, то я бы ("не мудрствуя лукаво") задал бы для открытия позиций по второму условию другой магик и отдельную функцию Open_Buy_2() !Тогда код второго условия выглядел бы так :