Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 114

 
Rewerpool:
Guten Tag, wie kann ich einen Trigger erstellen? Ich brauche zum Beispiel diese Bedingung if(iClose(NULL,HTF,4)<BlueLine) wenn sie ausgeführt wird DayDown = 1 ! F: Wie kann DayDown auf 1 belassen werden und erst am nächsten Tag abgefragt werden?
int ДеньОпроса=0;
void OnTick()
{
  if(ДеньОпроса != Day())  // Если новый день - нужно опросить
  {
     if(iClose(NULL,HTF,4)<BlueLine) DayDown = 1;  // Опрос
     ДеньОпроса = Day();   // Запомнить день
  }
 
Ich danke Ihnen! Ich werde versuchen, es anzuschrauben)
 
Hallo, bitte schreiben Sie Code auf die Bedingung, dass, wenn Sie 1 Objekt aus dem Diagramm zu löschen, dann der Rest (eine Auswahl) wird gelöscht werden

Ich habe andere Objekte, die an 1 Objekt angehängt sind, und wenn Sie dieses Objekt löschen, bleibt der Rest einfach im Diagramm hängen
 
STARIJ:

Ich habe es so verstanden:

if(DayNext!= Day()) // Wenn ein neuer Tag, müssen Sie abfragen

{

// Abfragen

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

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

PROBOI1 = 1;Print("Geschlossen über BlueLine = ",iClose(NULL,HTF,1));

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

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

PROBOI1 = -1;Print("Closed below RedLine = ",iClose(NULL,HTF,1));

DayNext = Day(); // Merken Sie sich den Tag

}

Korrigieren Sie, wenn etwas falsch ist! Und wenn ich verfolgen will, was jetzt auf einer niedrigeren TF passiert, muss ich dann Day außerhalb der Umfrage schreiben? Rechts -STARIJ:

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

 
Entschuldigen Sie, dass ich das tue, aber bitte antworten Sie:
https://www.mql5.com/ru/forum/226620#comment_6481536
 
Vladimir Karputov:

Setzen Sie die magische Zahl +1 für die Bedingung 1, die magische Zahl +2 für die Bedingung 2 und so weiter. Auf diese Weise können Sie dann sehen, ob diese Position mit Bedingung 1 oder mit Bedingung 2 eröffnet wurde...

Nachmittags. Ich habe mich nur für eine Position BAY. Das Magie-Set für den Verkauf funktioniert aus irgendeinem Grund nicht. Alles ist absolut identisch, außer dem Magier natürlich. Was habe ich falsch gemacht?

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:

Was habe ich falsch gemacht?

Ich entschuldige mich dafür, dass ich den Anfang der Korrespondenz nicht gefunden habe, aber ich möchte Ihnen sofort raten, komplexe Bedingungen und Berechnungen darin zu vermeiden - das macht den Code unleserlich und erschwert daher die Suche nach logischen Fehlern, ich würde Ihren Code wie folgt schreiben:

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;  

      }

Wenn Sie verstehen, was ich meine, können Sie den Code, den ich Ihnen gegeben habe, noch ein wenig abändern, d. h. in eine separate Bedingung einfügenif(OrderType()==OP_BUY....

Dann wird es viel einfacher sein, logische Fehler zu finden, imho

 
Igor Makanu:

Ich entschuldige mich dafür, dass ich den Anfang der Korrespondenz nicht gefunden habe, aber ich möchte sofort dazu raten, komplexe Bedingungen und Berechnungen darin zu vermeiden - das macht den Code unlesbar und erschwert folglich die Suche nach logischen Fehlern, ich würde Ihren Code so schreiben:

Wenn Sie verstehen, was ich meine, können Sie den Code, den ich Ihnen gegeben habe, noch ein wenig abändern, d. h. in eine separate Bedingung einfügenif(OrderType()==OP_BUY....

Dann wird es viel einfacher sein, logische Fehler zu finden, imho

Verstanden, danke, aber soweit ich verstanden habe, gibt es keinen Unterschied für das Verständnis des Codes durch die Plattform, während es für mich komplizierter zu sein scheint, eine Bedingung in mehrere kürzere aufzuteilen, um nach Fehlern zu suchen, weil die Anzahl der ineinandergreifenden Anweisungen steigt. Aber vielleicht hast du recht und ich werde bald auf deine Seite wechseln. Was die Logik des Codes betrifft, so habe ich keinen Unterschied zwischen meinem und Ihrem Code gefunden und sehe den Fehler immer noch nicht.

 
novichok2018:

Was die Logik des Codes betrifft, so habe ich keinen Unterschied zwischen meinem und Ihrem Code gefunden, und ich sehe den Fehler immer noch nicht.

Genau so - die Logik des Codes ist die gleiche, aber wenn Sie die Bedingungen aufteilen, ist es schneller zu finden, wo der logische Fehler ist, und in Ihrem Fall, wenn Sie ihn herausnehmen:

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

in eine separate Bedingung umwandeln, wird der Code optimiert - die Bedingung wird nur einmal statt viermal wie in Ihrem Beispiel geprüft.

Überprüfen Sie die Ausgabe im Journal des Expert Advisors mit der Funktion

Print()

für die Protokollierung, um zu sehen, welches Codefragment mit welchen Parametern ausgeführt wird

 

Leute,

Wie lese ich den Morning Flat Indikator im Expert Advisor Code?

Ich versuche es auf diese Weise und es funktioniert nicht.

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

Der Indikator selbst

//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+