Что нужно добавить для дополнительной поддержки универсальных математических расчетов в MQL5 и MQL5 Cloud Network? - страница 6

 
Renat:

тут такой момент, Ренат.

МТ5 ведь четко понимает - когда происходит активация стоплоса, а когда проирсходит активация тейкпрофита. // это видно и по коментам ордера и понятно по самой сути работы платформы

Поэтому и просьба соответствующая возникает (постоянно). - чтоб в OnTradeTransaction при активации СЛ или ТП появился соответствующий флаг - активация СЛ или ТП.


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

Хотя для вас такого слова как "нет ничего невозможного"  не существует. Вы же метаквоты :)

 

Другими словами, смотря на структуру транзакции https://www.mql5.com/ru/docs/constants/structures/mqltradetransaction

я бы добавил поле TRADE_ACTION

struct MqlTradeTransaction
  {
   ulong                         deal;             // Тикет сделки
   ulong                         order;            // Тикет ордера
   string                        symbol;           // Имя торгового инструмента
   ENUM_TRADE_TRANSACTION_TYPE   type;             // Тип торговой транзакции
   ENUM_TRADE_ACTION               action,            // Тип события, по какой причине выставлен ордер
   ENUM_ORDER_TYPE               order_type;       // Тип ордера
   ENUM_ORDER_STATE              order_state;      // Состояние ордера
   ENUM_DEAL_TYPE                deal_type;        // Тип сделки
   ENUM_ORDER_TYPE_TIME          type_time;        // Тип ордера по времени действия
   datetime                      time_expiration;  // Срок истечения ордера
   double                        price;            // Цена 
   double                        price_trigger;    // Цена срабатывания стоп-лимитного ордера
   double                        price_sl;         // Уровень Stop Loss
   double                        price_tp;         // Уровень Take Profit
   double                        volume;           // Объем в лотах
  };
причины выставления ордера соответственно
Сработал СЛ
Сработал ТП
Выход из позы по Стопауту

ну и другие , если есть //  хотя может это и все что надо
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции - Документация по MQL5
 
sergeev:

тут такой момент, Ренат.

МТ5 ведь четко понимает - когда происходит активация стоплоса, а когда проирсходит активация тейкпрофита. // это видно и по коментам ордера и понятно по самой сути работы платформы

В том то и дело, что в реальности не понимает и не должен понимать.

Все ходит через очереди исполнения, ордеры расщепляются на простые BUY/SELL, причем через шлюзы к провайдерам ликвидности и биржам. Не известно, как его исполнят (включая частичное) в реальности. И если мы вдруг провозгласим, что гарантируем флаги стопов, то завтра же papaklass будет в праведном гневе обвинять в нас, что "у меня не сработало!".

 
Renat:

В том то и дело, что в реальности не понимает и не должен понимать.

Все ходит через очереди исполнения, ордеры расщепляются на простые BUY/SELL, причем через шлюзы к провайдерам ликвидности и биржам.

Да, расщепляется.

Но ведь действие для этого расщепления уходит вполне конкретное - активировать стоплос/тейкпрофит. Причем эти действие обрабатывается ведь самим сервером МТ, а не клиентским терминалом.

Даже если активация стопов происходит не в МТ, то в результате все равно создается реальный ордер или событие для МТ5.

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

Раз сервер (или шлюз) активирует стоплос/тейкпрофит/стопаут и тд, значит в ответе он в любом случае выставляется ордер.  // без ордера ведь ничего не бывает!

И вот на этот ордер и поставить соответствующие флаг - причины выставления этого ордера или события.

 
Может новую структуру надо было ввести, именно для TradeTransaction?
 
pronych:
Может новую структуру надо было ввести, именно для TradeTransaction?

куда уж новее :)   она очень даже полная.

там не хватает только двух полей

- идентификатор позиции
- причина выставления ордера

 
sergeev:

Да, расщепляется.

Но ведь действие для этого расщепления уходит вполне конкретное - активировать стоплос/тейкпрофит. Причем эти действие обрабатывается ведь самим сервером МТ, а не клиентским терминалом.

Ответ простой - нет гарантии 100% выставления флагов.

Ибо очень много источников и инициаторов срабатывания, причем это отнюдь не единственный торговый сервер.

 
Renat:

Ответ простой - нет гарантии 100% выставления флагов.

Ибо очень много источников и инициаторов срабатывания, причем это отнюдь не единственный торговый сервер.

неужели активации стоплоса - обрабатывается несколькими торговыми серверами? 

мне казалось, что на такое достаточно один МТ сервер.

Для активации создается ордер и оповещается платформа о его создании. // внешним шлюзом
дальше идет его заливка. и появляются сделки.
Оно понятно, что ордер может не залиться, и остаток снимется.
но вот в момент создания этого ордера и можно в транзакцию добавить флаг - что это ордер для стоплоса.
нам ведь не важно - пройдут ли сделки по заливке стопа или нет. и зальется ли он весь вообще.  главное само событие, что это ордер для стоплоса.

Или в МТ могут быть сделки без ордера, если стоплос обрабатывается шлюзом? поза может закрываться сделками без ордера?

Но вам виднее, спорить не буду. это очень тонкий момент.
 

papaklass:

И кто же занимается болтологией?

однозначно - вы.

еще и тролить пытаетесь. смысл?

ведите себя корректно.

 
Renat:

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

Без участия терминала это хорошо. 

Кто будет формировать данные для этого "одного из агентов"? Скрипт или индикатор сможет это сделать?

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

Уже написал скрипт для проверки возможностей математических расчетов, правда некоторых функций не хватает)

// все данные расчетов агентов складываются в массив структур
struct MqlCloud
  {
   enum STATUS {wait,ready,error,free};
   STATUS status; // статус выполнения задачи - выполнена, выполняется, ошибка выполнения
   double input_data[]; // массив входных данных
   double out_data[];   // массив выходных данных
  };
  
long id=AccountInfoInteger(ACCOUNT_LOGIN);  

double in_data[100];
MqlCloud result[10000];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   CloudInit(id,"myprog.ex5");  // id - это кто будет платить за Cloud, myprog.ex5 - программа которая будет выполнять расчеты
   CloudData("file.dat");       // file.dat - файл с неизменными данными для расчета
   for(uint i=0; i<10000; i++)
      {
       //
       // формируем массив входных данных для расчета
          for(int n=0; n<ArraySize(in_data); n++) in_data[n]=MathRand()/SHORT_MAX; 
       //
       CloudCalculat(i,in_data); // здесь i - номер задачи, input_data - массив переменных входных данных
      }
   // выводим максимальный результат
   double max_result=0.0; 
   for(uint i=0; i<10000; i++)
      {
       if(result[i].status!=ready)
         {
          i--;
          Sleep(1000);
          continue;
         }
       max_result=MathMax(max_result,result[i].out_data[0]);
      }
   Print("Max result = ",ArrayMaximum(result[0].out_data));
  }
  
//+------------------------------------------------------------------+
void OnCloudPass(uint num_mission)
  {
   // анализируем результат выполнения задачи по ее номеру, если нужно
   double s=result[num_mission].out_data[0];
  }
//+------------------------------------------------------------------+

void CloudInit(long ID, string programm_name) {}
void CloudData(string file_dat) {}
void CloudCalculat(uint num_mission, double & idata[]) {}
Причина обращения: