В параметре указывается желаемая цена открытия. Если она попадет в коридор, заданный параметром Slippage, то приказ будет исполнен. В противном случае будет получен реквот.
Такой подход справедлив только для типов исполнения Instance Execution (см. режимы заключения сделок). А вот для типа исполнения Market Execution параметр price игнорируется.
- www.mql5.com
В чём смысл иметь параметр у функции, который нельзя изменить? Я исхожу из гипотезы, что класс CTrade писали разумные люди, которые не стали бы делать у функции параметр, который вообще не нужен.
Думаю, что сейчас я понял ваш вопрос)
Смотрите, бывает необходимо в коде запрашивать текущую цену аск или бид , для каких то расчётов.
Так вот чтоб не запрашивать эту цену дважды, сначала для расчётов, затем для открытия позиции, в коде CTrade при открытии позиции есть возможность вставить уже запрошенные цены.
Если ваш вопрос имеет под собой смысл, а зачем ВООБЩЕ отправлять какую то цену, если мы открываемся по рынку, то на этот вопрос я вам уже отвечал-проскальзывание.
Ответ @Ihor Herasko мне понятен. Осталось нагуглить (или вы мне подскажите), как установить Slippage и как узнать/установить режим исполнения.
@Aleksandr Slavskii, ваш ответ не до конца понимаю:
чтоб не запрашивать эту цену дважды, сначала для расчётов, затем для открытия позиции, в коде CTrade при открытии позиции есть возможность вставить уже запрошенные цены
В чём разница между эти примерами?
Ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK); //тут рассчёты trade.Buy(Lot, Symbol(), Ask);
Ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK); //тут рассчёты trade.Buy(Lot, Symbol());
Если я правильно понял объяснение Игоря, то в обоих случаях если сделка совершится, то по цене, которая будет у брокера на момент обработки ордера (назову её "текущий аск"). Но различаются условия, при которых сделка совершится.
В первом случае сделка совершится, если текущий аск отличается не более, чем на Slippage, от содержимого переменной Ask.
Во втором случае сделка совершится, если текущий аск отличается не более, чем на Slippage, от аска на момент выполнения функции Buy.
Причём всё сказанное относится лишь к режиму исполнения Instant Execution. В режиме Market Execution сделка в обоих случаях совершится (по цене текущего аска).
Игорь, Александр, поправьте меня, пожалуйста, если я неправ.
Ответ @Ihor Herasko мне понятен. Осталось нагуглить (или вы мне подскажите), как установить Slippage
trade.SetDeviationInPoints();
и как узнать/установить режим исполнения.
Выше я давал ссылку - режимы заключения сделок. Запрашивается так:
SymbolInfoInteger(Symbol(), SYMBOL_TRADE_EXEMODE);
- www.mql5.com
В первом случае функция будет вызвана один раз
SymbolInfoDouble(Symbol(), SYMBOL_ASK);
Во втором - дважды.
Если я правильно понял объяснение Игоря, то в обоих случаях если сделка совершится, то по цене, которая будет у брокера на момент обработки ордера (назову её "текущий аск"). Но различаются условия, при которых сделка совершится.
В первом случае сделка совершится, если текущий аск отличается не более, чем на Slippage, от содержимого переменной Ask.
Во втором случае сделка совершится, если текущий аск отличается не более, чем на Slippage, от аска на момент выполнения функции Buy.
Причём всё сказанное относится лишь к режиму исполнения Instant Execution. В режиме Market Execution сделка в обоих случаях совершится (по цене текущего аска).
Игорь, Александр, поправьте меня, пожалуйста, если я неправ.
И в первом и во втором случае - сделка совершится, если текущий аск отличается не более, чем на Slippage, от содержимого переменной Ask.
Правильно я понимаю, что это существенно из-за того, что эта функция обращается на сервер, а это затратно по времени?
И в первом и во втором случае - сделка совершится, если текущий аск отличается не более, чем на Slippage, от содержимого переменной Ask.
Во втором случае как содержимое переменной Ask может стать известно брокеру? Я могу вообще так написать:
Ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK); //тут рассчёты Ask = 42; trade.Buy(Lot, Symbol());
и это не повлияет на выполнение сделки, как мне кажется.
Видимо, вы говорили о том, что можно сэкономить на лишнем запросе цены с сервера. А я подумал, что речь о том, что рассчёты занимают время, за которое величина SymbolInfoDouble(Symbol(), SYMBOL_ASK) может поменяться.
Думаю, я разобрался. Всем спасибо за ответы!!
П.С. Интересующий меня в данный момент брокер работает только в режиме Market Execution :-) Но знания лишними не будут.
Только написал, что разобрался, так сразу снова запутался. Нагуглил вот эту статью: https://www.mql5.com/ru/blogs/post/701820
Там автор пишет:
Но это же противоречит этому:
Такой подход справедлив только для типов исполнения Instance Execution (см. режимы заключения сделок). А вот для типа исполнения Market Execution параметр price игнорируется.
Я так понял, что задавать максимальное отклонение имеет смысл лишь при Instant Execution. А в статье автор пишет иное...
Видимо, он просто неправ, ошибся. Потому что я нагуглил ещё одну статью, которая согласуется с объяснением Игоря.
Тут нет противоречий. Market Execution исполняет сделку по текущей рыночной цене. Здесь ставим точку. Далее идет пояснение: " она может отличаться от цены заявки на установленный размер отклонения". Просто неполное. Может отличаться, может не отличаться, может существенно отличаться. Вот так и следует это читать. То есть параметры цены и отклонения при Market Execution не нужны. Какой смысл отклонения, если не указана цена (которая игнорируется, даже если указана)?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Читаю документацию:
Параметры
...
price=0.0
[in] Цена, по которой позиция должна быть открыта. Если цена не указана, то позиция откроется по текущей рыночной цене Ask.
А что произойдёт, если цена указана и отличается от Ask? Например, как отработают такие вызовы?
trade.Buy(0.10, Symbol(), Ask);
trade.Buy(0.10, Symbol(), Ask / 2);
trade.Buy(0.10, Symbol(), Ask * 2);
trade.Buy(0.10, Symbol(), Ask * 0.9999);
trade.Buy(0.10, Symbol(), Ask * 1.0001);
Я спросил это у знакомого преподавателя, он ответил так: "сработает только первая строчка кода, так как при открытии ордера по маркету нужно указать именно текущую цену ask, а не произвольную".
Я совершенно не понимаю этот ответ. В чём смысл иметь параметр у функции, который нельзя изменить? Я исхожу из гипотезы, что класс CTrade писали разумные люди, которые не стали бы делать у функции параметр, который вообще не нужен.
Раньше я уже задавал этот вопрос на форуме в общей теме для вопросов. Мне ответили что-то про проскальзывание. Я знаю про проскальзывание, но не понимаю, как оно объясняет смысл параметра price у функции CTrade.Buy.