Ubzen系统开发过程 - 页 4

 
sakis:


我对这两个系统很感兴趣,它必须在市场改变方向时卖出。

如果你在3WLMA和100SMA之间做一个简单的交叉,在30分钟图上欧元/美元达到150点,并在交叉发生时退出,而不是SL,你将最终获得极端的利润。

我使用这个系统已经有一段时间了,看看结果,然后给我回信说有13%的收益。

这个系统(3LWMA 100SMA交叉)在欧元兑美元H1、H4和日线图上不起作用。
 
zzuegg:
这个系统(3LWMA 100SMA交叉)在欧元兑美元H1,H4和日线图上不起作用

嗨,Zzuegg,我知道它在30分钟图上工作,但只在欧元分钟图上工作,只是把系统本身与macd 分开。
 

sakis:

hi zzuegg i know that,

它在30分钟图表中工作,并且只在欧元中工作。

只需把系统本身与MACD分开就可以了。
 
sakis:


有些时候,系统在现场交易中比在自动交易中效果更好,因为人的眼睛,你永远不会在第6个交易日之前进入盘整状态。

在发生推力之前,也是如此。

因为你永远不会在重叠波发生之前采取逆势行动,并伴随着通道超调尖峰。

另外,当在1到2天的短时期内发生第3或第4次移动时,你们都会采取突破的方式,而且是高价位的突破,因为这意味着价格处于强势之中。

因此,我们需要过滤器来克服这个人眼。

 

好吧,这就是我所说的糟糕时期。现在,我打算倒着看,一次看1年。2009年、2008年等。

这里是每年的结果。

2010--Max-DD= 6.47____Rel-DD= 6.47____Net_Profit=4588____Factor=2.48
2009--Max-DD=26.76____Rel-DD=26.76____Net_Profit=-380____Factor=0.94
2008--Max-DD=19.79____Rel-DD=19.79____Net_Profit=1096____Factor=1.20
2007--Max-DD= 7.10____Rel-DD= 7.10____Net_Profit=1506____Factor=1.62
2006--Max-DD=20.46____Rel-DD=20.46____Net_Profit=-1612____Factor=0.63
2005--Max-DD=8.79____Rel-DD=8.79____Net_Profit= -23____Factor=0.99

2005----------------

2006-----------------

2007-----------------

2008--------------

2009 ------------------

2010----------------

有几个观察结果。

1)系统倾向于在一个行中输掉,而不是在大多数时候随机输掉。文章中的Z-Score可能有助于解决这个问题。

这有助于强调一个事实,即为什么专业交易员每年要寻找20-30%的回报。

 

现在我只能做回溯到2005年,因为我使用Fxdd的数据,在这里 找到。我使用这个数据的原因是Fxdd在周末关闭,就像我的经纪人一样,并且默认有周末的间隙。此外,他们的时间设置与我的经纪人的时间设置更接近。如果我有时间,我可能会在这里 测试2000-2005年的数据。他们的周开盘在周三开始,每周运行6天。

我最好的猜测是,这个系统以连续的方式亏损,因为它处于紧张或非常不稳定的区间内。但这只最适用于2008年,即使你盯着图表的经验有限,你也能猜到这可能与全球金融危机有关,市场在那个时候可能更多的是在恐惧中前进。

那么,现在该怎么做呢?

-接受结果(比如有一个亏损的年份是可以的),计算我们的凯利,不要贪婪?

-继续前进,进行更多的统计分析,如Z-Score。但是,即使我得到了关于损失之间的相关性的确认,然后呢?我可能还是要用其他方法来过滤数据,比如下面的方法。

-在糟糕的时期以视觉模式看这个东西,并试图避免什么东西杀死它?缺点是这可能会导致曲线拟合......如果过多的避免过去的知识只是为了使回测看起来不错。

-应用一些盲目的过滤器,如范围、波动率、时间、成交量等?这里的缺点是,过滤器限制了交易数量。例如:一次只做一个方向的交易或坚持长期趋势是大多数人没有意识到的过滤器的作用。我对这个系统唯一的不满是,它不够活跃,不能在合理的时间内将1000美元变成幸福,让大多数人感到高兴。但这可以通过在账户中加入其他稳定的系统来克服。

-最后一个但我最不喜欢的选项。将系统改变得更多。例如。

a) 方向上的头皮 - 缺点是我们需要tick数据。扎实的MM原则能与这样的附加物一起工作吗?

b) 金字塔方向 - 当价格顺着我们的方向时增加手数 - 缺点是当价格对我们不利时我们如何关闭它们?

c) 美元成本平均法 - 通过时间间隔但在获利前添加。缺点是没有考虑到形势的变化。

d) 网格法--在头寸对我们不利的情况下,增加相同的规模--缺点是导致RRR向上倾斜,而MM无法跟上。

e) 马丁格尔法/进步法(哈哈哈哈)在上述任何方法上。对于想把小账户变成大账户的人来说,这听起来很有吸引力。缺点是,肯定不能遵循正确的MM。

我个人倾向于称其为什么,并与MM一起继续前进。

我想知道其他人的想法,因为其他人可能觉得 "不可能,我需要更好的东西"。

 
ubzen:

现在我只能做回溯到2005年,因为我使用Fxdd的数据,在这里 找到。我使用这个数据的原因是Fxdd在周末关闭,就像我的经纪人一样,并且默认有周末的间隙。此外,他们的时间设置与我的经纪人的时间设置更接近。如果我有时间,我可能会在这里 测试2000-2005年的数据。他们的周开盘在周三开始,每周运行6天。

我最好的猜测是,这个系统以连续的方式亏损,因为它处于紧张或非常不稳定的区间内。但这只最适用于2008年,即使你盯着图表的经验有限,你也能猜到这可能与全球金融危机有关,市场在那个时候可能更多的是在恐惧中前进。

那么,现在该怎么做呢?

-接受结果(比如有一个亏损的年份是可以的),计算我们的凯利,不要贪婪?

-继续前进,进行更多的统计分析,如Z-Score。但是,即使我得到了关于损失之间的相关性的确认,然后呢?我可能还是要用其他方法来过滤数据,比如下面的方法。

-在糟糕的时期以视觉模式看这个东西,并试图避免什么东西杀死它?缺点是这可能会导致曲线拟合......如果过多的避免过去的知识只是为了使回测看起来不错。

-应用一些盲目的过滤器,如范围、波动率、时间、成交量等?这里的缺点是,过滤器限制了交易数量。例如:一次只做一个方向的交易或坚持长期趋势是大多数人没有意识到的过滤器的作用。我对这个系统唯一的不满是,它不够活跃,不能在合理的时间内将1000美元变成幸福,让大多数人感到高兴。但这可以通过在账户中加入其他稳定的系统来克服。

-最后一个但我最不喜欢的选项。将系统改变得更多。例如。

a) 方向上的头皮 - 缺点是我们需要tick数据。扎实的MM原则能与这样的附加物一起工作吗?

b) 金字塔方向 - 当价格顺着我们的方向时增加手数 - 缺点是当价格对我们不利时我们如何关闭它们?

c) 美元成本平均法 - 通过时间间隔但在获利前添加。缺点是没有考虑到形势的变化。

d) 网格法--在头寸对我们不利的情况下,增加相同的规模--缺点是导致RRR向上倾斜,而MM无法跟上。

e) 马丁格尔法/进步法(哈哈哈哈)在上述任何方法上。对于想把小账户变成大账户的人来说,这听起来很有吸引力。缺点是,肯定不能遵循正确的MM。

我个人倾向于称其为什么,并与MM一起继续前进。

我想知道其他人的想法,因为其他人可能觉得 "不可能,我需要更好的东西"。


你好。

方向上的金字塔似乎很强大,这正是我的版本所做的。我是用二级交易来做金字塔。

不幸的是,MAE告诉我们,平均数在这个策略中可能不起作用,我说不幸是因为我喜欢这样;)


但我的另一个问题是给菲利普的。

在你的脚本中,你正在调查订单打开和订单关闭之间的时间,但正如你的图表所示,你还应该调查打开/关闭之前和之后的一些时间,以便获得一个概览和正确的MAE/MFE计算?我是否走错了路?

 
zzuegg:

但我还有一个问题要问菲利普。

在你的脚本中,你正在调查订单开仓和订单平仓之间的时间,但正如你的图表所示,你还应该调查开仓/平仓之前和之后的一些时间,以便获得一个概览和正确的MAE/MFE计算?我是不是走错了路?


是的。 在每笔交易的基础上,你应该计算相对于MFE的时间,MAE的时间是先发生还是后发生。 MAE发生在MFE之前的交易被称为 "第一类"。 MFE发生在MAE之前的交易被称为 "类型2"。

表达你的策略的市场预测能力的一个简单指标是将第一类交易的发生率与总的交易数量相比较,然后乘以100%。 假设你在一年内有100笔交易,其中90笔是第一类交易,10笔是第二类交易。 所以你的 "预测成功率 "是90/100 x 100% = 90%。

具有较好的近期市场预测率的策略比不能正确预测近期市场方向的策略更受欢迎。 (因为所有明显的原因)
 

好的,明白了,但你是否也应该允许TimeToMAE与开盘时间相一致,成为负数和正数?当你提前进入交易时,ttoMAE为正,而当你晚些时候进入时,ttoMAE为负。当然,平均化这些数值可能会产生一个完美的策略,所以你也要看一下TToMAE的StdDev。

在我看来,你不允许负的ttoMAE。

通过引入WatchBarsBeforeOpen和WatchBarsAfterClose两个变量,我想我已经克服了这个问题。请注意,这仍然是正在进行的早期工作。ttoMAE和ttoMFE是在所使用的时间框架允许的范围内以分钟为单位的。

目前还没有分析结果,只有原始数据。

//+------------------------------------------------------------------+
//|                                      AdvancedReport_03_04_11.mq4 |
//|                                                           zzuegg |
//|                                       when-money-makes-money.com |
//+------------------------------------------------------------------+
#property copyright "zzuegg"
#property link      "when-money-makes-money.com"

extern int WatchBarsBeforeOpen=10;
extern int WatchBarsAfterClose=10;
extern int WatchPeriod=0;

int ticket[];
int mae[];
int mae.time[];
int mfe[];
int mfe.time[];
int mfee[];
int profit[];
int missed[];

void reportTrade(int trade){
   OrderSelect(trade,SELECT_BY_TICKET,MODE_HISTORY);
   int start   =(iBarShift(OrderSymbol(),WatchPeriod,OrderOpenTime(),false) +WatchBarsBeforeOpen)+1;
   int end     =iBarShift(OrderSymbol(),WatchPeriod,OrderCloseTime(),false) -WatchBarsAfterClose;
   int highest =iHighest (OrderSymbol(),WatchPeriod,MODE_HIGH,(start-end)+1,end);
   int lowest  =iLowest  (OrderSymbol(),WatchPeriod,MODE_LOW,(start-end)+1,end);
  // Print(OrderTicket()+"  "+start+"  "+end+"  "+highest+"  "+lowest);
   ArrayResize(ticket,ArraySize(ticket)+1);   
   ArrayResize(mae,ArraySize(mae)+1);
   ArrayResize(mae.time,ArraySize(mae.time)+1);
   ArrayResize(mfe,ArraySize(mfe)+1);
   ArrayResize(mfe.time,ArraySize(mfe.time)+1);
   ArrayResize(mfee,ArraySize(mfee)+1);
   ArrayResize(profit,ArraySize(profit)+1);
   ArrayResize(missed,ArraySize(missed)+1);
   
   //Print(TimeMinute(OrderOpenTime())+"  "+TimeMinute(OrderCloseTime())+"  "+TimeMinute(iTime(OrderSymbol(),WatchPeriod,lowest))+"  "+TimeMinute(iTime(OrderSymbol(),WatchPeriod,highest)));
   ticket[ArraySize(ticket)-1]            =OrderTicket();
   switch(OrderType()){
      case OP_BUY:{
         mae[ArraySize(mae)-1]            =(OrderOpenPrice()-iLow(OrderSymbol(),WatchPeriod,lowest))/MarketInfo(OrderSymbol(),MODE_POINT);
         mae.time[ArraySize(mae.time)-1]  =(OrderOpenTime()-iTime(OrderSymbol(),WatchPeriod,lowest))/60;
         mfe[ArraySize(mae)-1]            =(iHigh(OrderSymbol(),WatchPeriod,highest)-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);
         mfe.time[ArraySize(mae.time)-1]  =(OrderOpenTime()-iTime(OrderSymbol(),WatchPeriod,highest))/60;
         profit[ArraySize(profit)-1]      =(OrderClosePrice()-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);
         missed[ArraySize(missed)-1]      =(mae[ArraySize(mae)-1]+mfe[ArraySize(mfe)-1])-profit[ArraySize(profit)-1];
         mfee[ArraySize(mfee)-1]          =(mfe[ArraySize(mfe)-1])-profit[ArraySize(profit)-1];
      break;
      }
      case OP_SELL:{
         mae[ArraySize(mae)-1]            =(iHigh(OrderSymbol(),WatchPeriod,highest)-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);
         mae.time[ArraySize(mae.time)-1]  =(OrderOpenTime()-iTime(OrderSymbol(),WatchPeriod,highest))/60;
         mfe[ArraySize(mae)-1]            =(OrderOpenPrice()-iLow(OrderSymbol(),WatchPeriod,lowest))/MarketInfo(OrderSymbol(),MODE_POINT);
         mfe.time[ArraySize(mae.time)-1]  =(OrderOpenTime()-iTime(OrderSymbol(),WatchPeriod,lowest))/60;
         profit[ArraySize(profit)-1]      =(OrderOpenPrice()-OrderClosePrice())/MarketInfo(OrderSymbol(),MODE_POINT);
         missed[ArraySize(missed)-1]      =(mae[ArraySize(mae)-1]+mfe[ArraySize(mfe)-1])-profit[ArraySize(profit)-1]; 
         mfee[ArraySize(mfee)-1]          =(mfe[ArraySize(mfe)-1])-profit[ArraySize(profit)-1];      
      break;
      }
   }  
}

void writeCSV(string EA.name,string EA.parameter=""){
   int hnd=FileOpen(EA.name+"-"+EA.parameter+".csv",FILE_CSV | FILE_WRITE,";");
   FileWrite(hnd,"Ticket","MAE","TimeToMAE","MFE","TimeToMFE","MFEE","Profit","Missed");
   for(int i=0;i<ArraySize(mae);i++){
      FileWrite(hnd,ticket[i],mae[i],mae.time[i],mfe[i],mfe.time[i],mfee[i],profit[i],missed[i]);
   }
   FileClose(hnd);
}


void AdvancedReport.doStatistics(string EA.name,string EA.parameters="",int EA.limitMagicNumber=-1){
   for(int i=0;i<OrdersHistoryTotal();i++){
      OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
      if(OrderMagicNumber()==EA.limitMagicNumber || EA.limitMagicNumber==-1){
         reportTrade(OrderTicket());
      }
   }
   
   
   writeCSV(EA.name,EA.parameters);
}
 
ubzen:

好吧,这就是我所说的糟糕时期。现在,我打算倒着看,一次看1年。2009年、2008年等。

这里是每年的结果。

2010--Max-DD= 6.47____Rel-DD= 6.47____Net_Profit=4588____Factor=2.48
2009--Max-DD=26.76____Rel-DD=26.76____Net_Profit=-380____Factor=0.94
2008--Max-DD=19.79____Rel-DD=19.79____Net_Profit=1096____Factor=1.20
2007--Max-DD= 7.10____Rel-DD= 7.10____Net_Profit=1506____Factor=1.62
2006--Max-DD=20.46____Rel-DD=20.46____Net_Profit=-1612____Factor=0.63
2005--Max-DD=8.79____Rel-DD=8.79____Net_Profit= -23____Factor=0.99

2005----------------

2006-----------------

2007-----------------

2008--------------

2009 ------------------

2010----------------

有几个观察结果。

1)系统倾向于在一个行中输掉,而不是在大多数时候随机输掉。文章中的Z-Score可能有助于解决这个问题。

这有助于强调一个事实,即为什么专业交易员每年要寻找20-30%的回报。



当你拥有跨越数月和数年的投资回报率数据时,那么你就拥有了评估你未来毁灭风险所需的数据。

http://www.futuresmag.com/Issues/2009/August2009/Pages/Minimizing-your-risk-of-ruin.aspx

这种回测数据正是从回测结果中实际计算出一些可以利用来表明未来结果的数据。

Z-scores不能预测未来的结果,因为它们与时间序列有关,2009年的Z-score与2011年有关的唯一方法是,2011年的市场价格活动基本上是2009年的重复。

Z-score是一个有趣的评估统计数据,但它没有增加任何价值,也不能洞察你的策略将如何向前发展。 CTA、基金经理、晨星等不跟踪和报告专业管理账户的Z-score是有原因的。 它是一个毫无价值的成功指标。

虽然计算毁坏的风险,以及中位数缩减,这些都是专业人员所做的事情,而不仅仅是在外汇行业。

另外,就经纪人而言......使用不同的经纪人进行回溯测试,有点像穷人的努力,将他们的策略与基础时间序列的策略脱钩。 你不知道未来的时间序列会是什么样子,但没有两个经纪人过去的时间序列是相同的,所以在不同来源的广泛的历史数据集上进行回测,然后分析你的策略表现的稳健性是一个好主意,因为这种稳健性说明了你的策略在未来的时间序列上可以表现得多好。

专业人士也会针对不同的历史市场利率进行回测。 在某些情况下,他们使用蒙特卡洛方法创建完全虚构的市场数据,在统计学上等同于实际市场数据,以加强他们的回测。

只是供大家思考,你很可能知道所有这些,并有你自己同样合理的理由来选择追求其他分析方法。