Questions des débutants MQL5 MT5 MetaTrader 5 - page 189

 
En quoi Metatrader 5 est-il différent des 4 précédents ? Est-il plus difficile de travailler avec ou non ? Tous les courtiers proposent ces programmes, pourquoi n'y a-t-il pas un seul programme pour tous les courtiers afin de ne pas avoir à en installer plusieurs.
Блог полезных и познавательных статей обо всем, на различную тематику категорий, все интересное, что бы Вам хотелось узнать и найти в материалах Интернет сети
Блог полезных и познавательных статей обо всем, на различную тематику категорий, все интересное, что бы Вам хотелось узнать и найти в материалах Интернет сети
  • es-blogy.ru
Если вами соблюдается диета при язве, то это поможет вам избежать частых обострений и свести их к минимуму; а чем меньше обострений, тем меньше количество медикаментозных препаратов вам нужно принимать. Инфекцию Н. pylori можно обнаружить двумя способами: провести анализ крови; анализ желудочного сока. Эндоскопическое или радиологическое...
 
koctik:
En quoi Metatrader 5 est-il différent des 4 précédents ? Est-il plus difficile de travailler avec ou non ? Tous les courtiers proposent ces programmes, pourquoi n'y a-t-il pas un seul programme pour tous les courtiers afin de ne pas avoir à en installer un grand nombre.
Téléchargez les deux terminaux, travaillez avec eux sur des comptes de démonstration et découvrez-le par vous-même.
 

J'essaie de créer une fonction qui renvoie le résultat de la dernière position fermée (plus ou moins). Cette fonction est conçue pour un Expert Advisor multi-devises et doit sélectionner la dernière position fermée parmi toutes les paires de devises, et j'ai quelques problèmes avec elle. Pouvez-vous corriger la fonction ?

double last_profit()
{  
int dir = 0;
double prof = 0;
ulong d_ticket;

if (HistorySelect(0,TimeCurrent())) 
    {
       int j=HistoryDealsTotal()-1;
       if(j>0)
      {
         d_ticket = HistoryDealGetTicket(j);
         if (d_ticket>0)
         { 
         mydeal.Ticket(d_ticket);          
         prof = mydeal.Profit();
         }
       }
     }
if(prof < 0)dir = -1;
if(prof > 0)dir = 1;
if(prof == 0)dir =0;

return(dir);
} 

 
Automated-Trading:

OBJ_ALL_PERIODS=2097151

Merci, mais rien n'a fonctionné. Le problème est que les calculs des périodes D1 et...... devraient être affichés sur toutes les périodes, mais ils ne sont pas exécutés tels quels. Que faire ?
Dossiers :
macd2.mq5  4 kb
 
Reshetov:

Que voulez-vous dire : méthodes inutilisées dans vos classes ? Ce n'est pas la pratique dans la POO. Un programmeur OOP normal, contrairement à la programmation algorithmique, crée des classes avec tous les champs et méthodes nécessaires, comme on dit, pour toutes les occasions, car la même classe peut être utilisée ultérieurement dans d'autres applications ou faire partie d'une bibliothèque de classes. Sans parler du fait que, même au sein d'un même projet, il est préférable de créer des classes complètes, et non dépouillées, afin de ne pas avoir à chercher dans le code source et à ajouter les champs et méthodes nécessaires ultérieurement.

En POO, toute économie, à laquelle de nombreuses personnes s'habituent dans la programmation algorithmique, peut s'avérer préjudiciable par la suite. Tout ce qui n'est pas utilisé doit être exclu du code par le compilateur et non par le programmeur.

Bien sûr, la POO donne lieu à un code source plus important que la programmation algorithmique. Mais ce n'est pas un inconvénient mais un avantage car une grande partie du code "inutile" d'un projet donné peut être réutilisée dans d'autres projets.

Il n'est pas nécessaire d'essayer de faire une énigme, c'est-à-dire de tout mettre dans une seule classe. Vous devez créer des bibliothèques de classes, c'est-à-dire diviser les fonctionnalités en classes distinctes et ne pas oublier d'ajouter des commentaires à ce fief, et alors tout sera en ordre. Au départ, lorsque j'ai commencé à apprendre Java après Pascal, j'ai aussi essayé de tout faire en un seul morceau, c'est-à-dire qu'au lieu d'utiliser la POO, j'ai créé une classe avec tout ce dont j'avais besoin pour une certaine tâche, tout comme dans la programmation algorithmique. Le résultat était un désordre non universel impossible à appliquer partout par la suite, sans compter qu'il était difficile de comprendre un tel code.

Je comprends très bien tout cela. Mais vous pouvez au moins nous montrer les variables privées qui ne sont pas utilisées comme cela se fait dans VisualStudio, n'est-ce pas ?

Le fait est que les classes sont conçues pendant le processus de développement. Vous ne pouvez tout simplement pas prendre en compte tout ce qui existait avant la création. C'est pourquoi on crée des classes de cadres avec le moins de fonctionnalités possibles. En interagissant avec ces classes cadres, l'architecture globale commence à être élaborée. Certaines méthodes sont simplement supprimées, d'autres sont déplacées vers la section privée, et d'autres encore sont migrées d'une classe à l'autre. Dans le processus, des variables, des méthodes et même des classes entières oubliées apparaissent inévitablement. C'est normal, car c'est un peu comme le principe d'Okama en action - nous écrivons d'abord du code mauvais et redondant. Ensuite, nous formalisons la tâche plus clairement et certaines des entités disparaissent tout simplement. La redondance ne sert à rien. Et c'est dans ce processus que l'aide du compilateur serait très utile - voir les variables inutilisées et au moins les méthodes privées serait très utile.

 

Bonjour.

Je comprends que la fonctionOnCalculate() qui est utilisée dans les indicateurs se génère d'elle-même, c'est-à-dire sans l'événement de changement de prix ,

Quelle fonction peut être appliquée dans l'indicateur qui ne génère que lorsqu'un événement de changement de prix se produit ? Merci.

 
Vikon:

Bonjour.

Je comprends que la fonctionOnCalculate() qui est utilisée dans les indicateurs se génère d'elle-même, c'est-à-dire sans l'événement de changement de prix ,

Quelle fonction peut être appliquée dans l'indicateur qui ne génère que lorsqu'un événement de changement de prix se produit ? Merci.

L'événementCalculate est généré pour les indicateurs immédiatement après l'événement Init et à chaque changement de données de prix. Elle est gérée par la fonctionOnCalculate. Lorsque l'historique est modifié (lorsque l'historique est paginé), cet événement génère égalementOnCalculate.

LeOnCalculate est la fonction la plus importante de l'indicateur, dans laquelle tous les calculs de l'indicateur sont effectués en cas de changement des données de prix.

 
barabashkakvn:

L'événementCalculate est généré uniquement pour les indicateurs immédiatement après l'envoi de l'événement Init et lors de tout changement dans les données de prix. Cet événement est géré par la fonctionOnCalculate. Le mêmeOnCalculate est généré lorsque l'historique est modifié (lorsque l'historique est paginé).

LeOnCalculate est la fonction la plus importante de l'indicateur, dans laquelle tous les calculs de l'indicateur sont effectués en cas de changement des données de prix.

Ici, il y a un certain bouclage, c'est-à-dire qu'il génère toujours et que lorsque la période change, les relevés changent. Quelle est l'erreur ?

#property copyright "Copyright 2014, MetaQuotes Software Corp.
#lien de propriété "http://www.mql5.com"
#propriété version "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé |

int EMA1=12 ;
int EMA2=26 ;
int SMA=9 ;

ENUM_TIMEFRAMES période_macd ;
datetime t_MACD[] ;
double MACD[] ;
bool high_low=false ;
int shift_nachalo ;
double w_MACD[] ; d_MACD[] ;
int w_MACD_handle,d_MACD_handle ;

int barDown=0 ;
int barUP=0 ;

//+------------------------------------------------------------------+ return(0);
int OnInit()
{
w_MACD_handle=iMACD(NULL,PERIOD_W1,EMA1,EMA2,SMA,PRICE_CLOSE) ;
d_MACD_handle=iMACD(NULL,PERIOD_D1,EMA1,EMA2,SMA,PRICE_CLOSE) ;
ArraySetAsSeries(MACD,true) ;
ArraySetAsSeries(t_MACD,true) ;
ArraySetAsSeries(w_MACD,true) ;
ArraySetAsSeries(d_MACD,true) ;
return(INIT_SUCCEEDED) ;
}
//+------------------------------------------------------------------+ MACD_handle=iMACD(NULL,PERIOD_W1,EMA1,EMA1,SMA,PRICE_CLOSE);
//| Fonction d'itération de l'indicateur personnalisé |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{

ObjectsDeleteAll(0,0,-1) ;
////////////////////////////////////////////////////////
period_macd=PERIOD_D1 ;
CopyBuffer(d_MACD_handle,0,0,1000,d_MACD) ;
ArrayCopy(MACD,d_MACD,0,0,WHOLE_ARRAY) ;
nachalo() ;
ObjectCreate(0, "lin_2",OBJ_VLINE,0,t_MACD[shift_nachalo],0) ;
ObjectSetInteger(0, "lin_2",OBJPROP_BACK,true) ;
ObjectSetInteger(0, "lin_2",OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS) ;
ObjectSetInteger(0, "lin_2",OBJPROP_COLOR,clrYellow) ;
ObjectSetInteger(0, "lin_2",OBJPROP_STYLE,1) ;
retour(taux_total) ;
}
//+------------------------------------------------------------------+
//////////////////////////////////////////////////////////////////////////////
void nachalo() //début d'une nouvelle vague
{
double low_nachalo[],high_nachalo[] ;
CopyTime(NULL,period_macd,0,1000,t_MACD) ;
si (MACD[1]>0)
{high_low=false ;
while (MACD[barDown]>0)
{barDown++;}
barUP=barDown ;
while (MACD[barUP]<0)
{barUP++;}
CopyLow(NULL,period_macd,0,barUP,low_nachalo) ;
ArraySetAsSeries(low_nachalo,true) ;
shift_nachalo=ArrayMinimum(low_nachalo,barDown-1,barUP-(barDown-1)) ;
}
si (MACD[1]<0)
{high_low=true ;
while (MACD[barUP]<0)
{barUP++;}
barDown=barUP ;
while (MACD[barDown]>0)
{barDown++;}
CopyHigh(NULL,period_macd,0,barDown,high_nachalo) ;

ArraySetAsSeries(high_nachalo,true) ;

shift_nachalo=ArrayMaximum(high_nachalo,barUP-1,barDown-(barUP-1)) ;
}}
Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
Dossiers :
macd2.mq5  4 kb
 
Vikon:

C'est là que la boucle se produit, c'est-à-dire qu'elle génère constamment et que lorsque la période change, les relevés changent. Quelle est l'erreur ?


Comment insérer le code correctement dans le forum.

 
Vikon:


Notez l'erreur :

Pas de tampons indicateurs attachés

Utilisez :

//---- превращение динамических массивов в индикаторные буферы
   SetIndexBuffer()
Lisez également l'article"Comment écrire un indicateur en MQL5".