[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 326

 

我不是一个指标爱好者,但我决定检查一件事。专家顾问应该分别在上层RSI 指标的价格买入和在下层指标的价格卖出。只有当价格已经高于RSI 指标的上边界 时,那么买入应该高于这个边界,低于这个边界的值+从边界往上缩进的某个值(在代码中我只指定了一个数字0.1),对于销售,则相反。

我是这样做的。

外部参数。

extern string ___H1 = " __________ Параметры RSI _________ ";
extern int     i_RSITF = 5,
               i_RSIPeriod = 21,
               i_RSIApplied = PRICE_CLOSE;
extern double  i_RSIToUpLimit = 55,                                     // Верхняя граница RSI
               i_RSIToDnLimit = 45;                                     // Нижняя граница RSI

接收信号的函数和RSI值本身的代码: 这里的0.1 是买入或卖出范围的保证金公差)

//+-------------------------------------------------------------------------------------+
//| Получаем RSI с заданными параметрами                                                |
//+-------------------------------------------------------------------------------------+
double GetRSI(int RSIIndex)
{
   return (iRSI(NULL, i_RSITF, i_RSIPeriod, i_RSIApplied, RSIIndex));
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   if (FindOrders() > 0)
       return (SIGNAL_NO);

 //  if (GetRSI(PRICE_CLOSE, 0) > GetRSI(PRICE_CLOSE, 1))
   if (GetRSI(0) > i_RSIToUpLimit)
      if (GetRSI(0) < (i_RSIToUpLimit + 0.1))
         return (SIGNAL_BUY);                  // Запускаем функцию открытия покупки
           
   if (GetRSI(0) < i_RSIToDnLimit)
      if (GetRSI(0) > (i_RSIToDnLimit - 0.1))
         return (SIGNAL_SELL);                // Запускаем функцию открытия продаж
   
   return (SIGNAL_NO);
}

有时EA从非常高的水平开出订单,有时高得多(用于购买),有时低得多(用于出售)。为什么?该算法是初级的。

 
大家好。我有一个问题。我给自己买了一台复印机/**/,在处理几个账户的时候是很好的,很方便的东西。但问题是,当你并行运行任何其他程序(视频、游戏,只是地图)时,扬声器中不断传出噼啪声。是否有可能消除该问题(异响)?提前感谢。
 

我试图写一个基于RSI的简单指标(类似的是RandomIndicatorSignals mq4)。

我试图写一个基于RSI的简单指标(对于这个指标的类似物RandomIndicatorSignals.mq4来自MQL4语言的傻瓜文章。自定义指标(第一部分)(https://www.mql5.com/ru/articles/1500)

这个想法很简单,如果RSI画出一个顶部或谷底,它就在图表上画出一个箭头。

它似乎是好的,但在我看来,每根蜡烛的RSI值缓冲区没有被填满,因为这个原因,它不能工作。以下是代码。

//+------------------------------------------------------------------+
//|                                                    RSI+Arrow.mq4 |
//|                                                         _______ |
//|                                                    |
//+------------------------------------------------------------------+
#property copyright "_______"
#property link      "_________"


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Crimson
#property indicator_color2 RoyalBlue
//---- input parameters
extern int       barsToProcess=500;
//---- buffers
double ExtMapBuffer1[],
       ExtMapBuffer2[],
       RSIBuffer3[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,236);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,238);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer (2,RSIBuffer3);
   // для информации о значениях буфера
   SetIndexLabel  (2,"RSIBuffer3");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {    
   //расчет индикатора на последних барах 
   int limit,i;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   if(limit>barsToProcess)
   limit=barsToProcess;
   
   //заполняем буфер RSI значениями 
   for(i=0; i<limit; i++)
   if(i>=1)
     {
       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,0);
     }       
  //проводим сравнения                        
   for(i=0; i<limit; i++)
   if(i>=1)
        
        {
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]>0 && RSIBuffer3[i+1]-RSIBuffer3[i]>0) // условия выставления стрелки 

        /* так тоже не работает
        if(RSIBuffer3[i+2]>=RSIBuffer3[i+1] && RSIBuffer3[i+1]<=RSIBuffer3[i])
        */
        
        ExtMapBuffer2[i]=Low[i]-5*Point;
                    
        else
           
        ExtMapBuffer2[i]=0.0;
               
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]<0 && RSIBuffer3[i+1]-RSIBuffer3[i]<0) // условия выставления стрелки
        
        /* так тоже не работает
        if(RSIBuffer3[i+2]<=RSIBuffer3[i+1] && RSIBuffer3[i+1]>=RSIBuffer3[i])
        */
              
        ExtMapBuffer1[i]=High[i]+5*Point;
           
        else      
           
        ExtMapBuffer1[i]=0.0;           
        }
                   
   return(0);
   }
        
//+------------------------------------------------------------------+      
 
Merincool:

我试图写一个基于RSI的简单指标(类似的是RandomIndicatorSignals mq4)。

我试图写一个基于RSI的简单指标(对于这个指标的类似物RandomIndicatorSignals.mq4来自MQL4语言的傻瓜文章。自定义指标(第一部分)(https://www.mql5.com/ru/articles/1500)

这个想法很简单,如果RSI画出一个顶部或谷底,它就在图表上画出一个箭头。

它似乎是好的,但在我看来,每根蜡烛的RSI值缓冲区没有被填满,因为这个原因,它不能工作。以下是代码。

你在循环中访问未计算的指标值。

变化

for(i=0; i<limit; i++)

for(i=limit-1; i>=0; i--)
 
PapaYozh:

你正在循环返回到未计算的指标值。

变化


谢谢你,它给了我一个想法!然而,我想了解"物理意义":)正如我们的物理学家曾经说过的那样

我自己有一个问题:2个 "稍微 "不同但本质上相同的行动代码。删除所有待处理订单

1)不能正常工作 - 只有一个订单被删除

void start()

  {

   bool   result;     int    cmd,total,OT;

   total=OrdersTotal();

   for(int i=0; i<total; i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

        {

         cmd=OrderType();    OT=OrderTicket();

         if(cmd>1)   // !=OP_BUY && cmd!=OP_SELL)

           {

            result=OrderDelete(OT);

           }

        }

     } //end FOR

  }

2) 工作正常--删除所有的人

void start()
{
    string msg="Удалить все отложенные ордера?    ";
//   if (MessageBox(msg,title,MB_YESNO|MB_ICONQUESTION)!=IDYES) return;

   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()>1) OrderDelete(OrderTicket());
   }
}

请解释:"在这个循环中,你访问指标的未计算值 " 的含义。

 
PapaYozh:

你正在循环返回到未计算的指标值。

变化


你能把它拼出来吗? 为什么? 这样我以后就不会再犯任何错误了。
 
PapaYozh:

你正在循环返回到未计算的指标值。

变化


仍然不能工作,RSIBuffer3只在悬停在一个柱子上时显示最后一个柱子的RSI值。
 
Merincool:

但还是不行,RSIBuffer3只在悬停在柱子上时显示最后一个柱子的RSI值。

你的第5个参数是0--也就是最后一小节!

让它变成这样。

       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,i);  

摘自文件。

DoubleiRSI( 字符串, int timeframe, int period, int applied_price, int shift)
计算相对强度指数并返回其值。
参数。
标志 - 符号,其数据应被用于计算指标。 NULL表示当前的符号。
时限 - 时间框架。它可以是Timeframe 的任何一个枚举值。0表示当前图表的时间框架。
时间 - 计算的时期数。
应用价格 - 应用价格。它可以是应用价格 枚举值中的任何一个。
移位 - 从指标缓冲区中提取的数值的索引(相对于当前条形图而言,在给定的时间段之前移动)。
 
PapaYozh:

你正在循环返回到未计算的指标值。

变化


我还想,根据你的逻辑,该工具应该从极限和0条计算RSI,但从最后还是从开始计算RSI有区别吗? 它应该在一个给定的范围内计算每个条形的RSI,并将该值放入一个缓冲区(我是指一个数组),然后将数组中的三个连续值相互比较。或者说不是吗?

 
amurik61:

你的第5个参数是0--也就是最后一小节!

让它变成这样。

摘自文件。

DoubleiRSI( 字符串, int timeframe, int period, int applied_price, int shift)
计算相对强度指数并返回其值。
参数。
标志 - 符号,其数据应被用于计算指标。 NULL表示当前的符号。
时限 - 时间框架。它可以是Timeframe 的任何一个枚举值。0表示当前图表的时间框架。
时间 - 计算的时期数。
应用价格 - 应用价格。它可以是应用价格 枚举值中的任何一个。
移位 - 从指标缓冲区中提取的数值的索引(相对于当前条形图而言,在给定的时间之前进行移动)。

我会试一试的,谢谢