Questions des débutants MQL4 MT4 MetaTrader 4 - page 114

 
Rewerpool:
Bonjour ! Comment puis-je créer un trigger ? Par exemple, j'ai besoin de cette condition if(iClose(NULL,HTF,4)<BlueLine) si elle est exécutée DayDown = 1 ! Q : Comment faire pour que DayDown soit laissé à 1 et ne soit pas interrogé avant le jour suivant ?
int ДеньОпроса=0;
void OnTick()
{
  if(ДеньОпроса != Day())  // Если новый день - нужно опросить
  {
     if(iClose(NULL,HTF,4)<BlueLine) DayDown = 1;  // Опрос
     ДеньОпроса = Day();   // Запомнить день
  }
 
Merci ! Je vais essayer de le visser)
 
Bonjour, veuillez écrire un code à condition que si vous supprimez 1 objet du graphique, alors le reste (un choix) sera supprimé.

J'ai d'autres objets attachés à un objet, et lorsque vous supprimez cet objet, les autres restent accrochés au graphique.
 
STARIJ:

Je vois ça comme ça :

if(DayNext!= Day()) // S'il s'agit d'un nouveau jour, vous devez polluer

{

// Polling

si(iClose(NULL,1440,2)<BlueLine)

si(iOpen(NULL,1440,1)<BlueLine && iClose(NULL,HTF,1)>BlueLine)

PROBOI1 = 1;Print("Fermé au-dessus de BlueLine = ",iClose(NULL,HTF,1)) ;

si(iClose(NULL,1440,2)>RedLine)

si(iOpen(NULL,1440,1)>RedLine && iClose(NULL,HTF,1)<RedLine)

PROBOI1 = -1;Print("Fermé sous RedLine = ",iClose(NULL,HTF,1)) ;

DayNext = Day() ; // Se souvenir du jour

}

Corrigez si quelque chose ne va pas ! En outre, si je veux suivre ce qui se passe actuellement sur une TF inférieure, dois-je écrire Day en dehors de l'enquête ? A droite -STARIJ:

if(iClose(NULL,60,1)>RedLine&&iClose(NULL,1440,2)>RedLine) ) Vendre = 1

 
Désolé de faire ça, mais répondez s'il vous plaît :
https://www.mql5.com/ru/forum/226620#comment_6481536
 
Vladimir Karputov:

Définissez le nombre magique +1 pour la condition 1, le nombre magique +2 pour la condition 2 et ainsi de suite. De cette façon, vous pouvez alors voir si cette position a été ouverte avec la condition 1 ou avec la condition 2...

Après-midi. Je n'ai réussi que pour un seul poste BAY. L'ensemble de magik pour la vente ne fonctionne pas pour une raison quelconque. Tout est absolument identique, à l'exception de la magie elle-même, bien sûr. Qu'est-ce que j'ai fait de mal ?

int total=OrdersTotal();

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

      {

        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

         {

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_BUY && (MathAbs(WPR1)<5))

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

        

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_BUY && OrderMagicNumber==111 && MathAbs(WPR1)<20)

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);

      

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_SELL && OrderMagicNumber==222 && MathAbs(WPR1)>97.55)

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

           

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_SELL && MathAbs(WPR1)>96)

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);               

         }

       continue;  

      }  
 
novichok2018:

Qu'est-ce que j'ai fait de mal ?

Je m'excuse de ne pas avoir trouvé le début de la correspondance, mais je voudrais vous conseiller immédiatement d'éviter les conditions et les calculs complexes dans celles-ci - cela rend le code illisible et complique donc la recherche d'erreurs logiques, j'écrirais votre code comme ceci :

int total=OrdersTotal();

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

      {

        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

         {

            if(TimeCurrent()>OrderOpenTime()+100)&& OrderTicket())

            {   

         if(OrderType()==OP_BUY && (MathAbs(WPR1)<5))

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

         if(OrderType()==OP_BUY && OrderMagicNumber==111 && MathAbs(WPR1)<20)

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);

         if(OrderType()==OP_SELL && OrderMagicNumber==222 && MathAbs(WPR1)>97.55)

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

         if(OrderType()==OP_SELL && MathAbs(WPR1)>96)

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);

            }

         }

       continue;  

      }

Si vous comprenez ce que je veux dire, vous pouvez modifier le code que je vous ai donné un peu plus, je veux dire le mettre dans une condition séparéeif(OrderType()==OP_BUY....

Il sera alors beaucoup plus facile de trouver des erreurs de logique, je pense.

 
Igor Makanu:

Je m'excuse de ne pas avoir trouvé le début de la correspondance, mais je voudrais immédiatement conseiller d'éviter les conditions complexes et les calculs dans celles-ci - cela rend le code illisible et par conséquent complique la recherche d'erreurs logiques, j'écrirais votre code comme ceci :

Si vous comprenez ce que je veux dire, vous pouvez modifier le code que je vous ai donné un peu plus - je veux dire le mettre dans une condition séparéeif(OrderType()==OP_BUY....

Il sera alors beaucoup plus facile de trouver des erreurs de logique, je pense.

J'ai compris, merci, mais d'après ce que j'ai compris, il n'y a pas de différence pour la compréhension du code par la plateforme, alors que pour moi, diviser une condition en plusieurs plus courtes semble être plus compliqué dans la recherche d'erreurs car le nombre d'occurrences d'instructions les unes dans les autres augmente. Mais peut-être que tu as raison et que je vais bientôt me ranger de ton côté. Concernant la logique du code - je n'ai pas trouvé de différence entre le mien et le vôtre et je ne vois toujours pas l'erreur.

 
novichok2018:

Concernant la logique du code - je n'ai trouvé aucune différence entre le mien et le vôtre et je ne vois toujours pas l'erreur.

Exactement - la logique du code est la même, mais si vous divisez les conditions, il est plus rapide de trouver où se trouve l'erreur logique, et dans votre cas, si vous la supprimez :

if(TimeCurrent()>OrderOpenTime()+100)&& OrderTicket())

en une condition séparée, nous obtenons une optimisation du code - la condition sera vérifiée une fois au lieu de 4 fois comme dans votre exemple.

Vérifier la sortie dans le journal du conseiller expert en utilisant la fonction

Print()

pour la journalisation afin de voir quel fragment de code est exécuté et avec quels paramètres

 

Les gars,

Comment lire l'indicateur Morning Flat dans le code de l'Expert Advisor ?

J'essaie de cette façon et ça ne marche pas.

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,1,0);

L'indicateur lui-même

//+------------------------------------------------------------------+
//| MorningFlat.mq4 |
//| Scriptong |
//| |
//+------------------------------------------------------------------+
#property copyright "Scriptong"
#property link ""

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Turquoise
#property indicator_color2 Red
#property indicator_color3 Gold
#property indicator_color4 Silver

extern int StartHour=0;
extern int EndHour=8;
extern double TargetLevel=161.8;
extern color UpColor = Turquoise;
extern color DnColor = Red;
extern color TargetUpColor = Gold;
extern color TargetDnColor = Silver;

//---- buffers
double Up[];
double Down[];
double TargetUp[];
double TargetDn[];
bool Activate=False;
datetime LastDay;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   if(Period()>PERIOD_H1)
     {
      Comment("Индикатор работает на таймфреймах меньше H4!");
      return(0);
     }
   if(StartHour<0 || EndHour<0 || StartHour>23 || EndHour>23 || StartHour>=EndHour)
     {
      Comment("Значения StartHour и EndHour должны лежать в диапазоне от 0 до 24 и StartHour < EndHour.");
      return(0);
     }

   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Up);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Down);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,TargetUp);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,TargetDn);
   SetIndexEmptyValue(0, 0.0);
   SetIndexEmptyValue(1, 0.0);
   SetIndexEmptyValue(2, 0.0);
   SetIndexEmptyValue(3, 0.0);

   Activate=True;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
  {
//----
// Удаление объектов-ценовых меток
   for(int i=ObjectsTotal()-1; i>=0; i--)
     {
      string Name=ObjectName(i);
      if(StringSubstr(Name,0,3)=="Lab")
         ObjectDelete(Name);
     }
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Ценовая метка со значением уровня |
//+------------------------------------------------------------------+
void DrawLabel(datetime TimeL,double Price,bool Upper,color Col,int Code)
  {
   if(Upper)
      string Name="Lab"+DoubleToStr(TimeL,0)+"U";
   else
      Name="Lab"+DoubleToStr(TimeL,0)+"D";

   if(ObjectCreate(Name,OBJ_ARROW,0,TimeL,Price))
     {
      ObjectSet(Name,OBJPROP_ARROWCODE,Code);
      ObjectSet(Name,OBJPROP_COLOR,Col);
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(!Activate) return(0);

   LastDay=0;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   for(int i=limit; i>=0; i--)
      if(TimeHour(Time[i])>=EndHour)
        {
         datetime BeginDay=iTime(Symbol(),PERIOD_D1,iBarShift(Symbol(),PERIOD_D1,Time[i])); // Расчет времени начала суток
         datetime NextDay=BeginDay+86400; // Расчет времени начала следующих суток
         if(LastDay>= BeginDay) continue; // Если в этот день уже рисовали уровни, то продолжаем основной цикл
         int StartBar=iBarShift(Symbol(),0,BeginDay+StartHour*3600); // Бар, соответсвующий началу суток плюс смещение в часах
         int FinishBar=iBarShift(Symbol(),0,BeginDay+(EndHour-1)*3600); // Бар, соответствующий последнему бару "утреннего флэта"
         double LowV=Low[iLowest(Symbol(),0,MODE_LOW,StartBar-FinishBar+1,FinishBar)]; // Нижняя граница
         double HighV=High[iHighest(Symbol(),0,MODE_HIGH,StartBar-FinishBar+1,FinishBar)]; // Верхняя граница
         double TargetU = (HighV-LowV)*(TargetLevel-100)/100+HighV;
         double TargetD = LowV-(HighV-LowV)*(TargetLevel-100)/100;
         // Канал "утреннего флэта"
         for(int j=StartBar; j>=FinishBar; j--)
           {
            Up[j]=HighV;
            Down[j]=LowV;
            //Есть такой индикатор
            // -----------------------
            // Ожидаемые цели при пробое флэта 
            for(j=FinishBar; Time[j]<NextDay && j>=0; j--)
              {
               TargetUp[j] = TargetU;
               TargetDn[j] = TargetD;
              }
            // ------------------- 

            DrawLabel(Time[iBarShift(Symbol(), 0, BeginDay)], HighV, True, UpColor, 5); // Рисуем верхнюю ценовую метку канала
            DrawLabel(Time[iBarShift(Symbol(), 0, BeginDay)], LowV, False, DnColor, 5); // Рисуем нижнюю ценовую метку канала
            DrawLabel(Time[FinishBar],TargetU,True,TargetUpColor,5); // Рисуем верхнюю ценовую метку цели
            DrawLabel(Time[FinishBar],TargetD,False,TargetDnColor,5); // Рисуем нижнюю ценовую метку цели
            LastDay=BeginDay; // Отмечаем, что в этот день уровни уже были нарисованы
           }
        }
   WindowRedraw();
//----
   return(0);
  }
//+------------------------------------------------------------------+
Raison: