Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1413

 
Aleksey Vyazmikin #:

Так может у них нет истории, так как они сами не очень старая кухня?

А что есть не кухни, чтобы из России работать? Это не важно на самом деле. Вопрос как историю загрузить, даже если  у них её нет?
 
gyperion #:
А что есть не кухни, чтобы из России работать? Это не важно на самом деле. Вопрос как историю загрузить, даже если  у них её нет?

А вы не могли-бы одолжить мне денег, даже если у вас их нет?

 
gyperion #:
А что есть не кухни, чтобы из России работать? Это не важно на самом деле. Вопрос как историю загрузить, даже если  у них её нет?

Через пользовательских символов делаете свою историю.

Importing High Quality Tick Data to MetaTrader 5
Importing High Quality Tick Data to MetaTrader 5
  • 2021.11.28
  • www.mql5.com
In order to vet a potential trading strategy, it is imperative to ensure that the results obtained f r om optimizations and strategy tests are a true reflection of the performance of your EA
 
Nauris Zukas #:

Через пользовательских символов делаете свою историю.

Хмм. Сработало частично, но главное сработало. Покопаюсь дальше. Спасибо за помощь, уважаемый, ато уже всё перепробовал.
 

Привет всем, я хочу написать своего первого торгового робота (советника). Он отлично работает в бэктесте и результаты тестов тоже достойные. Но есть разные вещи, которые нужно учитывать: типы счетов, свойства инструментов, вмешательство в работу других советников и т.д.

Для этого у меня есть четыре переменные:

bool isHedging; bool isFIFO; ulong positionTicket; double positionVolume;

Первые две переменные задаются в методе init:

if ((bool)AccountInfoInteger(ACCOUNT_HEDGE_ALLOWED)) isHedging = true;
else isHedging = false;
if ((bool)AccountInfoInteger(ACCOUNT_FIFO_CLOSE)) isFIFO = true;
else isFIFO = false;

Если я хочу открыть позицию, я сначала проверяю, не вызовет ли это проблем с FIFO (т. е. если я хочу открыть длинную позицию, я проверяю, нет ли уже длинной позиции с таким же объемом или короткой позиции по соответствующему символу, поскольку в противном случае StopLoss и TakeProfit могут работать некорректно, как я слышал). И, наконец, я использую метод OrderSend и устанавливаю, был ли он успешным:

positionVolume = tradeResult.volume;
positionTicket = tradeResult.deal;

При исполненном StopLoss или TakeProfit я узнаю через метод OnTradeTransaction, была ли закрыта моя (внутренняя) позиция советника, проверяя, совпадает ли переменная positionTicket с transaction.position.

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

Если я хочу закрыть позицию на счете хеджирования, я закрываю позицию с помощью trade.PositionClose(positionTicket, slippage);

Если я хочу закрыть позицию на счете хеджирования FIFO, я закрываю самую старую позицию по соответствующему символу, которая соответствует направлению позиции (длинная/короткая) и объему, который должен быть моим собственным в силу моих условий входа для счетов FIFO, описанных выше.

Теперь я уверен, что упустил из виду что-то фундаментальное. Как мне убедиться, что StopLoss и TakeProfit на неттинговом счете также закрываются, когда я закрываю (внутреннюю) позицию советника, как описано выше? Есть ли более элегантные и эффективные способы сделать советник соответствующим FIFO? Если я открываю позицию в советнике только с помощью MarketOrder, не редактирую ее и затем хочу закрыть, всегда ли значение tradeResule.deal остается неизменным, чтобы я мог без проблем закрыть эту позицию с помощью trade.PositionClose(positionTicket, slippage), где positionTicket - это сохраненное значение tradeResult.deal?

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

 
Benjamin Fotteler #:

Теперь я уверен, что упустил из виду что-то фундаментальное. Как сделать так, чтобы StopLoss и TakeProfit на неттинговом счете также закрывались при закрытии (внутренней) позиции советника, как описано выше? Есть ли более элегантные и эффективные способы сделать советник FIFO-совместимым? Если я открываю позицию в советнике только с помощью MarketOrder, не редактирую ее и затем хочу закрыть, всегда ли значение tradeResule.deal остается неизменным, чтобы я мог закрыть эту позицию с помощью trade.PositionClose(positionTicket, slippage) без каких-либо проблем, при этом positionTicket будет сохраненным значением tradeResult.deal?

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

На неттинговом счете есть только одна позиция на символ. Если советник торгует только одним символом, это можно прочитать в PositionTotal() - или, что еще проще, PositionSelect() либо неверен (=none), либо, соответственно, также выбран для дальнейшей торговли.

Documentation on MQL5: Trade Functions / PositionSelect
Documentation on MQL5: Trade Functions / PositionSelect
  • www.mql5.com
PositionSelect - Trade Functions - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 

Все верно. Спасибо за подсказку. Но что мне делать, например, если другой советник работает на том же символе, открывает позицию в 0,5 лота и стоп-лосс 100 пунктов, мой советник открывает "внутреннюю позицию советника" в 0,5 и стоп-лосс 150 пунктов, т.е. увеличивает существующую позицию до 1 лота, а затем я закрываю "внутреннюю позицию советника", т.е. уменьшаю существующую позицию до 0,5 лота. Какой стоп-лосс тогда будет у оставшихся 0,5 лота? 100 пунктов или 150 пунктов? Или в таком случае в режиме неттинга невозможно установить независимый стоп-лосс для "моих" 0,5 лотов через SendRequest?

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

 
Benjamin Fotteler символе, открывает позицию в 0,5 лота и стоп-лосс 100 пунктов, мой советник открывает "внутреннюю позицию советника" в 0,5 и стоп-лосс 150 пунктов, т.е. увеличивает существующую позицию до 1 лота, а затем я закрываю "внутреннюю позицию советника", т.е. уменьшаю существующую позицию до 0,5 лота. Какой стоп-лосс тогда будет у оставшихся 0,5 лота? 100 пунктов или 150 пунктов? Или в таком случае в режиме неттинга невозможно установить независимый стоп-лосс для "моих" 0,5 лотов через SendRequest?

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

Если на нетто-счете(!) первый советник, например, по EURUSD покупает 0,01 лота (buy), а второй советник продает 0,05 лота (sell), то на счете снова остается только одна позиция, теперь уже 0,04 sell. Номера билетов здесь пока совершенно не важны. И если второй ордер на единственную позицию в EURUSD устанавливает новые (свои= SL и TP, то те, что были у первого ордера, перезаписываются.

Есть только одна позиция с одним SL и одним TP, если они указаны.

 
Я могу это понять, спасибо. Но я все еще не понимаю, какой стоп-лосс применяется, если первый советник покупает 0,01 лота, а второй - 0,05 лота. Тогда открывается позиция в 0,06 лота, верно? И какой стоп-лосс применяется к этой позиции? Первый, второй или агрегированный?
 
Benjamin Fotteler #:
Я могу это понять, спасибо. Но я все еще не понимаю, какой стоп-лосс применяется, если первый советник покупает 0,01 лота, а второй - 0,05 лота. Тогда открывается позиция в 0,06 лота, верно? И какой стоп-лосс применяется к этой позиции? Первый, второй или агрегированный?
Я думаю, что последний.
Причина обращения: