Erreurs, bugs, questions - page 379

 
Graff:

Est-ce que cela a un sens de

remplacer rates_total par BarsCalculated(ich) ?

Je ne pense pas. C'est plus comme un stub de service pour s'assurer que le tampon est prêt...

En outre, Copy renverra autant de données que calculé, et non la taille demandée.


Et de quelle ville venez-vous, si ce n'est d'un secret ?

pas à Dnepr.
 
sergeev:

Au fait, êtes-vous sûr que vous n'avez pas besoin d'appeler des fonctions supplémentaires ?

La bibliothèque dispose à la fois de Refresh et de BufferResize. Il me semble qu'ils sont nécessaires à un fonctionnement normal.


Et où est-il écrit qu'ils doivent l'être ?

J'ai essayé différentes variantes.

ichi.Refresh(true);
ichi.Refresh(false);
ichi.RefreshCurrent(true);
ichi.RefreshCurrent(false);

Je n'ai eu aucun effet.

 

Continué....

L'indicateur iIchimoku connaît un problème. Mon indicateur dessine juste des flèches en fonction de if(tenkan[i]>kijun[i]). Comme vous pouvez le voir dans la capture d'écran, les flèches ne sont pas dessinées correctement.

Le code complet est dans le fichier Ich_1_f.mq5

Cependant, si vous les calculez manuellement, tout s'affiche correctement.

Code complet dans le fichier Ich_1_ok.mq5

Dossiers :
Ich_1_f.mq5  6 kb
Ich_1_ok.mq5  6 kb
 

Écrire le dll :

#define _DLLAPI extern "C" __declspec(dllexport)
//+------------------------------------------------------------------+
//| адрес переменной double                                          |
//+------------------------------------------------------------------+
_DLLAPI int __stdcall
GetPtrVar(double a){return((int)(&a));}
//+------------------------------------------------------------------+
//| значение переменной double по адресу                             |
//+------------------------------------------------------------------+
_DLLAPI double __stdcall
GetValuePtr(int pointer){return(*(double*)pointer);}

Branchez-le :

#import "Projeckt1.dll"
int      GetPtrVar(double a);
double   GetValuePtr(int pointer);
#import

appeler :

void OnStart()
  {   
   double var=153.25; 
   Print("вложенный вызов = ",GetValuePtr(GetPtrVar(var)));
   int pointer=GetPtrVar(var);   
   Print("вызов с сохранением адреса = ",GetValuePtr(pointer));
  }

on obtient ceci :

2011.05.01 18:09:12     Черновик 31 (EURUSD,H1) вызов с сохранением адреса = 5.560304580319136 e-287
2011.05.01 18:09:12     Черновик 31 (EURUSD,H1) вложенный вызов = 153.25

alors que les deux lignes devraient retourner la même valeur 153.25.

Pourquoi ?

 
Urain:

Pourquoi ?
S'agit-il de la version 32 ou 64 bits ?
 
Renat:
S'agit-il de la version 32 ou 64 bits ?

32
 

C'est très simple : dans la fonction GetPtrVar(double a), vous prenez l'adresse d'une copie de la variable dans la pile, puis vous essayez de lire le morceau de mémoire de la pile.

La première fois, grâce à un appel rapproché de GetValuePtr, nous avons pu lire sur la pile non contaminée, alors que les appels de fonction suivants ont endommagé la pile de manière irrévocable.

Il n'y a pas d'erreur.

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 
Renat:

C'est très simple : dans la fonction GetPtrVar(double a), on prend l'adresse d'une copie de la variable dans la pile, puis on essaie de lire le morceau de mémoire de la pile qui a été détruit.

Oui, exactement, je sentais que j'avais besoin de creuser quelque part.

vous devez écrire dans la dll

GetPtrVar(double &a){return((int)(&a));}
 
Renat:

C'est très simple : dans la fonction GetPtrVar(double a), vous prenez l'adresse d'une copie de la variable dans la pile, puis vous essayez de lire le morceau de mémoire de la pile.

La première fois, grâce à un appel rapproché de GetValuePtr, nous avons pu lire sur la pile non contaminée, alors que les appels de fonction suivants ont endommagé la pile de manière irrévocable.

Il n'y a pas d'erreur.

Je l'ai remarqué aussi. Je pense que c'est la bonne façon de faire :

#define _DLLAPI extern "C" __declspec(dllexport)
//+------------------------------------------------------------------+
//| адрес переменной double                                          |
//+------------------------------------------------------------------+
_DLLAPI int __stdcall
GetPtrVar(double & a){return((int)(&a));}
//+------------------------------------------------------------------+
//| значение переменной double по адресу                             |
//+------------------------------------------------------------------+
_DLLAPI double __stdcall
GetValuePtr(int pointer){return(*(double*)pointer);}

branchement :

#import "Projeckt1.dll"
int      GetPtrVar(double & a);
double   GetValuePtr(int pointer);
#import
 
Dans la version 439 de Metatrader5, un indicateur de qualité de l'historique a été ajouté. Lorsque je teste sur M1 et H4 sur les prix d'ouverture et sur tous les ticks, la qualité est de 51%... Pourquoi et comment l'augmenter ? La source des citations est alpari demo.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5
Raison: