[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 409

 
sergeev:

pas de


Le problème ici est simplement dans la boucle. i va de 0 à 2. Vous voulez 2 à 0.



Montrez-moi un exemple s'il vous plaît, je l'ai fait
 for(i = OrdersTotal(); i > 0; i--)
Ça n'a pas marché.
 

sss2019:



Montrez-moi un exemple s'il vous plaît, je l'ai fait. Ça n'a pas marché.


J'ai fait le script comme ceci

int orderstotal = OrdersTotal();
        for(i = 0; i < orderstotal; i++ )
                {
                if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
                if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                        {
                        if(OrderType() == OP_BUY)
                        if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() == OP_SELL)
                        if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() > 1)
                        if(OrderDelete(OrderTicket()) == false)
                                {
                                Print(GetLastError());
                                }
                        }
                Print(i," ",orderstotal);
                }

En conséquence, Print produit le résultat suivant

0 4

1 4

C'est tout, pour une raison quelconque la boucle n'imprime pas

2 4

3 4

J'ai ajouté à la boucle OrderSelect(i, SELECT_BY_POS, MODE_TRADES au lieu de I 0, c'est-à-dire que le premier ordre est toujours sélectionné et le script fonctionne correctement. Il s'avère que lorsque la boucle supprime deux commandes, elle essaie de sélectionner la troisième commande alors qu'il n'y a que deux commandes dans la liste.

 
sss2019:


J'ai fait le script comme ceci

En fin de compte...

Exemples
 
sss2019:

S'il te plaît, montre-moi un exemple, je l'ai fait.

for(i = OrdersTotal(); i > 0; i--)

Ça n'a pas aidé.


parce que tu dois encore réfléchir.

for(i = OrdersTotal()-1; i >=0; i--)
 

Aidez-moi à résoudre ce dilemme

int i;
    double maxrange,range;
    double Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
    double Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
   
                    while(Ma1 > Ma2)
                        {
                        i++;
                        Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        range = (Ma1 - Ma2)/Point;
                        if(range > maxrange) maxrange = range;
                        }

Le script recherche la distance maximale entre les lignes. Il sort toutes les valeurs sur toutes les barres, la plage maximale est de 1.6235 sur une barre et 1.6208 sur l'autre.

J'essaie d'imprimer Print(maxrange) ; il imprime 0.086, je ne comprends pas pourquoi, je divise par Point.

 
sss2019:

Aidez-moi à résoudre ce dilemme

Le script recherche la distance maximale entre les lignes. Il sort toutes les valeurs sur toutes les barres, la plage maximale est de 1.6235 sur une barre et 1.6208 sur l'autre.

J'essaie de sortir Print(maxrange) ; il retourne 0.086, je ne comprends pas du tout pourquoi, je divise par Point


Il ne s'agit pas d'un dilemme. Un dilemme, c'est lorsque vous ne savez pas laquelle de deux solutions est la meilleure.

Tout d'abord, la fonction iMA() a sept paramètres, et non six. Deuxièmement, vous avez déclaré une variable par la chaîne int i. Et plus loin, la variable i n'est initialisée nulle part avec une valeur. Par conséquent, il est soit nul, soit contient des restes de mémoire de l'activité précédente. Et troisièmement, la boucle while est mal disposée. Disons que la variable i est égale à zéro après l'initialisation. Supposons également que l'expression Ma1 > Ma2 est également vraie. Par conséquent, la ligne while(Ma1 > Ma2) démarrera la boucle. À la prochaine itération de la boucle, nous découvrirons que l'expression (Ma1 > Ma2) n'est plus vraie et la boucle sera terminée. Les variables Ma1 et Ma2 ne contiendront pas la distance maximale - la distance maximale était une fois. Cette condition montrera seulement que Ma1 est maintenant devenu inférieur ou égal à Ma2.

De plus, la variable maxrange sera initialisée avec une valeur uniquement dans la ligne range = (Ma1 - Ma2)/Point ; Et si la condition if(range > maxrange) ne se produisait jamais, parce que vous n'initialisez pas la variable maxrange avec une valeur ailleurs dans le code ? Il s'avère donc que vous comparez le résultat des calculs avec les déchets des cellules de mémoire. Ici, vous avez des impressions incompréhensibles suite à l'exécution du code.

 
Le problème est que j'ai sorti toutes les valeurs MA dans la boucle, et toutes les valeurs sont correctes, c'est-à-dire que toutes les valeurs MA pour cette période ont été énumérées. Mais le calcul est faux à cet endroit - portée = (Ma1 - Ma2)/Point ;
if(range > maxrange) maxrange = range ;
 
sss2019:
C'est le point, je sortais toutes les valeurs MA dans la boucle et toutes les valeurs sont correctes, c'est-à-dire que toutes les valeurs MA pour cette période ont été recherchées. Mais le calcul est faux à cet endroit - portée = (Ma1 - Ma2)/Point ;
if(range > maxrange) maxrange = range ;

*Point

portée = (Ma1 - Ma2)*Point





 
pako:

*Point

plage = (Ma1 - Ma2)*Point

MA1 = 0,6526, MA2 = 0,6516. MA1-MA2 = 0,6526-0,6516 = 0,0010. Point = 0,0001. Si elle est multipliée, c'est une bilibrary. 0,0010 * 0,0001 = 0,0000001
 
sss2019:
Le problème est que j'ai sorti toutes les valeurs MA dans la boucle, et toutes les valeurs sont correctes, c'est-à-dire que toutes les valeurs MA pour cette période ont été énumérées. Mais le calcul est faux à cet endroit - portée = (Ma1 - Ma2)/Point ;
if(range > maxrange) maxrange = range ;

Eh bien, vous devez vérifier ce qui est entré. Quelles valeurs de variables sont impliquées dans les calculs ?