Зачем нужен price у CTrade.Buy

 

Читаю документацию:

Параметры
...
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.

Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / Buy
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / Buy
  • www.mql5.com
Открывает длинную позицию с заданными параметрами. Параметры volume [in]  Запрашиваемый объем позиции. symbol= NULL [in]  Наименование...
 

В параметре указывается желаемая цена открытия. Если она попадет в коридор, заданный параметром Slippage, то приказ будет исполнен. В противном случае будет получен реквот.

Такой подход справедлив только для типов исполнения Instance Execution (см. режимы заключения сделок). А вот для типа исполнения Market Execution параметр price игнорируется.

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Для получения текущей рыночной информации служат функции SymbolInfoInteger() , SymbolInfoDouble() и SymbolInfoString() . В качестве второго...
 
Irakly:

В чём смысл иметь параметр у функции, который нельзя изменить? Я исхожу из гипотезы, что класс CTrade писали разумные люди, которые не стали бы делать у функции параметр, который вообще не нужен.

Думаю, что сейчас я понял ваш вопрос)

Смотрите, бывает необходимо в коде запрашивать текущую цену аск или бид , для каких то расчётов.

Так вот чтоб не запрашивать эту цену дважды, сначала для расчётов, затем для открытия позиции, в коде  CTrade при открытии позиции есть возможность вставить уже запрошенные цены.

Если ваш вопрос имеет под собой смысл, а зачем ВООБЩЕ отправлять какую то цену, если мы открываемся по рынку, то на этот вопрос я вам уже отвечал-проскальзывание.

 

Ответ @Ihor Herasko мне понятен. Осталось нагуглить (или вы мне подскажите), как установить Slippage и как узнать/установить режим исполнения.

@Aleksandr Slavskii, ваш ответ не до конца понимаю:

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 сделка в обоих случаях совершится (по цене текущего аска).

Игорь, Александр, поправьте меня, пожалуйста, если я неправ.

 
Irakly #:

Осталось нагуглить (или вы мне подскажите), как установить Slippage и как узнать/установить режим исполнения.

Задается в Oninit() 

void  SetDeviationInPoints(
   ulong  deviation      // проскальзывание
   )
 
Irakly #:

Ответ @Ihor Herasko мне понятен. Осталось нагуглить (или вы мне подскажите), как установить Slippage

trade.SetDeviationInPoints();

и как узнать/установить режим исполнения.

Выше я давал ссылку - режимы заключения сделок. Запрашивается так:

SymbolInfoInteger(Symbol(), SYMBOL_TRADE_EXEMODE);
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Для получения текущей рыночной информации служат функции SymbolInfoInteger() , SymbolInfoDouble() и SymbolInfoString() . В качестве второго...
 
Irakly #:

@Aleksandr Slavskii, ваш ответ не до конца понимаю:

В чём разница между эти примерами?

В первом случае функция будет вызвана один раз

SymbolInfoDouble(Symbol(), SYMBOL_ASK);

Во втором - дважды.

 
Irakly #:

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

В первом случае сделка совершится, если текущий аск отличается не более, чем на Slippage, от содержимого переменной Ask.

Во втором случае сделка совершится, если текущий аск отличается не более, чем на Slippage, от аска на момент выполнения функции Buy.

Причём всё сказанное относится лишь к режиму исполнения Instant Execution. В режиме Market Execution сделка в обоих случаях совершится (по цене текущего аска).

Игорь, Александр, поправьте меня, пожалуйста, если я неправ.

И в первом и во втором случае  -  сделка совершится, если текущий аск отличается не более, чем на Slippage, от содержимого переменной Ask.

 
Aleksandr Slavskii #:

В первом случае функция будет вызвана один раз

Во втором - дважды.

Правильно я понимаю, что это существенно из-за того, что эта функция обращается на сервер, а это затратно по времени?

Aleksandr Slavskii #:
И в первом и во втором случае  -  сделка совершится, если текущий аск отличается не более, чем на 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

Там автор пишет:

Market Execution (рыночное исполнение ордеров) – подразумевает, что выставленный приказ исполнится по текущей рыночной цене, она может отличаться от цены заявки на установленный размер отклонения.


Но это же противоречит этому:

Ihor Herasko #:
Такой подход справедлив только для типов исполнения Instance Execution (см. режимы заключения сделок). А вот для типа исполнения Market Execution параметр price игнорируется.

Я так понял, что задавать максимальное отклонение имеет смысл лишь при Instant Execution. А в статье автор пишет иное...

Видимо, он просто неправ, ошибся. Потому что я нагуглил ещё одну статью, которая согласуется с объяснением Игоря.

 
Irakly #:

Там автор пишет:

Но это же противоречит этому:

Тут нет противоречий. Market Execution исполняет сделку по текущей рыночной цене. Здесь ставим точку. Далее идет пояснение: " она может отличаться от цены заявки на установленный размер отклонения". Просто неполное. Может отличаться, может не отличаться, может существенно отличаться. Вот так и следует это читать. То есть параметры цены и отклонения при Market Execution не нужны. Какой смысл отклонения, если не указана цена (которая игнорируется, даже если указана)?