Fonctions utiles de KimIV - page 85

 

En conséquence, un comptage de position personnalisé a été ajouté au bloc de fermeture, ce qui a permis une fermeture "correcte", mais l'erreur 131 apparaît encore plusieurs fois dans le journal :

Une telle insertion d'un comptage de commandes dans une boucle est-elle normale compte tenu du fait qu'il existe déjà un comptage de commandes et que

Pourriez-vous corriger le code pour éviter l'erreur 131 ?

Merci beaucoup.

Dossiers :
codz2.mq4  5 kb
 
hope писал(а) >>

Pourriez-vous corriger le code pour éviter l'erreur 131 ?

Merci beaucoup.

Et qui va normaliser la taille du lot pour vous après la division ? D'où l'erreur.

 

Alex, avant de transmettre le lot à la fonction de fermeture, normalisez sa taille avec NormalizeLot().

 

Merci Igor, Alexander,

En effet, j'ai vérifié les lots en remplaçant Lot/3 (Lot/2, Lot) par 0.01 dans la fonction SELLCLOSED_1=OrderClose( OrderTicket(), Lot/3, Ask, 0, Red ) ; et j'ai évité l'erreur 131. Nous pourrions le laisser comme ça (0,01), mais, d'abord, la fermeture à la forme Lot est plus correcte. Deuxièmement, je n'avais jamais rencontré de fonctions utilisateur et leur appel dans le programme auparavant, ce qui s'est avéré plutôt intéressant. Il semble que j'ai tout attaché correctement dans le code et que tout fonctionne, mais l'erreur 131 persiste. Regardez le code, s'il vous plaît. Je me suis peut-être trompé dans la fonction d'appel de NormalizeLot.

Dossiers :
cod3.mq4  6 kb
 

Excuses. Dans le code original, la ligne

RefreshRates() ;
BUYCLOSED_1=OrderClose( OrderTicket(), CloseLot, Bid, 0, Red ) ;

est le LotClose correct, conformément à la condition.

Lot =OrderLots() ; // NOMBRE DE LOTS
LotClose =NormalizeLot(Lot) ; // la valeur du LOT NORMALISÉ est affectée au LOT FERMÉ

faux lors de l'affichage........

 
hope писал(а) >>

Regardez le code, s'il vous plaît. Vous avez peut-être fait une erreur dans la fonction d'appel de NormalizeLot.

Essayez de remplacer

  if ( ro) l=MathCeil( lo* k)/ k; else l=MathFloor( lo* k)/ k;

à

  if ( ro) l=NormalizeDouble(MathCeil( lo* k)/ k,2); else l=NormalizeDouble(MathFloor( lo* k)/ k,2);
 

Bonjour Alexander,

Malheureusement, votre conseil n'a pas aidé. J'ai analysé le journal et j'ai constaté que l'erreur se produit dans deux cas, lorsque la fermeture d'une partie d'un lot coïncide presque avec la fermeture d'une autre partie du lot.

Dans le cas où il n'y a pas de coïncidence dans le temps, alors une partie du lot est fermée sans erreur.

J'ai essayé de normaliser les lots pour l'achat de clôture et les lots pour la vente de clôture séparément mais sans succès :

double
Lot, // Nombre de lots dans l'ordre sélectionné
LotCloseBuy,
LotCloseSell,

............................

Lot =OrderLots() ;
LotCloseBuy =NormaliserLot(Lot) ;

LotCloseSell =NormaliserLot(Lot) ;

............................

BUYCLOSED_3=OrderClose( OrderTicket(), LotCloseBuy, Bid, 0, Red )

...........................

SELLCLOSED_3=OrderClose( OrderTicket(), LotCloseSell, Ask, 0, Red ) ;

...................

La fonction d'Igor

NormaliserLot.........

Avez-vous des idées ?

 

Je suis un mouton ! Ugh - c'est dégoûtant....

Normalisé les lots dans la boucle d'ordre

//--------------------------------------------------------------- 4 --
// Comptage des ordres
Symb=Symbol() ; // Nom de l'instrument financier.
BuyTotal=0 ; // Nombre d'ordres d'achat
SellTotal=0 ; // Nombre d'ordres de vente
for(int i=1 ; i<=OrdersTotal() ; i++) // Boucle d'ordres
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Si ce qui suit
{ // Analyse des ordres :
if (OrderSymbol() !=Symb)continue ; // Pas notre instrument financier
if (OrderType()>1) // En attente
{
Alert(" Ordre en attente détecté. Le conseiller expert ne fonctionne pas.") ;
return ; // Sortie start()
}
if (OrderType()==OP_BUY)
{
BuyTotal++ ; // Compteur d'ordres d'achat
BuyOrdOpPrice=OrderOpenPrice() ; // Prix d'achat ouvert
}
if (OrderType()==OP_SELL)
{
SellTotal++ ; // Compteur d'ordres de vente
SellOrdOpPrice=OrderOpenPrice() ; // Prix de vente ouvert
}
Ticket=OrderTicket() ; // Numéro de l'ordre sélectionné.
Tip =OrderType() ; // Type de la commande sélectionnée.
Lot =OrderLots() ;

LotCloseBuy =NormaliserLot(Lot) ;

LotCloseSell =NormaliserLot(Lot) ;
}
}

.... et j'ai créé une boucle séparée pour tenir compte des ordres ouverts, où j'ai dû normaliser les lots pour les fermer ! !!

//--------------------------------------------------------------- 6 --

// Vérification des ordres ouverts
int _GetLastError = 0, _OrdersTotal = OrdersTotal() ;
int z ;


//---- passer par toutes les positions ouvertes
for ( z = _OrdersTotal-1 ; z >=0 ; z -- )
{
//The loop for - passer par tous les ordres ouverts
//---- si une erreur se produit pendant la sélection de la position, passer à la suivante
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
_GetLastError = GetLastError() ;
Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError ) ;
continue ;
}
//Finished
//Binding to Currency and Majik
//---- si la position n'est pas ouverte pour l'instrument actuel, ignorez-la
if ( OrderSymbol() != Symbol() ) continue ; // ERROR
//Finished

//---- si MagicNumber n'est pas égal à Expert_ID, sauter cette position
if ( OrderMagicNumber() != Expert_ID ) continue ; // ERROR
//Finished
if (OrderType()==OP_BUY)
{
BuyClot=OrderLots() ;
}
if (OrderType()==OP_SELL)
{
SellClLot=OrderLots() ;
}
OpenedLots=OrderLots() ;
LotCloseBuy =NormalizeLot(OpenedLots) ; // Nombre de lots
LotCloseSell =NormalizeLot(OpenedLots) ; // Nombre de lots

//Check if a Buy position is opened,

........................................

Merci Igor, Alexander. Sans la fonction de normalisation des lots, nous serions toujours dans une impasse.....

 

Bonsoir,

Et la toute première erreur qui se produit :

2009.07.08 21:05:45 TestGenerator : unmatched data error (volume limit 651 at 2009.07.08 19:00 exceeded)
est critique ou s'agit-il simplement d'une erreur du testeur ?

Merci.

 
Igor - veuillez consulter l'indicateur GAP ici.
Raison: