初学者的问题 MQL4 MT4 MetaTrader 4 - 页 114

 
Rewerpool:
下午好!我如何创建一个触发器? 例如,我需要这个条件if(iClose(NULL,HTF,4)<BlueLine)如果它被执行 DayDown = 1 !问:如何将DayDown设为1,并在第二天才轮询?
int ДеньОпроса=0;
void OnTick()
{
  if(ДеньОпроса != Day())  // Если новый день - нужно опросить
  {
     if(iClose(NULL,HTF,4)<BlueLine) DayDown = 1;  // Опрос
     ДеньОпроса = Day();   // Запомнить день
  }
 
谢谢你!我会试着把它拧上)。
 
你好,请写下代码,条件是如果你从图表中删除1个对象,那么其余的(选择)将被删除。

我有其他对象附在1个对象上,当你删除这个对象时,其他对象就会挂在图表上。
 
STARIJ:

我是这样想的。

如果(DayNext!= Day()) // 如果是新的一天,你必须进行投票。

{

// 投票

如果(iClose(NULL,1440,2)<BlueLine)

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

PROBOI1 = 1;Print("Closed above BlueLine = ",iClose(NULL,HTF,1))。

如果(iClose(NULL,1440,2)>RedLine)

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

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

DayNext = Day(); //记住这一天

}

如果有什么不对的地方,请改正!此外,如果我想跟踪现在在较低的TF上发生的事情,我是否需要在调查之外写上Day?右边 -STARIJ

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

 
很抱歉这样做,但请回复。
https://www.mql5.com/ru/forum/226620#comment_6481536
 
Vladimir Karputov:

为条件1设置魔法数字+1,为条件2设置魔法数字+2,以此类推。这样你就可以看到这个仓位是以条件1还是以条件2建立的......

下午。我只成功了一个位置BAY。卖出的魔法套装由于某种原因不能使用。一切都是完全相同的,当然除了魔术师之外。我做错了什么?

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:

我做错了什么?

我很抱歉没有找到通信的开头,但我想立即建议你避免在其中加入复杂的条件和计算--这使得代码无法阅读,从而使搜索逻辑错误变得复杂,我会这样写你的代码。

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;  

      }

如果你明白我的意思,你可以再修改一下我给你的代码,我的意思是把它放在一个单独的条件中,如果(OrderType()==OP_BUY....)

那么,发现逻辑错误就会容易得多,我认为

 
Igor Makanu:

我很抱歉没有找到通信的开头,但我想立即建议避免在其中加入复杂的条件和计算--这使得代码不可读,并因此使搜索逻辑错误变得复杂,我会这样写你的代码。

如果你明白我的意思,你可以再修改一下我给你的代码,我的意思是把它放在一个单独的条件中,如果(OrderType()==OP_BUY....)

那么,发现逻辑错误就会容易得多,我认为

明白了,谢谢,但据我所知,平台对代码的理解没有区别,而对我来说,把一个条件分成几个较短的条件,在搜索错误 时似乎更复杂,因为语句之间的出现次数会增加。但也许你是对的,我很快就会站到你这边来。关于代码逻辑--我没有发现我的和你的有什么不同,仍然没有看到错误。

 
novichok2018:

关于代码逻辑--我发现我的和你的没有区别,我还是没有看到错误。

正是如此--代码的逻辑是一样的,但如果你把条件分割开来,就能更快地找到逻辑错误所在,在你的案例中,如果你把它拿出来。

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

变成一个单独的条件,我们可以得到代码优化--条件将被检查一次,而不是像你的例子中那样检查4次。

检查专家顾问日志中的输出,使用

Print()

用于记录,以查看哪些代码片段被执行,有哪些参数。

 

伙计们。

如何读取专家顾问代码中的晨平指标

我正在尝试这样做,但没有效果。

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

该指标本身

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