Artyom Trishkin: Мы сможем "сейчас" проверить цену "тогда" лишь только открытия/закрытия/хай/лоу свечи, соответствующей тому времени - нету в МТ4 тиковой истории. Поэтому нужно найти пересечение на минутках для наиболее точного определения цены из имеющихся в наличии возможностей. Но что вы имеете в виду под пересечением RSI ?
为了从指标中分离出获取任意分形的函数,我们不应该通过引用数组high[]和low[]以及极限值来传递给它们。
由于我们的代码与MQL5非常接近,我们将不得不拒绝High[]、Low[]、iHigh()和iLow()函数。这就是它在这个指标中的样子。
虽然,你也应该从函数GetPriceHigh()和GetPriceLow()中检查出-1。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));
}
//+------------------------------------------------------------------+
接下来,我们需要知道什么?
接下来,我们需要知道当前的时间,以及它的值是否是检查间隔的分钟的倍数。我已经把它做成了一个测试的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的移动停止。是否有可能使之成为自动的?如果你坐着摆姿势,那么多亏了计算器和良好的视力,你可以计算并手动设置停止 - 没问题。对交易者来说,让它自动运行是一个不错的主意,即使它有其缺点,但在一个良好的趋势中,跟踪止损将减少新手错误止损的风险。预先感谢你。
它简单明了--在图表上显示图形对象,特别是带有所需数据的文本标签,并在每次打勾 时更新它们。
如果你不知道该如何处理它们,请尝试找到正确的方法;)
然后,如果RSI水平在20分钟前被越过,我们就检查价格,即对于空头来说,价格应该低于20分钟前。非常感谢你。如果一切顺利,我将被指控承诺))。
Artyom Trishkin:
Мы сможем "сейчас" проверить цену "тогда" лишь только открытия/закрытия/хай/лоу свечи, соответствующей тому времени - нету в МТ4 тиковой истории. Поэтому нужно найти пересечение на минутках для наиболее точного определения цены из имеющихся в наличии возможностей. Но что вы имеете в виду под пересечением RSI ?
这很简单,也很直接--你在图表上显示图形对象,特别是--带有所需数据的文本标签,并在每次打勾 时更新它们。
而kodobase 中不同的拖网是一打的--寻找合适的;)
非常感谢......,我们将寻找它))
一切都很容易和简单--显示图形对象,特别是--在图表上显示所需数据的文本标签,并在每个刻度 上更新它们。
而kodobase 中不同的拖网是一打的--找到适合自己的;)