Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 1100
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
Chers programmeurs, pouvez-vous s'il vous plaît m'aider à mettre une interdiction sur l'ouverture de plus d'une série de transactions à la fois (la série est si l'ordre est fermé dans la perte ou zéro et puis ouvre la transaction suivante sur le même instrument, mais avec un plus grand lot), c'est-à-dire, si vous ouvrez une série de transactions la deuxième et les suivantes sont mises sur d'autres instruments sous une interdiction (le bot travaille simultanément sur des instruments différents). Je pense que cela devrait être fait par le biais d'une variable globale dans le terminal, mais je n'ai pas assez de connaissances et d'expérience, je viens juste de commencer à apprendreMQL. Il s'agit d'un conseiller en options binaires. Voici le code
extern double Lots = 1 ; // Lots
extern int Exp = 1 ; // Expiration
extern int Wait = 1 ; // Nombre de chandeliers d'une même direction
extern int Timeout = 1 ; // Intervalle de temps
extern double Multiplier = 3 ; // Multiplicateur
extern int Slippage = 5 ; // Slippage
extern int Magic = 2090 ; // Magie
int ticket, Type ;
double Price, Lot ;
//+------------------------------------------------------------------+
//| 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()
{
// --------------- Ouvrir des transactions ---------------
if (OrdersTotal() == 0) // Le nombre de commandes doit être égal à zéro.
{
si ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
// Si la dernière transaction est perdante, la même est ouverte, mais avec un lot plus important.
{
Type = TypeLastHistOrder() ;
if (Type == OP_BUY) Prix = Demande ;
if (Type == OP_SELL) Price = Bid ;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2) ;
ticket = OrderSend(Symbol(), Type, Lot, Prix, Slippage, 0, 0, IntegerToString(Exp), Magic) ;
}
si (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// si le bénéfice de la dernière transaction est égal à zéro, la même transaction sera ouverte.
{
Type = TypeLastHistOrder() ;
if (Type == OP_BUY) Prix = Demande ;
if (Type == OP_SELL) Price = Bid ;
Lot = NormalizeDouble(LotsLastHistOrder(), 2) ;
ticket = OrderSend(Symbol(), Type, Lot, Prix, Slippage, 0, 0, IntegerToString(Exp), Magic) ;
}
si ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
|| CountHistTrades() == 0)// Si la dernière transaction est profitable, l'ordre est ouvert.
{
si (SignalBuy() && OrdersTotal() == 0)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic) ;
}
si (SignalSell() && OrdersTotal() == 0)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic) ;
Commentaire ("PriceCloseLastHistOrder(OP_BUY)= ", PriceCloseLastHistOrder(OP_BUY), "PriceCloseLastHistOrder(OP_SELL)=",
PrixCloseLastHistOrder(OP_SELL) ) ;
}
}
}
}
//+------------------------------------------------------------------+
int CountTrades(int type = -1) // Déterminer le nombre de transactions
{
int cnt = 0 ;
for (int i=OrdersTotal()-1 ; i>=0 ; i--) // La boucle passe par tous les ordres ouverts, i est le numéro de l'ordre.
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // La fonction vérifie si l'ordre portant le numéro i est sur le marché,
// si c'est le cas, les conditions suivantes sont vérifiées...
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // Si le symbole
// le symbole sur lequel l'ordre est ouvert est égal au symbole actuel, le type d'ordre est égal à magic dans les paramètres de l'EA actuel, et
// le type de commande est égal à type (ou type == -1 (dans le cas où le type requis pour le comptage de la commande n'a pas d'importance))
cnt++ ; // 1 est ajouté à la variable cnt et à la fin de la boucle cnt sera égal au nombre de donnes
// ouvert par l'EA actuel pour la paire de devises actuelle avec un certain type.
}
}
return(cnt) ; // la valeur de la variable cnt est retournée
}
//+------------------------------------------------------------------+
int CountHistTrades(int type = -1)
{
int cnt = 0 ;
for (int i=OrdersHistoryTotal()-1 ; i>=0 ; i--)
{
si (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
si (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
cnt++ ;
}
}
retour(cnt) ;
}
//+------------------------------------------------------------------+
bool SignalBuy()
{
pour (int i=1 ; i<=Wait ; i++)
{
si (Close[i] > Open[i]) return(false)
}
si ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true) ;
si (CountHistTrades() == 0) return(true) ;
retour (faux) ;
}
//+------------------------------------------------------------------+
bool SignalSell()
{
pour (int i=1 ; i<=Wait ; i++)
{
si (Close[i] < Open[i]) return(false)
}
si ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true) ;
si (CountHistTrades() == 0) return(true) ;
retour (faux) ;
}
//+------------------------------------------------------------------+
datetime TimeLastHistOrder(int type = -1)
{
datetime lasttime = 0 ;
datetime opentime = 0 ;
for (int i=OrdersHistoryTotal()-1 ; i>=0 ; i--)
{
si (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
si (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
si (OrderCloseTime() > lasttime)
{
lasttime = OrderCloseTime() ;
opentime = OrderOpenTime() ;
}
}
}
}
retour(opentime) ;
}
//+------------------------------------------------------------------+
int TypeLastHistOrder()
{
datetime time = 0 ;
int type = -1 ;
for (int i=OrdersHistoryTotal()-1 ; i>=0 ; i--)
{
si (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
si (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
si (OrderCloseTime() > time)
{
time = OrderCloseTime() ;
type = OrderType() ;
}
}
}
}
retour(type) ;
}
//+------------------------------------------------------------------+
double LotsLastHistOrder(int type = -1)
{
datetime time = 0 ;
double lots = 0 ;
for (int i=OrdersHistoryTotal()-1 ; i>=0 ; i--)
{
si (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
si (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
si (OrderOpenTime() > time)
{
time = OrderOpenTime() ;
time = OrderLots() ;
}
}
}
}
retour(lots) ;
}
//+------------------------------------------------------------------+
double PriceCloseLastHistOrder(int type = -1)
{
datetime time = 0 ;
double prix = 0 ;
for (int i=OrdersHistoryTotal()-1 ; i>=0 ; i--)
{
si (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
si (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
si (OrderCloseTime() > time)
{
time = OrderCloseTime() ;
prix = OrderClosePrice() ;
}
}
}
}
}
}
//+------------------------------------------------------------------+
double PriceOpenLastHistOrder(int type = -1)
{
datetime time = 0 ;
double prix = 0 ;
for (int i=OrdersHistoryTotal()-1 ; i>=0 ; i--)
{
si (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
si (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
si (OrderCloseTime() > time)
{
time = OrderCloseTime() ;
prix = OrderOpenPrice() ;
}
}
}
}
}
}
//+------------------------------------------------------------------+
J'ai unequestion à propos de la programmation: existe-t-il un moyen d'obtenir l' heure du serveur en millisecondes dans l'EA ?
Par exemple, prenez : 23.09.2016 14h. : 53 min. : 54000 millisecondes ? C'est exactement 54 secondes, 000 millisecondes.
Bonjour chers collègues !
J'ai unequestion pendant la programmation: est-il possible d'obtenir d'une manière ou d'une autre dans l'Expert Advisor l'heure du serveur avec une précision de quelques millisecondes?
Par exemple, prenez : 23.09.2016 14h. : 53 min. : 54000 millisecondes ? C'est exactement 54 secondes, 000 millisecondes.
Question intéressante. Que voulez-vous dire, spécifier la dernière heure connue du serveur, l'heure de la dernière citation de TimeCurrent() ou l'heure actuelle sur le serveur ?
Si c'est TimeCurrent(), à quoi cela servira-t-il, si l'on considère qu'un paquet avec une nouvelle cotation passe par l'internet du serveur au terminal pendant 10-500 ms et que ce temps varie de paquet en paquet. En outre, il n'est pas clair, quelle est l'arrivée de la dernière cotation, si elle arrive au serveur depuis plusieurs sources, fournisseurs de liquidités, et qu'elle est ensuite traitée, puis le serveur envoie un nouveau tick. De plus, on ne sait pas comment le minuteur du système du serveur est synchronisé avec le temps astronomique. Le 09.01.2014 de 04:15 à 06:15 MSK (jeudi, jour de bourse) je le constatais, car l'écart n'est pas de l'ordre de l'astronomie, mais de la moyenne de 31 entreprises. La figure pour 25 points de temps montre ces écarts (en secondes, pas en ms) :
Et quel est l'intérêt de calculer quoi que ce soit en quelques millisecondes à partir des données du serveur ?
La deuxième option est plus claire. Si votre ordinateur est synchronisé avec l'heure astronomique avec une précision connue de vous, l'heure astronomique de la ville où fonctionne le serveur est connue avec la même précision. Mais pourquoi en avez-vous besoin...
Je n'arrive pas à comprendre où est passée l'optimisation du testeur de stratégie. Les contrôles sont tous debout, je ne peux rien comprendre. MT4 build 1010. Windows 8.1.
Veuillez indiquer comment activer l'optimisation.
Je vais joindre des captures d'écran. Je ne vois pas le bouton d'optimisation.
}
Je demande à des programmeurs compétents de m'expliquer quelle est mon erreur... Pourquoi l'ordre n'est pas modifié... et le compilateur ne donne pas d'erreur en le faisant...
J'ai étudié le tutoriel, j'ai lu et pris des notes. Pourriez-vous indiquer les erreurs spécifiquement... parce que le compilateur ne donne pas d'erreurs et il n'y a pas d'erreurs dans le testeur. Mais l'ordre n'est pas modifié. C'est comme si l'ordre n'est pas du tout vu dans le programme.
Lisez attentivement ce que retourne OrderSend()
En fait, je ferais la chose suivante :
Lisez attentivement ce que retourne OrderSend()
En fait, je le ferais comme ça :