Compensation substantielle ???? - page 8

 
Алексей Тарабанов #:
Je donne aussi un problème à ma petite-fille : Il y a une relation entre Z et Y et Y et X. Dessinez un graphique de la dépendance de Z sur X. Graphiquement. Elle le dessine.

Merci, je vois.

 
prostotrader #:

Quoi qu'il en soit, j'ai regardé 500 dossiers, je ne peux pas être sûr à 100% sans l'original.

Mais vous avez des guillemets manquants, c'est possible dans MT5 aussi (mais beaucoup moins).

Je vais essayer de traduire votre temps en "digestible" et d'extraire BID et ASK séparément dans MT5,

Mais vous pouvez voir qu'il y a trop de divergences comme cela !

Oui, il y a des divergences. Le tableau et les taux agrégés fournis par la bourse ne sont pas fiables à 100%. C'est ce qu'affirme l'échange lui-même.
Des données fiables à 100%, toujours selon la bourse, se trouvent uniquement dans la table orders_log, mais il faut payer un supplément pour s'y abonner.
De quels flux et tableaux MT5 tire ses données, et comment il les tire, je ne peux pas l'affirmer à 100%, je ne peux que spéculer.
Par conséquent, j'utilise mon propre logiciel à mes fins, car je vois comment et d'où proviennent les données.
Je suis satisfait des résultats obtenus jusqu'à présent.

 
Vladimir Mikhailov #:

Oui, les divergences sont présentes. La table commune et les tumblers agrégés transmis par l'échange ne sont pas fiables à 100%. C'est ce qu'affirme l'échange lui-même.
Des données 100% fiables, toujours selon la bourse, se trouvent uniquement dans la table orders_log, mais son abonnement coûte de l'argent.
De quels flux et tableaux MT5 tire ses données, et comment il les tire, je ne peux pas l'affirmer à 100%, je ne peux que spéculer.
Par conséquent, j'utilise mon propre logiciel à mes fins, car je vois comment et d'où proviennent les données.
Je suis satisfait des résultats obtenus jusqu'à présent.

MT5 prend les données du même endroit que vous, le PlazaII.

J'ai converti votre temps, il y a trop de différences, les citations sont les mêmes mais le temps est différent.

Vous avez sauté les citations en rouge.

Convertisseur de temps

//+------------------------------------------------------------------+
//|                                                    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);
}
//+------------------------------------------------------------------+

Je n'ai pas regardé plus loin dans le dossier

Dossiers :
 

Vladimir !

Bien sûr, il peut y avoir des échecs isolés, mais il y a beaucoup de citations manquantes, et MT-5 a un problème avec le temps.

(d'après ce que j'ai compris, vous copiez simplement l'heure de la table sans rien en faire),

il semble qu'ils le "gardent" (le temps) eux-mêmes.

Vérifiez votre code (pour les omissions)

Utilisez-vous "0" ici ?

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

Vladimir !

Bien sûr, il peut y avoir des échecs isolés, mais il y a beaucoup de citations manquantes, et MT-5 a un problème avec le temps.

(d'après ce que j'ai compris, vous copiez simplement l'heure de la table sans rien en faire),

il semble qu'ils le "gardent" (le temps) eux-mêmes.

Vérifiez votre code (pour les omissions)

Utilisez-vous "0" ici ?

Oui, le temps est pris sur la table.
Dans conn_process, 0 est utilisé.

Il n'y a pas de sauts.

Voici le code de la fonction 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 #:

Il n'y a aucune omission.


Expliquez, s'il vous plaît....

 
prostotrader #:

Expliquez, s'il vous plaît....

Cette construction signifie que chaque enregistrement qui a été modifié est sauvegardé.

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 #:

Cette construction signifie que chaque enregistrement qui a été modifié est sauvegardé.

Je ne parlais pas du code, mais du tableau de comparaison, qui montre que MT5 a un devis et pas vous.

 
prostotrader #:

Je ne parlais pas du code, mais du tableau de comparaison, qui montre que MT5 a un devis et pas vous.

Il est fort probable que dans MT5, les données soient extraites de orders_log ou de FAST.

 
Vladimir Mikhailov #:

Cette construction signifie que chaque enregistrement qui a été modifié est sauvegardé.

Et d'où vient l'appel ? Depuis le conseiller expert ? S'il s'agit de l'expert, il y aura des omissions.