1. 概述
本文基于一系列新的研究,这些研究展示了一些基于RSI的交易技术。交易技巧是使用指标的一种方式。本研究基于mql5编码语言。
添加图片注释,不超过 140 字(可选)
2. RSI简介
RSI代表相对强度指数,这是一种技术分析指标,用于衡量股票、货币或商品等证券的强度和动量。RSI是使用数学公式计算的,并绘制在图表上,以直观地表示给定时期内证券的强弱程度。
RSI基于这样一个原则,即随着价格上涨,证券变得超买,而随着价格下跌,证券变得超卖。RSI帮助交易者识别潜在的趋势反转或价格修正。
RSI计算包括将证券在给定时期的平均收益与证券在同一时期的平均损失进行比较。RSI的默认版本绘制在0到100的范围内,读数高于70被视为超买,读数低于30被视为超卖。RSI在交易员中是一个受欢迎的指标,因为它可以提供潜在市场趋势的早期预警信号。例如,如果一种证券的RSI持续上升并达到70以上的水平,这可能表明该证券超买,应进行调整。另一方面,如果RSI持续下跌并达到30以下的水平,这可能表明该证券超卖,并将出现反弹。
值得注意的是,RSI不应单独用作做出交易决策的唯一依据。交易员通常将RSI与其他技术分析工具和市场指标结合使用,以更全面地了解市场状况,并做出明智的交易决策。一般来说,RSI是以周期数14来计算的。
3. 什么是RSI(更深入的描述)。
3.1概述
相对强弱指数(RSI)是一种用于金融市场分析的技术指标。它旨在根据最近交易期的收盘价绘制股票或市场的当前和历史强弱。指标不应与相对强度混淆。
RSI被归类为动量振荡器,用于测量价格波动的速度和幅度。动量是指价格上涨或下跌的速度。相对强度RS以较高收盘价与较低收盘价的比率给出。具体地说,计算收盘价变化绝对值的两个平均值,即蜡烛图中蜡烛大小的两个总和。RSI将动量计算为较高收盘价与总收盘价的比率:具有更多或更强正变化的股票比具有更多或更强烈负变化的股票具有更高的RSI。
RSI最常用于14天的时间段,尺度范围是从0到100,高水平和低水平分别标记为70和30。更短或更长的时间框架对应用于更短或更长的展望。高和低水平——80和20,或90和10——出现的频率较低,但表明动量更强。
相对强度指数由J. Welles Wilder 开发,并发表在1978年出版的《技术交易系统中的新概念》一书和1978年6月出版的《商品》杂志(现为《现代交易员》杂志)上。它已成为最受欢迎的振荡指数之一。
RSI提供信号,告诉投资者在证券或货币超卖时买入,在超买时卖出。
Marek和Šedivá(2017)对具有推荐参数的RSI及其日常优化进行了测试,并与其他策略进行了比较。该测试在时间和公司(例如,苹果、埃克森美孚、IBM、微软)中是随机的,表明RSI仍然可以产生良好的结果;然而,在较长的时间范围内,它通常被简单的买入和持有策略击败。
. 代码
//+------------------------------------------------------------------+
//| RSI Deep Three Move.mq5 |
//| Javier S. Gastón de Iriarte Cabrera |
//| https://https://www.mql5.com/en/users/jsgaston/news |
//+------------------------------------------------------------------+
#property copyright "Javier S. Gastón de Iriarte Cabrera"
#property link "https:/Javier Santiago Gaston De Iriarte Cabrera"
#property version "1.01"
#property script_show_inputs
#include <GetIndicatorBuffers.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
CPositionInfo m_position; // object of CPositionInfo class
CTrade m_trade; // object of CTrade class
CSymbolInfo m_symbol; // object of CSymbolInfo class
CAccountInfo m_account; // object of CAccountInfo class
CTrade trade;
CTrade Ctrade;
input string Expert_Title ="RSI Deep Three Move Strategy"; // Document name
enum ENUM_LOT_TYPE
{
LOT_TYPE_FIX = 0, // fix lot
LOT_TYPE_RISK = 1, // risk %
};
//--- input parameters
input ENUM_LOT_TYPE inp_lot_type = LOT_TYPE_FIX; // type of lot
input double inp_lot_fix = 0.01; // fix lot
input double inp_lot_risk = 0.01;
input bool InpPrintLog = false; // Print log
ulong Expert_MagicNumber =11777;
bool Expert_EveryTick =false;
input ENUM_TIMEFRAMES my_timeframe=PERIOD_CURRENT; // Timeframe
input ENUM_APPLIED_PRICE Inp_RSI_applied_price = PRICE_CLOSE; // RSI: type of price
input int InpPeriodRSI=8; // Period of the signal for the RSI inside custom
int handle_iCustom;
input int ptsl = 5000; // points for stoploss
input int pttp = 5000; // points for takeprofit
string Orden;
double sl2;
double tp2;
这是一段用MQL5语言编写的复杂代码。这是一种使用相对强弱指数(RSI)来识别潜在交易机会的交易策略。该代码包括各种类的使用,如CPositionInfo、CTrade、CSymbolInfo和CAccountInfo。它还包括各种输入参数的使用,如手数类型、固定手数、风险百分比、EA交易标题、幻数、时间框架、RSI平均期、价格类型以及止损和获利点。该代码还包括对handle_iRSI2、handle_iCustom、Orden、sl和tp等变量的使用。此代码的目的是根据RSI指标识别潜在的交易机会。
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
handle_iCustom=iCustom(_Symbol,my_timeframe,"\\Indicators\\Examples\\RSI",InpPeriodRSI);
if(handle_iCustom==INVALID_HANDLE)
{
//--- tell about the failure and output the error code
PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
_Symbol,
EnumToString(my_timeframe),
GetLastError());
//--- the indicator is stopped early
return(INIT_FAILED);
}
//---
return(INIT_SUCCEEDED);
}
此代码是MQL5语言中EA交易初始化函数的一部分。它用于为给定交易品种和时间框架的iCustom指标创建句柄。它还为具有给定参数的iRSI指标创建句柄。如果无法创建iCustom指标的句柄,则会打印一条错误消息并停止指标。如果成功创建句柄,则初始化成功。
void OnTick()
{
MqlTick tick;
double last_price = tick.ask;
SymbolInfoTick(_Symbol,tick);
int total = PositionsTotal();
//---
// Retrieve the current value
MqlTradeResult result;
MqlRates rates[];
//---
double array_rsi[];
ArraySetAsSeries(array_rsi,true);
int start_pos=0,count=5;
if(!iGetArray(handle_iCustom,0,start_pos,count,array_rsi))
return;
string text="";
for(int i=0; i<count; i++)
text=text+IntegerToString(i)+": "+DoubleToString(array_rsi[i],Digits()+1)+"\n";
//---
Comment(text);
{
if(array_rsi[0] < array_rsi[1] && array_rsi[1] < array_rsi[2] && array_rsi[2] < array_rsi[3] && array_rsi[3] < 20.0 && array_rsi[4] > 20.0)