你好,弗拉基米尔、
我需要一个跟踪止损,请把它写入代码中。
非常感谢
你好,弗拉基米尔、
我想把几个指标的结果合并起来,然后从结果中提取出来。我该怎么做呢?
csezo2 :
你好,弗拉基米尔、
我想把几个指标的结果合并起来,然后从结果中提取出来。我该怎么做?
请详细描述您的操作。展示代码。告诉我还需要做些什么。
#include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\AccountInfo.mqh> CPositionInfo m_position; // 交易位置对象 CTrade m_trade; // 交易对象 CSymbolInfo m_symbol; // 符号信息对象 CAccountInfo m_account; // 账户信息包装器 //--- 输入参数 input ENUM_TIMEFRAMES per_kis = PERIOD_M15; input ENUM_TIMEFRAMES per_nagy = PERIOD_H1; input int kis_trend_gyors_per= 99; input int kis_trend_lassú_per= 99; input int nagy_trend_gyors_per= 99; input int nagy_trend_lassú_per= 99; input ENUM_MA_METHOD MA_method_kis = MODE_SMA; input ENUM_MA_METHOD MA_method_nagy = MODE_SMA; input int ST_indikátor_periódus = 14; input int RSI_indikátor_periódus = 14; input int STh_alsó = 20; input int ST_lassuló = 3; input ushort TakeProfit=11111; input ushort StopLoss=90; input ushort TrailingStop=20; input double Lots=0.1; ulong m_magic=1; // 神奇数字 ulong m_slippage=30; // 滑动 int handle_iMA_kis_trend_gyors; // 用于存储 iMA 指标句柄的变量 int handle_iMA_kis_trend_lassú; int handle_iMA_nagy_trend_gyors; int handle_iMA_nagy_trend_lassú; int handle_iRSI; int handle_iStochastic_M15; // 用于存储 iStochastic 指标句柄的变量 ENUM_ACCOUNT_MARGIN_MODE m_margin_mode; double m_adjusted_point; // 点值调整为 3 点或 5 点 //+------------------------------------------------------------------+ //| 专家初始化函数| //+------------------------------------------------------------------+ int OnInit() { SetMarginMode(); if(!IsHedging()) { Print("Hedging only!"); return(INIT_FAILED); } if(TrailingStop>=TakeProfit) { Print("Error! TrailingStop>=TakeProfit!"); return(INIT_PARAMETERS_INCORRECT); } //--- m_symbol.Name(Symbol()); // 设置符号名称 if(!RefreshRates()) { Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()), ", Ask=",DoubleToString(m_symbol.Ask(),Digits())); return(INIT_FAILED); } m_symbol.Refresh(); //--- m_trade.SetExpertMagicNumber(m_magic); //--- m_trade.SetDeviationInPoints(m_slippage); //--- 调整 3 或 5 位数 int digits_adjust=1; m_adjusted_point=m_symbol.Point()*digits_adjust; //--- 创建指标 iMA 的句柄 handle_iMA_kis_trend_gyors=iMA(m_symbol.Name(),per_kis,kis_trend_gyors_per,0, MA_method_kis,PRICE_CLOSE); //--- 创建指标 iMA 的句柄 handle_iMA_kis_trend_lassú=iMA(m_symbol.Name(),per_kis,kis_trend_lassú_per ,0,MA_method_kis , PRICE_CLOSE ); //--- 创建指标 iMA 的句柄 handle_iMA_nagy_trend_gyors=iMA(m_symbol.Name(),per_nagy,nagy_trend_gyors_per ,0, MA_method_nagy , PRICE_CLOSE ); //--- 创建指标 iMA 的句柄 handle_iMA_nagy_trend_lassú=iMA(m_symbol.Name(),per_nagy,nagy_trend_lassú_per ,0, MA_method_nagy , PRICE_CLOSE ); //--- 创建指标 iRSI 的句柄 handle_iRSI=iRSI(m_symbol.Name(),per_kis,RSI_indikátor_periódus, PRICE_CLOSE); //--- 创建指标 iStochastic 的句柄 handle_iStochastic_M15=iStochastic(m_symbol.Name(),per_kis,ST_indikátor_periódus,3,ST_lassuló,MODE_SMA,STO_CLOSECLOSE); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 专家去初始化函数| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| 专家勾选功能| //+------------------------------------------------------------------+ void OnTick() { if(kis_trend_gyors_per>=kis_trend_lassú_per || nagy_trend_gyors_per>=nagy_trend_lassú_per) return; static datetime PrevBars=0; datetime time_0=iTime(0); if(time_0==PrevBars) return; PrevBars=time_0; //--- вычисляем начальные параметры индикаторов для поиска условий входа double MA_kis_trend_gyors = iMAGet(handle_iMA_kis_trend_gyors,0); double MA_kis_trend_lassú = iMAGet(handle_iMA_kis_trend_lassú,0); double MA_nagy_trend_gyors = iMAGet(handle_iMA_nagy_trend_gyors,0); double MA_nagy_trend_lassú = iMAGet(handle_iMA_nagy_trend_lassú,0); double Stoh_fast = iStochasticGet(MAIN_LINE,0); double Stoh_fast_prew=iStochasticGet(MAIN_LINE,1); double RSI0 = iRSIGet(0); double RSI1 = iRSIGet(1); double StRSI=(Stoh_fast*RSI0)/100;//------------------------------------------------------------------------ I would like to draw out these outcomes. double StRSI_prew=(Stoh_fast_prew*RSI1)/100;//-------------------------------------------------------------- double price_M15=iClose(1,NULL,per_kis); bool Long=false; if(MA_kis_trend_gyors>MA_kis_trend_lassú && MA_nagy_trend_gyors>MA_nagy_trend_lassú) Long=true; if(!Long ) return; //--- проверка условий для совершения сделки if(Long==true ) { if( StRSI>STh_alsó && StRSI_prew<=STh_alsó ) { if(!RefreshRates()) return; //--- 在发送订单前检查交易量,以避免出现 "资金不足 "错误 (CTrade) double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),Lots,m_symbol.Ask(),ORDER_TYPE_BUY); if(chek_volime_lot!=0.0) if(chek_volime_lot>=Lots) { Print("BUY разница (MA_M15-price_M15) = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits()), " MA_M15 = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits()), " price_M15 = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits())); double sl=m_symbol.NormalizePrice(m_symbol.Bid()-StopLoss*m_adjusted_point); double tp=m_symbol.NormalizePrice(m_symbol.Bid()+TakeProfit*m_adjusted_point); if(m_trade.Buy(Lots,NULL,m_symbol.Ask(),sl,tp)) { if(m_trade.ResultDeal()==0) Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); else Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } else Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } } } //--- трейлинг if(TrailingStop==0) return; for(int i=PositionsTotal()-1;i>=0;i--) if(m_position.SelectByIndex(i)) // 通过索引选择位置,以便进一步访问其属性 if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic) { if(m_position.PositionType()==POSITION_TYPE_BUY) { if(!RefreshRates()) continue; if(m_symbol.Bid()-m_position.PriceOpen()>TrailingStop*m_adjusted_point) { if(m_position.StopLoss()<m_symbol.Bid()-TrailingStop*m_adjusted_point) { if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_symbol.Bid()-TrailingStop*m_adjusted_point), m_position.TakeProfit())) Print("PositionModify -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } } } } //--- return; } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void SetMarginMode(void) { m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ bool IsHedging(void) { return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING); } //+------------------------------------------------------------------+ //| 刷新符号报价数据| //+------------------------------------------------------------------+ bool RefreshRates() { //--- 刷新率 if(!m_symbol.RefreshRates()) return(false); //--- 防止返回值为 "零" if(m_symbol.Ask()==0 || m_symbol.Bid()==0) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| 获取 iMA 缓冲区的值| //+------------------------------------------------------------------+ double iMAGet(int handle_iMA,const int index) { double MA[1]; //--- 重置错误代码 ResetLastError(); //--- 用索引为 0 的指示器缓冲区中的值填充 iMABuffer 数组的一部分 if(CopyBuffer(handle_iMA,0,index,1,MA)<0) { //--- 如果复制失败,请告知错误代码 PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError()); //----结果为零时退出----这意味着指标被视为未计算 return(0.0); } return(MA[0]); } //+------------------------------------------------------------------+ //| 获取 iStochastic | 缓冲区的值 //| 缓冲区编号如下:| //| 0 - main_line,1 - signal_line| //+------------------------------------------------------------------+ double iStochasticGet(const int buffer,const int index) { double Stochastic[1]; //--- 重置错误代码 ResetLastError(); //--- 用索引为 0 的指标缓冲区中的值填充 iStochasticBuffer 数组的一部分 if(CopyBuffer(handle_iStochastic_M15,buffer,index,1,Stochastic)<0) { //--- 如果复制失败,请告知错误代码 PrintFormat("Failed to copy data from the iStochastic indicator, error code %d",GetLastError()); //----结果为零时退出----这意味着指标被视为未计算 return(0.0); } return(Stochastic[0]); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 获取 iRSI 缓冲区的值| //+------------------------------------------------------------------+ double iRSIGet(const int index) { double RSI[1]; //--- 重置错误代码 ResetLastError(); //--- 用索引为 0 的指标缓冲区中的值填充 iRSI 数组的一部分 if(CopyBuffer(handle_iRSI,0,index,1,RSI)<0) { //--- 如果复制失败,请告知错误代码 PrintFormat("Failed to copy data from the iRSI indicator, error code %d",GetLastError()); //----结果为零时退出----这意味着指标被视为未计算 return(0.0); } return(RSI[0]); } //+------------------------------------------------------------------+ //| 获取指定条形指数的收盘价| //+------------------------------------------------------------------+ double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=per_kis; double Close[1]; double close=0; int copied=CopyClose(symbol,timeframe,index,1,Close); if(copied>0) close=Close[0]; return(close); } //+------------------------------------------------------------------+ //| 获取指定条形指数的时间| //+------------------------------------------------------------------+ datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=per_kis; datetime Time[1]; datetime time=0; int copied=CopyTime(symbol,timeframe,index,1,Time); if(copied>0) time=Time[0]; return(time); } //+------------------------------------------------------------------+
结合 "抛光层 "和 "获取趋势"。我用空白背景突出了这个问题。
csezo2:
结合 "抛光层 "和 "获取趋势"。我用空白背景突出了这个问题。
结合 "抛光层 "和 "获取趋势"。我用空白背景突出了这个问题。
//--- 创建指标 iMA 的句柄 handle_iMA_kis_trend_gyors=iMA(m_symbol.Name(),per_kis,kis_trend_gyors_per,0,MA_method_kis,PRICE_CLOSE); //--- 如果没有创建句柄 if(handle_iMA_kis_trend_gyors==INVALID_HANDLE) { //--- 报告故障并输出错误代码 PrintFormat("Failed to create handle \"handle_iMA_kis_trend_gyors\" of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //---指标提前停止 return(INIT_FAILED); } //--- 创建指标 iMA 的句柄 handle_iMA_kis_trend_lassú=iMA(m_symbol.Name(),per_kis,kis_trend_lassú_per,0,MA_method_kis,PRICE_CLOSE); //--- 如果没有创建句柄 if(handle_iMA_kis_trend_lassú==INVALID_HANDLE) { //--- 报告故障并输出错误代码 PrintFormat("为符号 %s/%s 创建 iMA 指标句柄失败,错误代码 %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //---指标提前停止 return(INIT_FAILED); } //--- 创建指标 iMA 的句柄 handle_iMA_nagy_trend_gyors=iMA(m_symbol.Name(),per_nagy,nagy_trend_gyors_per,0,MA_method_nagy,PRICE_CLOSE); //--- 如果没有创建句柄 if(handle_iMA_nagy_trend_gyors==INVALID_HANDLE) { //--- 报告故障并输出错误代码 PrintFormat("Failed to create handle \"handle_iMA_nagy_trend_gyors\" of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //---指标提前停止 return(INIT_FAILED); } //--- 创建指标 iMA 的句柄 handle_iMA_nagy_trend_lassú=iMA(m_symbol.Name(),per_nagy,nagy_trend_lassú_per,0,MA_method_nagy,PRICE_CLOSE); //--- 如果没有创建句柄 if(handle_iMA_nagy_trend_lassú==INVALID_HANDLE) { //--- 报告故障并输出错误代码 PrintFormat("为符号 %s/%s 创建 iMA 指标句柄失败,错误代码 %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //---指标提前停止 return(INIT_FAILED); } //--- 创建指标 iRSI 的句柄 handle_iRSI=iRSI(m_symbol.Name(),per_kis,RSI_indikátor_periódus,PRICE_CLOSE); //--- 如果没有创建句柄 if(handle_iRSI==INVALID_HANDLE) { //--- 报告故障并输出错误代码 PrintFormat("Failed to create handle \"handle_iRSI\" of the iRSI indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //---指标提前停止 return(INIT_FAILED); } //--- 创建指标 iStochastic 的句柄 handle_iStochastic_M15=iStochastic(m_symbol.Name(),per_kis,ST_indikátor_periódus,3,ST_lassuló,MODE_SMA,STO_CLOSECLOSE); //--- 如果没有创建句柄 if(handle_iStochastic_M15==INVALID_HANDLE) { //--- 报告故障并输出错误代码 PrintFormat("Failed to create handle \"handle_iStochastic_M15\" of the iStochastic indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //---指标提前停止 return(INIT_FAILED); }
//-----------------------------------我想引出这些结果。 double StRSI=(Stoh_fast*RSI0)/100.0; double StRSI_prew=(Stoh_fast_prew*RSI1)/100.0; //---
附加的文件:
1.mq5
33 kb
csezo2 :
我想得出 随机指数乘以 RSI 的结果。
我想得出 随机指数乘以 RSI 的结果。
我不明白。
请尝试用其他语言解释或画图。
抛光层:
智能交易系统基于以下指标: RSI, WPR, 随机振荡, 移动均线, deMarker
作者: Vladimir Karputov