Обсуждение статьи "Создаем алгоритм маркет-мейкинга на MQL5"

 

Опубликована статья Создаем алгоритм маркет-мейкинга на MQL5:

Как работают маркет-мейкеры на рынке? Рассмотрим этот вопрос и создадим примитивный алгоритм маркет-мейкинга.

Многим думается, что маркет-мейкер вообще не несет никаких рисков. Но это не так. Основной риск маркет-мейкера - это риск инвентаризации, или inventory risk. Этот риск заключается в том, что возможен резкий набор позиции в одну сторону, без возможности ее реализовать и заработать на спреде. К примеру, когда оголтелая толпа продает и продает актив, а маркет-мейкер вынужден выкупать все предложение, цена идет в минус, загоняя ММ в убытки. 

Компании пытаются избежать этого риска с помощью использования специальных формул центровки спреда и определения оптимальной цены для покупки и реализации. Но это не всегда достижимо: даже если цена не оптимальна, твоя работа в поставке ликвидности на рынок, и ты должен делать эту работу, даже если временно работаешь себе в убыток. 

Автор: Yevgeniy Koshtenko

 

Спасибо, Евгений, за статью! Многие пробелы в пазле моих знаний о валютном рынке практически полностью заполнились.

Есть один единственный нюанс: у некоторых читателей Вашей статьи советник в тестере стратегий может не запуститься, если у тестируемой валютной пары есть суффикс или префикс. Это нужно им учесть и прописать в настройках параметров советника.

А так - всё СУПЕР!!!

С уважением, Владимир.

 
MrBrooklin #:

Спасибо, Евгений, за статью! Многие пробелы в пазле моих знаний о валютном рынке практически полностью заполнились.

Есть один единственный нюанс: у некоторых читателей Вашей статьи советник в тестере стратегий может не запуститься, если у тестируемой валютной пары есть суффикс или префикс. Это нужно им учесть и прописать в настройках параметров советника.

А так - всё СУПЕР!!!

С уважением, Владимир.

Спасибо большое! Проверю завтра с префиксами у другого брокера. Если что - внесу дополнение)

 

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

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(string symb,ENUM_ORDER_TYPE type)
  {
   int count=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(OrderGetTicket(i)))
        {
         if(OrderGetInteger(ORDER_TYPE)==type && PositionGetString(POSITION_SYMBOL)==symb && PositionGetInteger(POSITION_MAGIC)==Magic)
            count++;
        }
     }
   return(count);
  }

На Ваше предупреждение сразу обратил внимание:  Вот функции подсчета открытых ордеров и открытых позиций. CountOrders и CountTrades занимаются подсчетом открытых ордеров и позиций для определенного символа с учетом магического номера советника. Они по факту в коде пока не используются, но будут использоваться в будущих версиях, когда я наконец напишу нормальную функцию центровки спреда между лимитами...

Но не совсем понял - это Вами было так задумано или всё-таки должно быть как-то по другому?

С уважением, Владимир.

 
MrBrooklin #:

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

На Ваше предупреждение сразу обратил внимание:  Вот функции подсчета открытых ордеров и открытых позиций. CountOrders и CountTrades занимаются подсчетом открытых ордеров и позиций для определенного символа с учетом магического номера советника. Они по факту в коде пока не используются, но будут использоваться в будущих версиях, когда я наконец напишу нормальную функцию центровки спреда между лимитами...

Но не совсем понял - это Вами было так задумано или всё-таки должно быть как-то по другому?

С уважением, Владимир.

Задумано - ведь иначе советник может начать путать ордера своего магика с другими) По symb задумано для того, чтобы в будущем сделать мультивалютную версию советника. У меня пока не получается ее сделать)))

 
Yevgeniy Koshtenko #:

Задумано - ведь иначе советник может начать путать ордера своего магика с другими) По symb задумано для того, чтобы в будущем сделать мультивалютную версию советника. У меня пока не получается ее сделать)))

С ордерами всё понятно, только зачем в этой функции проверяются символ и магик позиции? ))

С уважением, Владимир.

 

Это позор MQ, а не статья. Как можно такое пропускать к публикации?

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(string symb)
  {
   int count=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==symb && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            count++;
           }
        }
     }
   return(count);
  }

PositionGetTicket(i) согласно документации «Функция возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней…» И зачем выбирать позицию по её тикету, функцией PositionSelectByTicket если она уже выбрана? Это вы учите новичков как не надо делать?

И замечание Владимира вполне справедливо. А ответ ваш совсем не о том… Зачем проверять символ и магик ПОЗИЦИИ если работаем с ордерами???

 

кроме кода, мне и текстовая часть не понравилась

чушь какая то, не более чем с миру по нитке.

тема интересная, не спорю

какого маркет-мейкинга создаем, чо к чему?

то что его не получилось создать - факт, т.к. автору не хватило матчасти

а ее там - мама не горюй.

надо как минимум еще лет ..дцать подумать, может и получиться сделать.

как начало и как путь к совершенствованию - норм, в этом поддерживаю.

 

Renat Akhtyamov #:

какого маркет-мейкинга создаем, чо к чему?

то что его не получилось создать - факт, т.к. автору не хватило матчасти

Статью нужно читать не по диагонали, а от начала и до конца, т.е. полностью, вот тогда подобные вопросы не будут возникать.

С критикой Алексея Викторова по поводу использования функции PositionSelectByTicket(), когда тикет уже и без неё был выбран, полностью согласен. Сам, кстати, не обратил на это внимание.

Но за статью, Евгений, всё равно спасибо!

С уважением, Владимир.

 
MrBrooklin #:

Статью нужно читать не по диагонали, а от начала и до конца, т.е. полностью, вот тогда подобные вопросы не будут возникать.

С критикой Алексея Викторова по поводу использования функции PositionSelectByTicket(), когда тикет уже и без неё был выбран, полностью согласен. Сам, кстати, не обратил на это внимание.

Но за статью, Евгений, всё равно спасибо!

С уважением, Владимир.

Не тикет выбран, а позиция выбрана для работы с её свойствами посредством соответствующих функций.

 
Alexey Viktorov #:

Не тикет выбран, а позиция выбрана для работы с её свойствами посредством соответствующих функций.

Привет, Алексей! Спасибо за уточнение. )) Когда писал своё сообщение, тогда опирался на туже самую документацию (выделил желтым цветом):

Функция возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней 
при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.

ulong  PositionGetTicket(
   int  index      // номер в списке позиций
   );

Параметры

index

[in]  Индекс позиции в списке открытых позиций, начиная с 0.

Возвращаемое значение

Тикет позиции. В случае неудачного выполнения возвращает 0.

С уважением, Владимир.

Причина обращения: