Comment voyez-vous Metatrader X en 2030 ? - page 6

 
fxsaber:

Ecrire n'importe quelle donnée dans le global peut être vu dans les inludes correspondants ici.

OK, je n'ai pas vu cette solution.

Ce n'est pas facile à déterminer, vous devez vérifier

 
fxsaber:

Toute donnée écrite dans le global peut être vue dans les inludes correspondants ici.

Savez-vous qu'il existe un monde immense de données autres que les tics ? Vous voulez l'étrange - écrire/lire les données d'une instance de classe.

 
Igor Makanu:

OK, je n'ai pas vu cette solution.

Ce n'est pas facile à comprendre, vous devez vérifier.

Oui, écriture et lecture de données brutes vers/depuis la ressource. Bon exemple, merci !

Mais que pensez-vous de mon estimé fxsaber pour faire la même chose avec les classes ? Peut même avec des définitions, les gens promettent de ne pas devenir fous ;)))

 
Alexey Volchanskiy:

Ce n'est pas de la coke, oh, les mamies.


Non. Les futurs pains d'épices.

 
Alexey Volchanskiy:

Savez-vous qu'il existe un monde immense de données autres que les tics ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Avons-nous besoin de variables globales du terminal comme la chaîne de caractères ?

fxsaber, 2017.04.10 18:25

void OnStart()
{
  string Name = "Name";

// Записываем/считываем строки
  _GlobalVariableSet(Name, "Hello World!");
  Print(_GlobalVariableGet<string>(Name));

// Записываем/считываем простые структуры
  MqlTick Tick;
  SymbolInfoTick(_Symbol, Tick);

  _GlobalVariableSet(Name, Tick);
  Print(_GlobalVariableGet<MqlTick>(Name).time);

// Записываем/считываем массивы
  MqlTick Ticks[2];

  Ticks[0] = Tick;
  Ticks[1] = Tick;

  _GlobalVariableSet(Name, Ticks);

  MqlTick NewTicks[];

//  if (_GlobalVariableGet(Name, NewTicks)) // https://www.mql5.com/ru/forum/1111/page1868#comment_4853867
//    Print(NewTicks[1].time);

  _GlobalVariableDel(Name);
}


Je veux l'étrange - écrire/lire les données d'une instance d'une classe.

Je stocke les données dans des structures, tout comme les développeurs. C'est pratique et logique. Je ne me suis donc pas penché sur les classes dans ce numéro, même s'il n'y a pas de pointeurs vers les structures.

 
fxsaber:


Je stocke les données dans des structures, comme le font les développeurs. C'est pratique et logique. Par conséquent, je n'ai pas examiné les classes dans cette affaire, même si je n'ai pas de pointeurs sur les structures.

J'ai construit le script de vérification, mais je ne sais pas comment lire le tableau MqlTick.

#property strict
#include <fxsaber\TypeToBytes.mqh>        //https://www.mql5.com/ru/code/16282
#define  POSTFIX "___"

string GetName( const string Name, const int Num, const string PostFix = POSTFIX )
{
  return(Name + PostFix + (string)Num);
}

bool _GlobalVariableDel( const string Name )
{
  return(GlobalVariableDel(Name) && (GlobalVariablesDeleteAll(Name + POSTFIX) >= 0));
}

#define  GLOBAL_VARIABLE_SET(A)                                                        \
template <typename T>                                                                 \
  datetime _GlobalVariableSet( const string Name, const T A )                         \
  {                                                                                   \
    _GlobalVariableDel(Name);                                                         \
                                                                                      \
    double Array[];                                                                   \
                                                                                      \
    const datetime Res = GlobalVariableSet(Name, _ArrayCopy(Array, _R(Value).Bytes)); \
    const int Size = ArraySize(Array);                                                \
                                                                                      \
    for (int i = 0; i < Size; i++)                                                    \
      GlobalVariableSet(GetName(Name, i), Array[i]);                                  \
                                                                                      \
    return(Res);                                                                      \
  }

GLOBAL_VARIABLE_SET(Value)
GLOBAL_VARIABLE_SET(&Value)
GLOBAL_VARIABLE_SET(&Value[])

#define  GLOBAL_VARIABLE_GET(A)                                              \
  {                                                                         \
    double Array[];                                                         \
                                                                            \
    const int Amount = (int)Tmp;                                            \
    const int Size = ArrayResize(Array, Amount / sizeof(double) +           \
                                 ((Amount % sizeof(double) == 0) ? 0 : 1)); \
                                                                            \
    for (int i = 0; i < Size; i++)                                          \
      Array[i] = GlobalVariableGet(GetName(Name, i));                       \
                                                                            \
    uchar Bytes[];                                                          \
                                                                            \
    _ArrayCopy(Bytes, Array, 0, 0, Amount);                                 \
                                                                            \
    _W(A) = Bytes;                                                          \
  }

template <typename T>
const T _GlobalVariableGet( const string Name )
{
  T Res; // https://www.mql5.com/ru/forum/1111/page1869#comment_4854112

  double Tmp;

  if (GlobalVariableGet(Name, Tmp))
    GLOBAL_VARIABLE_GET(Res)

  return(Res);
}

template <typename T>
bool _GlobalVariableGet( const string Name, T &Value )
{
  double Tmp;
  const bool Res = GlobalVariableGet(Name, Tmp);

  if (Res)
    GLOBAL_VARIABLE_GET(Value)

  return(Res);
}


void OnStart()
  {
   string Name="Name";

// Записываем/считываем строки
   _GlobalVariableSet(Name,"Hello World!");
   Print(_GlobalVariableGet<string>(Name));

// Записываем/считываем простые структуры
   MqlTick Tick;
   SymbolInfoTick(_Symbol,Tick);

   _GlobalVariableSet(Name,Tick);
   Print("time --> ",_GlobalVariableGet<MqlTick>(Name).time);
   Print("bid --> ",_GlobalVariableGet<MqlTick>(Name).bid);

// Записываем/считываем массивы
   MqlTick Ticks[2];

   Ticks[0] = Tick;
   Ticks[1] = Tick;

   _GlobalVariableSet(Name,Ticks);
   
//    Print("time --> ",_GlobalVariableGet<MqlTick>(Name).time);
//    Print("bid --> ",_GlobalVariableGet<MqlTick>(Name).bid);
   
   _GlobalVariableDel(Name);
  }
//+------------------------------------------------------------------+


PS : avertissements du compilateur concernant l'utilisation possible d'une variable non initialisée 'Res', à supprimer si possible.


 
Alexey Volchanskiy:

Personnellement, le multitâche me manque. Je me souviens (10 lignes de nostalgie, saut de jeunesse), en 2000, je traînais sur le forum des programmeurs du RSDN lorsque le Pentium 4 est sorti. Et Intel parlait de 15GHz sur P4. Oui, je ne plaisante pas, c'était partout. Je ne sais pas s'ils le pensaient vraiment ou si c'était un canular, mais je ne l'ai pas cru, après tout je suis un ironman.

J'ai ensuite fait un grand fil de discussion sur le multicore qui arrive bientôt, vous verrez, nous devons nous préparer. Les gens ont ri, c'était comme un conte de fées, comment pouvez-vous programmer du code parallèle ? C'est un fantasme.

Et qui avait raison ? Intel a échoué avec son 15Ghz, puis la version de bureau a reçu le double cœur Pentium D et ensuite la percée Duo.

Et nous vivons toujours dans les années 199* sur MQL5. Pas de multithreading, pas d'exceptions... J'ai pris une pastèque à cause du chagrin...

Il ressort de la description de MT5 qu'il est multithread. En raison du fait que le CPU moderne est une poubelle de code exécutable sous l'utilisateur, il reste des pastèques, il n'y a aucun sens pragmatique dans tout le threading. Les entreprises ne s'intéressent ni aux codes efficaces, ni à l'utilisation rationnelle de la puissance de calcul : s'il n'y en a pas assez, il faut en acheter plus.

P.S. Peut-être 1.5GHz ? Je peux me tromper, à l'époque, ils ont défini la limite physique de la technologie à 5 nm, et à partir de là, les GHz supposés. J'aimerais passer de 200 nm à 5 nm, juste comme ça, en quelques années - certainement.

 

En 2030, metatrader sera interdit,

la personne qui va tout interdire va arriver au pouvoir.

Il n'y aura alors qu'un seul système de paiement dans le monde.

Et un seul dirigeant dans le monde entier.

Il va commencer à mettre des puces dans tout le monde et mettre tout le monde sous GLONASS, 5G.

Il n'y aura pas d'argent liquide. Les paiements seront effectués par le biais de puces implantées dans le corps.

Seuls les membres privilégiés de la société seront autorisés à faire du commerce sur Internet - ceux qui pensent que ce souverain est un vrai dieu...


Amen.

 
Igor Makanu:

J'ai construit un script pour le tester, mais je ne sais pas comment lire le tableau MqlTick.

Ajoutez cette surcharge

template <typename T>
bool _GlobalVariableGet( const string Name, T &Value[] )
{
  double Tmp;
  const bool Res = GlobalVariableGet(Name, Tmp);

  if (Res)
  {
    double Array[];                                                         
                                                                            
    const int Amount = (int)Tmp;                                            
    const int Size = ArrayResize(Array, Amount / sizeof(double) +           
                                 ((Amount % sizeof(double) == 0) ? 0 : 1)); 
                                                                            
    for (int i = 0; i < Size; i++)                                          
      Array[i] = GlobalVariableGet(GetName(Name, i));                       
                                                                                                                                                        
    _ArrayCopy(Value, Array, 0, 0, Amount);
  }  

  return(Res);
}
Igor Makanu:

PS : avertissements du compilateur concernant l'utilisation possible d'une variable non initialisée 'Res', qui pourrait être supprimée si possible.

Ajoutez cette ligne

  T Res;
  ZeroMemory(Res);
 
Unicornis:

Il ressort de la description de MT5 qu'il est multithread. En raison du fait que le processeur moderne dans son travail sous l'utilisateur est une décharge de codes exécutables, il y a toujours des pastèques, il n'y a pas de sens pragmatique dans tout le threading. Les entreprises ne s'intéressent ni aux codes efficaces, ni à l'utilisation rationnelle de la puissance de calcul : s'il n'y en a pas assez, il faut en acheter plus.

P.S. Peut-être 1.5GHz ? Je peux me tromper, à l'époque, ils ont défini la limite physique de la technologie à 5 nm, et à partir de là, les GHz supposés. J'aimerais passer de 200 nm à 5 nm, juste comme ça, en quelques années - bien sûr que oui.

Je suis analphabète et je ne lis pas les manuels. Mais je sais que MT5 est multithreadé uniquement dans l'optimiseur). Dans le testeur, il ne fonctionne que dans un seul fil.

Pour le paralléliser, vous pouvez utiliser OpenCL, mais cette technologie en soi n'est prise en charge que par MT5.

Et à propos du 15GHz dans la feuille de route, je suis sûr, j'ai la mémoire d'un programmeur, ce que je vois, je ne l'oublierai jamais.