![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В Profit.mq4 я поместил код функции isCloseLastPosByTake, а в своем советнике перед функцией start() сделал #include < Profit.mq4 >
Сейчас убрал #include < Profit.mq4 > из советника, и вписал полностью код функции isCloseLastPosByTake - естественно ничего не поменялось, и такое же предупреждение "'isCloseLastPosByTake' - expression on global scope not allowed "
Может быть у меня структура кода неправильная?
код функции isCloseLastPosByTake
старт
если(условие выполняется)
открываем ордер1 на покупку
открываем ордер2 на покупку
ставим отложенный ордер3 на покупку
ставим отложенный ордер4 на покупку
ретурн
если(условие выполняется)
открываем ордер1 на продажу
открываем ордер2 на продажу
ставим отложенный ордер3 на продажу
ставим отложенный ордер4 на продажу
ретурнесли( isCloseLastPosByTake )
закрываем все ордера
ретурн
Ошибки компиляции устранил, отсутствие других, если такие имеются, не гарантирую.
Ошибки компиляции устранил, отсутствие других, если такие имеются, не гарантирую.
Спасибо огромное! Наконец-то все заработало как надо.
Ошибки компиляции устранил, отсутствие других, если такие имеются, не гарантирую.
khorosh, не могли бы Вы ответить еще на один вопрос?
Дело в том, что при прогоне советника в тестере МТ4, при срабатывании тейк-профит, соответсвенно и закрытия всех ордеров... происходит цикл открытия и моментального закрытия ордеров много раз, в связи с чем свопами съедается ощутимая сумма. Складывается впечатление, что скрипт isCloseLastPosByTake еще не доработал, а новый вход в рынок уже происходит. Как можно это устранить? Пробовал функцию sleep(10000), но она не помогла. Или такое происходит потому, что тестер, а на реале и демо счете будет работать нормально?
khorosh, не могли бы Вы ответить еще на один вопрос?
Дело в том, что при прогоне советника в тестере МТ4, при срабатывании тейк-профит, соответсвенно и закрытия всех ордеров... происходит цикл открытия и моментального закрытия ордеров много раз, в связи с чем свопами съедается ощутимая сумма. Складывается впечатление, что скрипт isCloseLastPosByTake еще не доработал, а новый вход в рынок уже происходит. Как можно это устранить? Пробовал функцию sleep(10000), но она не помогла. Или такое происходит потому, что тестер, а на реале и демо счете будет работать нормально?
ну так конечно будет открываться. вы по тренду достигаете ТП и конечно же будет выполняться вот это условие для БАЙ
if(Bid>iMA(Symbol(),PERIOD_M15,21,0,1,4,0)) { //... }
идет новая серия открытия.
Функция Кима видит закрытые ордера по ТП и соответственно тут же их закрывает.
Вместо if(isCloseLastPosByTake("0", -1, -1)) считайте историю ордеров. Сравните их цену закрытия с ТП. Если разница небольшая, то вызывайте функцию isCloseLastPosByTake("0", -1, -1);
Даже если Все ордера не отработаются функцией (что за положняк на реале в кухнях, выдадут реквот например), то на следующем тике не отработанные ордера опять будут обрабатываться.
Обратите внимание на:
sell2=OrderSend(Symbol(),OP_SELL,Lots*2,Bid+NextBuy*Point,3,0, Bid, "sell2");
для бай2 - то же самое
Вы открываете ордер "прям щас " Но смещаете цену от той которая есть сейчас. такой ордер не откроется в 99% случаев. Ставьте вместо него отложенный.
khorosh, не могли бы Вы ответить еще на один вопрос?
Дело в том, что при прогоне советника в тестере МТ4, при срабатывании тейк-профит, соответсвенно и закрытия всех ордеров... происходит цикл открытия и моментального закрытия ордеров много раз, в связи с чем свопами съедается ощутимая сумма. Складывается впечатление, что скрипт isCloseLastPosByTake еще не доработал, а новый вход в рынок уже происходит. Как можно это устранить? Пробовал функцию sleep(10000), но она не помогла. Или такое происходит потому, что тестер, а на реале и демо счете будет работать нормально?
Прошу помощи.
Суть проблемы: Советник открыл по условию ордер(работа внутридневно на часовом по итогам предыдущего дня),допустим через час или два и т.д ордер закрылся по ТП,но условие продолжает действовать и советник открывает новый ордер.
Нужно: После закрытия ордера по ТП в этот день по этому условию советник ордер больше не открывал, а при закрытии по СЛ могбы опять открыть сделку по этому условию.
Или хотя бы чтобы в день советник не мог совершать больше одной сделки.
Прошу прощения если коряво изъяснился.
ну так конечно будет открываться. вы по тренду достигаете ТП и конечно же будет выполняться вот это условие для БАЙ
if(Bid>iMA(Symbol(),PERIOD_M15,21,0,1,4,0)) { //... }
идет новая серия открытия.
Функция Кима видит закрытые ордера по ТП и соответственно тут же их закрывает.
Вместо if(isCloseLastPosByTake("0", -1, -1)) считайте историю ордеров. Сравните их цену закрытия с ТП. Если разница небольшая, то вызывайте функцию isCloseLastPosByTake("0", -1, -1);
Даже если Все ордера не отработаются функцией (что за положняк на реале в кухнях, выдадут реквот например), то на следующем тике не отработанные ордера опять будут обрабатываться.
Обратите внимание на:
sell2=OrderSend(Symbol(),OP_SELL,Lots*2,Bid+NextBuy*Point,3,0, Bid, "sell2");
для бай2 - то же самое
Вы открываете ордер "прям щас " Но смещаете цену от той которая есть сейчас. такой ордер не откроется в 99% случаев. Ставьте вместо него отложенный.
Не вводите в заблуждение топик стартёра. Если вы программист, то должны выражаться точнее. Функция Кима в данном коде не закрывает ордера, а даёт разрешение для закрытия.
"...идет новая серия открытия. Функция Кима видит закрытые ордера по ТП и соответственно тут же их закрывает." Не правильно. После закрытия по тейку первого ордера остальные ордера будут закрыты по команде, а не по тейку, поэтому функция Кима примет состояние false и не разрешит сразу удаление ордеров новой серии, до того пока один из них не закроется по тейку.
"Вместо if(isCloseLastPosByTake("0", -1, -1)) считайте историю ордеров. Сравните их цену закрытия с ТП. Если разница небольшая, то вызывайте функцию isCloseLastPosByTake("0", -1, -1);" - а это для чего? Непонятно.
Причина неправильной работы в том, что количество открываемых ордеров ничем не ограничено.
Прошу помощи.
Суть проблемы: Советник открыл по условию ордер(работа внутридневно на часовом по итогам предыдущего дня),допустим через час или два и т.д ордер закрылся по ТП,но условие продолжает действовать и советник открывает новый ордер.
Нужно: После закрытия ордера по ТП в этот день по этому условию советник ордер больше не открывал, а при закрытии по СЛ могбы опять открыть сделку по этому условию.
Или хотя бы чтобы в день советник не мог совершать больше одной сделки.
Прошу прощения если коряво изъяснился.
- запомнить тикет открытой позиции
- если она исчезла, в истории найти цену закрытия и установить флаг на торговлю в соответствии с выделенным.