新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 209

 
Alexey Viktorov:

问题出在这一行

由于我想在一个柱子上检查几种货币,我应该检查时间和货币,以避免在一个柱子和一个符号上重复发出警报,但允许在同一个柱子上以不同的符号发出警报。乍一看,我们还需要一个带有标志的数组,以确定该符号是否被抓取。

一般来说,我们必须在这一行添加一个符号检查,或者只在出现新条形 的时候重复循环。但是我有一个担心,当用这个指标在符号上出现一个新条形时,另一个符号上还没有出现新条形。

结论是:我们必须使我们的头部肌肉紧张,以确定每个符号上是否出现了新的条形符号,但同时又不能把线的数量拉到无限大。我没有现成的解决方案。而且我不喜欢通过写代码来建议...

而我还没有解决他的问题?

也许我漏掉了什么地方--我在膝盖上写了代码。

 
Artyom Trishkin:

而我还没有解决他的问题?

也许我漏掉了什么地方--我在膝盖上写了代码。

Artem,我帖子的最后一句话解释了一切。甚至没有看你的代码。打开第一个未读,问题中引用了我之前的回复,我回答了,然后看到了其他建议。我不怀疑你的代码的正确性,甚至从我的膝盖上...

 
Alexey Viktorov:

Artyom,我帖子的最后一句话解释了一切。甚至没有看你的代码。打开第一个未读,问题中引用了我之前的回答,我回答了,然后看到了其他建议。我不怀疑你的代码的正确性,甚至从我的膝盖上...

本来想说的是懒惰;)

即使是第一眼,你也可以看到该代码取决于当前符号的刻度。因此,我们必须从OnTick()中删除循环,并将其塞入一个定时器。并稍微修改一下时间警报的定义。

 

大家好,有一个误解的过程,在函数 "start "中循环mm++;并通过Print() 跟踪它的变化;所以问:"为什么不是1、2、3、4等弹出四位数?"

代码本身

int start()

  {
   int    counted_bars=IndicatorCounted();
   int limit, i;
                                               int mm=0;     // ======= ПЕРВОЕ========
  

   if(counted_bars<0) return(-1);

   limit=(Bars-counted_bars)-1;

for (i=limit; i>=0;i--)
    { 
       if (TimeDayOfWeek(Time[i]) != 0)
       {if (High[i+1]>LastHigh) LastHigh=High[i+1];if (Low[i+1]<LastLow) LastLow=Low[i+1];}
 

if (TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0)
   {
      
                                                   mm++; // ==========ВТОРОЕ==========
       
   
   
                                                   Print(" TEST= ",mm);// ========ТРЕТЬЕ========
  
   LastLow=Open[i]; LastHigh=Open[i];

  /* ObjectMove("Pivot", 0, Time[i],P);
     ObjectMove("S1", 0, Time[i],S1);
     ObjectMove("R1", 0, Time[i],R1); */
   }
   
   // S1Buffer[i]=S1;
   // R1Buffer[i]=R1;

}

//----
   return(0);
  }
//+------------------------------------------------------------------+
 
виталик:

大家好,有一个误解的过程,在函数 "start "中循环mm++;并通过Print()跟踪它的变化;所以问:"为什么不是1、2、3、4等弹出四位数?"

代码本身


在第一次运行时,10秒IndicatorCounted()=0

 limit=(Bars-counted_bars)-1;

所以限制=历史上的最大条数-1

 
Alekseu Fedotov:


在第一次运行时,10秒内IndicatorCounted()=0

意思是极限=历史上的最大条数-1

仍然不清楚,声明和初始化在循环外的零 int mm=0; 而放在循环中的mm++;print() 显示四位数的数字只在下降的方向上有一个单位的差异,这是由于某种原因。
 
виталик:
仍然不清楚,声明和初始化在循环外的零 int mm=0; 而放在循环中的 mm++; print() 显示四位数的变化,相差一个单位,只是在下降的方向上有一些原因
并非所有的印刷品都印在本日志中。在文件中寻找。
 

Alexey Viktorov:

...你必须使你的头部肌肉紧张...

感谢每个人的回应。

Artyom Trishkin: 像这样。

Artem,你为什么要写你还没有解决这个问题?它为所有的工具发送信号,但它只是大量地加载系统。是否有可能降低负荷?

在一个新条上限制检查是行不通的,因为也会有一些条件必须在每个勾 上检查。

我尝试在你的代码中加入OnTimer(),在EA中OnTick()时它是有效的,但如何在OnCalculate中做到这一点?

int OnInit()
  {
  EventSetMillisecondTimer(1);
//--- indicator buffers mapping
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
  
  void OnDeinit(const int reason)
{// ---
        EventKillTimer();
 // ---
}
void OnTimer()
  {
   RefreshRates();
  // OnTick();
   OnCalculate();
  }

 
Ibragim Dzhanaev:

你能告诉我为什么订单不能打开吗?


好的,它将被打开。
//пересечение вверх
bool PeresVverh()
  {//Объявление пересечения вверх
   //if(Ma(MaPer1,2)>Ma(MaPer2,2))
      if(Ma(MaPer1,1)>=Ma(MaPer2,1))
         if(Ma(MaPer1,0)<Ma(MaPer2,0))
            return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool PeresVniz()
  {//Объявление пересечения вниз
   //if(Ma(MaPer1,2)<Ma(MaPer2,2))
      if(Ma(MaPer1,1)<=Ma(MaPer2,1))
         if(Ma(MaPer1,0)>Ma(MaPer2,0))
            return(true);
   return(false);
  }

 
Sile Si:

感谢每个人的回应。

Artyom,你为什么写说你没有解决这个问题?它在所有的仪器上发出信号,但它对系统的负荷很重。有什么办法可以减轻负担吗?

在一个新的条形图上进行检查的限制是不行的,因为还有一些条件必须在每个刻度 上进行检查。

在你的代码中,我尝试添加OnTimer(),当OnTick()时在EA中起作用,但如何在OnCalculate中做到?


用一个200毫秒的定时器试试。

//+------------------------------------------------------------------+
//|                                                      Test_01.mq4 |
//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window

input string Symbols = "EURUSD, GBPUSD, USDJPY"; // Список символов, разделитель - запятая
//---
struct SSymbolsData
  {
   string   name;       // Имя символа
   datetime time_alert; // Время последнего алерта
  };
SSymbolsData symbols_array[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(200);
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   for(int i=0; i<ArraySize(symbols_array); i++) {
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_BUY) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);;
         if(symbols_array[i].time_alert!=tm) {
            Alert("UP - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_SELL) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);
         if(symbols_array[i].time_alert!=tm) {
            Alert("Down - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Condition(string symbol_name,int shift) {
   MqlRates array[];
   if(CopyRates(symbol_name,PERIOD_CURRENT,shift,2,array)==2){
      if(array[0].open<array[0].close && array[1].open>array[1].close) return(ORDER_TYPE_BUY);
      if(array[0].open>array[0].close && array[1].open<array[1].close) return(ORDER_TYPE_SELL);
      }
   return(WRONG_VALUE);
}
//+------------------------------------------------------------------+
ushort SetSymbols(string symbols_list,SSymbolsData &array[]){
   symbols_list+=","; // Добавим признак конца строки
   short beg=WRONG_VALUE, end=1, len=(short)StringLen(symbols_list);
   string sy="";
   Print(__FUNCTION__," > ",symbols_list); // Посмотрим символы в строке
   while(beg<len) {
      beg++;
      end=(short)StringFind(symbols_list,",",beg);
      if(end==beg || end<0) continue;
      sy=StringSubstr(symbols_list,beg,end-beg);
      if(CheckSymbol(sy,array) || !IsPresentSymbol(sy)) continue;
      ushort sz=(ushort)ArraySize(array);
      ArrayResize(array,sz+1);
      array[sz].name=sy;
      array[sz].time_alert=0;
      //--- Посмотрим корректность найденного символа и записи его в массив
      Print("beg=",IntegerToString(beg,2,'0'),", end=",IntegerToString(end,2,'0'),", sy=|",sy,"|",", in array[",sz,"]=",array[sz].name);
      }
   return((ushort)ArraySize(array));
}
//+------------------------------------------------------------------+
bool CheckSymbol(string symbol_name,SSymbolsData &array[]){
   for(short i=0; i<ArraySize(array); i++) if(array[i].name==symbol_name) return(true);
   return(false);
}
//+------------------------------------------------------------------+
bool IsPresentSymbol(string symbol_name){
   for(ushort i=0; i<SymbolsTotal(false); i++){
      if(SymbolName(i,false)==symbol_name) {
         SymbolSelect(symbol_name,true);
         return(true);
         }
      }
   return(false);
}
//+------------------------------------------------------------------+
原因: