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

 
Artyom Trishkin:

为了从指标中分离出获取任意分形的函数,我们不应该通过引用数组high[]和low[]以及极限值来传递给它们。

由于我们的代码与MQL5非常接近,我们将不得不拒绝High[]、Low[]、iHigh()和iLow()函数。这就是它在这个指标中的样子。

虽然,你也应该从函数GetPriceHigh()和GetPriceLow()中检查出-1。
谢谢你。
 
strongflex:
RSI应该是15分钟。我们需要EA在开市后每20分钟检查一次(9-00,9-20,9-40等),假设在10-20有一个低于70水平的交叉,它就会记住这个价格,在10-40检查时,如果价格低于10-20,就会开出一个空头。

那么首先你需要使时间得到 一个给定的分钟数的回报。这里有一个测试脚本。

//+------------------------------------------------------------------+
//|                                                sTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input ENUM_TIMEFRAMES   TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int               MinutesBefore  =20;           // Количество минут назад
int minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   datetime time_before=TimeCurrent()-minutesBefore*PeriodSeconds(PERIOD_M1);
   int shift=Bars(Symbol(),TimeframeRSI,TimeCurrent(),time_before);
   double value=iRSI(Symbol(),TimeframeRSI,14,PRICE_CLOSE,shift);
   Comment("\nCurrent time: ",TimeToString(TimeCurrent()),
           "\nВремя ",minutesBefore," минут назад: ",TimeToString(time_before),
           "\nБар времени ",TimeToString(time_before)," = ",shift," на таймфрейме ",EnumToString(TimeframeRSI),
           "\nЗначение RSI на баре ",shift," периода ",EnumToString(TimeframeRSI),": ",DoubleToString(value,Digits()));
  }
//+------------------------------------------------------------------+

这个脚本是从当前的服务器时间开始倒计时的--只是测试获得指定分钟前的RSI数据。

 

接下来,我们需要知道当前的时间,以及它的值是否是检查间隔的分钟的倍数。我已经把它做成了一个测试的EA。

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES      TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int                  PeriodRSI      = 14;          // Период расчёта RSI
input ENUM_APPLIED_PRICE   PriceRSI       = PRICE_CLOSE; // Цена расчёта RSI
input int                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore; // Количество минут назад
int      periodRSI;     // Период расчёта RSI
double   prevRSIValue;  // Значение RSI xxx минут назад
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад
   periodRSI=(PeriodRSI<1?1:PeriodRSI);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   if(server_time.min%minutesBefore==0) prevRSIValue=GetLastDataRSI(Symbol(),TimeframeRSI,TimeCurrent(),minutesBefore);
   Comment("\nТекущее время: ",TimeCurrent(),"\nМинуты текущего времени: ",server_time.min,"\nЗначение RSI: ",DoubleToString(prevRSIValue,Digits()));
  }
//+------------------------------------------------------------------+
double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, datetime start_time, int minutes_before,
                      int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE)
  {
   datetime time_before=start_time-minutes_before*PeriodSeconds(PERIOD_M1);
   int shift=Bars(symbol_name,timeframe,start_time,time_before);
   return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift));
  }
//+------------------------------------------------------------------+

接下来,我们需要知道什么?

 
下午好。我是交易新手,所以我有很多问题,包括软件问题,在我看来是MT4。是否可以将货币对的价差以数字的形式显示在图表窗口中,并以同样的方式显示ATR指标?我认为用这种方式来展示市场情况的信息是很方便的,根据平均数来计算和评估更方便、更快捷。第二点是基于ATR的移动停止。是否有可能使之成为自动的?如果你坐着摆姿势,那么多亏了计算器和良好的视力,你可以计算并手动设置停止 - 没问题。对交易者来说,让它自动运行是一个不错的想法,即使它有其缺点,但在一个良好的趋势中,跟踪止损将减少新手错误止损的风险。提前感谢。
 
Artyom Trishkin:

接下来,我们需要知道当前的时间,以及它的值是否是检查间隔的分钟的倍数。我已经把它做成了一个测试的EA。

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES      TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int                  PeriodRSI      = 14;          // Период расчёта RSI
input ENUM_APPLIED_PRICE   PriceRSI       = PRICE_CLOSE; // Цена расчёта RSI
input int                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore; // Количество минут назад
int      periodRSI;     // Период расчёта RSI
double   prevRSIValue;  // Значение RSI xxx минут назад
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад
   periodRSI=(PeriodRSI<1?1:PeriodRSI);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   if(server_time.min%minutesBefore==0) prevRSIValue=GetLastDataRSI(Symbol(),TimeframeRSI,TimeCurrent(),minutesBefore);
   Comment("\nТекущее время: ",TimeCurrent(),"\nМинуты текущего времени: ",server_time.min,"\nЗначение RSI: ",DoubleToString(prevRSIValue,Digits()));
  }
//+------------------------------------------------------------------+
double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, datetime start_time, int minutes_before,
                      int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE)
  {
   datetime time_before=start_time-minutes_before*PeriodSeconds(PERIOD_M1);
   int shift=Bars(symbol_name,timeframe,start_time,time_before);
   return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift));
  }
//+------------------------------------------------------------------+

接下来,我们需要知道什么?

接下来,如果20分钟前的RSI水平有一个交叉,我们检查价格,即对于空头来说,价格应该低于20分钟前。非常感谢你。如果成功了,我欠你一个承诺))
 
Vladymyr Glushko:
日子过得不错。我是交易新手,这就是为什么我有很多问题,包括软件,在我看来是MT4。是否可以在图表窗口中以数字形式显示货币对的价差,并以同样方式显示ATR指标?我认为用这种方式来展示市场情况的信息是很方便的,根据平均数来计算和评估更方便、更快捷。第二点是基于ATR的移动停止。是否有可能使之成为自动的?如果你坐着摆姿势,那么多亏了计算器和良好的视力,你可以计算并手动设置停止 - 没问题。对交易者来说,让它自动运行是一个不错的主意,即使它有其缺点,但在一个良好的趋势中,跟踪止损将减少新手错误止损的风险。预先感谢你。

它简单明了--在图表上显示图形对象,特别是带有所需数据的文本标签,并在每次打勾 时更新它们。

如果你不知道该如何处理它们,请尝试找到正确的方法;)

 
strongflex:
然后,如果RSI水平在20分钟前被越过,我们就检查价格,即对于空头来说,价格应该低于20分钟前。非常感谢你。如果一切顺利,我将被指控承诺))。
我们只能通过与该时间相对应的开盘/收盘/高点/低点蜡烛来检查 "现在""当时 "的价格--MT4中没有tick历史。因此,我们需要在分钟上找到一个交叉点,以获得最准确的价格判断。 但你说的RSI交叉是什么意思?
 

Artyom Trishkin:
Мы сможем "сейчас" проверить цену "тогда" лишь только открытия/закрытия/хай/лоу свечи, соответствующей тому времени - нету в МТ4 тиковой истории. Поэтому нужно найти пересечение на минутках для наиболее точного определения цены из имеющихся в наличии возможностей. Но что вы имеете в виду под пересечением RSI ?

RSI越过70水平,假设RSI在10-00时低于70,在10-20时高于70,在10-40时检查,10-20时应高于10-40时。
 
Artyom Trishkin:

这很简单,也很直接--你在图表上显示图形对象,特别是--带有所需数据的文本标签,并在每次打勾 时更新它们。

kodobase 中不同的拖网是一打的--寻找合适的;)

非常感谢......,我们将寻找它))

 
Artyom Trishkin:

一切都很容易和简单--显示图形对象,特别是--在图表上显示所需数据的文本标签,并在每个刻度 上更新它们。

kodobase 中不同的拖网是一打的--找到适合自己的;)

但如何一步一步地做呢?..... 图形对象(它是什么,如何设置),在图表上放上带有数据的标签(在哪里输入,用什么数据)...... 对不起,我的问题很愚蠢。
原因: