вопросы о советнике который должен имитировать ручную торговлю в конкурсах

 

Здравствуйте уважаемые форумчане. Я искал на форуме сообщении на эту тему  но конкретные ответы на мои вопросы не нашел. Пришлось самому создать тему. И так вот такая у меня проблема. Я торгую в нескольких конкурсах(на реальных и демо конкурсах) одновременно вручную . Но вручную торговать в конкурсах одновременно и трудно и не прибыльно. Поэтому решил написать советника который будет торговать вместо меня . Так как  в некоторых конкурсах торговля советниками запрещено я решил что советник должен имитировать ручную торговлю.Я новичок в программировании вообще и в программировании в mql4 и в win32 api тоже.Но тем не менее написал некоторый код советника который вручную с помощью win32 api открывает рыночные и отложенные ордера с тейкпрофитами и стоплоссами.Я пока запрограммировал советника только на открытие ордеров а не на модификации/закрытии или на каких-либо других действий.Я хочу чтобы этот советник был полностью скрытным от брокера т.е хочу чтобы брокер думал что я торгую вручную а не с помощью советника.Так вот мой вопросы :

1. Чего НЕ должно быть в коде советника чтобы полностью скрыть использование советника от брокера ? Какие функции,выражении  и т.д языка Mql4 НЕ должно быть в коде советника ? Например мне нужно модифицировать ордер.В Mql4 для этого предназначено функция OrderModify .Но я не знаю  использование этой функции скроет ли моего советника от брокера.

2.Можно ли ТОЛЬКО средствами языка Mql4 дописать этот советник так чтобы полностью скрыть использование советника от брокера не прибегая к помощи Win32 Api ? Если да то объясните пожалуйста в общих чертах как дописать этот советник .

3.Если невозможно ТОЛЬКО средствами языка Mql4 дописать этот советник то объясните пожалуйста в общих чертах как дописать этот советник с помощю Win32 Api.

Спасибо.

 
ilqar200:

1. Чего НЕ должно быть в коде советника чтобы полностью скрыть использование советника от брокера ? Какие функции,выражении  и т.д языка Mql4 НЕ должно быть в коде советника ? Например мне нужно модифицировать ордер.В Mql4 для этого предназначено функция OrderModify .Но я не знаю  использование этой функции скроет ли моего советника от брокера.

Нет, торговые функции в таких случаях использовать нельзя. Все придется делать через интерфейс терминала. И по-моему, с модификацией ордеров будет много проблем. Ведь нужно прочитать содержимое SysListView. Не факт, что там есть данные.

2.Можно ли ТОЛЬКО средствами языка Mql4 дописать этот советник так чтобы полностью скрыть использование советника от брокера не прибегая к помощи Win32 Api ? Если да то объясните пожалуйста в общих чертах как дописать этот советник .

Без WinAPI точно никак.

3.Если невозможно ТОЛЬКО средствами языка Mql4 дописать этот советник то объясните пожалуйста в общих чертах как дописать этот советник с помощю Win32 Api.

Если открытие ордеров уже сделано, то это уже большой кусок работы. Далее потребуется придумать, как сделать закрытие ордеров без OrderClose() и их модификацию без OrderModify(). Если с  SysListView не получится, то можно еще подумать в направлении открытия окна "Ордер" так, чтобы оно принимало вид, подходящий для закрытия и модификации ордера. 

 
Ihor Herasko #:

Нет, торговые функции в таких случаях использовать нельзя. Все придется делать через интерфейс терминала. И по-моему, с модификацией ордеров будет много проблем. Ведь нужно прочитать содержимое SysListView. Не факт, что там есть данные.

Без WinAPI точно никак.

Если открытие ордеров уже сделано, то это уже большой кусок работы. Далее потребуется придумать, как сделать закрытие ордеров без OrderClose() и их модификацию без OrderModify(). Если с  SysListView не получится, то можно еще подумать в направлении открытия окна "Ордер" так, чтобы оно принимало вид, подходящий для закрытия и модификации ордера. 

Здравствуйте. Спасибо за ответы. Есть еще вопросы к вам. ТОЛЬКО торговые функции нельзя использовать для сокрытие советника ? А остальные функции можно использовать ? Мне пригодиться функции с работы со счетом (которые начинаться с префиксом Account*),функции проверок состояние,функции проверки рыночной информации,математические функции. Эти функции можно использовать ? По поводу win32 api. Как можно узнать цену открытие ордера и как открыть окно Ордер конкретного ордера средствами win32 api ? Буду благодарен за ответы.
 
ilqar200 #:

Здравствуйте. Спасибо за ответы. Есть еще вопросы к вам. ТОЛЬКО торговые функции нельзя использовать для сокрытие советника ?

Да, только торговые. Запрет ведь устанавливается на торговые действия.

А остальные функции можно использовать ? Мне пригодиться функции с работы со счетом (которые начинаться с префиксом Account*),функции проверок состояние,функции проверки рыночной информации,математические функции. Эти функции можно использовать ?

Да, ориентируйтесь на индикаторы. Можно вообще сделать приложение в виде индикатора, а не советника. Тогда точно не сможете использовать те функции, которыми мог бы пользоваться советник.

По поводу win32 api. Как можно узнать цену открытие ордера

Здесь API не нужно. Достаточно MQL.

и как открыть окно Ордер конкретного ордера средствами win32 api ? 

Вот об этом я и говорил в предыдущем сообщении. Нужно исследовать сообщения, которые передаются окну "Ордер". Потому как через окно "Терминал" вряд ли получится открыть окно "Ордер" для нужного ордера. Проблема заключается в чтении содержимого SysListView. По-моему, там ничего нет, т. к. он находится в режимах OWNER_DATA и OWNER_DRAW.

 
Ihor Herasko #:

Да, только торговые. Запрет ведь устанавливается на торговые действия.

Да, ориентируйтесь на индикаторы. Можно вообще сделать приложение в виде индикатора, а не советника. Тогда точно не сможете использовать те функции, которыми мог бы пользоваться советник.

Здесь API не нужно. Достаточно MQL.

Вот об этом я и говорил в предыдущем сообщении. Нужно исследовать сообщения, которые передаются окну "Ордер". Потому как через окно "Терминал" вряд ли получится открыть окно "Ордер" для нужного ордера. Проблема заключается в чтении содержимого SysListView. По-моему, там ничего нет, т. к. он находится в режимах OWNER_DATA и OWNER_DRAW.

Я не понял. Как можно узнать цену открытие ордера средствами mql4 если торговые функции нельзя использовать ? По моему чтобы узнать цену открытия ордера нужно использовать две торговые функции :OrderSelect и OrderOpenPrice.Так как нам необходимо НЕ использовать торговые функции то как можно узнать цену открытия ордера средствами mql4 ? есть вопрос по поводу лота тоже. Как можно отбросить дробную часть лота до нужного знака после запятой. Ну например после вычисление у меня получилось лот 3.37 а нужно использовать лот 3.3. Как  это сделать ? По поводу SysListView . Мне нужно еше и узнать данные ордеров т.е направления ордеров,являеться ли ордер открытым или отложенным ну и т.д.Я вижу что без работы с SysListView мне не обойтис. Для меня это будет трудно.Но я постараюс дописать этот советник. Какие ресурсу в интернете вы можете посоветовать мне прочитать для работы с этой SysListView с режимом Owner_Data ?  Спасибо за ответы еще раз.
 
ilqar200 #:
Я не понял. Как можно узнать цену открытие ордера средствами mql4 если торговые функции нельзя использовать ? По моему чтобы узнать цену открытия ордера нужно использовать две торговые функции :OrderSelect и OrderOpenPrice.Так как нам необходимо НЕ использовать торговые функции то как можно узнать цену открытия ордера средствами mql4 ? есть вопрос по поводу лота тоже. Как можно отбросить дробную часть лота до нужного знака после запятой. Ну например после вычисление у меня получилось лот 3.37 а нужно использовать лот 3.3. Как  это сделать ? По поводу SysListView . Мне нужно еше и узнать данные ордеров т.е направления ордеров,являеться ли ордер открытым или отложенным ну и т.д.Я вижу что без работы с SysListView мне не обойтис. Для меня это будет трудно.Но я постараюс дописать этот советник. Какие ресурсу в интернете вы можете посоветовать мне прочитать для работы с этой SysListView с режимом Owner_Data ?  Спасибо за ответы еще раз.
всегда представлял что имитация ручной торговли это кликер с набором макросов которые уже запускаются из под советника
 
ilqar200 #:

Я не понял. Как можно узнать цену открытие ордера средствами mql4 если торговые функции нельзя использовать ?

Функции OrderSelect(), OrderOpenPrice() и т. д. не являются торговыми в том смысле, который я придаю этому выражению. Их с успехом можно использовать в индикаторах. Торговых функций всего пять:

  1. OrderSend()
  2. OrderClose()
  3. OrderModify()
  4. OrderDelete()
  5. OrderCloseBy()

По моему чтобы узнать цену открытия ордера нужно использовать две торговые функции :OrderSelect и OrderOpenPrice.

Это не торговые функции. Да, в справке их отнесли к торговым. Видимо, под термином "торговые функции" разработчики имели в виду что-то другое. На всякий случай мое определение: торговые функции - это те, которые отправляют торговый приказ на сервер. А ведь OrderSelect() и прочие не обращаются к серверу, они работают внутри терминала.

есть вопрос по поводу лота тоже. Как можно отбросить дробную часть лота до нужного знака после запятой. Ну например после вычисление у меня получилось лот 3.37 а нужно использовать лот 3.3.

Округлить к ближайшему меньшему:

double VolumeCast(double volume, double volumeMin, double volumeMax, double volumeStep)
{
   if (volumeStep == 0.0)
      return volumeMin;

   return (MathMin(MathMax(MathFloor(volume / volumeStep) * volumeStep, volumeMin), volumeMax));
}

или просто к ближайшему допустимому:

double VolumeRound(double volume, double volumeMin, double volumeMax, double volumeStep)
{
   if (volumeStep == 0.0)
      return volumeMin;

   return (MathMin(MathMax(MathRound(volume / volumeStep) * volumeStep, volumeMin), volumeMax));
}

По поводу SysListView . Мне нужно еше и узнать данные ордеров т.е направления ордеров,являеться ли ордер открытым или отложенным ну и т.д.Я вижу что без работы с SysListView мне не обойтис. Для меня это будет трудно.Но я постараюс дописать этот советник. Какие ресурсу в интернете вы можете посоветовать мне прочитать для работы с этой SysListView с режимом Owner_Data ?  Спасибо за ответы еще раз.

Список ордеров можно будет прочитать и средствами MQL, о чем я указал выше. А вот провести с этими ордерами операции - другой вопрос. Если список находится в режиме OWNER_DATA (я не уверен в этом, т. к. давно не проверял), то получить данные из него не получится никак. Единственная зацепка для операций с ордерами - вызывать окно "Ордер", передав ему каким-то образом данные ордера, с которым собираетесь работать. Для этого придется исследовать очередь сообщений при вызове окна. Прочитать про это нигде нельзя, т. к. это внутренности терминала, по ним документации не существует.

 
Ihor Herasko #:

Функции OrderSelect(), OrderOpenPrice() и т. д. не являются торговыми в том смысле, который я придаю этому выражению. Их с успехом можно использовать в индикаторах. Торговых функций всего пять:

  1. OrderSend()
  2. OrderClose()
  3. OrderModify()
  4. OrderDelete()
  5. OrderCloseBy()


Правильно понимаю что выбор ордера и получение инфы о нем возможен в индюках?
 
Valeriy Yastremskiy #:
Правильно понимаю что выбор ордера и получение инфы о нем возможен в индюках?

Конечно!

int OnCalculate(const int rates_total,
                    const int prev_calculated,
                    const datetime& time[],
                    const double& open[],
                    const double& high[],
                    const double& low[],
                    const double& close[],
                    const long& tick_volume[],
                    const long& volume[],
                    const int& spread[])
{
   static bool bIsFirst = true;
   if (bIsFirst)
   {
      for (int i = OrdersTotal() - 1; i >= 0; --i)
         if (OrderSelect(i, SELECT_BY_POS))
            OrderPrint();
      bIsFirst = false;
   }
       
   return(rates_total);
}

Результат:

2021.12.15 20:26:17.777 Test GBPUSD,M15: #614310459 2021.11.01 21:08:21 sell stop 0.01 EURUSD 0.00300 100000000.00000 0.00000 1.12576 0.00 0.00 0.00  0
2021.12.15 20:26:17.777 Test GBPUSD,M15: #614662136 2021.11.05 10:37:26 sell 0.01 GBPUSD 1.34621 0.00000 0.00000 1.32156 0.00 -1.09 24.65  0
2021.12.15 20:26:17.777 Test GBPUSD,M15: #614662130 2021.11.05 10:37:21 sell 0.01 USDCHF 0.91326 0.00000 0.00000 0.92679 0.00 -2.64 -14.60  0
2021.12.15 20:26:17.777 Test GBPUSD,M15: #614662010 2021.11.05 10:35:11 buy 0.01 USDJPY 113.828 0.000 0.000 113.941 0.00 -0.38 0.99  0
 
Ihor Herasko #:

Конечно!

Результат:

Спасибо, заблуждался)
 
Ihor Herasko #:

Функции OrderSelect(), OrderOpenPrice() и т. д. не являются торговыми в том смысле, который я придаю этому выражению. Их с успехом можно использовать в индикаторах. Торговых функций всего пять:

  1. OrderSend()
  2. OrderClose()
  3. OrderModify()
  4. OrderDelete()
  5. OrderCloseBy()

Это не торговые функции. Да, в справке их отнесли к торговым. Видимо, под термином "торговые функции" разработчики имели в виду что-то другое. На всякий случай мое определение: торговые функции - это те, которые отправляют торговый приказ на сервер. А ведь OrderSelect() и прочие не обращаются к серверу, они работают внутри терминала.

Округлить к ближайшему меньшему:

или просто к ближайшему допустимому:

Список ордеров можно будет прочитать и средствами MQL, о чем я указал выше. А вот провести с этими ордерами операции - другой вопрос. Если список находится в режиме OWNER_DATA (я не уверен в этом, т. к. давно не проверял), то получить данные из него не получится никак. Единственная зацепка для операций с ордерами - вызывать окно "Ордер", передав ему каким-то образом данные ордера, с которым собираетесь работать. Для этого придется исследовать очередь сообщений при вызове окна. Прочитать про это нигде нельзя, т. к. это внутренности терминала, по ним документации не существует.

Нашел один легкий способ добраться до окно Ордер. Нужно просто отправить сообщении wm_lbuttondown,wm_lbuttonup,wm_lbuttondblclick с координатами к syslistview. Проверил работает.После этого для меня не составить труда работать с окном Ордер. Чтобы добраться до остальных ордеров нужно просто добавить значение координата y.Таким способом можно даже модифицировать отложенные ордера.Самое лучшее для меня это то что после этих сообщений какой-бы не был размер syslistview щелчок идет всегда на одном и том же месте syslistview.Но правда возникает другие вопросы. Мне нужно будет проверить состояние связи с сервером. Если я буду использовать функцию IsConnected то брокер может узнать что я использую советник ?
Причина обращения: