任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 971

 
korobok777:
没有代码,你无法判断
 

下午。我写了一个简单的指标,用于RSI从超买/超卖区退出。

对,在它应该的地方画箭头。但只能是实时的。

问题:如何让它在历史上画出n个小节?

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 LimeGreen
#property indicator_color2 LimeGreen

双重rsi,rsi1,rsi2。
双重CrossUp[]。
double CrossDown[]。
int FLAG = 0。
int FLAG1 = 2;
bool New_Bar=false。
int init()
{
//---- 指标
SetIndexStyle(0, DRAW_ARROW,5,1);
SetIndexArrow(0, 233)。
SetIndexBuffer(0, CrossUp)。
SetIndexStyle(1, DRAW_ARROW,5,1)。
SetIndexArrow(1, 234);
SetIndexBuffer(1, CrossDown)。
//----
return(0);
}
//+------------------------------------------------------------------+
//|自定义指标去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----

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

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0)。
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1)。
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2)。



Fun_New_Bar()。
int limit, i, counter;
double Range, AvgRange;
for(i = 0; i <= limit; i++) {
counter=i。
范围=0。
平均范围=0。
for (counter=i ;counter<=i+9; counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter])。
}
范围=AvgRange/10。
如果(FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
{警报("RSI下降!!!")。on", Symbol())。
CrossDown[i] = High[i]+ Range*1.8;
FLAG = 1;}
如果(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
{警报("RSI上升!!")。on", Symbol())。
CrossUp[i] = Low[i]- Range*1.8;
FLAG1 = 1; }
如果( New_Bar==true)
{FLAG=0;}
如果( New_Bar==true)
{FLAG1=2;}
}
return(0);
}
空白的Fun_New_Bar()
{
static datetime New_Time=0。
New_Bar=false。
如果(New_Time!=Time[0])
{
New_Time=Time[0];
New_Bar=true。
}
}
 
Vinin:
没有代码,你就无法知道任何事情。
//==================================================================+
extern ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков
//==================================================================+

string _ChartSymbol;
long   _ChartID,
       _ChartFirst,
       _ChartPeriod;
int start()
{//---идентификатор графика начиная с первого 
    _ChartFirst=ChartFirst();
if(_ChartFirst>0)//если идентификатор больше ноля
{
 _ChartSymbol=ChartSymbol(_ChartFirst);//символ графика
 _ChartPeriod=ChartPeriod(_ChartFirst);//Периоды графика
 //---выполним функцию конвертации периода если не совпадает
if( _ChartPeriod!=PERIOD_)
 {
  bool  ch=ChartSetSymbolPeriod(_ChartFirst,_ChartSymbol,PERIOD_);
 } 
}
return(0);
}
int  deinit()
{
Alert("скрипт закончил работу");
return(0);
}
这只是针对第一个图形,我没有做任何进一步的工作,弹出的窗口阻止了它。
 
Red_Manticore:

下午。我写了一个简单的指标,用于RSI从超买/超卖区退出。

对,在它应该的地方画箭头。但只能是实时的。

问题:如何让它在历史上画出n个小节?


根据规则插入代码,早点熟悉起来吧!点击视频按钮左侧的SRC,并删除 "表"!

#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 LimeGreen
#property  indicator_color2 LimeGreen

double rsi,rsi1,rsi2;
double CrossUp[];
double CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool New_Bar=false; 
 
int init()
  {
//---- indicators
  SetIndexStyle(0, DRAW_ARROW,5,1);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW,5,1);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

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

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar(); 
  
   int limit, i, counter;
   double Range, AvgRange;
    for(i = 0; i <= limit; i++) {
   
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;
      if (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
      {Alert ("RSI DOWN!!! on ", Symbol());
      CrossDown[i] = High[i]+ Range*1.8;
          FLAG = 1;} 
      if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
      {Alert ("RSI UP!!! on ", Symbol());
      CrossUp[i] = Low[i]- Range*1.8;
         FLAG1 = 1; } 
   
       if( New_Bar==true)
       {FLAG=0;}
       if( New_Bar==true)
       {FLAG1=2;} 
   
   }
  return(0);
  } 
  
  void Fun_New_Bar()                              
  {                                             
   static datetime New_Time=0;                  
   New_Bar=false;                               
   if(New_Time!=Time[0])                        
     { 
      New_Time=Time[0];                         
      New_Bar=true;                            
     } 
  }     
ответить
 
korobok777:
这只是针对第一个图表,我没有做进一步的干扰弹出窗口。

该脚本处理所有打开的图表。当前的一个是最后处理的。由于脚本在改变时间框架时终止工作,脚本终止的警告窗口将只弹出一次。在所有图表上,时间框架将被改变为指定的时间框架。

//+------------------------------------------------------------------+
//|                                             ReplaceTimeFrame.mq4 |
//|                                            Copyright 2015, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict

#property  show_inputs

input ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   long id=ChartFirst();
   long id_current=ChartID();
   int i=0;
   while(i<100)
     {
      ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id);//Периоды графика
      if(_ChartPeriod!=PERIOD_ && id!=id_current)
        {
         bool  ch=ChartSetSymbolPeriod(id,ChartSymbol(id),PERIOD_);
        }

      id=ChartNext(id);
      if(id<0){break;}
      i++;
     }
   ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id_current);//Периоды графика
   if(_ChartPeriod!=PERIOD_)
     {
      bool  ch=ChartSetSymbolPeriod(id_current,ChartSymbol(id_current),PERIOD_);
     }
  }
 
Vinin:

该脚本处理所有打开的图表。当前的一个是最后处理的。由于脚本在改变时间框架时终止工作,脚本终止的警告窗口将只弹出一次。在所有的图表上,时间框架将被改变为指定的框架。


Ai)))做得很好!!!!,谢谢你!!
 

下午好。

我声明一个数组

double gdClose_array[];

ArrayResize(gdClose_array, 1)。

将数据从当前图表中复制到带有最后一个闭合柱的数组中

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

阵列的输出值

double dX=NormalizeDouble(gdClose_array[0],Digits)。

打印("NormalizeDouble(dX,Digits)", dX)。

我得到了一个数字,但它显然是不正确的。

NormalizeDouble(dX,Digits) 1.0644.

虽然在图表中没有这样的数值(根据可视化),但是

而且这个值在测试过程中不会改变。

我补充说

ArraySetAsSeries(gdClose_array,true)。

情况没有改变。

错误在哪里?

 
n0name:

下午。

...

将数据复制到一个数组中,以最后一个收盘的柱状图为单位,从当前的图表中复制数据。

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

这里你只写了数组的名称,没有指定数组元素的 索引。因为你之前ArrayResize(gdClose_array, 1);你设置了数组元素的数量为1,它的索引为0。这就是为什么必须以这种方式进行。

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);


还有几个问题/提示。

1) 如果你只需要存储1个值,你可以使用一个变量而不是一个数组。然后代替。

double gdClose_array[];
ArrayResize(gdClose_array, 1); 

使

double gdClose_array;

然后像你的原始代码那样做其余的事情。

2) 如果你需要一个数组,但马上就知道它只有1个元素,那么就声明一个有1个元素的静态数组,而不是声明一个动态数组,然后再调整它的大小。没有必要进行额外的操作。

而不是

double gdClose_array[];
ArrayResize(gdClose_array, 1);

double gdClose_array[1];

然后

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);

然后像你的原始代码一样。

 

你好,向程序员提问。

我有一个专家顾问,当一个订单被打开时被触发,并根据指定的点数为其设置止损和止盈。

我的问题。

我们是否可以改变代码,使EA不显示止损,而是显示相同规模的待定反向止损单

为此,我应该在代码中做什么改动?

谢谢你。

 

下午好!

我又一次无法摆脱这个看似简单的问题--为什么一切似乎都是按照帮助进行的,但结果却打印出0.0?

  double FractalDown_1 = iFractals(NULL,0,MODE_LOWER,1); Print("FractalDown_1=",FractalDown_1);

为什么分形的价值没有被提取出来?