为什么我的EA在回测时一直给出负利润? - 页 2

 
deVries:

我已经重写了你的代码,并进行了测试,也看到了设置。

虽然没有最好的回溯数据,但如果你做得对的话,是可以盈利的。

策略测试报告
RSI_strategy_cyxstudio
AlpariUK-Demo - Micro+Classic (Build 451)

符号欧元兑美元(欧元对美元)
时间每日(D1) 2010.10.01 00:00 - 2013.01.29 00:00 (2010.10.01 - 2013.01.30)
模型Every tick (基于所有可用的最小时间框架的最精确方法)
参数RSIPeriod=3; UpperBound=90; LowerBound=5; MASlowPeriod=200; MAFastPeriod=5; Lots=0.1; StopLoss=60; TakeProfit=120; TrailingStop=40; MagicNumber=54333; CommentEA="RSI策略"; Slippage.Pips=3;
测试中的交易棒1603模拟的点数40187739建模质量不适用
不匹配的图表错误2062601
初始存款3000.00
总净利润967.18毛利润2226.34毛亏损-1259.16
利润因素1.77预期报酬率13.62
绝对缩水107.10最大跌幅327.47 (7.99%)相对缩减7.99% (327.47)
交易总额71空头头寸(赢得%)66 (69.70%)多头头寸(韩元%)5 (80.00%)
盈利交易(占总数的百分比)50 (70.42%)亏损交易(占总数的%)21 (29.58%)
最大的盈利交易120.07亏损交易-60.00
平均值盈利交易44.53亏损交易-59.96
最多连胜(以金钱计算的利润)8 (424.26)连续亏损(以金钱计算的亏损)3 (-179.93)
最大的连续盈利(赢钱的次数)424.26 (8)连续亏损(亏损数)-179.93 (3)
平均数连赢4连败2


我以不同的方式写了至少7-10次,但它要么根本没有执行任何头寸,要么是负利润......你是怎么做到的?????
 
RaptorUK:
这让我觉得有什么地方不对。


    if (BUYS<1 && CurrentRSI < LowerBound && pAsk > MA200) 
        {    //Condition to execute buy entry  
         Ticket = OrderSend(Symbol(), OP_BUY,......


// LowerBound=5


  if (SELLS<1 && CurrentRSI > UpperBound && pBid > MA200) 
      {     //Condition to execute sell entry
       Ticket = OrderSend(Symbol(), OP_SELL, Lots,......


// UpperBound=90
通常情况下是的,但在这种情况下不是,它是由cyxstudio 为RSI选择的 设置完成的。
 
deVries:

我已经重写了你的代码,并进行了测试,也看到了设置。

虽然没有最好的回溯数据,但如果你做得对的话,是可以盈利的。

策略测试报告
RSI_strategy_cyxstudio
AlpariUK-Demo - Micro+Classic (Build 451)

符号欧元兑美元(欧元对美元)
时间每日(D1) 2010.10.01 00:00 - 2013.01.29 00:00 (2010.10.01 - 2013.01.30)
模型Every tick (基于所有可用的最小时间框架的最精确方法)
参数RSIPeriod=3; UpperBound=90; LowerBound=5; MASlowPeriod=200; MAFastPeriod=5; Lots=0.1; StopLoss=60; TakeProfit=120; TrailingStop=40; MagicNumber=54333; CommentEA="RSI策略"; Slippage.Pips=3;
测试中的交易棒1603模拟的点数40187739建模质量不适用
不匹配的图表错误2062601
初始存款3000.00
总净利润967.18毛利润2226.34毛亏损-1259.16
利润因素1.77预期报酬率13.62
绝对缩水107.10最大跌幅327.47 (7.99%)相对缩减7.99% (327.47)
交易总额71空头头寸(赢得%)66 (69.70%)多头头寸(韩元%)5 (80.00%)
盈利交易(占总数的百分比)50 (70.42%)亏损交易(占总数的%)21 (29.58%)
最大的盈利交易120.07亏损交易-60.00
平均值盈利交易44.53亏损交易-59.96
最多连胜(以金钱计算的利润)8 (424.26)连续亏损(以金钱计算的亏损)3 (-179.93)
最大的连续盈利(赢钱的次数)424.26 (8)连续亏损(亏损数)-179.93 (3)
平均数连赢4连败2


请让我看看你的代码,我需要研究它并从我的错误中学习。
 
deVries:
通常情况下是的,但在这种情况下不是,它是由cyxstudio 为RSI选择的 设置完成的。
啊,好的,如果你能解释,那么就没有理由担心了;-)
 

上限为90,下限为10

策略测试报告
RSI_strategy_cyxstudio
AlpariUK-Demo - Micro+Classic (Build 451)

符号EURUSD (欧元对美元)
时间每日(D1) 2010.10.01 00:00 - 2013.01.29 00:00 (2010.10.01 - 2013.01.30)
模型Every tick (基于所有可用的最小时间框架的最精确方法)
参数RSIPeriod=3; UpperBound=90; LowerBound=10; MASlowPeriod=200; MAFastPeriod=5; Lots=0.1; StopLoss=60; TakeProfit=120; TrailingStop=40; MagicNumber=54333; CommentEA="RSI策略"; Slippage.Pips=3。
测试中的交易棒1603模拟的点数40187739建模质量不适用
不匹配的图表错误2062601
初始存款3000.00
总净利润782.62毛利润3062.38毛损失-2279.76
利润因素1.34预期报酬率7.38
绝对缩水106.90最大跌幅400.70 (9.90%)相对缩减9.90% (400.70)
总交易量106空头头寸(赢得%)66 (69.70%)多头头寸(韩元%)40 (55.00%)
盈利交易(占总数的百分比)68 (64.15%)亏损交易(占总数的百分比)38 (35.85%)
最大的盈利交易120.07亏损交易-60.12
平均值盈利交易45.04亏损交易-59.99
最多连胜(以金钱计算的利润)8 (425.96)连续亏损(以金钱计算的亏损)4 (-240.12)
最大的连续盈利(赢钱的次数)490.51 (6)连续亏损(亏损数)-240.12 (4)
平均数连赢3连败2

这看起来如何

 
cyxstudio:

请让我看看你的代码,我需要研究它并从我的错误中学习。

这是开始.....

把你的评论.....,说说到目前为止和你有什么不同......

//+------------------------------------------------------------------+
//|                                       RSI_strategy_cyxstudio.mq4 |
//|                                  Copyright 2013, Tjipke de Vries |
//|                                     https://forum.mql4.com/53695/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


extern int RSIPeriod        =  3;      //number of periods for RSI
extern double UpperBound    =  90;     //set upper bound value for RSI
extern double LowerBound    =  5;      //set lower bound value for RSI
extern int MASlowPeriod     = 200;
extern int MAFastPeriod     = 5;
extern double Lots  = 0.1;
extern double StopLoss      = 60;       //Set the stop loss level
extern double TakeProfit    = 120;       //Set the take profit level
extern double TrailingStop = 40;
//extra settings for OrderSend
extern int        MagicNumber = 54333;
extern string     CommentEA = "RSI strategy";
extern int        Slippage.Pips    = 3;


int    BUYS=1,SELLS=1;
//++++ These are adjusted for 5 digit brokers.
int     pips2points;      // slippage  3 pips    3=points    30=points
double  pips2dbl;         // Stoploss 15 pips    0.015      0.0150
int     Digits.pips;      // DoubleToStr(dbl/pips2dbl, Digits.pips)
//---
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----   
   if(Digits % 2 == 1)  // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
     {pips2dbl = Point*10; pips2points = 10;   Digits.pips = 1;}
     else {pips2dbl = Point;    pips2points =  1;   Digits.pips = 0;}
     // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl        
//----      

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Ticket;
   double SL,TP;
   int Total;
   
   double pAsk = MarketInfo(Symbol(), MODE_ASK);
   double pBid = MarketInfo(Symbol(), MODE_BID);
   double MA200 = iMA(NULL, 1440, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 1440, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average
   double CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
   
   
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   
   if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


   if(OrdersTotal()<1)
        {
         BUYS=0;
         SELLS=0;
        } 

然后阅读https://www.mql5.com/en/forum/139654,并尝试做一个循环检查交易的倒数。

 
deVries:

这是开始.....

把你的评论.....,说说到目前为止和你有什么不同......

然后阅读https://www.mql5.com/en/forum/139654,并尝试做一个循环倒数检查交易。


它并不完整...

我现在正试图填写其余部分并测试它...

顺便说一下,当一个简单的Ask可以返回相同的值时,你为什么要使用

double pAsk = MarketInfo(Symbol(), MODE_ASK);  
 
cyxstudio:


它并不完整...

我现在正试图填补其余部分并进行测试......

顺便说一下,当一个简单的Ask可以返回相同的值时,你为什么要使用

Ask可以是过时的,上面的调用将是最新的,不需要调用RefreshRates()。
 

另外,int BUYS=1,SELLS=1;是指是否已经开仓的指标,对吗?

我在我自己的脚本中添加了,当我用策略测试器 测试20天时......什么都没有发生,没有交易被执行。

 
cyxstudio:

另外,int BUYS=1,SELLS=1;是指是否已经开仓的指标,对吗?

我加入了自己的脚本,当我用策略测试器测试了20天......什么都没有发生,没有交易被执行。

当你启动你的Metatrader时,EA必须找出是否有一笔交易。

如果有交易,我只做了检查 交易的循环倒计时。

如果我在一开始就把它设置为1,并且OrdersTotal()>0,那么我就让它检查交易,如果(.......> ||.......> ){做循环....