Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 482

 

@STARIJ Merci, j'ai pris mon temps pour écrireObjectSet ! Il a été écrit depuis longtemps, non commenté, et le code n'interfère pas ! Vous avez écritStringSubstr(str,20,7) , je ne pensais pas que c'était tout à fait littéral ! Après le dîner, j'ai réalisé que tout était question d'espaces ! J'aurais dû compter chaque caractère et chaque espace ! Merci ami !!!!


 

Bonjour, chers amis. Une autre question d'un novice en matière de μl4. J'utilise la fonction Fun_New_Bar() recommandée dans le tutoriel pour définir une nouvelle barre :


void Fun_New_Bar()                              // Ф-ия обнаружения нового бара   
  {                                             
   static datetime New_Time=0;                  // Время текущего бара  
   New_Bar=false;                               // Нового бара нет  
   if(New_Time!=Time[0])                        // Сравниваем время  
     {  
      New_Time=Time[0];                         // Теперь время такое  
      New_Bar=true;                             // Поймался новый бар  
     }  
  }
Cependant, pour une raison quelconque, cela ne fonctionne pas toujours. J'ai fait un contrôle d'impression :
if(Hour()>=8 && Hour()<20) 
      {
      Fun_New_Bar();
      if(New_Bar==false) Print("Нового бара нет");
      if(New_Bar==true )      
       {     
       RefreshRates();
        ........... Fun_Open_Sell();          
        ........... Fun_Open_Buy();
       } 
      }

Ainsi, il ouvre une position sur une nouvelle barre, puis imprime "Pas de nouvelle barre" et ouvre une position sur la barre actuelle. Je ne comprends pas pourquoi. Merci.

 
novichok2018:

Bonjour, chers amis. Une autre question d'un novice en matière de μl4. J'utilise la fonction Fun_New_Bar() recommandée dans le tutoriel pour définir une nouvelle barre :

Cependant, cela ne fonctionne pas toujours. J'ai fait un contrôle d'impression :

Ainsi, il ouvre une position sur une nouvelle barre, puis imprime "Pas de nouvelle barre" et ouvre une position sur la barre actuelle. Je ne comprends pas pourquoi. Merci.

Comment distinguer la nouvelle barre de la barre actuelle ? À quelle fréquence cette partie du code est-elle exécutée - chaque tick ou seulement lorsqu'une nouvelle barre est formée ?

 
STARIJ:

comment distinguer la nouvelle barre de la barre actuelle ? À quelle fréquence cette partie du code est-elle exécutée - chaque tick ou seulement lorsqu'une nouvelle barre est formée ?

Nouveau bar - par fonction. La barre actuelle - dans laquelle une position a été fermée, mais le temps de la barre n'a pas expiré. Le code doit être exécuté au moment de la formation d'unenouvelle barre. Ou plutôt, pas. La partie du code où sont définies les conditions de fermeture de la position est exécutée chaque tick, tandis que celles de l'ouverture de la position sont exécutées dans une nouvelle barre.

 
novichok2018:

Nouveau bar - par fonction. Courant - lorsque la position a été fermée mais que le temps de barre n'a pas expiré. Le code doit être exécuté au moment où lanouvelle barre se forme.Ou plutôt, il ne l'est pas. La partie du code où sont définies les conditions de fermeture de la position est exécutée chaque tick, tandis que la condition d'ouverture de la position est exécutée dans une nouvelle barre.

Donc, tout est clair ici. Mais lorsque vous écrivez et que vous voyez que vous devriez écrire plus précisément, déplacez le curseur en arrière et corrigez. Sinon, il est difficile de le lire dans un sens ou dans l'autre.

Le code est exécuté à chaque tic-tac. C'est-à-dire la question "Y a-t-il un nouveau bar? Y a-t-il un nouveau bar? Y a-t-il une nouvelle barre? et à chaque fois, un message s'imprime indiquant qu'il n'y a pas de nouvelle barre. Et puis il y a un nouveau bar. La commande s'ouvre ? Tout d'abord, une commande est envoyée au serveur. Et puis les tics arrivent et il y a une nouvelle barre? Il y a une nouvelle barre et à chaque fois qu'il n'y a pas de nouvelle barre, le serveur ouvre finalement une commande et vous regardez l'heure et vous vous demandez quelle heure il est. Vous pouvez utiliser Print(TimeCurrent()) avant l'ouverture d'un ordre, 4 lignes en dessous du premier. Ou mieux encore, utilisez la fonction Alerte - directement sur l'écran. Vous pouvez voir d'un coup d'œil.

Une dernière chose : au lieu de if(New_Bar==false) if(New_Bar==true), vous pouvez utiliser if(!New_Bar) if(New_Bar) sinon vous obtenez de l'huile de beurre

 
STARIJ:

En bref, tout est clair ici. Mais lorsque vous écrivez et que vous voyez que vous devez écrire plus précisément, ramenez le curseur et corrigez-le. C'est difficile de le lire de cette façon et de cette autre.

Le code est exécuté à chaque tic-tac. C'est-à-dire la question "Y a-t-il un nouveau bar? Y a-t-il un nouveau bar? Y a-t-il une nouvelle barre? et à chaque fois, un message s'imprime indiquant qu'il n'y a pas de nouvelle barre. Et puis il y a un nouveau bar. La commande s'ouvre ? Tout d'abord, une commande est envoyée au serveur. Et puis les tics arrivent et il y a une nouvelle barre? Il y a une nouvelle barre et à chaque fois qu'il n'y a pas de nouvelle barre, le serveur ouvre finalement une commande et vous regardez l'heure et vous vous demandez quelle heure il est. Vous pouvez utiliser Print(TimeCurrent()) avant l'ouverture d'un ordre, 4 lignes en dessous du premier. Ou mieux encore, utilisez la fonction Alerte - directement sur l'écran. Vous pouvez voir d'un coup d'œil.

Et une dernière chose : au lieu de if(New_Bar==false) if(New_Bar==true) vous pouvez utiliser if(!New_Bar) if(New_Bar) sinon vous obtiendrez de l'huile

Ok, tout est clair avec le message sur l'absence d'une nouvelle barre. L'heure d'ouverture de la commande affichée dans le journal par la plateforme est tout à fait suffisante pour moi, même sans impression supplémentaire. Cependant, je ne comprends toujours pas pourquoi un ordre est ouvert sur une nouvelle barre une fois et sur la barre actuelle la deuxième fois, alors que selon le code, une nouvelle barre devrait apparaître avant de rechercher les conditions pour ouvrir la position.

 
novichok2018:

OK, tout est clair avec le message sur l'absence d'un nouveau bar. L'heure d'ouverture de la commande imprimée dans le journal par la plateforme est suffisante pour moi, même sans l'impression supplémentaire. Cependant, je ne comprends toujours pas pourquoi l'ordre s'ouvre sur une nouvelle barre une fois et sur la barre actuelle la deuxième fois, alors que selon le code, une nouvelle barre devrait apparaître avant de rechercher les conditions pour ouvrir la position.

Tout d'abord, une commande est envoyée au serveur. Pendant ce temps, les tics arrivent et il y a une nouvelle barre? Il y a une nouvelle barre et chaque fois qu'il n'y a pas de nouvelle barre, le serveur ouvre finalement une commande et vous regardez l'heure et vous vous demandez. Vous pouvez utiliser Print(TimeCurrent( )) avant l'ouverture d'un ordre, 4 lignes en dessous du premier. Ou mieux encore, utilisez Alert - directement à l'écran. Vous pouvez voir d'un coup d'oeil... la commande pour ouvrir l'ordre a été envoyée plus tôt, sur la nouvelle barre

 

Pouvez-vous me dire comment faire pour qu'il soit possible d'avoir une couleur d'ombrage entre les 2 lignes de l'indicateur?

Comme dans ishimoku

 
Roman Sharanov:

Pouvez-vous me dire comment faire pour qu'il soit possible d'avoir une couleur d'ombrage entre les 2 lignes de l'indicateur, comme dans l'ishimoku ?

Regardez comment c'est faitlà-bas... Et le terminal a probablement...

 

Bonjour, j'ai commencé à étudier MQL4 en utilisant les tutoriels vidéo de 2013, j'ai réécrit le code exactement à partir de la vidéo, en ajoutant quelques modifications mineures d'une autre, selon mes besoins... Résultat, j'ai 25 erreurs. J'ai essayé de trouver une solution à ces erreurs, mais depuis que la version du terminal a été modifiée et que des changements ont été apportés au codage. Je serai reconnaissant si quelqu'un peut m'aider à modifier le code ou au moins me donner quelques conseils utiles, merci d'avance.

//+------------------------------------------------------------------+
//|                                                           ea.mq4 |
//|                                                             mql4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Intruder"
#property link      ""
#property version   "1.00"
#property strict

extern double Lots         = 0.1;
extern int    TakeProfit   = 50;
extern int    Step         = 50;
extern double Multiplier   = 2;
extern int    Slippage     = 5;
extern int    Magic        = 123;

extern int    MA_1_Period  = 21;
extern int    MA_1_Shift   = 0;

extern int    MA_2_Period  = 3;
extern int    MA_2_Shift   = 0;


int ticket;
double price, TP, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Init()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit *= 10;
       Step       *= 10;
       Slippage   *= 10;  
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
{
   if (CountTrades() == 0)
   {
      double ima_1 = iMA(Symbol(), PERIOD_CURRENT, MA_1_Period, MA_1_Shift, MODE_SMA, PRICE_CLOSE, 1);
      double ima_2 = iMA(Symbol(), PERIOD_CURRENT, MA_2_Period, MA_2_Shift, MODE_SMA, PRICE_CLOSE, 1);
      
      if (ima_1 > ima_2)
      {
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      else if(ima_1 < ima_2)
      {
         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      
   }
   else
   {
      int order_type = FindLastType();
      if (order_type == OP_BUY)
      {
         price = FindLastOrderPrice(OP_BUY);
         if(Ask <= price - Step * Point)
         {
            Lastlot = FindLastLots (OP_BUY);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
            if (ticket > 0)
               ModifiOrders(OP_BUY);
         }
      }
      else if (order_type == OP_SELL)
      {
          price = FindLastOrderPrice(OP_SELL);
         if(Bid <= price + Step * Point)
         {
            Lastlot = FindLastLots (OP_SELL);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Bid, Slippage, 0, 0, "", Magic, 0, Red);
            if (ticket > 0)
               ModifiOrders(OP_SELL);
         }        
      }
   }
   
   return(0);
}
//+------------------------------------------------------------------+
void ModifiOrders(int otype)
{
   double avgprice = 0,
          order_lots= 0;
   
   price = 0;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelecti(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots();
         }
      }
   }
   avgprice = NormalizeDouble(price / order_lots, Digits);
   
   if (otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit*Point, Digits);
   if (otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit*Point, Digits);
   
   for (i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
            OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0)    
      } 
   }
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
   double oldlots;
   int oldticket;
   
   ticket = 0;
   for(int i = OrdersTotal ()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() ++ otype)
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldlots = OrderLots();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
   double oldopenprice;
   int    oldticket;
   
   ticket = 0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldopenprice = OrderOpenPrice();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
   for (int i= OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber () == Magic)
              return(OrderType());
      }
   }
   return(-1);   
}
//+------------------------------------------------------------------+
int CountTrades()
{
   int count = 0;
   for (int i=OrdersTotal()-1 i>=0; i--)
   {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               count++;
        }
   }
   
   return(count);

//-------------------------------------------------------------------+

Erreurs

Raison: