Fonctions utiles de KimIV - page 49

 
KimIV писал (а) >>

Exemples d'utilisation de la fonction ExistOrders().

5. Vérifier pour toute commande dont le temps de réglage est de 2 heures ou plus.

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);

Bonsoir, je suis un peu confus par ce commentaire. Je suis assis ici, en train de le découvrir ! Je n'arrive pas à trouver comment formuler correctement ma condition - "pas plus tôt que 5 min" ou "pas plus tard que 5 min" ! (C'était clair pour moi avant que je commence à y penser !)

Je dois supprimer un ordre en attente s'il ne s'est pas déclenché dans un délai donné. Par exemple, dans les 5 minutes qui suivent le réglage !

Je l'ai fait :

if (ExistOrders(NULL, OP_BUYSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР BUYSTOP > 5 min 
                 DeleteOrders(NULL, OP_BUYSTOP, Magic);
if (ExistOrders(NULL, OP_SELLSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР SELLSTOP > 5 min  
                 DeleteOrders(NULL, OP_SELLSTOP, Magic);

Est-ce correct ? Mais cela ne fonctionne pas dans le testeur. Les commandes sont passées et immédiatement supprimées.

Comment écrire correctement la fonction ExistOrders() ?

 
rid писал (а) >>
Je suis un peu confus...

J'ai l'impression d'être confus moi aussi. Déchiffrons-nous ensemble... :-)

Le paramètre ot (temps de passage de la commande) a été introduit dans la fonction ExistOrders pour traiter correctement les erreurs 128, 142 et 143. Le but de la gestion des erreurs est d'exclure les réglages doubles (voire triples dans des cas pratiques) du même ordre. Pour ce faire, l'heure d'envoi de l'ordre est mémorisée et les tentatives de trading sont mises en pause. Après la pause, on vérifie la présence de l'ordre avec le temps fixé après celui mémorisé. S'il y a un ordre, on conclut que l'objectif a été atteint (l'ordre a été fixé) et les tentatives de négociation sont interrompues. En d'autres termes, le temps après lequel le paramètre de l'ordre est vérifié est transmis au paramètre ot. Plus tard = pas plus tôt.

rid aécrit (a) >>
Je dois supprimer un ordre en attente s'il ne s'est pas déclenché dans un délai donné. Par exemple, dans les 5 minutes suivant le réglage !

Le paramètre ot de la fonction ExistOrders n'est pas utile ici. Cela fonctionne dans le sens inverse. Il va dans le sens d'un rapprochement avec le présent. Ce que vous devez faire, c'est travailler à l'envers. Le paramètre d'expiration de la fonction OrderSend (ou le paramètre ex de la fonction SetOrder) est idéal pour cela.

 

La fonction ClosePosBySelect() pour le testeur.

Exécute la fermeture d'une position présélectionnée. Il s'agit d'une version allégée de la fonction du même nom, précédemment publiée à la page 13. Rien de plus. Pas de fonctionnalités supplémentaires. Dans ma pratique, je n'ai jamais eu une position qui n'était pas fermée dans le testeur. C'est pourquoi il n'y a pas de contrôles dans cette fonction. Ils sont inutiles dans le testeur.

//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;

  if (OrderType()==OP_BUY) {
    pp=MarketInfo(OrderSymbol(), MODE_BID);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=MarketInfo(OrderSymbol(), MODE_ASK);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}

SZY. Exemple d'utilisation de la fonction ClosePosBySelect() que je donnerai plus tard, avec la fonction OpenPosition() pour le testeur.

 

Bonjour à tous. Pour éviter de devoir fouiller dans les pages à chaque fois, j'ai dû faire le contenu branche par branche.

J'ai consolidé les fonctions de thèmes similaires ici et là. Contenus de 1 à 40 pages.

Ceux qui le souhaitent peuvent continuer et ajouter d'autres pages et les mettre ici.

Dossiers :
 

Bonjour Igor, j'ai besoin de ton aide. J'ai décidé d'implémenter une fonction de fermeture dans l'EA e-CloseByProfit similaire à e-CloseByPercentProfit.

Tout fonctionne bien, le conseiller expert fonctionne correctement et le terminal se ferme. Mais quand je rouvre le terminal, il le ferme tout de suite.

Veuillez m'aider à modifier le code pour corriger ce problème.

//+----------------------------------------------------------------------------+
//| e-CloseByProfit.mq4 |
//| Kim Igor V. alias KimIV |
//| http://www.kimiv.ru |
//| |
//| 22.10.2006 L'Expert Advisor ferme toutes les positions dès que le seuil spécifié est atteint.
//| niveau de profit.
//| 20.06.2008 Correction d'une erreur dans le calcul du bénéfice en points .
//+----------------------------------------------------------------------------+
#property copyright "Kim Igor V. aka KimIV"
#lien de propriété "http://www.kimiv.ru"
#define MAGIC 20061022

//------- Paramètres externes du conseiller expert ------------------------------------------
extern string _P_Expert = "---------- EA parameters" ;
extern bool CurSymbolOnly = false ; // Seulement le symbole actuel
extern intProfit = 100 ; // TakeProfit
extern bool CloseTerminal = False ; // Fermer le terminal
extern bool ShowComment = True ; // Afficher le commentaire
extern int NumberAccount = 0 ; // Numéro du compte de trading
extern bool UseSound = True ; // Utiliser le signal sonore
extern string NameFileSound = "manycoin.wav" ; // Nom du fichier son
extern int Slippage = 3 ; // Dérapage de prix
extern inttern NumberOfTry = 5 ; // Nombre de tentatives

//------- Variables globales de l'Expert Advisor --------------------------------------
couleur clCloseBuy = Bleu ; // couleur clCloseSell = Rouge ; // couleur du symbole de clôture de l'achat
couleur clCloseSell = Rouge ; // couleur du drapeau de fermeture de vente
int CurProfit ;

//------- Connexion des modules externes -------------------------------------------
#include <stdlib.mqh>.
#include <WinUser32.mqh>

//+----------------------------------------------------------------------------+
//| fonction d'initialisation de l'expert |
//+----------------------------------------------------------------------------+
void init() { if (!IsTesting()) Comment("") ; }

//+----------------------------------------------------------------------------+
//| fonction de désinitialisation des experts |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comment(") ; }

//+----------------------------------------------------------------------------+
//| fonction de démarrage de l'expert |
//+----------------------------------------------------------------------------+
void start() {
si (!IsTesting()) {
si (NumberAccount>0 && NumberAccount!=AccountNumber()) {
Message("La négociation sur le compte est INTERDITE" +AccountNumber()) ;
retour ;
} else Comment(") ;
}

CloseByProfit() ;
if (ShowComment) {
Commentaire(IIFs(CurSymbolOnly, "CurSymbolOnly ","),
"Profit actuel=",CurProfit," p."
"Close Profit=",TakeProfit," p."
) ;
}
}


//+----------------------------------------------------------------------------+
//| Auteur : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 19.02.2008 |
//| Description : Fermeture d'une position présélectionnée.
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
bool fc ;
clClose ;
double ll, pa, pb, pp ;
int err, it ;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1 ; it<=NumberOfTry ; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break ;
while (!IsTradeAllowed()) Dormir (5000) ;
RefreshRates() ;
pa=MarketInfo(OrderSymbol(), MODE_ASK) ;
pb=MarketInfo(OrderSymbol(), MODE_BID) ;
si (OrderType()==OP_BUY) {
pp=pb ; clClose=closeBuy ;
} else {
pp=pa ; clClose=closeSell ;
}
ll=OrderLots() ;
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose) ;
if (fc) {
if (UseSound) PlaySound(NameFileSound) ; break ;
} else {
err=GetLastError() ;
si (err==146) while (IsTradeContextBusy()) Sleep(1000*11) ;
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it) ;
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp) ;
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber()) ;
Dormir (1000*5) ;
}
}
} else Print("Opération commerciale non valide. Fermer ",GetNameOP(OrderType())) ;
}

//+----------------------------------------------------------------------------+
//| Auteur : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 19.02.2008 |
//| Description : Fermeture des positions au prix du marché la plus rentable.
//+----------------------------------------------------------------------------+
//| Paramètres : |
//| sy - nom de l'instrument (" - n'importe quel symbole, |
//| NULL - symbole actuel) |
| //| op - opération (-1 - toute position) |
//| mn - MagicNumber (-1 - n'importe quel magik) |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal() ;
si (sy=="0") sy=Symbole() ;

// Fermer d'abord les positions rentables
for (i=k-1 ; i>=0 ; i--) {
si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
si ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
si (mn<0 || OrderMagicNumber()==mn) {
si (OrderProfit()+OrderSwap()>0) ClosePosBySelect() ;
}
}
}
}
}
// puis tout le reste
k=OrdersTotal() ;
for (i=k-1 ; i>=0 ; i--) {
si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
si ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
si (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect() ;
}
}
}
}
}

//+----------------------------------------------------------------------------+
//| Fermeture de toutes les positions sur les bénéfices.
//+----------------------------------------------------------------------------+
void CloseByProfit() {
double pa, pb, pp ;
int i, k=OrdersTotal(), pr=0 ;

for (i=0 ; i<k ; i++) {
si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (!CurSymbolOnly || OrderSymbol()==Symbol()) {
pa=MarketInfo(OrderSymbol(), MODE_ASK) ;
pb=MarketInfo(OrderSymbol(), MODE_BID) ;
pp=MarketInfo(OrderSymbol(), MODE_POINT) ;
si (pp==0) if (StringFind(OrderSymbol(), "JPY")<0) pp=0.0001 ; sinon pp=0.01 ;
si (OrderType()==OP_BUY) {
pr+=NormalizeDouble((pb-OrderOpenPrice())/pp, 0) ;
}
si (OrderType()==OP_SELL) {
pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp, 0) ;
}
}
}
}
CurProfit=pr ;
si (CurProfit>=TakeProfit) ClosePosFirstProfit() ;
if (CloseTerminal && !ExistPositions()) CloseTerminal() ;
}
//+----------------------------------------------------------------------------+
//| Fermer le terminal de trading. |
//+----------------------------------------------------------------------------+
void CloseTerminal() {
Print("CloseTerminal() s'est déclenché ;)
int hwnd=WindowHandle(Symbol(), Period()) ;
int hwnd_parent=0 ;

while(!IsStopped()) {
hwnd=GetParent(hwnd) ;
si (hwnd==0) pause ;
hwnd_parent=hwnd ;
}
si (hwnd_parent!=0) PostMessageA(hwnd_parent, WM_CLOSE, 0, 0) ;
}

//+----------------------------------------------------------------------------+
//| Retourne le drapeau d'existence |
//| Paramètres : |
//| sy - nom de l'instrument (" - n'importe quel symbole, |
//| NULL - symbole actuel) |
| //| op - opération (-1 - toute position) |
//| mn - MagicNumber (-1 - n'importe quel magik) |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal() ;

si (StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Symbol() ;
for (i=0 ; i<k ; i++) {
si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
si (OrderSymbol()==sy || sy==") {
si (OrderType()==OP_BUY || OrderType()==OP_SELL) {
si (op<0 || OrderType()==op) {
si (mn<0 || OrderMagicNumber()==mn) return(True) ;
}
}
}
}
}
retourner(Faux) ;
}
//+----------------------------------------------------------------------------+
//| Auteur : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 01.09.2005 |
//| Description : Renvoie le nom de l'opération commerciale.
//+----------------------------------------------------------------------------+
//| Paramètres : ||
//| op - identifiant de l'opération commerciale |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
switch (op) {
cas OP_BUY : return("Buy") ;
cas OP_SELL : return("Sell") ;
cas OP_BUYLIMIT : return("BuyLimit") ;
cas OP_SELLLIMIT : return("SellLimit") ;
cas OP_BUYSTOP : return("BuyStop") ;
cas OP_SELLSTOP : return("SellStop") ;
par défaut : return("Unknown Operation") ;
}
}

//+----------------------------------------------------------------------------+
//| Auteur : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 01.02.2008 |
//| Description : Il renvoie l'une des deux valeurs en fonction de la condition.
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
si (condition) return(ifTrue) ; sinon return(ifFalse) ;
}

//+----------------------------------------------------------------------------+
//| Afficher un message dans le commentaire et dans le journal de bord |
//+----------------------------------------------------------------------------+
void Message(string m) {
Commentaire(s) ;
si (StringLen(m)>0) Print(m) ;
}
//+----------------------------------------------------------------------------+

 
Vkorch писал (а) >>
Bonjour Igor, j'ai besoin de ton aide. J'ai décidé d'écrire la fonction de fermeture du terminal dans l'EA e-CloseByProfit de manière similaire à e-CloseByPercentProfit.

Tout fonctionne bien, l'EA fonctionne, le terminal se ferme. Mais lorsque je rouvre le terminal, l'EA le ferme immédiatement.
Aidez à changer un code pour éliminer ce manque.

Faites comme ça :

CurProfit=pr;
if (CurProfit>=TakeProfit) {
  ClosePosFirstProfit();
  if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
 
KimIV писал(а) >>

Faites comme ça :

Merci, Igor. Je l'ai corrigé. Mais lors de la compilation, j'ai une erreur

'(' - définition de la fonction inattendue C:\Program Files\MetaTrader - AlpariÒexperts\e-CloseByProfit.mq4 (180, 19)

Que dois-je faire ?

 

Igor, pourriez-vous créer une bibliothèque de fonctions pour travailler avec les ordres et les positions ? La bibliothèque a été développée et testée pendant plus de 2 ans, j'ai joint les fichiers, peut-être que certaines idées vous seront utiles.

Quant à

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po) ;

Peut-être serait-il préférable d'appeler OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44) ;

а

double pa=MarketInfo("USDCAD", MODE_ASK);
double pb=MarketInfo("USDCAD", MODE_BID);
double po=MarketInfo(
"USDCAD", MODE_POINT);
et this insert 
  
 
double lot_min =MarketInfo(Symbol(),MODE_MINLOT)
; 
if(Lots<lot_min) return ;

calculer à l'intérieur de la fonction, c'est-à-dire passer la valeur sl à et tp, et calculer et normaliser tout correctement à l'intérieur de la fonction.


	          
Dossiers :
 

Bonjour Igor !

Si j'ai une position de 0,3 lot ouverte, je dois.. :

1.Fermer une partie d'une position de 0,1 lot.

Modifier (déplacer le stop loss à un autre niveau)

2.1 Partie plus proche de la position 0.1 lot.

Modifier (fixer le stop loss à un autre niveau).

3. position fermée.

Une autre question ? Lorsque la position partielle est fermée.

OrderClose(OrderTicket(),NormalizeDouble(OrderLots()/3,2),Ask,3,Violet) ;

J'obtiens l'erreur 131 (mauvais volume). Comment puis-je la corriger ?

Réponse s'il vous plaît pour un débutant. Peut être en mots.

.

 
Prival писал (а) >>
Igor, pourriez-vous, s'il vous plaît, transformer les fonctions qui fonctionnent avec les ordres et les positions en une bibliothèque ?

Non, ce n'est pas... En principe, tout est déjà arrangé comme il se doit... Je ne l'affiche pas car toutes les fonctions de cette bibliothèque n'ont pas encore été publiées... il en reste deux ou trois qui sont apparus depuis le début de ce fil.

Et je vais réfléchir au reste...