Caractéristiques du langage mql5, subtilités et techniques - page 56

 
Andrey Khatimlianskii:

Avez-vous mesuré les performances ? Je suis curieux de savoir à quel point il sera plus lent. Surtout avec des indicateurs personnalisés.

Pas mesuré, mais il ne devrait pas être plus lent que dans MT4.

Mesure
#define  AMOUNT 1 e7
void OnStart()
{  
  int handle = iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE);
  const ulong StartTime = GetMicrosecondCount();
  
  for (int i = 0; i < AMOUNT; i++)
    handle = iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE);

  Print((string)((GetMicrosecondCount() - StartTime) / AMOUNT) + " mcs per iMA");
  Print(handle);    
}


Le résultat est

0.3383469 mcs per iMA


Un tiers de microseconde pour tester. Cela signifie qu'une seule exécution pour 10 millions de ticks ralentira de trois secondes.

 
fxsaber:

Mesure

C'est étrange que vous n'ayez pas comparé la création d'un handle + l'obtention d'une valeur dans la boucle avec votre version originale, c'est la différence qui est intéressante.

 
Andrey Khatimlianskii:

Il est étrange que vous n'ayez pas comparé la création d'un handle + la récupération d'une valeur dans une boucle avec votre version originale, qui est la différence qui est intéressante.

Parce que les valeurs sont prises dans la même poignée. iMA renvoie toujours le même handle avec les mêmes paramètres.

 
fxsaber:
Dans MQL5 il est tout à fait acceptable de l'écrire comme ceci

C'est-à-dire "créer" une poignée sur chaque tique. De nouvelles entités d'indicateurs ne seront pas créées, le temps sera uniquement perdu à comparer les paramètres d'entrée d'iMA avec les indicateurs qui ont été lancés aux ticks précédents. C'est-à-dire exactement la même chose que ce qui est fait dans MT4.

Un design intéressant.

Veuillez vérifier la vitesse de création d'un handle dans OnInit, avec cette approche.

 
Vitaly Muzichenko:

Veuillez vérifier la vitesse de création du handle OnInit, avec cette approche.

C'est par rapport à votre option.

 

Comment puis-je remplacer les fonctions standard OrderCalcProfit() et OrderCalcMargin() pour qu'elles soient multiplateformes ? Il semble que ce sujet ait déjà été abordé quelque part, mais je ne le trouve pas ici - j'avais peut-être sommeil... Mais j'ai dû me réveiller dans l'heure qui a suivi la recherche :)

 
Artyom Trishkin:

Comment puis-je remplacer les fonctions standard OrderCalcProfit() et OrderCalcMargin() pour les rendre multiplateformes ? Il semble que cela ait déjà été fait quelque part, mais je ne le trouve pas ici - peut-être étais-je éveillé... Mais j'ai dû me réveiller pendant une heure de recherche :)

https://www.mql5.com/ru/search#!keyword=myordercalcmargin&module=mql5_module_forum

MQL5.Community
MQL5.Community
  • www.mql5.com
Поиск выполняется с учетом морфологии и без учета регистра. Все буквы, независимо от того, как они введены, будут рассматриваться как строчные. По умолчанию наш поиск показывает страницы...
 
fxsaber:

https://www.mql5.com/ru/search#!keyword=myordercalcmargin&module=mql5_module_forum

:)

SymbolInfoMarginRate() n'est pas présent dans 4. La question était posée comme suit :

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

Particularités du langage mql5, trucs et astuces

Artyom Trishkin, 2017.10.06 06:36

Qu'est-ce qui peut remplacer les fonctions standard OrderCalcProfit() et OrderCalcMargin() pour que les fonctions soient multiplateformes? Il semble qu'elle existait déjà quelque part, mais je ne la trouve pas ici - peut-être ai-je trop sommeil... Mais j'aurais dû me réveiller pendant une heure de recherche :)

Et il n'y a rien sur OrderCalcProfit()
 

Un cadeau, pas une opportunité linguistique

struct MQLTICK : public MqlTick
{
  bool operator >( const MqlTick &Tick )
  {
    return(this.bid > Tick.bid);
  }

  bool operator <( const MqlTick &Tick )
  {
    return(this.ask < Tick.ask);
  }
};

void OnStart()
{  
  MQLTICK Ticks[];
  
  Print(CopyTicks(_Symbol, Ticks));
  
  Print(Ticks[0] < Ticks[1]);
}
 
fxsaber:

Un cadeau, pas une opportunité linguistique

Un cadeau sous la forme d'une erreur d'exécution insaisissable

struct MqlTick1 : MqlTick {        };
struct MqlTick2 : MqlTick { int i; };
void Copyticks( MqlTick& []) {}
void OnStart()
{
        MqlTick1 ticks1[];
        MqlTick2 ticks2[];
        int i1 = ::CopyTicks( _Symbol, ticks1 ); //нормально ??????????????
                   Copyticks(          ticks1 ); //error: 'ticks1' - parameter conversion not allowed
        int i2 = ::CopyTicks( _Symbol, ticks2 ); //нормально ??????????????
        Print( "i2=", i2, ":", GetLastError()); //Результат: -1:4006
}

En quoi ::CopyTicks est-il meilleur que Copyticks ?

Et pourquoi le résultat est toujours -1. De telles erreurs (4006) doivent être signalées au moment de la compilation.