EA: 抛光层

 

抛光层:

智能交易系统基于以下指标: RSI, WPR, 随机振荡, 移动均线, deMarker

抛光层测试

作者: Vladimir Karputov

 

你好,弗拉基米尔、

我需要一个跟踪止损,请把它写入代码中。


非常感谢

 

你好,弗拉基米尔、

我想把几个指标的结果合并起来,然后从结果中提取出来。我该怎么做呢?

 
csezo2 :

你好,弗拉基米尔、

我想把几个指标的结果合并起来,然后从结果中提取出来。我该怎么做?

请详细描述您的操作。展示代码。告诉我还需要做些什么。

 
如何正确插入代码?还是直接复制粘贴?我可以看到 Alt+S功能,但不知道它是如何工作的。
 
csezo2:
如何正确插入代码?还是直接复制粘贴?我可以看到 Alt+S功能,但不知道它是如何工作的。

关于交易、自动交易系统和交易策略测试的论坛

论坛的一般规则和最佳做法。

Alain Verleyen, 2017.07.19 11:03

当您发布代码时,请使用 SRC 按钮 !

编辑器中的代码按钮

谢谢。

 
 
#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
 
我想引出随机 指数乘以 RSI 的结果。
 
csezo2 :
我想得出 随机指数乘以 RSI 的结果。

我不明白

请尝试用其他语言解释或画图。