Inhaltliche Klärung???? - Seite 8

 
Алексей Тарабанов #:
Ich gebe meiner Enkelin auch eine Aufgabe: Es gibt eine Beziehung zwischen Z und Y und Y und X. Zeichnen Sie ein Diagramm der Abhängigkeit von Z von X. Stellen Sie es grafisch dar. Sie zeichnet es.

Vielen Dank, ich verstehe.

 
prostotrader #:

Wie auch immer, ich habe mir 500 Datensätze angesehen, aber ohne das Original ist es unmöglich, das zu 100% zu bestätigen.

Aber Sie haben fehlende Anführungszeichen, es ist möglich, dass in MT5 auch (aber viel weniger)

Ich werde versuchen, Ihre Zeit in "verdaulich" zu übersetzen und BID und ASK separat in MT5 zu extrahieren,

Aber Sie sehen schon, dass es zu viele Unstimmigkeiten gibt!

Ja, es gibt Diskrepanzen. Die von der Börse zur Verfügung gestellte Tabelle und die aggregierten Kurse sind nicht 100%ig zuverlässig. Dies wird von der Börse selbst festgestellt.
100 % verlässliche Daten gibt es laut der Börse nur in der Tabelle orders_log, deren Abonnement allerdings extra kostet.
Aus welchen Bewegungen und Tabellen MT5 die Daten entnimmt und wie er sie entnimmt, kann ich nicht 100%ig sagen, ich kann nur spekulieren.
Deshalb verwende ich für meine Zwecke meine eigene Software, weil ich sehe, wie und woher die Daten stammen.
Ich bin mit den bisherigen Ergebnissen zufrieden.

 
Vladimir Mikhailov #:

Ja, es gibt Diskrepanzen. Die von der Börse übermittelten gemeinsamen Tabellen und aggregierten Tumbler sind nicht 100%ig zuverlässig. Dies wird von der Börse selbst festgestellt.
100 % verlässliche Daten gibt es nach Angaben der Börse nur in der Tabelle orders_log, deren Abonnement allerdings etwas Geld kostet.
Aus welchen Bewegungen und Tabellen MT5 die Daten entnimmt und wie er sie entnimmt, kann ich nicht 100%ig sagen, ich kann nur spekulieren.
Deshalb verwende ich für meine Zwecke meine eigene Software, weil ich sehe, wie und woher die Daten stammen.
Ich bin mit den bisherigen Ergebnissen zufrieden.

MT5 bezieht die Daten von demselben Ort, von dem Sie sie erhalten haben, nämlich PlazaII.

Ich habe Ihre Zeit umgerechnet, es gibt zu viele Unterschiede, die Zitate sind die gleichen, aber die Zeit ist anders.

Sie haben Zitate in Rot übersprungen.

Zeitumrechner

//+------------------------------------------------------------------+
//|                                                    Convertor.mq5 |
//|                                     Copyright 2021, prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#define  STR_POS 8
ulong base_time_ns;
ulong add_time; //добивка до Московского времи

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
string GetTime(const string b_str)
{
  ulong cur_time = ulong(StringToInteger(b_str));
  if(cur_time > 0)
  {
    ulong full_time = (cur_time + add_time);
    ulong diff_time = full_time - base_time_ns;
    if(diff_time > 0)
    {
      ulong sec_time = ulong(double(full_time)/1000000000);
      ulong ms_time = ulong(double((full_time - sec_time*1000000000))/1000000); 
      ulong mcs_time = ulong(double( full_time - (sec_time*1000000000 + ms_time*1000000))/1000);
      ulong ns_time = full_time - (sec_time*1000000000 + ms_time*1000000 + mcs_time*1000);
      return(TimeToString(datetime(sec_time), TIME_SECONDS) + "." + StringFormat("%03i", ms_time) +
             "." + StringFormat("%03i", mcs_time) + "." + StringFormat("%03i", ns_time));
    }
    else return("Time out of range!"); 
  }
  return("");
}
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
bool GetParams(const string a_str, string &a_1, string &a_2, string &a_3,
                     string &a_4, string &a_5, string &a_6, string &a_7,
                     string &a_8,string &a_9)
{
  if(base_time_ns > 0)
  {
    string tmp_str = a_str;
    int cnt = 0;
    while(cnt<STR_POS)
    {
      int a_pos = StringFind(tmp_str, ";");
      if(a_pos > 0)
      {
        switch(cnt)
        {
          case 0:
            a_1 = StringSubstr(tmp_str, 0, a_pos);
          break;
          case 1:
            a_2 = StringSubstr(tmp_str, 0, a_pos);
          break;
          case 2:
            a_3 = StringSubstr(tmp_str, 0, a_pos);
          break;
          case 3:
            a_4 = StringSubstr(tmp_str, 0, a_pos);
          break;
          case 4:
            a_5 = StringSubstr(tmp_str, 0, a_pos);
          break;
          case 5:
            a_6 = StringSubstr(tmp_str, 0, a_pos);
          break;
          case 6:
            a_7 = StringSubstr(tmp_str, 0, a_pos);
          break;
          case 7:
            a_8 = GetTime(StringSubstr(tmp_str, 0, a_pos));
            a_9 = GetTime(StringSubstr(tmp_str, a_pos + 1));
          break;
        }
      }
      tmp_str = StringSubstr(tmp_str, a_pos + 1);
      cnt++;
    }
    return(true);
  }
  return(false);
}
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  int str_cnt = 0;
  base_time_ns = ulong(D'20.10.2021 07:00:00') * 1000 * 1000 * 1000;
  add_time = (3*3600);
  add_time = add_time*1000000000;
  string in_str, par_1, par_2, par_3, par_4, par_5, par_6, par_7, par_8, par_9;
  int in_handle=FileOpen("gazp-20-10-2021.csv",FILE_READ|FILE_ANSI|FILE_CSV); 
  if(in_handle!=INVALID_HANDLE)
  {
    int out_handle=FileOpen("gazp-20-10-2021_new.csv",FILE_WRITE|FILE_CSV); 
    if(out_handle!=INVALID_HANDLE)
    {
      while(!FileIsEnding(in_handle))
      {
        if(str_cnt == 0)
        {
          in_str = FileReadString(in_handle);
          FileWrite(out_handle, "id", "best_buy", "xamount_buy", "best_sell", "xamount_sell", "price", "xamount", "deal_time_ns", "mod_time_ns");
        }
        else
        {
          in_str = FileReadString(in_handle);
          if(StringLen(in_str) > 0)
          {
            if(GetParams(in_str, par_1, par_2, par_3, par_4, par_5, par_6, par_7, par_8, par_9) == true)
              FileWrite(out_handle, par_1, par_2, par_3, par_4, par_5, par_6, par_7, par_8, par_9);
          }
        }
        str_cnt++;
      } 
      FileClose(out_handle);
    }
    FileClose(in_handle);
  }   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+

Ich habe die Datei nicht weiter untersucht.

Dateien:
 

Wladimir!

Natürlich kann es einzelne Fehler geben, aber Sie haben viele fehlende Anführungszeichen, und MT-5 hat ein Problem mit der Zeit

(Soweit ich weiß, kopiert man einfach die Zeit aus der Tabelle, ohne etwas damit zu tun),

es scheint, dass sie sie (die Zeit) selbst "behalten".

Prüfen Sie Ihren Code (auf Auslassungen)

Verwenden Sie hier "0"?

result = cg_conn_process(conn, 0, NULL);
Dateien:
 
prostotrader #:

Wladimir!

Natürlich kann es einzelne Fehler geben, aber Sie haben viele fehlende Anführungszeichen, und MT-5 hat ein Problem mit der Zeit

(Soweit ich weiß, kopiert man einfach die Zeit aus der Tabelle, ohne etwas damit zu tun),

es scheint, dass sie sie (die Zeit) selbst "behalten".

Prüfen Sie Ihren Code (auf Auslassungen)

Verwenden Sie hier "0"?

Ja, die Zeit wird vom Tisch genommen.
In conn_process wird 0 verwendet.

Es gibt keine Auslassungen.

Hier ist der Code der Funktion colback:

CG_RESULT MessageCallbackQuote(cg_conn_t* conn, cg_listener_t* listener, struct cg_msg_t* msg, void* data)
{
        static size_t offset_isin_id = 0;
        static size_t offset_best_buy = 0;
        static size_t offset_xamount_buy = 0; //i8
        static size_t offset_best_sell = 0;
        static size_t offset_xamount_sell = 0; //i8
        static size_t offset_price = 0; //d16.5
        static size_t offset_xamount = 0; //i8
        static size_t offset_deal_time_ns = 0; //u8
        static size_t offset_replAct = 0; //i8
        static size_t offset_mod_time_ns = 0; //u8

        switch (msg->type)
        {
        case CG_MSG_STREAM_DATA:
        {
                int64_t price_int = 0;
                int8_t price_scale = 0;
                long long xamount_buy = 0;
                long long xamount_sell = 0;
                double price;
                long long xamount = 0;
                unsigned long long deal_time_ns = 0;
                unsigned long long mod_time_ns = 0;
                double best_buy = 0;
                double best_sell = 0;

                cg_msg_streamdata_t* replmsg = (cg_msg_streamdata_t*)msg;
                char* data = (char*)replmsg->data;
                if (*(int64_t*)(data + offset_replAct) == 0 && fut_isin_id == *((int32_t*)(data + offset_isin_id)))
                {
                        cg_bcd_get(((char*)(data + offset_best_buy)), &price_int, &price_scale);
                        best_buy = ((double)price_int) / (pow(10.0, price_scale));

                        cg_bcd_get(((char*)(data + offset_best_sell)), &price_int, &price_scale);
                        best_sell = ((double)price_int) / (pow(10.0, price_scale));

                        cg_bcd_get(((char*)(data + offset_price)), &price_int, &price_scale);
                        price = ((double)price_int) / (pow(10.0, price_scale));

                        xamount_buy = *((int64_t*)(data + offset_xamount_buy));
                        xamount_sell = *((int64_t*)(data + offset_xamount_sell));
                        xamount = *((int64_t*)(data + offset_xamount));

                        mod_time_ns = *((uint64_t*)(data + offset_mod_time_ns));
                        deal_time_ns = *((uint64_t*)(data + offset_deal_time_ns));

                        size_t s = quote.size();
                        if (s == 0)
                        {
                                quote.push_back(SQuote(best_buy, xamount_buy, best_sell, xamount_sell, price, xamount, deal_time_ns, mod_time_ns));
                        }
                        else
                        {
                                if (quote[s - 1].best_buy != fut_bid || quote[s - 1].best_sell != fut_ask ||
                                        quote[s - 1].xamount_buy != xamount_buy || quote[s - 1].xamount_sell != xamount_sell ||
                                        quote[s - 1].price != price || quote[s - 1].xamount != xamount ||
                                        quote[s - 1].deal_time_ns != deal_time_ns)
                                {
                                        quote.push_back(SQuote(best_buy, xamount_buy, best_sell, xamount_sell, price, xamount, deal_time_ns, mod_time_ns));
                                }
                        }
                        
                        return(0);
                }
        }
        break;
        case CG_MSG_OPEN:
        {
                struct cg_scheme_desc_t* schemedesc = 0;
                cg_lsn_getscheme(listener, &schemedesc);

                size_t msgidx = 0;
                for (cg_message_desc_t* msgdesc = schemedesc->messages; msgdesc; msgdesc = msgdesc->next, msgidx++)
                {
                        size_t fieldindex = 0;
                        if (strcmp(msgdesc->name, "common") == 0)
                        {
                                for (cg_field_desc_t* fielddesc = msgdesc->fields; fielddesc; fielddesc = fielddesc->next, fieldindex++)
                                {
                                        if (strcmp(fielddesc->name, "replAct") == 0 && strcmp(fielddesc->type, "i8") == 0)
                                        {
                                                offset_replAct = fielddesc->offset;
                                        }
                                        else if (strcmp(fielddesc->name, "isin_id") == 0 && strcmp(fielddesc->type, "i4") == 0)
                                        {
                                                offset_isin_id = fielddesc->offset;
                                        }
                                        else if (strcmp(fielddesc->name, "best_buy") == 0 && strcmp(fielddesc->type, "d16.5") == 0)
                                        {
                                                offset_best_buy = fielddesc->offset;
                                        }
                                        else if (strcmp(fielddesc->name, "best_sell") == 0 && strcmp(fielddesc->type, "d16.5") == 0)
                                        {
                                                offset_best_sell = fielddesc->offset;
                                        }
                                        else if (strcmp(fielddesc->name, "mod_time_ns") == 0 && strcmp(fielddesc->type, "u8") == 0)
                                        {
                                                offset_mod_time_ns = fielddesc->offset;
                                        }
                                        else if (strcmp(fielddesc->name, "deal_time_ns") == 0 && strcmp(fielddesc->type, "u8") == 0)
                                        {
                                                offset_deal_time_ns = fielddesc->offset;
                                        }
                                        else if (strcmp(fielddesc->name, "price") == 0 && strcmp(fielddesc->type, "d16.5") == 0)
                                        {
                                                offset_price = fielddesc->offset;
                                        }
                                        else if (strcmp(fielddesc->name, "xamount_buy") == 0 && strcmp(fielddesc->type, "i8") == 0)
                                        {
                                                offset_xamount_buy = fielddesc->offset;
                                        }
                                        else if (strcmp(fielddesc->name, "xamount_sell") == 0 && strcmp(fielddesc->type, "i8") == 0)
                                        {
                                                offset_xamount_sell = fielddesc->offset;
                                        }
                                        else if (strcmp(fielddesc->name, "xamount") == 0 && strcmp(fielddesc->type, "i8") == 0)
                                        {
                                                offset_xamount = fielddesc->offset;
                                        }
                                }
                        }
                }
        }
        break;
        case CG_MSG_P2REPL_ONLINE:
        {
                printf("%s: Futures qoute online!\n", cserver_time);
                fut_is_ready = true;
        }
        break;
        case CG_MSG_CLOSE:
        {
                printf("%s: Futures qoute offline!\n", cserver_time);
                fut_is_ready = false;
        }
        break;
        }
        return 0;
};
 
Vladimir Mikhailov #:

Es gibt keine Auslassungen.


Erklären Sie bitte....

 
prostotrader #:

Erklären Sie bitte....

Diese Konstruktion bedeutet, dass jeder Datensatz, der Änderungen aufweist, gespeichert wird.

size_t s = quote.size();
if (s == 0)
{
        quote.push_back(SQuote(best_buy, xamount_buy, best_sell, xamount_sell, price, xamount, deal_time_ns, mod_time_ns));
}
else
{
        if (quote[s - 1].best_buy != fut_bid || quote[s - 1].best_sell != fut_ask ||
                quote[s - 1].xamount_buy != xamount_buy || quote[s - 1].xamount_sell != xamount_sell ||
                quote[s - 1].price != price || quote[s - 1].xamount != xamount ||
                quote[s - 1].deal_time_ns != deal_time_ns)
        {
                quote.push_back(SQuote(best_buy, xamount_buy, best_sell, xamount_sell, price, xamount, deal_time_ns, mod_time_ns));
        }
}
 
Vladimir Mikhailov #:

Diese Konstruktion bedeutet, dass jeder Datensatz, der Änderungen aufweist, gespeichert wird.

Ich meinte nicht den Code, sondern die Vergleichstabelle, die zeigt, dass MT5 einen Kurs hat und Sie nicht.

 
prostotrader #:

Ich meinte nicht den Code, sondern die Vergleichstabelle, die zeigt, dass MT5 einen Kurs hat und Sie nicht.

Im MT5 werden die Daten höchstwahrscheinlich aus orders_log oder FAST entnommen.

 
Vladimir Mikhailov #:

Diese Konstruktion bedeutet, dass jeder Datensatz, der Änderungen aufweist, gespeichert wird.

Und woher kommt der Name? Vom Expert Advisor? Wenn vom Experten, wird es Lücken geben.