Was sollte zur zusätzlichen Unterstützung von universellen mathematischen Berechnungen in MQL5 und MQL5 Cloud Network hinzugefügt werden? - Seite 6

 
Renat:

Die Sache ist die, Renat.

MT5 weiß genau, wann ein Stop-Loss aktiviert ist und wann ein Take-Profit. // Dies ist aus den Kommentaren zur Bestellung ersichtlich und geht aus der Handhabung der Plattform selbst hervor.

Aus diesem Grund haben wir (ständig) die Bitte. - Wir möchten, dass das entsprechende Flag in OnTradeTransaction erscheint, wenn der SL oder TP aktiviert wird.


Aber wenn dies (selbst theoretisch) aufgrund des Mangels an einer geeigneten Bindungsarchitektur nicht möglich ist, sagen wir besser einfach, dass die Plattformarchitektur es uns nicht erlaubt, ein Kennzeichen in den Auftrag zu setzen, der an diese Aktion gesendet wird, um zu bestätigen, ob es ein SL oder ein TP war.

Auch wenn es für Sie kein Wort wie "nichts ist unmöglich" gibt. Sie sind metaquotes :)

 

Mit anderen Worten: Betrachtet man die Struktur der Transaktion https://www.mql5.com/ru/docs/constants/structures/mqltradetransaction

Ich würde ein TRADE_ACTION-Feld hinzufügen

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;           // Объем в лотах
  };
die Gründe für die Erteilung des Auftrags bzw.
SL ausgelöst
TP ausgelöst
Verlassen einer Position durch Stop Out

und andere, falls es welche gibt // obwohl dies vielleicht alles ist, was wir brauchen
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торговой транзакции - Документация по MQL5
 
sergeev:

Da ist etwas dran, Renat.

MT5 weiß genau , wann der Stop Loss und wann der Take Profit aktiviert ist. // Dies geht aus den Kommentaren zur Bestellung hervor und ist auch auf der Plattform selbst ersichtlich.

Das ist es ja: Er versteht es nicht und sollte es nicht verstehen.

Alles läuft über Ausführungswarteschlangen, Aufträge werden in einfache Käufe und Verkäufe aufgeteilt und über Gateways an Liquiditätsanbieter und Börsen weitergeleitet. Es ist nicht absehbar, wie sie in der Realität (auch teilweise) ausgeführt werden wird. Und wenn wir plötzlich verkünden, dass wir garantieren, dass die Flaggen aufhören, wird Papaklass uns morgen in gerechtem Zorn vorwerfen, dass "es bei mir nicht funktioniert hat!".

 
Renat:

Das ist der Punkt: In Wirklichkeit ist das nicht der Fall und sollte es auch nicht sein.

Alles läuft in Ausführungswarteschlangen, die Aufträge werden in einfache Käufe und Verkäufe aufgeteilt und über die Gateways an Liquiditätsanbieter und Börsen weitergeleitet.

Ja, es spaltet sich.

Diese Aufteilung erfordert jedoch eine ganz bestimmte Aktion - die Aktivierung von Stop Loss/StackProfit. Und diese Aktionen werden vom MT-Server verarbeitet , nicht vom Client-Terminal.

Auch wenn die Aktivierung der Stops nicht im MT erfolgt, wird als Ergebnis ein echter Auftrag oder ein Ereignis für MT5 erstellt.

Mir ist klar, dass ich nicht in die Eingeweide des MT5-Servers eindringen kann, aber vergewissern Sie sich einfach noch einmal. Ist es möglich, über die Aktion zu informieren, aufgrund derer der Auftrag erteilt wird?

Sobald der Server (oder das Gateway) einen Stoploop/Stackprofit/Stoppout usw. aktiviert, muss trotzdem eine Bestellung aufgegeben werden. // Ohne Bestellung passiert nichts!

Und hier, auf dieser Bestellung und setzen Sie die entsprechende Flagge - der Grund für die Platzierung dieser Bestellung oder Veranstaltung.

 
Vielleicht hätte eine neue Struktur speziell für TradeTransaction eingeführt werden sollen?
 
pronych:
Vielleicht hätte eine neue Struktur nur für TradeTransaction eingeführt werden sollen?

Es ist nicht so neu :) es ist sehr vollständig.

Es fehlen nur zwei Felder

- Positionsnummer
- Grund für die Erteilung eines Auftrags

 
sergeev:

Ja, es spaltet sich.

Aber die Aktion für diese Aufteilung ist ziemlich spezifisch - um Stoploop/Stackprofit zu aktivieren. Und diese Aktion wird vom MT-Server verarbeitet , nicht vom Client-Terminal.

Die Antwort ist einfach: Es gibt keine Garantie für eine 100%ige Kennzeichnung.

Denn es gibt viele Quellen und Auslöser für die Auslösung, und es ist nicht der einzige Handelsserver.

 
Renat:

Die Antwort ist einfach: Es gibt keine Garantie für eine 100%ige Kennzeichnung.

Denn es gibt so viele Quellen und Auslöser, und dies ist bei weitem nicht der einzige Handelsserver.

Wird die Aktivierung eines Stop-Loss wirklich von mehreren Handelsservern abgewickelt?

Ich hatte den Eindruck, dass ein einziger Handelsserver für diesen Zweck ausreichend ist.

Für die Aktivierung wird ein Auftrag erstellt und die Plattform über dessen Erstellung informiert. // durch ein externes Gateway
dann wird es gegossen. und die Gewerke erscheinen.
Es ist verständlich, dass die Bestellung nicht ausgeführt werden kann, und der Restbetrag wird zurückgezogen.
Aber im Moment der Auftragserstellung können wir der Transaktion eine Markierung hinzufügen, die besagt, dass es sich um einen Stop-Loss-Auftrag handelt.
Das Wichtigste ist das Ereignis selbst, dass es sich um einen Auftrag für einen Stop-Loss handelt.

Oder kann es in MT auch Abschlüsse ohne Order geben, wenn der Stop-Loss über das Gateway abgewickelt wird?

Aber Sie wissen es besser, ich werde nicht widersprechen.
 

papaklass:

Und wer redet hier eigentlich?

Auf jeden Fall Sie.

Du versuchst zu trollen. Was soll das?

Benehmen Sie sich.

 
Renat:

Wir unsererseits denken über eine unabhängige Kommunikation zwischen Agenten ohne Terminal nach. Zum Beispiel kann einer der Agenten erste Daten generieren und diese per Fordcast an die anderen senden.

Ohne die Beteiligung des Terminals ist das gut.

Wer wird die Daten für diesen "einen der Agenten" generieren? Kann ein Skript oder ein Indikator dies bewerkstelligen?

Wozu dient die Kommunikation zwischen Agenten? Klären Sie die Unbedarften auf, wenn Sie können.

Ich habe bereits ein Skript geschrieben, um die mathematischen Fähigkeiten zu testen, obwohl noch einige Funktionen fehlen)

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