
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Саймон,
Хорошо, давайте я попробую добавить уровень стопа в советник, просто для примера.
Ах-ха! Уровень заморозки для USDJPY равен 0, а уровень стопа - 30.
Я предполагаю, что 30 означает 3, потому что брокер пятизначный. Я попробовал использовать MODE_SPREAD и получил 20. Очевидно, что спред по USDJPY не 20, а ;) 2.0. Можно также сказать, что 2 пункта эквивалентны 20 пунктам.
Спасибо.
Подсказка для вас. . . .
Саймон,
Похоже, что это снова проблема выбора заказа.
Функция OrderClose() пытается закрыть ордер (не ордер USDJPY). Она пытается закрыть ордер на графике EURUSD.
Функция OrderPrint() ранее была выбрана до ее выполнения и четко соответствует своему назначению.
Красный цвет, обведенный вокруг недействительной цены, должен означать WRONG.
Зеленый цвет, обведенный вокруг USDJPY, должен означать ПРАВДУ.
Поэтому, если все верно, я должен сосредоточиться на красном круге и выбрать ордер до выполнения функции OrderClose().
Спасибо.
что такое Bid и Ask?
Ask - это последняя известная цена продавца (цена спроса) для текущего символа.
Bid - это последняя известная цена покупателя (цена предложения, цена бида) текущего символа.
Вы уже знаете причину неудачного закрытия... просто подумайте внимательно в течение минуты.
Посмотрите на свой код, какую цену вы используете для закрытия ордера?
Саймон,
Ask/Bid - это последняя известная цена продавца/покупателя для текущего символа.
Цена, по которой советник хочет закрыть ордер, - это цена символа EURUSD.
Почему советник зависит от размещения на графике USDJPY для закрытия своего ордера? Функция OrderSelect() предназначалась для выбора номера тикета, и как только номер тикета был выбран, советник мог бы затем выбрать
Очевидно, советник должен находиться на графике символа USDJPY, чтобы закрывать ордера на нем.
Зачеркните все, что я только что сказал.
Вот решение. Ошибка кроется в третьем параметре. Я рассматриваю возможность указать символ и ПОТОМ поместить переменную ask/bid в его параметр (местоположение 3-го параметра функции OrderClose()). Это должно устранить все неясности в мыслях.
Спасибо.
Это и есть решение. Ошибка кроется в третьем параметре. Я рассматриваю возможность указать символ и ПОТОМ поместить переменную ask/bid в его параметр (местоположение 3-го параметра функции OrderClose()). Это должно устранить любые неясности в мыслях.
Спасибо.
Саймон,
Ошибка кроется в третьем параметре функции OrderClose(), потому что ;) Ask/Bid - это последняя известная цена продавца/покупателя для текущего символа. Если "для текущего символа" означает текущий график, на котором установлен советник, то это может быть немного непонятно. Следует помнить, что MQL4 существует уже давно и имеет свои уникальные методы иллюстрации и представления.
Решение состоит в том, чтобы заменить предопределенные переменные Ask/Bid на альтернативу, например...
Что вы на это скажете?
Я добавил версию этого советника, которая имеет возможность печатать информацию об ордере USDJPY и закрывать его независимо от графика, на котором он размещен. Я еще не подтвердил, изменил ли он SL и TP ордера USDJPY, но подтвержу после проверки. Советник выдает последнюю ошибку, которую несложно устранить. В настоящее время я работаю над этим. Вот снимок считывания ошибки:
Спасибо.
Саймон,
Ошибка кроется в третьем параметре функции OrderClose(), потому что ;) Ask/Bid - это последняя известная цена продавца/покупателя для текущего символа. Если "для текущего символа" означает текущий график, на котором установлен советник, то это может быть немного непонятно. Я должен помнить, что MQL4 существует уже давно и имеет свои уникальные методы иллюстрации и представления.
Решение состоит в том, чтобы заменить предопределенные переменные Ask/Bid альтернативой, например...
Что вы на это скажете?
Я добавил версию этого советника, которая имеет возможность печатать информацию об ордере USDJPY и закрывать его независимо от того, на каком графике он установлен. Я еще не подтвердил, изменил ли он SL и TP ордера USDJPY, но подтвержу после проверки. Советник выдает последнюю ошибку, которую несложно устранить. В настоящее время я работаю над этим. Вот снимок чтения ошибки:
Спасибо.
Саймон,
Оператор цикла 'while' выполняется следующим образом: Если выражение истинно, оператор выполняется до тех пор, пока выражение не станет ложным. Если выражение ложно, управление передается следующему оператору.
Цель кода в блоке SRC, приведенного ниже, состоит в том, чтобы сделать следующее:
Пока переменная 'i' (содержащаяся в функции OrderSelect() ) НЕ является номером позиции билета USDJPY И символ ордера не является USDJPY,переменная 'i' увеличивается до тех пор, пока переменная 'i' не станет номером позиции билета USDJPY И символом ордера станет USDJPY. Как только цикл 'while' становится ложным, управление передается ниже, к следующей строке кода.
Я привел заголовок и тело цикла 'while' для наглядности.
Я полагаю, что вы понимаете, как цикл 'while' находит билет на валютной паре USDJPY, даже если в данный момент на валютной паре нет билета, но ;) Боюсь, что нет.
Как цикл 'while' может найти тикет на графике USDJPY, если на графике USDJPY нет ордера, который нужно найти?
Мне кажется, что вы написали что-то в духе размещения ордера в позиции 0. Не могли бы вы рассказать об этом подробнее или, возможно, дать ссылку для изучения?
Спасибо.
Я полагаю, что вы понимаете, как цикл 'while' находит билет на валютную пару USDJPY даже без того, чтобы билет в данный момент находился на валютной паре, но ;) Боюсь, что нет.
Как цикл 'while' может найти тикет на графике USDJPY, если на графике USDJPY нет ордера, который нужно найти?
Я полагаю, вы написали что-то вроде того, что ордер находится в позиции 0. Не могли бы вы рассказать об этом подробнее или, возможно, дать ссылку для изучения?
Если вы хотите писать код для себя самостоятельно, то вам нужно выполнить задание 3 человек, может даже 4. Человека, который составляет документ с требованиями, инженера-программиста и инженера по тестированию. Недостаточно знать синтаксис задом наперед и уметь писать код. Вы должны понимать, какую проблему вы пытаетесь решить и как вы собираетесь ее решить, а также вы должны знать, как протестировать код, чтобы убедиться, что он соответствует требованиям.
На базовом уровне это означает пройтись по коду строка за строкой и убедиться, что он делает то, что вы хотели. Обычно это делается с помощью диапазона значений для каждой переменной, начиная с их минимального значения, через типичные значения и заканчивая максимальным значением.
Давайте сделаем это на примере цикла while...
Когда вы объявляете переменную int , не задавая ее значения, ее начальное значение равно 0, поэтому, когда вы объявляете i (почему бы не использовать более описательное имя переменной?) она имеет значение 0, поэтому при первом прохождении цикла whilei равно 0, поэтому OrderSelect() пытается выбрать ордер в позиции 0, если это сработает, то вызов OrderSymbol() вернет правильное имя символа для ордера в позиции 0, и если это не "USDJPY", то выражение(OrderSymbol() !="USDJPY" ) приведет к значению true , если OrderSelect() будет true и проверка символа будет true,true и true =true и следующая строка кода (это внутри цикла while) будет выполнена.
Теперьi равно 1, OrderSelect() выбирает ордер в позиции 1, поэтому получается значение true, проверка символа не находит символаUSDJPY, поэтому возвращается true, снова true и true = true , поэтому снова выполняется i++
Теперьi равно 2, OrderSelect() пытается выбрать ордер на позиции 2, но не получается. . есть только 2 открытых ордера, на позициях 0 и 1, поэтому OrderSelect() возвращает false, что делает OrderSymbol()? нет выбранного ордера. ... . но даже если он по какой-то странной причине вернет true , OrderSelect() уже вернул false,false и true = false ... цикл while завершился иi установлен в 2.
Теперь проработайте остальную часть кода, помня, чтоi имеет значение 2. ...