Bibliotheken: TradeTransactions - Seite 8

 
ifffrt #:
Derselbe Fehler trat auch nach dieser Änderung noch auf, sorry.

Laden Sie jede Datei separat von der russischen Version der Codebasis herunter.

TradeTransactions
TradeTransactions
  • www.mql5.com
Доступ к данным OnTradeTransaction в любом месте программы
 

Hallo,

Bitte helfen Sie mir, ich stecke in einem Punkt fest. Ich habe 2 EAs gemacht, einer speichert Daten, der andere liest sie. Ich habe ein Problem mit der Ressourcenerkennung.

Dieser Code speichert die Daten und von dort kann ich darauf zugreifen und sie lesen:

#include "ResourceData.mqh" // https://www.mql5.com/de/code/22166

#define PRINT(A) Print(#A + " = " + (string)(A));

  struct ExampleStruct

    {

     string ea_name;

     string symbol;

     string direction;

     string time_for_command;

    };

 ExampleStruct qexamplestruct[2];

int OnInit(void)

  {

      EventSetTimer(1);

   return(INIT_SUCCEEDED);

  } 

void OnTimer()

{    

  // Произвольные данные для примера

  string Str[] = {"123", "Hello World!"};  

  qexamplestruct[0].direction="buy";

  qexamplestruct[0].ea_name="TestEAname";

  qexamplestruct[0].symbol="EURUSD";  

  qexamplestruct[0].time_for_command="01.01.2021";

  string stringtosend = Serialize(qexamplestruct[0]);


  const RESOURCEDATA<uint> Resource("::ResoC"); // Ресурс для обмена данными

  CONTAINER<uint> Container;         // Создаем контейнер - все будет храниться в массиве простого типа (в примере выбран uint)

 Container[0] = Str;

 Container[1] = stringtosend;


  const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::ResoC";  

   Print(NameOut); // Вывели полное имя ресурса.

  Resource = Container.Data;  // Отправили данные на обмен

//---

   }

   string Serialize(const ExampleStruct &s)

{

   return s.ea_name + "\n" + s.symbol + "\n" + s.direction + "\n" + s.time_for_command;

}


ExampleStruct Deserialize(const string &line)

{

   string parts[];

   StringSplit(line, '\n', parts);


   ExampleStruct s;

   if(ArraySize(parts) > 0) s.ea_name = parts[0];

   if(ArraySize(parts) > 1) s.symbol = parts[1];

   if(ArraySize(parts) > 2) s.direction = parts[2];

   if(ArraySize(parts) > 3) s.time_for_command = parts[3];

   return s;

}

Und dieser Code liest die Daten und schreibt jedes Mal, dass da nichts ist:

#include "ResourceData.mqh" // https://www.mql5.com/de/code/22166

#define PRINT(A) Print(#A + " = " + (string)(A));

int OnInit(void){return(INIT_SUCCEEDED);} 

void OnTick()

{    

  const RESOURCEDATA<uint> Resource("\Terminal\99A739E3DB06068691C851DE1765F329\MQL5\Experts\ZC\Conections\Draft4.ex5::ResoC"); // Ресурс для доступа к данным (только для чтения) из другой программы

  CONTAINER<uint> Container4; // Сюда будем получать данные

  Resource.Get(Container4.Data); // Считали данные из ресурса.  

    for (int i = 0; i < Container4.GetAmount(); i++)

       Print("i==",i);

         string Str4;

           Container4[0].Get(Str4);                // Получили массив

  Print("Test!!!"+Str4);   

  Print(Str4);

//---

   }

Ich scheine alles analog zu machen, aber aus irgendeinem Grund sehe ich keine Informationen aus dem Code, den ich geschrieben habe, weder ein Array vom Typ String, noch einen einzelnen String, den ich aus meiner Struktur bekomme

TradeTransactions
TradeTransactions
  • 2018.09.06
  • www.mql5.com
Доступ к данным OnTradeTransaction в любом месте программы
 
Alexander #:

Ich scheine alles durch Analogie zu tun, aber aus irgendeinem Grund keine Informationen von der ich schrieb, weder ein Array von String-Typ, noch eine einzelne Zeichenfolge, die ich von meiner Struktur erhalten angezeigt wird.

Ich habe es nicht ausgeführt, aber ich nehme an, dass dies der Fall ist.

  string GetFullName( void ) const
  {
    // Muss TERMINAL_DATA_PATH sein вместо TERMINAL_PATH.
        return((this.GetName()[0] == ':') ? ::StringSubstr(::MQLInfoString(MQL_PROGRAM_PATH), ::StringLen(::TerminalInfoString(TERMINAL_PATH)) + 5) + this.GetName() : this.GetName());
  }

Versuchen Sie es auf diese Weise.

const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_DATA_PATH)) + 5) + "::ResoC";
 
fxsaber #:

Ich habe es nicht ausprobiert, aber ich nehme an, dass das der Fall ist.

Probieren Sie es selbst aus.

Hallo, vielen Dank für Ihren Beitrag

Habe es gleich ausprobiert, da hier schon einmal darüber geschrieben wurde. Ich bin die Optionen durchgegangen, sowohl im Namen als auch in der Adresse zu fixieren, auch in "ResourceData.mqh" korrigiert. Hat leider nicht geholfen. Ich habe die Ursache noch nicht gefunden

 
Ich habe den Ressourcennamen mit Print("Full Name: ",Resource.GetFullName()) überprüft; ich nehme den richtigen Namen, ich habe sowohl TERMINAL_PATH als auch TERMINAL_DATA_PATH Pfadvarianten ausprobiert - das Ergebnis ist das gleiche.
 

Ich habe einige weitere Fortschritte gemacht -

Wenn ich ResourceReadImage(FullNameCorrect,Arr,width,height)) direkt verwende, kann ich Daten von einer Ressource akzeptieren, die von einem anderen EA erstellt wurde, alles funktioniert korrekt. Beim Zugriff auf denselben Ressourcennamen über Bibliotheksfunktionen (ähnlich der oben angehängten) - werden die Daten nicht akzeptiert.

Ich werde weiter berichten, wenn ich finde, was das Problem war.

 

Ich erstelle eine Ressource:

a - über die Bibliothek

b - manuell (ResourceCreate)

Ich greife auf die Ressourcendaten von einem anderen EA zu, der denselben Ressourcennamen verwendet:

a - über die Bibliothek

b - manuell(ResourceReadImage)

Ergebnis:

Die über die Bibliothek erstellte Ressource wird nicht gefunden, weder manuell noch über die Bibliothek

Eine manuell erstellte Ressource wird gefunden und manuell gelesen, aber nicht über die Bibliothek gefunden.

 
Alexander #:

Eine über die Bibliothek erstellte Ressource wird nicht gefunden, weder manuell noch über die Bibliothek

Eine manuell erstellte Ressource wird manuell gefunden und gelesen, aber nicht über die Bibliothek gefunden.

Sie funktioniert über die Bibliothek.

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/de/code/22166

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{    
  // Beliebige Daten für das Beispiel
  string Str[] = {"123", "Hello World!"};
  double Num = 5;
  MqlTick Tick = {0};
  Tick.bid = 1.23456;

  const RESOURCEDATA<uint> Resource("::ResoC"); // Ressource für die gemeinsame Nutzung von Daten
  CONTAINER<uint> Container;         // Erstellen eines Containers - alles wird in einem Array eines einfachen Typs gespeichert (in diesem Beispiel wird uint gewählt)
  
  // Füllen Sie den Container mit verschiedenen Daten
  Container[0] = Str;
  Container[1] = Num;
  Container[2] = Tick;
    
  // Drucken der im Container gespeicherten Datentypen
  for (int i = 0; i < Container.GetAmount(); i++)
    PRINT(Container[i].GetType())

  Resource = Container.Data;  // Senden der Daten zum Austausch
  
  CONTAINER<uint> Container2; // Hier werden wir die Daten abrufen

  const RESOURCEDATA<uint> Resource2(Resource.GetFullName()); // Ressource für die gemeinsame Nutzung von Daten
  
  Resource2.Get(Container2.Data); // Ich habe die Daten
      
  // Abrufen der Daten in ihrer ursprünglichen Form
  string Str2[];
  Container2[0].Get(Str2);                // Ich habe das Array
  ArrayPrint(Str2);

  PRINT(Container2[1].Get<double>())      // Wir haben eine Nummer
  PRINT(Container2[2].Get<MqlTick>().bid) // Wir haben die Struktur 
}


Ich weiß nicht, warum Ihr ursprüngliches Beispiel noch nicht funktioniert.

 
fxsaber #:

Warum Ihr ursprüngliches Beispiel nicht funktioniert, weiß ich noch nicht.

Wenn alles andere richtig geschrieben ist, wird es helfen.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Bibliotheken: TradeTransactions

Alexander, 2025.09.15 21:09

void OnTimer()
{    
  // ....
  static const RESOURCEDATA<uint> Resource("::ResoC"); // Ressource für die gemeinsame Nutzung von Daten
  // ....
}

Du hast ein Objekt auf jedem Eingang zu OnTimer erstellt und es dementsprechend getötet - auf dem Ausgang. Das ist, warum die Ressource lebte für Mikrosekunden und war nicht auf der Seite.

class RESOURCE
{
public:
  ~RESOURCE( void)
  {
    ::ResourceFree(this.Name);
  }
 
fxsaber #:
statisch

Was für ein offensichtlicher Punkt, an dem ich 2 Tage lang vorbeigeschaut habe, ohne ihn zu bemerken)

Ich danke Ihnen sehr!


Alles funktioniert perfekt, die Möglichkeit, benutzerdefinierte Strukturen zwischen Algorithmen mit Ihrer Bibliothek auszutauschen, ist eine große Hilfe für meinen Handel, Hut ab vor Ihnen!