¿Qué debería añadirse para el soporte adicional de los cálculos matemáticos universales en MQL5 y MQL5 Cloud Network? - página 6

 
Renat:

Esta es la cuestión, Renat.

MT5 entiende claramente cuando se activa un stop loss y cuando se activa un take profit. // Esto se puede ver en los comentarios de la orden y está claro en el propio manejo de la plataforma.

Por eso tenemos la petición (constante). - Nos gustaría que el indicador correspondiente apareciera en OnTradeTransaction al activar un SL o TP.


Pero si esto es imposible (incluso teóricamente) debido a la falta de una arquitectura de vinculación adecuada, será mejor que digamos que la arquitectura de la plataforma no nos permite poner una bandera en la orden que se envía a esta acción para confirmar si era un SL o un TP.

Aunque para ti no existe la palabra "nada es imposible". Usted es metacitas :)

 

En otras palabras, mirando la estructura de la transacción https://www.mql5.com/ru/docs/constants/structures/mqltradetransaction

Yo añadiría un campo 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;           // Объем в лотах
  };
las razones para realizar el pedido, respectivamente
SL activado
TP activado
Salir de una posición mediante Stop Out

y otros, si los hay // aunque esto puede ser todo lo que necesitamos
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции - Документация по MQL5
 
sergeev:

Hay un punto aquí, Renat.

MT5 entiende claramente cuando se activa el Stop Loss y cuando se activa el Take Profit. // Esto se puede ver en los comentarios del pedido y en la propia plataforma.

Esa es la cuestión: no entiende ni debe entender.

Todo pasa por las colas de ejecución, las órdenes se dividen en simple COMPRA/VENTA, con pasarelas a proveedores de liquidez y bolsas. No se sabe cómo se ejecutará (incluso parcialmente) en la realidad. Y si de repente proclamamos que garantizamos la detención de las banderas, los papaklass nos acusarán mañana con justa razón de que "¡a mí no me ha funcionado!".

 
Renat:

Esa es la cuestión: en realidad no lo hace y no debería hacerlo.

Todo se desarrolla en colas de ejecución, las órdenes se dividen en simple COMPRA/VENTA, y a través de las pasarelas a los proveedores de liquidez y las bolsas.

Sí, se está dividiendo.

Pero esta acción de división requiere una acción bastante específica: activar el Stop Loss/StackProfit. Y estas acciones son procesadas por el servidor de MT , no por el terminal del cliente.

Aunque la activación de los stops no tenga lugar en MT, el resultado sigue siendo la creación de una orden o evento real para MT5.

Me doy cuenta de que no puedo entrar en las entrañas del servidor de MT5, pero asegúrate una vez más. ¿Es posible notificar sobre la acción en base a la cual se realiza el pedido?

Una vez que el servidor (o la pasarela) activa un stoploop/stackprofit/stopout, etc., la respuesta es realizar una orden de todos modos. // ¡No pasa nada sin una orden!

Y aquí, en esta orden y poner la bandera apropiada - la razón de poner esta orden o evento.

 
¿Tal vez debería haberse introducido una nueva estructura, específicamente para TradeTransaction?
 
pronych:
¿Tal vez debería haberse introducido una nueva estructura, sólo para TradeTransaction?

No es tan nuevo :) es muy completo.

Sólo faltan dos campos

- identificador de posición
- motivo de la orden

 
sergeev:

Sí, se divide.

Pero la acción para esta división es bastante específica: activar el stoploop/stackprofit. Y esta acción es procesada por el servidor MT , no por el terminal del cliente.

La respuesta es sencilla: no hay garantía de que se marque el 100%.

Porque hay muchas fuentes e iniciadores de activación, y no es el único servidor de comercio.

 
Renat:

La respuesta es sencilla: no hay garantía de que se marque el 100%.

Porque hay muchas fuentes y desencadenantes, y este no es en absoluto el único servidor comercial.

¿La activación de un stop loss es realmente gestionada por varios servidores de comercio?

Me parece que un solo servidor de comercio es suficiente para este propósito.

Para la activación, se crea una orden y se notifica a la plataforma su creación. // por una pasarela externa
entonces se vierte. y aparecen los oficios.
Es comprensible que el pedido no se pueda cumplir, y el resto será retirado.
Pero en el momento de la creación de esta orden podemos añadir a la transacción una bandera que diga que es una orden de stop loss.
Lo más importante es el hecho en sí de que se trata de una orden de stop loss.

¿O en MT puede haber operaciones sin orden si el stop loss lo gestiona la pasarela?

Pero tú lo sabes mejor, no voy a discutir. Es un punto muy sutil.
 

papaklass:

¿Y quién es el que habla?

Definitivamente tú.

Estás tratando de trollear. ¿Cuál es el punto?

Compórtate.

 
Renat:

Nosotros, por nuestra parte, pensamos en la comunicación independiente entre agentes sin terminal. Por ejemplo, uno de los agentes puede generar datos iniciales y enviarlos a los demás mediante fordcast.

Sin la participación del terminal, esto es bueno.

¿Quién generará los datos para este "uno de los agentes"? ¿Podrá hacerlo un script o un indicador?

Para qué sirve la comunicación entre agentes, ilumina a los no entendidos si puedes.

Ya escribí un script para probar las capacidades matemáticas, aunque faltan algunas funciones)

// все данные расчетов агентов складываются в массив структур
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[]) {}
Razón de la queja: