O que deve ser acrescentado para apoio adicional de cálculos matemáticos universais em MQL5 e MQL5 Cloud Network? - página 6

 
Renat:

Eis o que se passa, Renat.

MT5 compreende claramente quando um stop loss é activado e quando um take profit é activado. // Isto pode ser visto a partir de comentários de encomendas e é claro a partir do próprio manuseamento da plataforma.

É por isso que temos o pedido (constantemente). - Gostaríamos que a bandeira apropriada aparecesse na OnTradeTransaction ao activar o SL ou TP.


Mas se isto for impossível (mesmo teoricamente) devido à falta de uma arquitectura vinculativa adequada, é melhor dizer apenas que a arquitectura da plataforma não nos permite colocar uma bandeira na ordem que está a ser enviada para esta acção para confirmar se foi um SL ou um TP.

Embora para si não exista tal palavra como "nada é impossível". São metaquotes :)

 

Por outras palavras, olhando para a estrutura da transacção https://www.mql5.com/ru/docs/constants/structures/mqltradetransaction

Eu acrescentaria um 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;           // Объем в лотах
  };
as razões para fazer a encomenda, respectivamente
SL desencadeado
TP desencadeado
Sair de uma posição por Stop Out

e outros, se houver algum // embora isto possa ser tudo o que precisamos
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции - Документация по MQL5
 
sergeev:

Há aqui um ponto, Renat.

MT5 compreende claramente quando o Stop Loss é activado e quando o Take Profit é activado. // Isto pode ser visto nos comentários da ordem e na própria plataforma.

O problema é esse: ele não compreende e não deve compreender.

Tudo passa por filas de execução, as ordens são divididas em simples BUY/SELL, com gateways para fornecedores de liquidez e bolsas. Não se sabe como será executado (incluindo parcial) na realidade. E se de repente proclamarmos que garantimos o fim das bandeiras, o Papaklass acusar-nos-á amanhã com justa raiva de que "não funcionou para mim!

 
Renat:

A questão é essa: na realidade, não o faz e não deve fazê-lo.

Tudo corre em filas de execução, as ordens são divididas em simples BUY/SELL, e através das portas de acesso aos fornecedores de liquidez e bolsas.

Sim, está a dividir-se.

Mas esta acção de divisão requer uma acção bastante específica - para activar o Stop Loss/StackProfit. E estas acções são processadas pelo servidor da MT , não pelo terminal do cliente.

Mesmo que a activação de paragens não ocorra em MT, o resultado continua a ser a criação de uma ordem ou evento real para MT5.

Compreendo que não consigo entrar nas entranhas do servidor MT5, mas é só ter a certeza, mais uma vez. É possível notificar sobre a acção com base na qual a encomenda é feita?

Assim que o servidor (ou gateway) activa um stoploop/stackprofit/stopout, etc., a resposta é fazer uma encomenda de qualquer maneira. // Nada acontece sem uma encomenda!

E aqui, nesta ordem e colocar a bandeira apropriada - a razão para colocar esta ordem ou evento.

 
Talvez devesse ter sido introduzida uma nova estrutura, especificamente para a TradeTransaction?
 
pronych:
Talvez devesse ter sido introduzida uma nova estrutura, apenas para TradeTransaction?

Não é assim tão novo :) é muito completo.

Faltam apenas dois campos

- identificador de posição
- razão para fazer uma encomenda

 
sergeev:

Sim, divide-se.

Mas a acção para esta divisão é bastante específica - para activar o stoploop/stackprofit. E esta acção é processada pelo servidor MT , não pelo terminal do cliente.

A resposta é simples - não há garantia de 100% de bandeiras.

Porque existem muitas fontes e iniciadores de desencadeamento, e não é o único servidor comercial.

 
Renat:

A resposta é simples - não há garantia de 100% de bandeiras.

Pois há tantas fontes e gatilhos, e este não é de modo algum o único servidor comercial.

A activação de um stop loss é realmente tratada por vários servidores comerciais?

Pareceu-me que apenas um servidor comercial é suficiente para este fim.

Para a activação, é criada uma ordem e a plataforma é notificada da sua criação. // por um portão externo
depois é derramado. e os ofícios aparecem.
É compreensível que a encomenda não possa ser preenchida, e que o resto seja retirado.
Mas no momento da criação desta ordem podemos acrescentar à transacção uma bandeira dizendo que se trata de uma ordem de stop loss.
O mais importante é o próprio acontecimento que é uma ordem para uma paragem da perda.

Ou em MT pode haver negócios sem ordem se o stop loss for tratado pela porta de entrada?

Mas sabe melhor, não vou discutir. é um ponto muito subtil.
 

papaklass:

E quem é que está a falar?

Definitivamente, você.

Para quê?

Comporte-se.

 
Renat:

Nós, pela nossa parte, estamos a pensar numa comunicação independente entre agentes sem um terminal. Por exemplo, um dos agentes pode gerar dados iniciais e enviá-los para os outros por fordcast.

Sem o envolvimento do terminal, isto é bom.

Quem irá gerar os dados para este "um dos agentes"? Será um guião ou um indicador capaz de o fazer?

Para que serve a comunicação entre agentes, ilumine os pouco sofisticados se puder.

Já escreveu um guião para testar as capacidades de cálculos matemáticos, mas faltam algumas funções)

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