Cosa si dovrebbe aggiungere per un ulteriore supporto dei calcoli matematici universali in MQL5 e MQL5 Cloud Network? - pagina 6

 
Renat:

Il fatto è questo, Renat.

MT5 capisce chiaramente quando lo stoploss è attivato e quando il takeprofit è attivato. // Questo può essere visto dai commenti degli ordini ed è chiaro dalla gestione della piattaforma stessa.

Ecco perché abbiamo la richiesta (costantemente). - Vorremmo che il flag appropriato apparisse in OnTradeTransaction quando si attiva lo SL o il TP.


Ma se questo è impossibile (anche teoricamente) a causa della mancanza di un'architettura vincolante adeguata, è meglio dire solo che l'architettura della piattaforma non ci permette di mettere un flag nell'ordine che viene inviato a questa azione per confermare se era un SL o un TP.

Anche se per voi non esiste la parola "niente è impossibile". Voi siete meta-citazioni :)

 

In altre parole, guardando la struttura della transazione https://www.mql5.com/ru/docs/constants/structures/mqltradetransaction

Aggiungerei 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;           // Объем в лотах
  };
i motivi dell'ordine, rispettivamente
SL attivato
TP attivato
Uscire da una posizione con Stop Out

e altri, se ce ne sono // anche se questo potrebbe essere tutto ciò di cui abbiamo bisogno
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции - Документация по MQL5
 
sergeev:

C'è un punto qui, Renat.

MT5 capisce chiaramente quando lo Stop Loss è attivato e quando il Take Profit è attivato. // Questo può essere visto nei commenti dell'ordine e nella piattaforma stessa.

Questo è il punto: non capisce e non dovrebbe capire.

Tutto passa attraverso le code di esecuzione, gli ordini sono divisi in semplici BUY/SELL, con gateway per i fornitori di liquidità e le borse. Non si può dire come verrà eseguito (anche parzialmente) nella realtà. E se improvvisamente proclamiamo che garantiamo lo stop alle bandiere, domani papaklass ci accuserà con giusta rabbia che "non ha funzionato per me!".

 
Renat:

Questo è il punto: in realtà non lo fa e non dovrebbe farlo.

Tutto scorre in code di esecuzione, gli ordini sono divisi in semplici BUY/SELL, e attraverso i gateway ai fornitori di liquidità e alle borse.

Sì, si sta dividendo.

Ma questa azione di divisione richiede un'azione abbastanza specifica - per attivare Stop Loss/StackProfit. E queste azioni sono processate dal server di MT , non dal terminale client.

Anche se l'attivazione degli stop non avviene in MT, il risultato è comunque la creazione di un vero ordine o evento per MT5.

Mi rendo conto che non posso entrare nelle viscere del server MT5, ma tu assicurati ancora una volta. È possibile notificare l'azione in base alla quale viene effettuato l'ordine?

Una volta che il server (o il gateway) attiva uno stoploop/stackprofit/stopout, etc., la risposta è di piazzare comunque un ordine. // Non succede niente senza un ordine!

E qui, su questo ordine e mettere la bandiera appropriata - il motivo di questo ordine o evento.

 
Forse si sarebbe dovuto introdurre una nuova struttura, specificamente per TradeTransaction?
 
pronych:
Forse si sarebbe dovuto introdurre una nuova struttura, solo per TradeTransaction?

Non è così nuovo :) è molto completo.

Mancano solo due campi

- identificatore di posizione
- motivo dell'ordine

 
sergeev:

Sì, si divide.

Ma l'azione per questa divisione è abbastanza specifica - attivare stoploop/stackprofit. E questa azione viene elaborata dal server MT , non dal terminale client.

La risposta è semplice: non c'è garanzia di flagging al 100%.

Perché ci sono molte fonti e iniziatori di attivazione, e non è l'unico server di trading.

 
Renat:

La risposta è semplice: non c'è garanzia di flagging al 100%.

Perché ci sono così tante fonti e inneschi, e questo non è assolutamente l'unico server commerciale.

L'attivazione di uno stop loss è davvero gestita da diversi server di trading?

Mi è sembrato che un solo server di trading sia sufficiente per questo scopo.

Per l'attivazione, si crea un ordine e si notifica alla piattaforma la sua creazione. // da un gateway esterno
Poi si versa. e appaiono i mestieri.
È comprensibile che l'ordine non possa essere evaso, e il resto sarà ritirato.
Ma al momento della creazione di questo ordine possiamo aggiungere alla transazione un flag che dice che si tratta di un ordine stop loss.
La cosa più importante è l'evento stesso che questo è un ordine per uno stop loss.

O in MT ci possono essere scambi senza un ordine se lo stop loss è gestito dal gateway?

Ma tu lo sai bene, non voglio discutere. è un punto molto sottile.
 

papaklass:

E chi sta facendo tutto il discorso?

Sicuramente tu.

Stai cercando di trollare, qual è il punto?

Comportati bene.

 
Renat:

Noi, da parte nostra, pensiamo alla comunicazione indipendente tra agenti senza un terminale. Per esempio, uno degli agenti può generare dati iniziali e inviarli agli altri tramite fordcast.

Senza il coinvolgimento del terminale, questo è buono.

Chi genererà i dati per questo "uno degli agenti"? Uno script o un indicatore sarà in grado di farlo?

A cosa serve la comunicazione tra agenti, illuminate i non addetti ai lavori se potete.

Ho già scritto uno script per testare le capacità di calcolo matematico, ma mancano alcune funzioni)

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