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

 

Je ne comprends pas quel est le problème ?

int start() 

{

bool i;

int ticket;

double Pricem;

datetime Timen; 

string Symb=Symbol();

ticket=OrderSend(Symb,OP_SELL,0.1,Bid,3,Ask+4*Point,Ask-12*Point);

i=OrderSelect(0,SELECT_BY_POS);

while(true)

{

RefreshRates();

Timen=OrderCloseTime();

  if(Timen>0)

   {

     Pricem=OrderClosePrice();

     Alert(Pricem);

     Alert("ордер закрылся");

     Sleep(30000);

 }

 Sleep(10);

 }

return;                              

}


Un message de fermeture devrait apparaître. L'ordre s'ouvre, atteint l'arrêt, se ferme et c'est tout ! Où se trouve l'erreur ?
 

Je suis en train de résoudre la tâche de fermer tous les graphiques ouverts en utilisant les outils MQL4. Il y a 3 graphiques ouverts avec différentes paires de devises et voici le code du script :

   for (int i=1;i<=3;i++) {
      long current=ChartID();
      Print("итерация цикла: ",i,", идентификатор текущего графика ",current);
      bool result=ChartClose(current);
      if(result)Print("окно успешно закрыто");
      else Print("не удалось закрыть окно с идентификатором: ", current);
   }

Lorsque j'exécute le script, seul un des trois graphiques est fermé et voici les impressions du journal :

AUDUSD,H1: итерация цикла: 1, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 2, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 3, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто

Cela signifie qu'après la fermeture d'un graphique, le graphique actuel devrait être l'autre, mais.. :

1. Après la fermeture du premier graphique, la fonctionChartIDrenvoie l'identifiant du graphique fermé au lieu de l'identifiant actuel.

2. Lafonction ChartClose() en 2 et 3 itérations retourne vrai, ce qui signifie qu'elle ferme avec succès la fenêtre déjà fermée...

Qui sait où se trouve le bug et comment résoudre ce problème ?

 
CJIeCaPb:

Je ne comprends pas quel est le problème ?

Un message de fermeture devrait apparaître. L'ordre s'ouvre, atteint l'arrêt, se ferme et c'est tout ! Où se trouve l'erreur ?

Je pense que OrderSelect() doit être à l'intérieur de la boucle while, et de plus, le numéro de position sera incorrect, car après sa fermeture il deviendra différent - dans ce cas il vaut mieux sélectionner par ticket
 
tuner:
Je pense que OrderSelect() devrait être à l'intérieur d'une boucle while, et de plus, le numéro de position sera incorrect, parce qu'après la fermeture, il deviendra différent - dans ce cas, il est préférable de sélectionner à partir du ticket.
Hourra, ça a marché ! Merci !
 
tuner:

Je suis en train de résoudre la tâche de fermer tous les graphiques ouverts en utilisant les outils MQL4. Il y a 3 graphiques ouverts avec différentes paires de devises et voici le code du script :

Lorsque j'exécute le script, seul un des trois graphiques est fermé et voici les impressions du journal :

Cela signifie qu'après la fermeture d'un graphique, le graphique actuel devrait être l'autre, mais.. :

1. Après la fermeture du premier graphique, la fonctionChartIDrenvoie l'identifiant du graphique fermé au lieu de l'identifiant actuel.

2. Lafonction ChartClose() en 2 et 3 itérations retourne vrai, ce qui signifie qu'elle ferme avec succès la fenêtre déjà fermée...

Qui sait où se trouve le bug et comment résoudre ce problème ?

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  
      prevChart=currChart;
      ChartClose(currChart);
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

pako, parfois ça marche, parfois non, je ne sais pas pourquoi... Je reçois une erreur :

2014.12.11 17:52:12.456 Violation d'accès en lecture à 0x09295000 dans 'C:\.....................ex4'.

Serait-ce parce qu'il essaie de fermer le graphique sur lequel le script est lancé ?

PS fonctionne correctement si le script est attaché au premier graphique en partant de la gauche. Mais si je le place sur un autre graphique, j'obtiens une erreur

 
tuner:

pako, parfois ça marche, parfois non, je ne sais pas pourquoi... Je reçois une erreur :

2014.12.11 17:52:12.456 Violation d'accès en lecture à 0x09295000 dans 'C:\.....................ex4'.

Serait-ce parce qu'il essaie de fermer le graphique sur lequel le script est lancé ?

PS fonctionne correctement si le script est attaché au premier graphique en partant de la gauche. Mais si je le place sur un autre graphique, j'obtiens une erreur

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break; 
      ChartClose(currChart); 
      prevChart=currChart;
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

Les gars, aidez-moi.

Le problème est la fonction suivante pour convertir l'ordre en non perte, elle commence à fonctionner incorrectement si je la règle sur les paires de Yen et autorise tous les ordres ouverts en non perte

je les laisse tous ok, mais sur cinq chiffres il revient à zéro même si je le règle sur cinq chiffres seulement mais la meilleure chose est que si je le règle sur cinq il fonctionne ok

Quelle est la raison d'être d'un tel travail ? Qu'est-ce qui doit être pris en compte dans ces fonctions, afin que l'exécution correcte soit réalisée et ne dépende pas de l'opération EA dans quelle fenêtre je l'ai jetée à trois ou cinq chiffres ?

Merci beaucoup.

    }

 //==================================================================================================

 // функция перевода ордеров стоп лоса в без убыток по всем открытым ордерам

 //==================================================================================================

 if(_Simbol==false)//если false то по всем ордерам открытым 

 { 

   for(int i=0;i<OrdersTotal();i++)//цикл перебора ордеров

     {

       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//будем искать следующие

         {

           if(OrderType()==OP_BUY) //если тип бай

            {

             double  bid=MarketInfo(OrderSymbol(),MODE_BID);//последний известный бид инструмента

             double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

             

               if(OrderStopLoss()<OrderOpenPrice())//если стоп лос меньше цены открытия

                {

                  if(bid-Dist_Perivoda*point>OrderOpenPrice())//бид-профит*пункт больше цены открытия

                   {//модифицируем стоп лос

 bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

              if(!ord_modifik)//если не получилось

              Comment(GetLastError());//номер ошибки в угол

                   }

                   

                }

            }

            if(OrderType()==OP_SELL)//если тип селл

            {

              double ask=MarketInfo(OrderSymbol(),MODE_ASK);//последний известный аск инструмента

              double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

              

              if(OrderStopLoss()==0||OrderStopLoss()>OrderOpenPrice())//если стоп лос больше цены открытия или равен нолю

              {

                if(ask+Dist_Perivoda*point<OrderOpenPrice())//аск +профит*пункт меньше цены открытия

                  {//модифицируем стоп лос

  bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

                  if(!ord_modifik)//если не получилось

                  Comment(GetLastError());//номер ошибки в  угол

                  }

                }

             } 

          }

       }

    }

  

 
pako:

Merci pour le code, je comprends l'essentiel, bien que j'obtienne encore une erreur parfois.

Expérimenté avec les fonctions qui montrent les ID des graphiques. Ce que signifie ChartFirst() dans la documentation n'est absolument pas clair, on peut l'interpréter de n'importe quelle façon - cela peut signifier le premier graphique ouvert dans l'ordre à partir de la gauche, ou le premier graphique ouvert parmi tous ceux qui sont ouverts (dans le temps), ou le premier jamais ouvert dans le terminal (la possibilité qu'il soit ouvert maintenant est presque nulle, donc cela n'a aucun sens de le fermer). Je suis plus enclin à la dernière version, car je n'ai jamais vu cette fonction retourner l'ID du graphique, qui est ouvert en ce moment.

 
tuner:

Merci pour le code, je comprends l'essentiel, bien que j'obtienne encore une erreur parfois.

Expérimenté avec les fonctions qui montrent les ID des graphiques. Ce que signifie ChartFirst() dans la documentation n'est absolument pas clair, on peut l'interpréter de n'importe quelle façon - cela peut signifier le premier graphique ouvert dans l'ordre à partir de la gauche, ou le premier graphique ouvert parmi tous ceux qui sont ouverts (dans le temps), ou le premier jamais ouvert dans le terminal (la possibilité qu'il soit ouvert maintenant est presque nulle, donc cela n'a aucun sens de le fermer). Je suis plus enclin à la dernière version, car je n'ai jamais vu cette fonction renvoyer l'ID du graphique qui est ouvert en ce moment.

ChartFirst

Retourne l'ID du premier graphique du terminal client.

Je comprends que c'est le tableau le plus à gauche

Raison: