[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 131

 
alsu:
win_idx是否正确?

win_ind原来是正确的。

ObjectCreate("max",OBJ_HLINE,win_idx,0,top); 在正确的窗口中绘制。


ObjectSet("max",OBJPROP_COLOR,Yellow); 以正确的颜色绘制。

ObjectSet("max",OBJPROP_WIDTH,0); 画出正确的线。

但并没有定义在

double top=WindowPriceMax(win_idx)。

且topBuffer[]为空。


准则

#属性 indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Red
//--- 缓冲区
双倍ExtMapBuffer1[]。
双倍ExtMapBuffer2[]。
double topBuffer[]。


bool initFinished=false; // 添加一个变量,它将记住初始化的状态。
// false - 初始化还没有发生。
// true - 已被初始化
//+------------------------------------------------------------------+
//|自定义指标初始化函数
//+------------------------------------------------------------------+
int init()
{
//---- 指标
SetIndexStyle(0,DRAW_LINE)。
SetIndexBuffer(0,ExtMapBuffer1)。
SetIndexStyle(1,DRAW_LINE)。
SetIndexBuffer(1,ExtMapBuffer2)。
SetIndexStyle(2,DRAW_NONE)。
SetIndexBuffer(2,topBuffer)。

IndicatorDigits(5)。
//----
return(0);
}
//+------------------------------------------------------------------+
//|自定义指标去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//|自定义指标迭代函数|
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted()。
限度。

如果(counted_bars>0)
counted_bars--。

limit=Bars-counted_bars。
//----
for(int i=0;i<limit;i++)

{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i)。
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i) 。

如果(initFinished==false)
{
IndicatorShortName("MACD_max-min")。

int win_idx=WindowFind("MACD_max-min")。
//找到我们的指标子窗口的编号

如果(win_idx<0)
{
// 如果子窗口编号为-1,则有一个错误
Print("Window not found")。
return(0);
}

double top=WindowPriceMax(win_idx)。
//找到当前图表的指定子窗口的垂直刻度的最大值


ObjectCreate("max",OBJ_HLINE,win_idx,0,top)。
//在我们的指标的一个子窗口中画一条水平线

ObjectSet("max",OBJPROP_COLOR,Yellow)。
ObjectSet("max",OBJPROP_WIDTH,0)。

WindowRedraw()。
//重新绘制窗口以看到这条线路

initFinished=true。
// 绘图完成了

}

topBuffer[i]=top。


}

//----
return(0);
}
//+------------------------------------------------------------------+

 
MK07:

win_ind原来是正确的。

ObjectCreate("max",OBJ_HLINE,win_idx,0,top); 在正确的窗口中绘制。


ObjectSet("max",OBJPROP_COLOR,Yellow); 以正确的颜色绘制。

ObjectSet("max",OBJPROP_WIDTH,0); 画出正确的线。

但并没有定义在

double top=WindowPriceMax(win_idx)。

且topBuffer[]为空。


编码

#属性 indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Red
//--- 缓冲区
双倍ExtMapBuffer1[]。
双倍ExtMapBuffer2[]。
double topBuffer[]。


bool initFinished=false; // 添加一个变量,它将记住初始化的状态。
// false - 初始化还没有发生。
// true - 已被初始化
//+------------------------------------------------------------------+
//|自定义指标初始化函数
//+------------------------------------------------------------------+
int init()
{
//---- 指标
SetIndexStyle(0,DRAW_LINE)。
SetIndexBuffer(0,ExtMapBuffer1)。
SetIndexStyle(1,DRAW_LINE)。
SetIndexBuffer(1,ExtMapBuffer2)。
SetIndexStyle(2,DRAW_NONE)。
SetIndexBuffer(2,topBuffer)。

IndicatorDigits(5)。
//----
return(0);
}
//+------------------------------------------------------------------+
//|自定义指标去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//|自定义指标迭代函数|
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted()。
限度。

如果(counted_bars>0)
counted_bars--。

limit=Bars-counted_bars。
//----
for(int i=0;i<limit;i++)

{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i)。
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i) 。

如果(initFinished==false)
{
IndicatorShortName("MACD_max-min")。

int win_idx=WindowFind("MACD_max-min")。
//找到我们的指标子窗口的编号

如果(win_idx<0)
{
// 如果子窗口编号为-1,则有一个错误
Print("Window not found")。
return(0);
}

double top=WindowPriceMax(win_idx)。
//找到当前图表的指定子窗口的垂直刻度的最大值


ObjectCreate("max",OBJ_HLINE,win_idx,0,top)。
//在我们的指标的一个子窗口中画一条水平线

ObjectSet("max",OBJPROP_COLOR,Yellow)。
ObjectSet("max",OBJPROP_WIDTH,0)。

WindowRedraw()。
//重新绘制窗口以看到这条线路

initFinished=true。
// 绘图完成了

}

topBuffer[i]=top。


}

//----
return(0);
}
//+------------------------------------------------------------------+



对不起,我多管闲事了。

topBuffer[i]后面的循环和绘制,试试这个。

int start()
  {
   int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
        ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);
        
          if(initFinished==false)
           { 
             int win_idx=WindowFind("MACD_max-min");
             // находим номер подокна нашего индикатора
      
             if(win_idx<0)
              {
               // если номер подокна равен -1, то возникла ошибка
                 Print("Окно не найдено");
                 return(0);
              }  
              
             double   top=WindowPriceMax(win_idx); 
              //находим максимальное значение вертикальной шкалы указанного подокна текущего графика
             topBuffer[i]=top;
             Comment( "\n"," top = ",top); 

             ObjectCreate("max",OBJ_HLINE,win_idx,0,0);
             // рисуем горизонтальную линию в подокне нашего индикатора
             ObjectSet("max", OBJPROP_PRICE1, top);  
             ObjectSet("max",OBJPROP_COLOR,Yellow);
             ObjectSet("max",OBJPROP_WIDTH,0);
 
             WindowRedraw();      
             // перерисовываем окно, чтобы увидить линиию   
      
             initFinished=true;
            // рисование закончено  
        
           } 
        
            
                
        
      }  
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
//Пробуйте с учетом мнения alsu. 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
double ExtMapBuffer1[],ExtMapBuffer2[];
int init(){SetIndexStyle(0,DRAW_LINE);SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);SetIndexBuffer(1,ExtMapBuffer2);
IndicatorShortName("MACD_max-min");return(0);}
int deinit(){return(0);}
//+------------------------------------------------------------------+
int start(){int counted_bars=IndicatorCounted(),limit,win_idx;double top;
if(counted_bars>0)counted_bars--;limit=Bars-counted_bars;win_idx=WindowFind("MACD_max-min");
for(int i=0;i<limit;i++){ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
  ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);}
  top=WindowPriceMax(win_idx);ObjectDelete("max");
  if(ObjectFind("max")!=win_idx){ObjectCreate("max",OBJ_HLINE,win_idx,Time[0],top);
  ObjectSet("max",OBJPROP_COLOR,Yellow);ObjectSet("max",OBJPROP_WIDTH,0);}return(0);}
//+------------------------------------------------------------------+
 
我是一个新手,安装了MetaFX和专家顾问,在演示中所有的工作和不希望在原始的工作中不希望只是站着。
 

你好!

请为我指出正确的方向。

我得到了N个相同类型的外部变量。如何在不重载代码的情况下从它们中选择最大值 - MathMax返回两个值的最大值,但如果它,比方说,20?

或者,如何从这些数据创建一个数组,然后应用ArrayMaximum

extern int A = 10;
extern int .......;

extern int N = 1253;

预先感谢 !

 
Roll:

https://docs.mql4.com/ru/array/ArrayMaximum

int ArrayMaximum( double array[], int count=WHOLE_ARRAY, int start=0)
搜索具有最大值的元素。该函数返回数组中最大元素的位置。
参数。
array[] - 数字数组,被搜索到。
count - 要搜索的元素的数量。
Start - 搜索的起始索引。
例子。
double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
int maxValueIdx=ArrayMaximum(num_array)。
Print("Max value = ", num_array[maxValueIdx])。


但是,以

int Max [N] = {A,.....,N};

阵列不被创建。

其中:A,......N是相同类型的给定变量。变量的数量=N

 

从外部变量创建一个字符串数组的例子(脚本)。

extern string sym1="GBPUSD";
extern string sym2="GBPJPY";
extern string sym3="EURUSD";
extern string sym4="EURJPY";
extern string sym5="AUDUSD";
extern string sym6="AUDJPY";
extern string sym7="NZDUSD";
extern string sym8="USDCAD";

string sym[8];
//+------------------------------------------------------------------+
int init(){sym[1]=sym1;sym[2]=sym2;sym[3]=sym3;sym[4]=sym4;
   sym[5]=sym5;sym[6]=sym6;sym[7]=sym7;sym[8]=sym8;return(0);}

int start(){Alert("символ  ",sym[1]);return(0);}
 
Roll:

从外部变量创建一个字符串数组的例子(脚本)。


谢谢你!

它起作用了,但有一个修正:用 "我 "代替 "我"。

int init(){sym[1]=sym1;............

做到以下几点

int init(){sym[0]=sym1;.......

然后对所有元素进行统计。

 
r772ra:

对不起,打扰您了。

topBuffer[i]后面的循环和绘制,这样试试。

你的选择没有用,但要感谢你的关注、努力工作和对他人问题的理解。
 
Roll:

太感谢了

你这个版本的指标是有效的!

我试图用MQL4教程和指标的例子来解决这些问题,但没有任何效果。

如果你有愿望、时间和倾向,可以帮助我弄清楚原因。

1.当你安装指标线时,收到的值是0(零),只有在第一个刻度线到来时,才会有变量top的值,或者应该打开参数窗口,并立即关闭它。

2.虽然在init()中有以下一行,但参数top被计算到了第4个符号

IndicatorDigits(Digits+1);

和线

top=WindowPriceMax(win_idx)。

我把它换成了

top=NormalizeDouble((WindowPriceMax(win_idx)), Digits+1);

这并没有什么帮助!而指标窗口刻度的数值是5位数。

3.随着指标的删除,评论 并没有从图表中删除。



编码

--------

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
double ExtMapBuffer1[],
ExtMapBuffer2[];
//--------------------------------
int init()
{
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
IndicatorShortName("MACD_max-min_v2");

IndicatorDigits(Digits+1);

return(0);
}
//--------------------------------
int deinit()
{

return(0);
}
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(),limit,win_idx;
double top;

if(counted_bars>0)counted_bars--;
limit=Bars-counted_bars;
win_idx=WindowFind("MACD_max-min_v2");

for(int i=0;i<limit;i++)
{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);
}

// top=WindowPriceMax(win_idx);
top=NormalizeDouble((WindowPriceMax(win_idx)),Digits+1);
Comment( "\n"," top = ",top);
ObjectDelete("max");

if(ObjectFind("max")!=win_idx)
{
ObjectCreate("max",OBJ_HLINE,win_idx,Time[0],top);
ObjectSet("max",OBJPROP_COLOR,Yellow);
ObjectSet("max",OBJPROP_WIDTH,0);
}

return(0);
}
//+------------------------------------------------------------------+


附加的文件: