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

 
Vladimir Karputov:

有:

谢谢。我将在电脑前,也许我会看一看。
 
Artyom Trishkin:
谢谢你。我将在电脑前,也许我会看一看。

该指标是以MQL4的一个非常老的格式编写的,我已经很久没有碰过它了,我不确定我是否记得它是怎么写的。

@zig2003 作为一种选择,尝试从start()中删除IndicatorBuffers(6)。

并在顶部固定#属性 indicator_buffers 6

 
伊戈尔-马卡努,在我修复指标后,我需要与EA中的什么进行比较,以编制反转程序?
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
zig2003:
伊戈尔-马卡努,在我纠正了指标之后,我应该在我的专家顾问中与什么相比较,以规划中枢?

每个指标由几个指标缓冲区组成

当你通过iCustom()从专家顾问中调用该指标时,你会得到某个条形图上的一个缓冲区的值,你可以在数据窗口Ctrl+D中查看这个值。

比较什么取决于你的TS,要么是指标缓冲区的值,要么是缓冲区和价格--有很多变种。

你应该首先创建一个MA指标,然后,当你理解它时,你将调用你自己的指标而不是MA

这并不容易--只要写几个命令,你的专家顾问就可以了


ZS。指标中枢是指标缓冲区的几个值的比较,从你的截图来看,第2条必须设置在第1条缓冲区的价格附近,其余的缓冲区将有EMPTY_VALUE值,而在条形图№1上,相反,缓冲区№1的值是EMPTY_VALUE,2或3个缓冲区中的一个会有与EMPTY_VALUE不同的值--你应该在数据概览窗口中查看这些值(在条形图上移动鼠标箭头,你会看到缓冲区的值)。

 

伊戈尔,谢谢你,我纠正了指标,但缓冲区的值仍然没有出现。我早就过了那个阶段,那里一切都很简单,有两条线--两个缓冲区。 通常对于类似的指标,由一行组成,但有不同的颜色缓冲区,我这样写代码。

//Функция для определения входа и выхода по AMA 
 int Enter()
  {
   double AMAbuy_1  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,1);             //Подключаем AMA для первого бара (buy)
   double AMAsell_1 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,1);             //                                (sell)
   double AMAbuy_2  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,2);             //Подключаем AMA для второго бара (buy)       
   double AMAsell_2 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,2);             //                                (sell)                    
                         
   if(AMAbuy_1>0 && AMAsell_2>0)                                                                                 //Вход в бай
      return(1);                                                                                           
   if(AMAsell_1>0 && AMAbuy_2>0)                                                                                 //Вход в селл
      return(-1);                                                                                          
        
   return(0);
  } 

但这只是在为每种颜色分配一个真正的缓冲区的情况下。当你在第一个闭合的条形图上改变颜色时,缓冲区的值会变得大于零,而在前一个条形图上,它要么等于零,要么另一种颜色的缓冲区大于零。我无法从这个指标中得到第二个卖出颜色的值,我不知道该用什么来比较它以捕捉反转。我已经试过所有的缓冲区号码。这很不幸,因为这个Mladenov的转盘虽然老旧,但在手动策略中非常体面的走势....,谁能猜到如何从第二个缓冲区拉出数值并写出反转的公式?

 
zig2003:

伊戈尔,谢谢你,我纠正了指标,但缓冲区的值仍然没有出现。我早就过了那个阶段,那里一切都很简单,有两条线--两个缓冲区。通常对于类似的指标,由一行组成,但有不同颜色的缓冲区,我是这样写代码的。

但这只是在为每种颜色分配一个真正的缓冲区的情况下。当你在第一个闭合的条形图上改变颜色时,缓冲区的值会变得大于零,而在前一个条形图上,它要么等于零,要么另一种颜色的缓冲区大于零。我无法从这个指标中获得第二种颜色的数值,我也不明白该用什么来比较以捕捉反转。而这是很不幸的,因为这个Mladenov的指标虽然老旧,但在手动策略中的趋势非常好....,谁能想出如何写出反转公式?

没有任何指标的编辑。

两个缓冲区中的数据是什么意思--在0和1。

  • 如果在缓冲区0中有一个值,而在缓冲区1中没有值,这就是做多的方向(蓝色指标线(如果默认))。
  • 如果在缓冲区0中有一个值,而在缓冲区1中有一个值,那么这就是一个短方向(指示线的红色(如果默认))。

改变线条的方向(颜色)。

  • 缓冲区中总是有一个值0,而且,人们总是可以定义它(比较三个柱子上的值:2<=1 &&1>0 -->向下,2>=1 &&1<0 -->向上)。
    ...
    但你也可以只使用缓冲区1。
  • 如果在第0小节的缓冲区1中没有值,而在第1小节有一个值,这就是线的方向改变为多头。
  • 如果在缓冲区1中的第0条上有一个值,而在第1条上没有值,这就是行进方向改变为空头。

这里的 "无值 "就是EMPTY_VALUE。或者DBL_MAX - 无所谓,都是一样的。也就是说,它不是零,而是EMPTY_VALUE

 
zig2003:

有谁能猜到如何从第二个缓冲区提取数值并写出透视公式?

你不必猜测,你应该首先以对应于MQL4当前状态的正常形式重写该指标

我把代码整理了一下,但我不确定不会有错误。 我不喜欢源代码,但我已经用我得到的东西工作了。

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrTomato
#property indicator_color3 clrTomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
input int    Range           = 9;
input int    FastMA          = 3;
input int    SlowMA          = 30;
input int    filter          = 25;
input int    normalizeDigits = 4;

input bool   alertsOn        = false;
input bool   alertsOnCurrent = false;
input bool   alertsMessage   = true;
input bool   alertsSound     = true;
input bool   alertsEmail     = false;
input string soundfile       = "alert2.wav";


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0, fAMA);
   SetIndexLabel(0, "fAMA");
   SetIndexBuffer(1, Downa);
   SetIndexLabel(1, "Downa");
   SetIndexBuffer(2, Downb);
   SetIndexLabel(2, "Downb");
   SetIndexBuffer(3, trend);
   SetIndexLabel(3, "trend");
   SetIndexBuffer(4, mAMA);
   SetIndexLabel(4, "mAMA");
   SetIndexBuffer(5, AMA);
   SetIndexLabel(5, "AMA");
   for (int i=0; i<indicator_buffers; i++) {
      SetIndexStyle(i, DRAW_LINE);
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],        // Low
                 const double &close[],      // Close
                 const long &tick_volume[],  // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
                )
{
   int limit;
   if(prev_calculated==0) limit=rates_total-1;
   else limit=rates_total-prev_calculated+1;
   if (trend[limit] == -1) ClearPoint(limit, Downa, Downb);
   double k1 = 2.0 / (SlowMA + 1);
   double k2 = 2.0 / (FastMA + 1) - k1;
   for(int i = limit; i>= 0; i--) {
      double sdAMA = 0;
      double Noise = 0;
      for(int k=0; k<Range; k++) Noise += MathAbs(Close[i+k] - Close[i+k+1]);
      double ER    = 0;
      if(Noise != 0) ER = MathAbs(Close[i] - Close[i+Range]) / Noise;
      double SSC   = (ER*k2+k1);



      AMA[i]  = AMA[i+1] + NormalizeDouble(SSC*SSC*(Close[i] - AMA[i+1]), normalizeDigits);
      mAMA[i] = AMA[i];

      if(filter < 1) fAMA[i] = mAMA[i];
      else {
         for(k = i; k <= i + SlowMA - 1; k++)  sdAMA = sdAMA + MathAbs(mAMA[k] - mAMA[k+1]);
         double dAMA  = mAMA[i] - mAMA[i+1];
         if(dAMA >= 0)
            if(dAMA < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) &&  High[i] <= High[Highest(NULL, 0, MODE_HIGH, 4, i)]+10*Point)
               fAMA[i] = fAMA[i+1];
            else   fAMA[i] = mAMA[i];
         else if(MathAbs(dAMA) < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) && Low[i] > Low[Lowest(NULL, 0, MODE_LOW, 4, i)]-10*Point)
            fAMA[i] = fAMA[i+1];
         else  fAMA[i] = mAMA[i];
      }

      Downa[i] = EMPTY_VALUE;
      Downb[i] = EMPTY_VALUE;
      trend[i] = trend[i+1];
      if (fAMA[i]> fAMA[i+1]) trend[i] =1;
      if (fAMA[i]< fAMA[i+1]) trend[i] =-1;
      if (trend[i]==-1) PlotPoint(i, Downa, Downb, fAMA);
   }

//


   if (alertsOn) {
      if (alertsOnCurrent)
         int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
         if (trend[whichBar] == 1)
            doAlert("buy");
         else  doAlert("sell");
   }
   return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;

   if (previousAlert != doWhat || previousTime != Time[0]) {
      previousAlert  = doWhat;
      previousTime   = Time[0];

      //
      //


      message =  StringConcatenate(Symbol(), " at ", TimeToStr(TimeLocal(), TIME_SECONDS), " AMA STL_Color ", doWhat);
      if (alertsMessage) Alert(message);
      if (alertsEmail)   SendMail(StringConcatenate(Symbol(), " AMA STL_Color "), message);
      if (alertsSound)   PlaySound(soundfile);
   }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClearPoint(int i, double& first[], double& second[])
{
   if ((second[i]  != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE))
      second[i+1] = EMPTY_VALUE;
   else if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE))
      first[i+1] = EMPTY_VALUE;
}
void PlotPoint(int i, double& first[], double& second[], double& from[])
{
   if (first[i+1] == EMPTY_VALUE)
      if (first[i+2] == EMPTY_VALUE) {
         first[i]  = from[i];
         first[i+1]  = from[i+1];
         second[i] = EMPTY_VALUE;
      }
      else  {
         second[i] = from[i];
         second[i+1] = from[i+1];
         first[i]  = EMPTY_VALUE;
      }
   else     {
      first[i]  = from[i];
      second[i]   = EMPTY_VALUE;
   }
}
//+------------------------------------------------------------------+

在这里我看到这个指标的指标缓冲区的值。


 
伙计们,谢谢你们的提示。特别是伊戈尔-马卡 努。是的,的确,我做了6个缓冲区,而不是默认的3个,其中一个缓冲区出现了1和-1的值,但在原来的缓冲区中完全没有。这就是为什么我不能把价值拿出来。而我自己也从未猜到。现在一切都恢复正常了。一切都在运作。伊戈尔,也感谢你将指标提炼成新的格式。 再次感谢你的知识!!!。
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
Igor Makanu:

你不必猜测,首先你需要以对应于MQL4语言当前状态的正常形式重写该指标

我把代码整理了一下,但我不确定会不会有错误,我不喜欢源代码,但我已经用我得到的东西工作了

这里我看到了这个指标的指标缓冲区的值。

它的工作原理是不需要覆盖,并使你的数据非常容易得到。我在上面描述了它--你只需要在数据窗口中 查看它的缓冲区读数(Ctrl+D)。

 
Artyom Trishkin:

它无需重写,可以非常简单地接收其数据。我在上面描述了它--你只需要在数据窗口中 查看它的缓冲区读数(Ctrl+D)。

我在上面写道,我不记得旧指标中的IndicatorCounted()函数是如何工作的,带有OnCalculate()的新形式指标更容易理解

好了,这个问题似乎已经解决了,好了;)

原因: