初学者的问题 MQL5 MT5 MetaTrader 5 - 页 824

 
lil_lil:

谢谢,当满足算法的前两点,并且在第一根柱子上有两个MAs的值时,我如何写一个循环来寻找穿过两个MAs的柱子的数量?

/

.


啊哈,你毕竟不是通过数组来解决的。

注意:通过数组的解决方案(将指标的最后三个值复制到数组First[]、Second[]和Third[])是两个iMA的交叉- OnTick()。

//--- We look for crossing of two indicators
   double   First[];
   double   Second[];
   double   Third[];
   ArraySetAsSeries(First,true);    // index [0] - the most right bar on a charts
   ArraySetAsSeries(Second,true);   // index [0] - the most right bar on a charts
   ArraySetAsSeries(Third,true);    // index [0] - the most right bar on a charts
   int      buffer_num=0;           // indicator buffer number 
   int      start_pos=0;            // start position 
   int      count=3;                // amount to copy 
   if(!iMAGet(handle_iMA_First,buffer_num,start_pos,count,First))
      return;
   if(!iMAGet(handle_iMA_Second,buffer_num,start_pos,count,Second))
      return;
   if(InpFilterMA)
      if(!iMAGet(handle_iMA_Third,buffer_num,start_pos,count,Third))
         return;
//--- step 1: check in the arrays bars [0] and [1]
   if(First[0]>Second[0] && First[1]<Second[1]) // buy
     {
      if(InpFilterMA)
         if(Third[0]>=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[0] && First[1]>Second[1]) // sell
     {
      if(InpFilterMA)
         if(Third[0]<=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }
//--- step 2: on a step of 1 crossing haven't found. check in the arrays bars [0] and [2]
   if(First[0]>Second[0] && First[2]<Second[2]) // buy
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[2] && First[1]>Second[2]) // sell
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }


在你的情况下(一次一个值),循环将看起来像这样。

   int      signal=0;                                 // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
   double   MA1_curr=iMAGet(handle_iMA_1,0);          // the value of the 1st MA on i bar
   double   MA2_curr=iMAGet(handle_iMA_2,0);          // the value of the 1st MA on i bar
   for(int i=0;i<100;i++)
     {
      double   MA1_prev=iMAGet(handle_iMA_1,i+1);     // the value of the 1st MA on i+1 th bar
      double   MA2_prev=iMAGet(handle_iMA_2,i+1);     // the value of the 1st MA on i+1 th bar
      //---
      signal=0;                                       // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
      if(MA1_prev<MA2_prev && MA1_curr>MA2_curr)
         signal=1;
      else if(MA1_prev>MA2_prev && MA1_curr<MA2_curr)
         signal=-1;
      //---
      MA1_curr=MA1_prev;
      MA2_curr=MA2_prev;
     }

MA1_curr - 指标MA1在bar #i上的值,MA1_prev - 指标MA1在bar #i+1上的值。
MA2_curr - 指标MA2在bar #i上的值,MA2_prev - 指标MA2在bar #i+1上的值。

当你得到一个交叉点(变量信号是"-1 "或 "1")--i的值将是发生交叉点的条形数字。

这是最简单的寻找交叉点的算法,但它不是最准确的。

 
Vladimir Karputov:

是的,你终究决定不使用数组...


谢谢你,你的另一个MA交叉 EA被用来作为一个例子

我想在穿越后的第三或第五或......n个小节上进入。

弗拉基米尔-卡尔普托夫

在你的案例中(获得一个值),循环将看起来像这样

为什么在发现交叉点时,没有从循环中退出?

这些条件可以放在循环之外吗?

 if(signal==-1)num_bar_b=i;
 if(signal==1)num_bar_s=i;

.

 

下午好。请告诉我以何种格式从Finam或MFD.ru服务器下载历史数据以导入 报价历史?我根本无法做到这一点。我只能把它从txt保存为csv,仅此而已。

 
Eol:

下午好。请告诉我以何种格式从Finam或MFD.ru服务器下载历史数据以导入报价历史?我根本无法做到这一点。我只能把它从txt保存为csv,仅此而已。


你不需要在MetaTrader 5中下载任何东西 :)- 只要你连接到交易服务器,你就可以获得真实的tick历史。向CopyTicks 看齐

 
Vladimir Karputov:

在MetaTrader 5中,你不需要下载任何东西 :)- 只要你连接到交易服务器,你就可以看到真实的tick历史。向CopyTicks 看齐


我只需要10年的俄罗斯股票。我的经纪人不给我那么多,也不太可能找到。

 
5.0 Build 1755

问题描述

晚上好,有一个关于MQL5的问题,如果你能帮忙的话。
我还没有任何关于5的教科书。
问题是。


#property indicator_level1 30 - 我已经定义了参数。当我在图表上 加载该指标 时。我明白了。
我通过函数ColorBuffer[]改变线条,如果线条下降到这个参数以下。

我这里有一个问题。如果我打开指标,把参数换成另一个,即使在加载指标后,水平线也放在那里,但指标是用之前设置的参数计算的,即#属性 indicator_level1 30

我应该如何处理这个层面,以便能够在运行时改变它?

- 已经尝试过检查参数。并重新计算所有的指标链。
但它还是不能按照我想要的方式重绘!这是不可能的。

帮助!
:)

操作顺序

RSI.mqh

#property indicator_level1 30

#property indicator_level2 70


在Calculaite描述代码中。在线条穿过For的结尾处,我添加了一个功能,如果线条低于这个水平,就改变其颜色。
ExtColorsBuffer [i] =0。
如果(ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1;
}
如果(ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2。

预期的结果


我看到的情况和图片上的一样,但当我在使用指标的过程中打开设置并改变级别indicator_level1 / 2时,我得到了重绘。指标被重新绘制,所以如果线穿过一个水平,它就会改变其颜色。但对我来说,它和以前的水平是一样的 :)

更多信息

...

附加的文件:
rrgpusgf5g.png  69 kb
 
Ivan Stepanenko:
5.0 Build 1755

问题描述

晚上好,有一个关于MQL5的问题,如果你能帮忙的话。
我还没有任何关于5的教科书。
问题是。


#property indicator_level1 30 - 我已经定义了参数。当我在图表上 加载该指标 时。我明白了。
我通过函数ColorBuffer[]改变线条,如果线条下降到这个参数以下。

我这里有一个问题。如果我打开指标,把参数换成另一个,即使在加载指标后,水平线也放在那里,但指标是用之前设置的参数计算的,即#属性 indicator_level1 30

我应该如何处理这个层面,以便能够在运行时改变它?

- 已经尝试过检查参数。并重新计算所有的指标链。
但它还是不能按照我想要的方式重绘!这是不可能的。

帮助!
:)

操作顺序

RSI.mqh

#property indicator_level1 30

#property indicator_level2 70


在Calculaite描述代码中。在线条穿过For的结尾处,我添加了一个功能,如果线条低于这个水平,就改变其颜色。
ExtColorsBuffer [i] =0。
如果(ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1;
}
如果(ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2。

预期的结果


我看到的情况和图片上的一样,但当我在使用指标的过程中打开设置并改变级别indicator_level1 / 2时,我得到了重绘。指标被重新绘制,所以如果线穿过一个水平,它就会改变其颜色。但对我来说,它和以前的水平是一样的 :)

更多信息

...

IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrCrimson);      // Поменяет цвет самого первого по счёту уровня на цвет Crimson
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrDeepSkyBlue);  // Поменяет цвет второго по счёту уровня на цвет DeepSkyBlue
 
Ivan Stepanenko:
5.0 Build 1755

问题描述

晚上好,有一个关于MQL5的问题,如果你能帮忙的话。
我还没有任何关于5的教科书。
问题是。

我想知道为什么我不喜欢这个答案,在一个单独的话题中。

这是一个关于交易、自动交易系统和策略测试的论坛。

我在MQL5中需要帮助 #属性 indicator_level

Alexey Viktorov, 2018.01.31 09:06

伊戈尔,我们都错了。我并没有立即理解这个任务...

除了#属性指令,你还可以用函数来设置指标水平

IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);

因此,这一水平应在传入的指标参数中设置。在这种情况下,水平将由指定的值来绘制,它应该由这个值来改变。

测试案例

#property indicator_separate_window
#property indicator_buffers     1
#property indicator_type1       DRAW_LINE
#property indicator_plots       1
#property indicator_color1      clrGreenYellow
#property indicator_level1      0
#property indicator_levelcolor  clrPurple

input double level = 0.6;
double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, buf, INDICATOR_DATA);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, level);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   int i = 0, limit = prev_calculated == 0 ? 0 : rates_total-1;
    for(i = limit; i < rates_total; i++)
     {
      buf[i] = i%2;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

我希望根据输入参数中定义的级别来改变颜色并不困难。
 

关于交易、自动交易系统和交易策略测试的论坛

虫子,虫子,问题

Aleksey Rodionov, 2018.02.06 16:31

这里有一个有趣的例子。

Print("Баланс на счёте = ",AccountInfoDouble(ACCOUNT_BALANCE));
printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));


如果你在pintf中去掉%G,那么数值就不会被显示,但在Print中,它的显示没有%G。

在Print中也显示了平衡值10000.0,但在printf中只有整数10000。

我更感兴趣的是Print和Printf之间有什么区别,最重要的是,为什么没有%G就不显示。我不明白参考书中的任何内容。


 

同事们好,我有个问题,我想在论坛 "forex money "的签名中插入我的信号小部件,但他们禁用或阻止了HTML,有什么办法可以把它转换成URL吗?

以下是代码 <iframe frameborder="0" width="220" height="140" src="https://www.mql5.com/ru/signals/widget/signal/328l?t=green"></iframe>.