Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 114

 
Rewerpool:
Per esempio ho bisogno di questa condizione if(iClose(NULL,HTF,4)<BlueLine) se viene eseguita DayDown = 1 ! D: Come si può lasciare DayDown a 1 e non fare il polling fino al giorno successivo?
int ДеньОпроса=0;
void OnTick()
{
  if(ДеньОпроса != Day())  // Если новый день - нужно опросить
  {
     if(iClose(NULL,HTF,4)<BlueLine) DayDown = 1;  // Опрос
     ДеньОпроса = Day();   // Запомнить день
  }
 
Grazie! Cercherò di avvitarlo)
 
Ciao, per favore scrivi del codice sulla condizione che se rimuovi 1 oggetto dal grafico, allora il resto (una scelta) sarà rimosso

Ho altri oggetti attaccati a 1 oggetto, e quando si elimina questo oggetto, il resto si blocca sul grafico
 
STARIJ:

Ho capito così:

if(DayNext!= Day()) // Se un nuovo giorno, dovete fare il polling

{

// Sondaggio

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

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

PROBOI1 = 1;Print("Chiuso sopra BlueLine = ",iClose(NULL,HTF,1));

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

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

PROBOI1 = -1;Print("Chiuso sotto RedLine = ",iClose(NULL,HTF,1));

DayNext = Day(); // Ricorda il giorno

}

Correggere se qualcosa non va! Inoltre, se voglio tracciare ciò che sta accadendo ora su un TF inferiore, devo scrivere Day al di fuori del Survey? Destra -STARIJ:

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

 
Scusa se lo faccio, ma per favore rispondi:
https://www.mql5.com/ru/forum/226620#comment_6481536
 
Vladimir Karputov:

Imposta il numero magico +1 per la condizione 1, il numero magico +2 per la condizione 2 e così via. In questo modo potete poi vedere se questa posizione è stata aperta con la condizione 1 o con la condizione 2...

Pomeriggio. Ho avuto successo solo per una posizione BAY. Il set di magia per la vendita non funziona per qualche motivo. Tutto è assolutamente identico, tranne il mago, naturalmente. Cosa ho fatto di male?

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:

Cosa ho fatto di male?

Mi scuso per non aver trovato l'inizio della corrispondenza, ma vorrei subito consigliarvi di evitare condizioni e calcoli complessi al loro interno - questo rende il codice illeggibile e quindi complica la ricerca di errori logici, io scriverei il vostro codice così:

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;  

      }

Se capisci quello che voglio dire, puoi modificare il codice che ti ho dato un po' di più, voglio dire di metterlo in una condizione separataif(OrderType()==OP_BUY....

Allora sarà molto più facile trovare errori logici, imho

 
Igor Makanu:

Mi scuso per non aver trovato l'inizio della corrispondenza, ma vorrei consigliare immediatamente di evitare condizioni e calcoli complessi al loro interno - questo rende il codice illeggibile e di conseguenza complica la ricerca di errori logici, io scriverei il tuo codice così:

Se capisci quello che voglio dire, puoi modificare il codice che ti ho dato un po' di più - voglio dire di metterlo in una condizione separataif(OrderType()==OP_BUY....

Allora sarà molto più facile trovare errori logici, imho

Capito, grazie, ma per quanto ho capito non c'è differenza per la comprensione del codice da parte della piattaforma, mentre per me, rompere una condizione in diverse condizioni più brevi sembra essere più complicato nella ricerca di errori perché il numero di occorrenze di dichiarazioni una dentro l'altra aumenta. Ma forse hai ragione e passerò presto dalla tua parte. Per quanto riguarda la logica del codice - non ho trovato alcuna differenza tra il mio e il tuo e ancora non vedo l'errore.

 
novichok2018:

Per quanto riguarda la logica del codice - non ho trovato alcuna differenza tra il mio e il tuo e ancora non vedo l'errore.

Esattamente così - la logica del codice è la stessa, ma se si dividono le condizioni, è più veloce trovare dove è l'errore logico, e nel tuo caso, se lo togli:

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

in una condizione separata, otteniamo un'ottimizzazione del codice - la condizione sarà controllata una volta invece di 4 volte come nel tuo esempio.

Controllate l'output nel diario dell'Expert Advisor usando il comando

Print()

per la registrazione per vedere quale frammento di codice viene eseguito e con quali parametri

 

Ragazzi,

Come si legge l 'indicatore Morning Flat nel codice di Expert Advisor?

Sto provando in questo modo e non funziona.

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

L'indicatore stesso

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