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

 

向所有论坛成员问好。

请帮助我让该指标在特定的符号上工作,无论它被设置在哪个图表上。

我知道,一个外部参数被用来改变符号

input string   Symb   ="GBPJPY";
我不知道接下来该怎么做

我在此附上指标

附加的文件:
Fisher.mq4  3 kb
 

请告诉我如何在新条形图出现时重置缓冲区,但要使以前的数据不被抹去并显示在图表上。由于某些原因,我无法将缓冲区重置为零,当新的条形图出现,新的数据会叠加在旧的累积数据上我的代码有什么问题吗?谢谢你的澄清。

void OnInit()
{
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
   SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
  
   
}
 
 
//+------------------------------------------------------------------+
//| 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[])
{
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
}
 
Alekseu Fedotov:

这就是事实


我有一个关于代码的问题,事实证明,未收盘的当前蜡烛有收盘时间,在蜡烛收盘前,指标会画出该时段的价格收盘,在此基础上,指标在屏幕区域呈现红色,而这是不应该画的,因为小时蜡烛没有收盘。,这就是编译的时间,然后在编译之后就会出现每个收盘的蜡烛的画法,当然你可以通过寻找小时线来解决另一种方法,但是我想要一个更简单的方法,我之前写过,所以

for(i=limit; i>0; i--)
{
yesterday_weekday = TimeHour(iTime(Symbol(),0,i+1))-TimeHour(iTime(Symbol(),0,i));
if(yesterday_weekday!=0)

还有其他解决方法吗?我想在编译中看到它,但我想有一个更简单的解决方案。

 
MakarFX: 请帮助我使该指标对某一符号起作用,不管它被设置在哪个图表上。

有必要在调用最高、最低时写下这个参数--它们已经过时了,更好的是iHigest、iLowest,并称赞声名狼藉的费舍尔立即同意平局(V.Vysotsky)。

 
PokrovMT5:
我对代码有一个问题,事实证明,未关闭的当前一小时的蜡烛有关闭时间,在蜡烛关闭之前,指标会画出指标所处时期的价格关闭,截图中的红色区域不会被画出来,因为一小时的蜡烛没有关闭。,这就是编译的时间,然后在编译之后就会出现每个收盘的蜡烛图的绘制,当然你可以通过寻找小时柱来解决另一种方法,但是我想要一个更简单的方法,我之前写过

有其他的解决方案吗?谢谢你。

如果我理解正确的话,你想在图表上标记每小时的收盘价?

// (только для TF меньше часа) для всех свечей внутри часа поставить HourCloseBuff=цена закрытия часа

// предполагается что close индексирован как тайм-серия

for(int back=i+1;back<=limit && TimeHour(time[back]==TimeHour(time[i+1]);back++) {

  HourCloseBuff[back]=close[i+1];

}

 
STARIJ:

我们应该把这个参数写进最高、最低的调用中--它们已经过时了,更好的是iHigest、iLowest和被称赞的臭名昭著的费舍尔立即同意和棋(V.Vysotsky)。

#property  copyright "Copyright © 2005, Yura Prokofiev"
#property  link      "Yura.prokofiev@gmail.com"

#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Lime
#property  indicator_color3  Red
 
input string   Symb     ="GBPJPY";
extern int     period   =10;

double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtBuffer2[];


int init()
  {
   
   
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Lime);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);

   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);

   IndicatorShortName("Fisher");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);

   return(0);
  }


int start()
  {
   //int     period=10;
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current,old;
   double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
   double price;
   double MinL=0;
   double MaxH=0;  
   

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;


   for(int i=0; i<limit; i++)
    {  MaxH = High[iHighest(Symb,0,MODE_HIGH,period,i)];
       MinL = Low[iLowest(Symb,0,MODE_LOW,period,i)];
      price = (High[i]+Low[i])/2;
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     
      Value=MathMin(MathMax(Value,-0.999),0.999); 
      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];
      
    }


   bool up=true;
   for(i=limit-2; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
           
      if (((current<0)&&(prev>0))||(current<0))   up= false;    
      if (((current>0)&&(prev<0))||(current>0))   up= true;
      
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
        
       else
         {
          ExtBuffer1[i]=current;
          ExtBuffer2[i]=0.0;
         }
     }

   return(0);
  }
我做了,但这并没有解决这个问题,因为
price = (High[i]+Low[i])/2;
高和低使用当前的符号。
 
Maxim Kuznetsov:

如果我理解正确的话,你想在图表上标记每小时的收盘价?

// (только для TF меньше часа) для всех свечей внутри часа поставить HourCloseBuff=цена закрытия часа

// предполагается что close индексирован как тайм-серия

for(int back=i+1;back<=limit && TimeHour(time[back]==TimeHour(time[i+1]);back++) {

  HourCloseBuff[back]=close[i+1];

}

马克西姆,日安!感谢你的变体,我的变体几乎相同,也能工作,但阿列克谢-费多托夫 建议,我写道,有一个想法,如何纠正它?



for(i=limit; i>=0; i--)
     {
      T = iTime(NULL,0,i); 
      shift=iBarShift(NULL,60,T); 
      C=iClose(NULL,60,shift);
      CC[i]=C;
     }
 

请告诉我如何在新条形图出现时重置缓冲区,但要使以前的数据不被抹去,而是显示在图表上。由于某些原因,我无法将缓冲区重置为零,当新的条形图出现,新的数据会叠加在旧的累积数据上我的代码有什么问题吗?谢谢你的澄清。

 datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
 

没有人可以帮助我吗?

 

祝大家今天愉快我如何切换到正确的图表窗口?

我打开了许多不同货币对的窗口,每个窗口都有一个EA,出现了一个交易信号,但货币是他娘的,我需要快速激活信号出现的确切图表。

我知道Symbol() 命令,但我不知道如何用指定的货币对激活一个窗口。也许,谁曾面临过这个任务?

原因: