Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 623
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
J'ai déjà décrit la tâche la plus simple.
Ouvrez MetaEditor.
Cliquez sur Fichier->Créer.
Dans le champ contextuel, sélectionnez Indicateur.
...
Mais ce code n'est pas accepté par le traducteur MQL.
Je vais répondre dans environ 20 minutes
Que faites-vous, les enfants, à remuer les eaux ?
Personne ne fait d'histoires. La situation commence enfin à s'éclaircir un peu. Il s'avère que l'on appelle un script une fonction qui ne peut pas être placée dans le corps du code principal.
N'oubliez pas non plus que MT est destiné à travailler avec de l'argent qui doit être protégé des attaques de tiers. D'où la plupart des limitations de la langue.
J'ai déjà décrit une tâche simple.
Ouvrez MetaEditor.
Cliquez sur Fichier->Créer.
Dans le champ contextuel, sélectionnez Indicateur.
Dans l'indicateur OnCalculate(), introduisez n'importe quel objet script avec l'événement OnStart().
Personnellement, je ne sais pas comment faire. Eh bien, par exemple, comme ça :
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[])
{
//---
for(int i = 1 ; i < 100;i++)
{
si(open[i] > Max)
{
OnStart()
Et ici, nous écrivons un script pour construire l'objet qui nous intéresse. Par exemple, une ellipse, une lettre sur un graphique ou autre chose...
} //if(open)
} //for(int i)
//--- retour de la valeur de prev_calculée pour l'appel suivant
return(rates_total)
} // OnCalculate
Cela devrait ressembler à quelque chose comme ça.
Mais le traducteur MQL ne perçoit pas un tel code.
Cela devrait ressembler à quelque chose comme ceci
Dans environ 20 minutes, je répondrai.
Il a fallu beaucoup de temps pour télécharger la vidéo - plus de 40 minutes.
Le chargement de la vidéo a pris beaucoup de temps - plus de 40 minutes.
Il m'arrive aussi de mélanger les sections du forum et d'écrire une réponse à une question sur mql4 dans mql5.
En principe, dans ce cas, rien ne changera sauf l'extension du fichier, mais dans mql4, elle sera superflue.
et même complètement inutiles et inutilisables.
Que faites-vous, les enfants, en réalité, à remuer les eaux ?
Il suffit d'aller dans le MetaEditor, et de taper la commande : Fichier->Créer...
Cela fera apparaître un formulaire avec différents fichiers factices.
En particulier, il s'agira de fichiers factices :
- Conseiller expert
- Indicateur personnalisé
- Script
- Bibliothèque, etc.
Nous sommes intéressés par les trois premiers éléments : Expert Advisor, Custom Indicator et Script.
Comparons ces mannequins :
Dans Expert Advisor, nous avons des événements :
-OnInit(), OnDeinit(), OnTick(), OnTimer, OnChartEvent() ... tout, rien de plus.
Dans le script, nous avons les événements :
- OnStart() ... c'est tout, rien de plus.
dans l'indicateur, nous avons des événements :
- OnInit(), OnCalculate(), OnTimer, OnChartEvent() ... tout, rien de plus.
La question naturelle qui se pose ici est de savoir comment faire le lien entre ces objets.
Il s'avère qu'il n'y a et ne peut y avoir aucune connexion entre eux dans MQL, car les flux de données entre ces objets sont complètement séparés et il n'y a aucune connexion entre eux.
De plus, je suis surpris par le fait que les créateurs de MQL nous donnent ce fait comme un "bien".
Et si, par exemple, en C++, je peux facilement appeler le traducteur BASIC, ou Javascript ou tout autre traducteur, et passer à l'environnement de programmation Android, par exemple,
dans MQL, je ne peux même pas créer un soi-disant "script" dans l'environnement "indicateur", car l'environnement indicateur n'accepte pas la commande OnStart().
Quel genre de monstre est-ce ?
Et il y a plus qu'assez de ces vilaines choses dans MQL.
Ils sont à chaque étape.
Je lis la description de MQL - et je suis surpris, car il n'y a rien d'autre à faire.
Pendant ce temps, les créateurs de MQL proclament haut et fort que MQL est un descendant de C++.
Bien sûr, je suis désolé, mais je veux demander aux créateurs de MQL : - Héritier de quoi ? - Dans sa laideur ?
Je compare involontairement MQL au célèbre environnement de programmation 1C. Ils prétendent également être les héritiers de C++.
Mais tout y est fait de manière beaucoup plus décente.
Et les objets graphiques, et la communication entre les modules et bien plus encore.
Et qu'y a-t-il dans MQL ?
Pas de classes intégrées, pas d'objets liés au thread... et rien du tout.
Et je n'ai rien dit sur l'enveloppe mathématique du terminal ! !!
C'est un tout autre sujet pour les surprises ! !!
Pourquoi ne pas lire un peu d'aide et trouver toutes ces choses que vous prétendez ne pas avoir, lire les cours intégrés en SB, apprendre à demander de l'aide poliment (vous avez demandé de l'aide) et apprendre à ne pas être impoli envers les gens qui essaient de vous aider (notez qu'ils sont désintéressés)...
En général - vous bannir pour 24 heures pour troll, impolitesse et mendicité (vous n'avez pas montré une ligne de votre code pour prouver toutes vos déclarations, mais impudemment exiger des gens qui ont répondu à votre question et les déclarations, ils vous fourniront le code de travail pour vos besoins - ce n'est pas habituel ici - ils aident, pas faire pour vous, note - le code le plus simple)
Sans vouloir vous offenser, celui qui vient à nous avec rien sera tué par quelque chose d'inintelligible.
D'autant plus que je vous avais prévenu de baisser le chauffage :
Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading
Toute question des débutants sur MQL4, aide et discussion sur les algorithmes et les codes.
Artyom Trishkin, 2018.09.12 14:02
Essayez maintenant sans les insultes et l'arrogance.comment installer mt4 sur macOS ? de l'aide s'il vous plaît !
Exclusivement dans une machine virtuelle. J'ai Parallel, c'est cher mais pratique et fiable.
https://www.parallels.com/ru/products/desktop/
Je demande de l'aide. Les questions sont les suivantes :
1. Le programme ne fixe pas de stop loss à l'achat et à la vente en mode test. Mais il modifie les ordres en cours.
2. Il ne démarre pas en temps réel sur le compte.
S'il vous plaît, aidez-moi.
J'aimerais également demander de signaler toute erreur qui aurait pu se produire lors de l'écriture du programme.
Merci d'avance.
Code du programme :
.input int Pourcentage=50 ;
entrée int MAGICNUMBER=413 ;
//Introduction aux constantes des indicateurs et aux oscillateurs pour les graphiques à long terme.
entrée int Signal_Period_long_term=6 ;
entrée int Fast_EMA_Period_long_term=12 ;
input int Slow_EMA_Period_long_term=24 ;
//Les paramètres d'impact des indicateurs et des oscillateurs sont des constantes pour les graphiques à court terme.
input int Stochastic_Kperiod_short_term=5 ;
input int Stochastic_Dperiod_short_term=3 ;
input int Stochastic_slowing_short_term=3 ;
entrée ENUM_TIMEFRAMES PERIODs_short_term=PERIOD_M5 ;
entrée ENUM_TIMEFRAMES PERIODs_long_term=PERIOD_H1 ;
//-----------------------------------------------------------------------------------------
//les variables communes et leurs types
static datetime New_Time;//heure de la barre actuelle
statique datetime Time_Local ;
double Margin_Percent ; //Utilisé pour l'ouverture des ordres
double Lots;//Détermination du nombre total de lots
double Lots_Volume ;
//Variables et types pour le graphique à long terme
double MacdCurrent_long_term;//MACD paramètres de la ligne principale de la barre actuelle
double MacdPrevious_long_term;//MACD paramètres de la ligne principale de la barre précédente
double SignalCurrent_long_term ;
//Variables et types pour le graphique à court terme
double Stochastic_Current_short_term_main;//Paramètres stochastiques de la barre courante sur le graphique 5 minutes
double Stochastic_Previous_short_term_main;//Paramètres stochastiques de la barre précédente sur le graphique 5 minutes
double Stochastic_Current_short_term_signal;//Paramètres stochastiques de la barre actuelle dans le graphique 5 minutes
double Stochastic_Previous_short_term_signal;//Paramètres stochastiques de la barre précédente sur le graphique 5 minutes
double StopLoss_BUY ;
double StopLoss_SELL ;
double Price_BUY ;
double Prix_Vente ;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED) ;
}
//+------------------------------------------------------------------+
//| Fonction de désinitialisation experte |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| fonction tick expert |
//+------------------------------------------------------------------+
void OnTick()
{
int ticket,cnt ;
int total=OrdersTotal();// Détermination du nombre de commandes
bool New_Bar=false ; // Marque une nouvelle barre.
//Définir les valeurs des variables pour le graphique à long terme
MacdCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,1) ;
MacdPrevious_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,2) ;
SignalCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_SIGNAL,1) ;
//Détermination des valeurs des variables pour le graphique à court terme
Stochastic_Current_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,1) ;
Stochastic_Previous_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,2) ;
Stochastic_Current_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,1) ;
Stochastic_Previous_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,2) ;
//Définition des variables communes
Price_BUY=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT) ;
Prix_SELL=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT) ;
StopLoss_BUY=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT) ;
StopLoss_SELL=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT) ;
Margin_Percent=AccountFreeMargin()*Percent/100 ;
Lots=NormalizeDouble(Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2) ;
Lots_Volume=NormalizeDouble(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP),2) ;
//-----------------------------------------------------------------------------------------------------------------------
//----- Определение нового бара------------------------------------------------------------------------------------------
New_Time=TimeCurrent() ;
Print("Time=",TimeCurrent() ;
Print("Bar open time =",iTime(NULL,PERIODs_short_term,0)) ;
if(iTime(NULL,PERIODs_short_term,0)==New_Time) // Compare les temps
{
if(iVolume(NULL,PERIODs_short_term,0)<=2) //compare le volume
Print("Volume de la barre =",Volume[0]) ;
if(iBarShift(NULL,PERIODs_short_term,TimeCurrent())==0)//Check the bar index
Print("Bar index =",iBarShift(NULL,PERIODs_short_term,TimeCurrent()) ;
New_Bar=true ; // Une nouvelle barre est capturée.
Print("New_Bar") ;
}
else if(New_Bar==false) // Si la barre n'est pas nouvelle...
{
Print("La barre n'est pas nouvelle") ;
retour ;
}
//---Contrôle de la disponibilité des fonds pour l'ouverture du lot minimum
if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))
{
Print("Pas assez de fonds. Fonds libres = ",AccountFreeMargin()) ;
retour ;
}
//---Détermination du numéro de lot
si(Lots>Lots_Volume)
{
Lots=NormalizeDouble(Lots_Volume,2) ;
Print("Nombre de lots : ",Lots) ;
}
autre si(Lots<Lots_Volume)
{
Lots=NormaliserDouble(MathFloor(Lots),2) ;
Print("Nombre de lots : ",Lots) ;
}
//+------------------------------------------------------------------+
//| Conditions d'ouverture des ordres si le nombre d'ordres est égal à zéro | |
//+------------------------------------------------------------------+
si(total<1)
{
if(MacdCurrent_long_term<0 && MacdCurrent_long_term>SignalCurrent_long_term)
Print("La condition est vraie pour BUY") ;
{
//+---------------------------------------------------------------------------+
//| Condition pour ouvrir une position longue BUY uniquement |
//+---------------------------------------------------------------------------+
if(Stochastic_Current_short_term_main<Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main>=Stochastic_Previous_short_term_signal)
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,3,0,0,NULL,MAGICNUMBER,0,Blue) ;
if(ticket>0)//vérification de la position ouverte
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
retour ;
}
else Print("BUY order open error : ",GetLastError()) ;
retour ;
}
}
}
if(MacdCurrent_long_term>0 && MacdCurrent_long_term<SignalCurrent_long_term)
Print("La condition est vraie pour SELL") ;
{
//+---------------------------------------------------------------------------+
//| Condition pour l'ouverture de positions courtes SELL uniquement |
//+---------------------------------------------------------------------------+
if(Stochastic_Current_short_term_main>Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main<=Stochastic_Previous_short_term_signal)
{
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Price_SELL,3,0,0,NULL,MAGICNUMBER,0,Green) ;
if(ticket>0)//vérification de la position ouverte
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("Ordre de vente ouvert : ",OrderOpenPrice()) ;
retour ;
}
else Print("Erreur lors de l'ouverture d'un ordre de VENTE : ",GetLastError()) ;
retour ;
}
}
}
}
//+---------------------------------------------------------------------------+
//| Conditions de modification de la commande |
//+---------------------------------------------------------------------------+
for(cnt=0;cnt<total;cnt++)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continuer ;
if(OrderMagicNumber()==MAGICNUMBER && // vérifier le numéro magique de la commande
OrderSymbol()==Symbol()) // vérification du symbole de l'ordre
{
//--- position longue ouverte
si(OrderType()==OP_BUYSTOP)
{
si(OrderOpenPrice()<Price_BUY && Ask<Price_BUY)
{
if(OrderModify(OrderTicket(),Price_BUY,0,0,0,0,Blue))
Print("La commande Price_BUY a été modifiée avec succès.") ;
else Print("Erreur lors de la modification de l'ordre BUYStop. Code d'erreur=",GetLastError()) ;
retour ;
}
else Print("Le prix de la modification est supérieur au prix de la commande") ;
retour ;
}
si(OrderType()==OP_SELLSTOP)
{
si(OrderOpenPrice()<Price_SELL && Bid>Price_SELL)
{
if(OrderModify(OrderTicket(),Price_SELL,0,0,0,0,Green))
Print("L'ordre Prix_SELL a été modifié avec succès.") ;
else Print("Erreur lors de la modification de l'ordre SELLStop. Code d'erreur=",GetLastError() ;
retour ;
}
}
si(OrderType()==OP_BUY)
{
si(OrderStopLoss()<StopLoss_BUY && StopLoss_BUY<Ask)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_BUY,0,0,Blue))
Print("Prix de la commande Price_BUY modifié avec succès.") ;
else Print("Erreur lors de la modification de la commande BUY. Code d'erreur=",GetLastError()) ;
retour ;
}
}
si(OrderType()==OP_SELL)
{
if(OrderStopLoss()>StopLoss_SELL && StopLoss_SELL>Bid)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))
Print("Prix_SELL prix de l'ordre modifié avec succès.") ;
else Print("Erreur lors de la modification de l'ordre SELL. Code d'erreur=",GetLastError() ;
retour ;
}
}
}
}
}
//+------------------------------------------------------------------+
Aide à corriger un bug dans l'indicateur, il ne dessine pas le haut et le bas du jour quand il est sur la dernière bougie de l'heure.
https://prnt.sc/kut6xo
https://prnt.sc/kut79b
Je demande de l'aide. Les questions sont les suivantes :
1. Le programme ne fixe pas de stop loss à l'achat et à la vente en mode test. Mais la modification des ordres en cours se passe bien.
2. Il ne démarre pas en temps réel sur le compte.
C'est ainsi que
modifiera le code ET, insérez-le correctement (Alt+S).