Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 901

 
.roman.:

Les calculs inutiles (sans rapport avec le problème) ont été supprimés. Les imprimantes ont été ajoutées au code spécifiquement pour montrer le problème. Malgré la comparaison du symbole de l'ordre avec le symbole où l'EA est ouvert, il peut montrer ce qui suit (à partir du graphique Ozi prendre les données de l'ordre sur les euros, par exemple, comme dans ce cas) :

                        if(Ask>openPrice)
                           {
                              Print("OrderSymbol ",OrderSymbol()," OrderTicket ",OrderTicket()," OrderOpenPrice ",OrderOpenPrice());
                           }
                     

Cela ne peut pas être le cas, il n'y a aucune chance que le Ask sur le kangourou soit plus élevé que n'importe quel prix ouvert sur l'Eurodollar en 2015....

Et toutes les vérifications concernant l'ordre sélectionné sont mieux faites après la sélection, avec une clause if() séparée.

 
evillive:

Cela ne peut pas être le cas, il n'y a aucune chance que le Ask sur le Kangourou soit plus élevé que n'importe quel prix d'ouverture sur l'Eurodollar en 2015....

Et toutes les vérifications concernant l'ordre sélectionné doivent être effectuées après la sélection, avec une clause if() distincte.

C'est vrai, ça ne pouvait pas. C'est pourquoi il a donné des ordres Bid<openPrice sur eu à 1.11262.

En d'autres termes, suggérez-vous de vérifier la présence d'un ordre à l'aide de la fonction if(OrderSelect()), puis de comparer, dans la fonction embedded if, le symbole du graphique avec le symbole de l'ordre, le prix ouvert, etc.

 
.roman.:

C'est vrai, ça ne pouvait pas. C'est pourquoi il a donné un ordre Bid<openPrice sur eu à 1.11262.

En d'autres termes, suggérez-vous de vérifier la présence d'un ordre à l'aide de la fonction if(OrderSelect()), puis de comparer le symbole du graphique avec le symbole de l'ordre, le prix d'ouverture, etc., dans le if intégré ?

Oui, exactement, d'abord OrderSelect(), et ensuite la vérification suivante pour le reste des paramètres.
 

Danser autour du pot ne sert à rien.

Il n'y a aucune différence entre écrire la sélection de l'ordre et la vérification du symbole et du magicien sur une seule ligne ou les diviser en 3 lignes différentes. Selon les modifications apportées aux nouvelles constructions, les conditions de contrôle sont vérifiées par étapes, c'est-à-dire que si la première condition n'est pas remplie, les suivantes ne seront pas vérifiées. C'est la même chose que pour les 3 lignes. La première condition est remplie et la seconde est vérifiée. Et ce n'est que si la deuxième condition est également remplie que nous procédons à la vérification de la troisième.

Le problème est probablement qu'il y a un appel d'une fonction utilisateur dans la partie supprimée du code où une autre commande est sélectionnée.

 

S'il avait été question de travailler avec des commandes, c'est la première chose que j'aurais remarquée. Mais il n'y a que des calculs, pas une seule fonction utilisateur utilisée. On ne sait pas exactement ce qui fait qu'une commande est sélectionnée parmi une autre paire. C'est pourquoi je suis si perplexe quant à l'"environnement logiciel" mentionné dans la documentation et j'ai déjà refait le code comme evillive l'a suggéré et je suis prêt à danser avec des tambourins. La prochaine perversion sera une comparaison forcée avec le bid\ask de la paire requise via marketinfo.


UPD. : Problème résolu. J'ai trouvé une fonction imbriquée qui utilise son propre OrderSelect. Merci pour l'idée, AlexeyVik.

 
Bonjour à tous, Pouvez-vous me dire comment résoudre un problème, je trouve le numéro de barre que je veux dans la boucle, mais j'ai aussi besoin du numéro de barre passé dans la boucle, comment implémenter cela succinctement ? Merci.
for(i=limit; i>=0; i--)
{
yesterday_weekday = TimeDayOfWeek(iTime(Symbol(),0,i-1))-TimeDayOfWeek(iTime(Symbol(),0,i));
if (yesterday_weekday ==1)
yesterday_time=iTime(Symbol(),0,i);
yesterday_shift=iBarShift(Symbol(),0,yesterday_time0);//последний бар 

}
 

J'ai créé un EA (pas pour le travail, juste pour la pratique).

Si je règle les deux paramètres dans la fonction IF, si je les règle un par un, tout fonctionnera bien, voici le code (Aussi, comment m'assurer que si j'ai déjà un ordre d'achat ouvert, le prochain ordre d'achat ne s'ouvrira pas, même si toutes les conditions correspondent) ?

//+------------------------------------------------------------------+
//|                                                        новый.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()

  {
  
double PC = iClose ("EURUSD", PERIOD_H1, 0);  

double MA = NormalizeDouble (iMA ("EURUSD", PERIOD_H1, 12, 0, MODE_LWMA, PRICE_MEDIAN, 0), 4); 


if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point);

   
return (0);





   
  }
//+------------------------------------------------------------------+
 
inuboh:

J'ai créé un EA (pas pour le travail, juste pour la pratique).

Si je les définis un par un, cela fonctionne bien, c'est-à-dire que le code est correct (et je veux savoir comment vérifier si j'ai déjà un ordre d'achat ouvert et que le prochain ordre d'achat ne s'ouvrira pas même si toutes les conditions sont correctes) :

Non pas que ce soit la source de tous les problèmes, mais par pur intérêt académique : pourquoi en même temps OnInit(), OnDeinit() et puis soudainement start() ?

Et pour ce qui est de la question, il est fortement déconseillé de faire une telle comparaison Demande == MA, très rarement se vérifie sur l'histoire. Alors, que signifie une telle expression PC-->MA?

Quant à l'autorisation d'un achat, nous parcourons en boucle toutes les positions du marché et les comparons aux critères spécifiés - symbole, type, numéro magique, et augmentons le compteur d'une unité si la position recherchée est trouvée. Puis, le cas échéant, ce compteur est vérifié.

C'est comme ça :

   _ExpertOrdersB=0;
   _ExpertOrdersS=0;

   for(int z=OrdersTotal()-1; z>=0; z --)
     {
      if(!OrderSelect(z,SELECT_BY_POS))
        {
         Print(". OrderSelect("+IntegerToString(z)+", SELECT_BY_POS ) FAIL!. Error #"+IntegerToString(GetLastError()));
        }
      if((OrderMagicNumber()==magic) && OrderSymbol()==_Symbol)
        {
          switch(OrderType())
           {
            default: break;
            case 0:
               _ExpertOrdersB++;
               break;
            case 1:
               _ExpertOrdersS++;
               break;
           }
        }
     }


if (_ExpertOrdersB < 1) //если нет покупок, то пытаемся купить, при условии, что:
if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point); 
 
evillive:

Non pas que ce soit la source de tous les problèmes, mais par pur intérêt académique : pourquoi simultanément OnInit(), OnDeinit() et puis soudainement start() ?

Et pour ce qui est de la question, il est fortement déconseillé de faire une telle comparaison Demande == MA, très rarement se vérifie sur l'histoire. Alors, que signifie une telle expression PC-->MA?

Quant à l'autorisation d'un achat, nous parcourons en boucle toutes les positions du marché et les comparons aux critères spécifiés - symbole, type, numéro magique, et augmentons le compteur d'une unité si la position recherchée est trouvée. Ensuite, nous examinons le compteur si nécessaire.

J'ai fixé start() par "habitude" )

Pourquoi Ask == MA est-il un événement rare ? Le prix actuel de l'offre touche-t-il rarement la ligne de la moyenne mobile?

Le PC-->MA est dans mon cas si le prix de clôture précédent est supérieur à la ligne de la moyenne mobile (je n'ai pas trouvé d'autre moyen).

Ainsi, lorsque j'active la fonction IF une par une, d'abord Ask == MA et ensuite PC-->MA, cela fonctionne bien, mais lorsque je les combine, cela ne fonctionne pas !

 
evillive:

Non pas que ce soit la source de tous les problèmes, mais par pur intérêt académique : pourquoi simultanément OnInit(), OnDeinit() et puis soudainement start() ?

Et pour ce qui est de la question, il est fortement déconseillé de faire une telle comparaison Demande == MA, très rarement se vérifie sur l'histoire. Alors, que signifie une telle expression PC-->MA?

Quant à l'autorisation d'un Achat, nous parcourons en boucle toutes les positions du marché et les comparons aux critères spécifiés - symbole, type, numéro magique, et augmentons le compteur d'une unité si la position recherchée est trouvée. Puis, le cas échéant, ce compteur est vérifié.

C'est comme ça :

Je crois savoir que PC-- > MA est identique à PC-1 > MA.

Raison: