Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 114

 
Rewerpool:
Boa tarde! Como posso criar um gatilho? Por exemplo, eu preciso desta condição se(iClose(NULL,HTF,4)<BlueLine) se for executado DayDown = 1 ! P: Como o DayDown pode ser deixado como 1 e não ser pesquisado até o dia seguinte ?
int ДеньОпроса=0;
void OnTick()
{
  if(ДеньОпроса != Day())  // Если новый день - нужно опросить
  {
     if(iClose(NULL,HTF,4)<BlueLine) DayDown = 1;  // Опрос
     ДеньОпроса = Day();   // Запомнить день
  }
 
Obrigado! Vou tentar aparafusá-lo)
 
Olá, por favor escreva o código na condição de que se você remover 1 objeto da tabela, o resto (sua escolha) será removido

Eu tenho outros objetos anexados a 1 objeto, e quando você apaga este objeto, o resto fica pendurado na tabela
 
STARIJ:

Tenho-o assim:

if(DayNext!= Day()) // Se um novo dia, você tem que pesquisar

{

// Votação

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

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

PROBOI1 = 1;Print("Closed above 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(); // Lembre-se do dia

}

Corrigir se algo está errado! Além disso, se eu quiser acompanhar o que está acontecendo agora em um TF inferior, preciso escrever Day outside the Survey? Certo -STARIJ:

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

 
Desculpe por fazer isto, mas por favor responda:
https://www.mql5.com/ru/forum/226620#comment_6481536
 
Vladimir Karputov:

Defina o número mágico +1 para a condição 1, número mágico +2 para a condição 2 e assim por diante. Assim você pode ver se esta posição foi aberta com a condição 1 ou com a condição 2...

Boa tarde. Só tive sucesso em uma posição BAY. O conjunto magik para venda não funciona por alguma razão. Tudo é absolutamente idêntico, exceto o próprio magik, é claro. O que eu fiz de errado?

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:

O que eu fiz de errado?

Peço desculpas por não ter encontrado o início da correspondência, mas gostaria de aconselhá-lo imediatamente a evitar condições e cálculos complexos neles - isto torna o código ilegível e, portanto, complica a busca por erros lógicos, eu escreveria seu código desta forma:

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 você entende o que quero dizer, você pode modificar o código que lhe dei um pouco mais, quero dizer colocá-lo em uma condição separadase(OrderType()==OP_BUY....

Então será muito mais fácil encontrar erros lógicos, imho

 
Igor Makanu:

Peço desculpas por não ter encontrado o início da correspondência, mas gostaria de aconselhá-lo imediatamente a evitar condições e cálculos complexos neles - isto torna o código ilegível e como resultado complica a busca por erros lógicos, eu escreveria seu código desta forma:

Se você entender o que quero dizer, pode modificar o código que lhe dei um pouco mais, quero dizer colocá-lo em uma condição separadase(OrderType()==OP_BUY....

Então será muito mais fácil encontrar erros lógicos, imho

Entendi, obrigado, mas até onde entendi não há diferença para a compreensão do código pela plataforma, enquanto para mim, quebrar uma condição em várias outras mais curtas parece ser mais complicado na busca de erros porque o número de ocorrências de declarações dentro de cada uma delas aumenta. Mas talvez você esteja certo e em breve eu irei ao seu lado. Quanto à lógica de código - não encontrei nenhuma diferença entre a minha e a sua e ainda não vejo o erro.

 
novichok2018:

Quanto à lógica do código - não encontrei nenhuma diferença entre a minha e a sua e ainda não vejo o erro.

Exatamente - a lógica do código é a mesma, mas se você dividir as condições, é mais rápido encontrar onde está o erro lógico, e no seu caso, se você o retirar:

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

em uma condição separada, obtemos uma otimização de código - a condição será verificada uma vez ao invés de 4 vezes, como no seu exemplo.

Verifique a saída no diário do Expert Advisor usando o

Print()

para registro para ver qual fragmento de código é executado e com quais parâmetros

 

Gente,

Como faço para ler o indicador Morning Flat no código Expert Advisor?

Estou tentando desta maneira e não funciona.

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

O próprio indicador

//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
Razão: