Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 845

 
Anatoliy Ryzhakov:
Bonjour. Pouvez-vous me dire comment retourner la valeur du type de l'avant-dernier ordre dans l'historique.

Vous devez trouver l'heure du dernier ordre clôturé et ensuite rechercher les ordres avec une heure de clôture maximale, mais inférieure à la dernière heure mémorisée, c'est ce que j'ai fait :

https://www.mql5.com/ru/forum/247136#comment_7555643

dans mon exemple, le ticket a été recherché, il faudrait retourner le type de commande au lieu du ticket, ou bien en connaissant le ticket de la commande, on peut trouver son type...

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 

Est-il possible d'appliquer un modèle à une fonction exportable pour être exportée de c++ vers mql4 ?

J'ai créé un fichier de type régulier avec l'extension "srp" et j'y ai écrit une fonction primitive.

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
MT4_EXPFUNC  int __stdcall  add(int a=0, int b=0)//stdcall //cdecl
{return (18);}

Puis j'ai créé un fichier avec l'extension "def" et spécifié le nom de la fonction à exporter

LIBRARY "dllmt42"
EXPORTS
add

Puis je l'ai fait passer par Build - Build Solution.
Je veux appliquer un modèle à ma fonction car nous allons développer des fonctions qui travaillent avec des tableaux et ne peuvent pas se passer d'un modèle.

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
template<typename T>MT4_EXPFUNC  int __stdcall  add(T a=0, T b=0){ return (18);}

T est mis en évidence mais écrit qu'il y a une erreur aide conseil et est-ce possible, essayé de réarranger ? De plus, comment cette fonction, si elle est possible, sera-t-elle appelée du côté de la mql4 ?




 
Roman Shiredchenko:

regardez dans la base de code - sur MT4 ils étaient certainement...

Sur la première page, dans ce fil.

 

Bonsoir. Dans le processus d'étude et d'apprentissage MT5 essayer de mettre en œuvre une tâche généralement pas difficile, mais peu d'expérience et les lacunes dans les connaissances....... en général ne fonctionne pas, s'il vous plaît aide et assistance.

J'ai un indicateur et un conseiller expert, tous deux avec un code source ouvert, tous deux par le même auteur (Artem Trishkin, respect et félicitations). J'essaie de demander à l'indicateur d'obtenir la direction réelle au moment de la demande. L'indicateur indique cette direction à l'aide de flèches vers le haut ou vers le bas. La direction obtenue sera utilisée par l'Expert Advisor soit comme un signal, soit comme un filtre, mais elle est encore lointaine.

J'ai obtenu la poignée de l'indicateur mais les valeurs des données des flèches de l'indicateur sont un désordre et je ne peux pas les comprendre.

Je n'ai pas modifié l'indicateur, mais j'ai ajouté OnInit dans mon Expert Advisor :

   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);

J'ai ajouté OnTick :

   int n=0;
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find || ArraySize(Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 3-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);

Bien sûr, j'ai décrit et lancé les surcharges appropriées, les tableaux, définis comme des séries chronologiques et td.......

J'ai utilisé Commentaire et Imprimer pour vérifier. Pas immédiatement, mais aucune erreur, seulement quelques avertissements, que je ne comprends pas. Mais l'essentiel - les paramètres sont définis de manière incorrecte. Malgré la condition ci-dessous, le nombre maximum de double pour la flèche vers le haut et un certain nombre négatif pour la flèche vers le bas sont produits.

if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
и
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
 
Voici les fichiers
Dossiers :
 
Sergey Voytsekhovsky:
Voici les fichiers

Vous devriez commencer par tester l'obtention de données à partir de l'indicateur avec un simple EA de test, plutôt que de le prendre dans un article avec beaucoup de fonctionnalités inutiles pour le test.

Créez simplement un conseiller expert simple dans l'assistant MQL et utilisez-le pour vous entraîner à utiliser iCustom().

 
Sergey Voytsekhovsky:

Bonsoir. Dans le processus d'étude et d'apprentissage MT5 essayer de mettre en œuvre une tâche généralement pas difficile, mais peu d'expérience et les lacunes dans les connaissances....... en général ne fonctionne pas, s'il vous plaît aide et assistance.

J'ai un indicateur et un conseiller expert, tous deux avec un code source ouvert, tous deux par le même auteur (Artem Trishkin, respect et félicitations). J'essaie de demander à l'indicateur d'obtenir la direction réelle au moment de la demande. L'indicateur indique cette direction à l'aide de flèches vers le haut ou vers le bas. La direction obtenue sera utilisée par l'Expert Advisor soit comme un signal, soit comme un filtre, mais elle est encore lointaine.

J'ai obtenu la poignée de l'indicateur mais les valeurs des données des flèches de l'indicateur sont un désordre et je ne peux pas les comprendre.

Je n'ai pas changé l'indicateur, mais j'ai ajouté OnInit dans mon Expert Advisor :

J'ai ajouté OnTick :

Bien sûr, j'ai décrit et lancé les surcharges appropriées, les tableaux, définis comme des séries chronologiques et td.......

J'ai utilisé Commentaire et Imprimer pour vérifier. Pas immédiatement, mais aucune erreur, seulement quelques avertissements, que je ne comprends pas. Mais l'essentiel - les paramètres sont définis de manière incorrecte. Malgré la condition ci-dessous, le nombre maximal de double pour la flèche vers le haut et un certain nombre négatif pour la flèche vers le bas sont imprimés.

Artyom a dit correctement et je vais juste marquer l'inutilité d'une comparaison.

if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)

Si CopyBuffer renvoie le nombre d'éléments copiés dans le tableau, alors la taille du tableau sera exactement celle-là. Par conséquent, la partie en surbrillance de la condition reproduit simplement la première.

Et une réflexion à voix haute : je n'ai pas regardé le code de l'indicateur et de l'EA, donc je peux me tromper. Êtes-vous sûr qu'il doit y avoir un signal dans la plage period_find ?

 
Alexey Viktorov:

Artem a dit correctement, et je vais juste souligner l'inutilité d'une comparaison

Si CopyBuffer renvoie le nombre d'éléments copiés dans le tableau, alors la taille du tableau sera exactement celle-là. De même, la partie sélectionnée de la condition duplique simplement la première.

Je réfléchis à voix haute : je n'ai pas vérifié le code de l'indicateur et du Conseiller Expert, donc je peux me tromper. Êtes-vous sûr qu'il doit y avoir un signal dans la plage period_find ?

Oui - c'est comme un filtre - la fréquence des signaux en dépend.

 
Artyom Trishkin:

Vous devriez commencer par un test d'obtention de données de l'indicateur avec un simple EA de test, plutôt que de le prendre dans un article avec beaucoup de fonctions inutiles pour le test.

La fonction iCustom() sera plus pratique pour vous.

Merci, bon conseil, je vais le faire, au moins ce sera plus pratique.

Je vais le commencer aujourd'hui.
 

Pouvez-vous me dire ce qui ne va pas avec le rationnement du lot ?

double lot_=0.01;
double minlot=0.10;
double LotNormalize(double lot_)
  {
   if(minlot==0.001)
     {
      return(NormalizeDouble(lot_,3));
     }
   if(minlot==0.01)
     {
      return(NormalizeDouble(lot_,2));
     }
   if(minlot==0.10)
     {
      return(NormalizeDouble(lot_,1));
     }

   return(NormalizeDouble(lot_,0));
  }
Raison: