我不擅长统计......但我不认为你可以把点差和轮盘上的0等同起来。 无论输赢,点差都要支付。 轮盘上的0只是意味着如果你玩红色或黑色,你的胜率低于50% ... 18:19或48.65%。
我想你要找的是,由于点差的影响,什么样的交易能带来48.65%的有效赢率。 我想如果你的交易是20个点,点差是1个点,这将给你带来你想要的结果 ...... 风险=21,回报20 ...... 我认为,不要引用我的话;-)
很高兴你有不同的想法,这也是我试图回答的主要问题之一,因为我相信它可以被等同起来。我确实知道,你在轮盘上每下一美元,就有一个预期损失,这相当于你的胜率和你的50/50比率之间的差异。例如,如果你在轮盘上没有0/Green,那么从长远来看,你会玩一个平衡的游戏。然而,由于只有48.65%的机会,你每下注100美元就会有1.35美元的持续损失。
这与点差的唯一区别是....,每次交易时你都必须支付点差,无论结果是输是赢。
现在的下一步是让我进行一些模拟。第一次使用随机交易,寻找20个点的止损和20个点的止盈(当然不包括1个点的点差,使得总损失为21个点,希望能创造我所寻找的赔率)。显然,这个测试中的交易/样本越多越好。嗯,我想知道是否有人认为与轮盘相比,它不会有类似的结果?
好吧,伙计们,我们有一些数据。
color Color; double Sl; double Tp; double Pips; double Price; void start(){ if(OrdersTotal()==0){ int Dir=MathRand()%2; Pips=Point; if(Digits==3){Pips=0.01;}if(Digits==5){Pips=0.0001;} if(Dir==0){Price=Ask; Sl=Ask-20*Pips; Tp=Ask+20*Pips; Color=Blue;} if(Dir==1){Price=Bid; Sl=Bid+20*Pips; Tp=Bid-20*Pips; Color=Red;} int Ticket=OrderSend(Symbol(),Dir,0.1,Price,999,0,0,"",0,0,Color); if(Ticket>-1){ if(OrderSelect(Ticket, SELECT_BY_TICKET)){ OrderModify(Ticket,OrderOpenPrice(),Sl,Tp,0,Color); } } } }
现在肯定有一些19.9倍的利润和损失在里面。然而,盈利的交易%是不言而喻的。
结果是比轮盘赌还要差,但那是由于标准误差,或任何缓冲统计需要。其他人可能会运行它,得到稍高或稍低的值,但是,我相信它的数学期望值 与轮盘赌相同。伙计,如果这还不能把不知道这一点的交易员吓得魂飞魄散,那就没有别的办法了。
总之,继续前进。当我早些时候知道的时候,下一个合乎逻辑的步骤是做一个mql4模拟的随机数字,看看它们是否在0-36之间的任何地方着陆,如果是偶数,就在我的运行总数上加1美元(从100,000美元开始),如果是奇数或0,就减1美元。如果他们不知道,可以在网上查找。所以,我就跳过这一步。
但无论如何,我们是交易员,对吧,笑。我们不相信市场是随机的,我们相信我们可以预测市场,有一定的成功概率。因此,至少对我来说,下一步将是建立一个预测方法与随机条目的对比。但我的下一个问题是,考虑到我们在交易中使用的所有过滤器,我们不会有任何接近这个数量的样本,我们如何将一个交易系统与此进行比较?
好的,我仍在等待对我上述问题的建议。在主要时间,我将提出2个系统。其中一个我称其为系统14,来自http://forex-strategies-revealed.com/simple/simple-trading-with-daily-range。另一个我称之为 "奥斯卡的磨练",来自http://www.blackjackforumonline.com/content/Betting_Systems_Oscars_Blackjack_System.htm。
关于系统14的几句话:这是我能找到的该网站高级部分中反应最强烈的主题。它的代码看起来很简单,而且很多网友都认为它是一个赢家。
关于OscarGrind的几句话。优势玩家甚至不喜欢听到进步这个词。然而,从一个我非常尊重的作者那里(虽然他没有说这是一件肯定的事情),我愿意在这个背景下给它一个机会。
我将继续编码并张贴我对两个系统的解释。System-14的一个缺陷是,我将强迫它使用20点的SL-TP。对OscarGrind来说,一个隐患是如何在赢钱后只寻找一个单位的Size-Orders。但请大家保持警惕,一个有利可图的系统可能很快就会被确认。
好了,这是System_14。几乎达到了收支平衡,因此与随机系统相比还不错,但仍有很大的改进空间。总之,这是我刚写的代码,所以可能不是没有错误。
int Magic_S14=14; double Sl; double Tp; double Pips; double Price; color Color; bool Pen_Mode; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void start(){ if(!isNewBar() && !Pen_Mode){return(0);} Pips=Point; if(Digits==3){Pips=0.01;} if(Digits==5){Pips=0.0001;} Check_Pending_Order_Condition(); Set_Trigger_Market_Order_SlTp(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bool isNewBar(){ static datetime LastBar; datetime CurBar=iTime(Symbol(),PERIOD_D1,0); if(LastBar !=CurBar){LastBar=CurBar; return(true);} } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ double Percent25_Previous_24Hours_Move(){ double High_=iHigh(Symbol(),PERIOD_D1,1); double Low_=iLow(Symbol(),PERIOD_D1,1); double Total_Move=High_-Low_; double Percent_25=NormalizeDouble(Total_Move*0.25,Digits); return(Percent_25); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void Check_Pending_Order_Condition(){ if(Count_Orders_Magic_Symbol_Only()==0){ int Stop_Level=MarketInfo(Symbol(),MODE_STOPLEVEL); double Percent_25=Percent25_Previous_24Hours_Move(); if(Percent_25<Stop_Level*Pips){Percent_25=Stop_Level*Pips;} OrderSend(Symbol(),OP_BUYSTOP,0.1,Ask+Percent_25,999,0,0,"",Magic_S14,0,Blue); OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid-Percent_25,999,0,0,"",Magic_S14,0,Red); if(Count_Orders_Magic_Symbol_Type(1)==2){Pen_Mode=true;} else{Print("Twin_OrderSend_Failed_Error=",GetLastError());} } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Count_Orders_Magic_Symbol_Only(){ int Ans; for(int i=OrdersTotal()-1; i>=0; i--){ if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber()==Magic_S14 && OrderSymbol()==Symbol()){Ans++;} }return(Ans); //~~~~~~~~~~~~~~~~~~~~ } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Count_Orders_Magic_Symbol_Type(int x){ int Ans; for(int i=OrdersTotal()-1; i>=0; i--){ if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber()==Magic_S14 && OrderSymbol()==Symbol() && OrderType()>x){Ans++;} }return(Ans); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bool Set_Trigger_Market_Order_SlTp(){ if(!Pen_Mode){return(0);} for(int i=OrdersTotal()-1; i>=0; i--){ if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber()==Magic_S14 && OrderSymbol()==Symbol() && (OrderType()==0 || OrderType()==1) ){int Ot=OrderTicket(); double Op=OrderOpenPrice(); bool Res; if(OrderType()==OP_BUY){Res=OrderModify(Ot,Op,Op-20*Pips,Op+20*Pips,0,Blue);}else if(OrderType()==OP_SELL){Res=OrderModify(Ot,Op,Op+20*Pips,Op-20*Pips,0,Red);} if(!Res){Print("Setting_Sl_Tp_Failed_Error=",GetLastError()); return(Res);} } } if(Res){ for( i=OrdersTotal()-1; i>=0; i--){ if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber()==Magic_S14 && OrderSymbol()==Symbol() && (OrderType()==4 || OrderType()==5) ){ Res=OrderDelete(OrderTicket()); if(!Res){Print("Pending_Delete_Failed_Error=",GetLastError()); return(Res);} if(Res){Pen_Mode=false;} return(Res); } } } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
好吧,外汇的奥斯卡磨练是一个完全失败者。我想这里没有发现什么好东西。然而,有些事情需要指出。如果你交易的是随机系统,点差为1-3,并寻找<60点之间的获利,你最好去打赌场轮盘。如果你使用渐进式(马丁格尔或其他方式),那只是时间问题,直到你毁掉,特别是如果你有糟糕的预测。更强的预测可能是让赔率对你有利的最好方法。
同样,测试者的编码。可能包含错误,不要在真实账户上使用任何这些。
int Magic_OG; color Color; double Sl; double Tp; double Pips; double Price; double Lots; double Bank_Hi; double Last_OrSize; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void start(){ if(Count_Orders_Magic_Symbol_Only()==0){ if(AccountEquity()>Bank_Hi){Bank_Hi=AccountEquity();} int Dir=MathRand()%2; Pips=Point; if(Digits==3){Pips=0.01;}if(Digits==5){Pips=0.0001;} if(Dir==0){Price=Ask; Sl=Ask-20*Pips; Tp=Ask+20*Pips; Color=Blue;} if(Dir==1){Price=Bid; Sl=Bid+20*Pips; Tp=Bid-20*Pips; Color=Red;} Alert(Lot_Size()); int Ticket=OrderSend(Symbol(),Dir,Lot_Size(),Price,999,0,0,"",0,0,Color); if(Ticket>-1){ if(OrderSelect(Ticket, SELECT_BY_TICKET)){ OrderModify(Ticket,OrderOpenPrice(),Sl,Tp,0,Color); } } } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Count_Orders_Magic_Symbol_Only(){ int Ans; for(int i=OrdersTotal()-1; i>=0; i--){ if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber()==Magic_OG && OrderSymbol()==Symbol()){Ans++;} }return(Ans); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ double Lot_Size(){ double BkrLotStep= MarketInfo(Symbol(),MODE_LOTSTEP); double BrkMiniLot= MarketInfo(Symbol(),MODE_MINLOT); double BrkMaxiLot= MarketInfo(Symbol(),MODE_MAXLOT); double Tick_Value= MarketInfo(Symbol(),MODE_TICKVALUE); double Tick_Sizes= MarketInfo(Symbol(),MODE_TICKSIZE); if(Digits==2 || Digits==3){ int Pips_2Real=100;} if(Digits==4 || Digits==5){ Pips_2Real=10000;} double Pip_Values=Tick_Value / (Tick_Sizes*Pips_2Real); double AE=AccountEquity(); bool isLastWin=His_LasOrdWin_Magic_Symbol_Only(); if(!isLastWin){Lots=Last_OrSize;} if( isLastWin && AE>=Bank_Hi){Lots=0.1;} if( isLastWin && AE <Bank_Hi){Lots=Last_OrSize+0.1; double Target=20+Bank_Hi-AE; if(Lots*Pip_Values*20>Target){ for(double i=Lots; i>BrkMiniLot; i-=BkrLotStep){ if(i*Pip_Values*20<=Target){Lots=i; break;} } } } if(Lots>BrkMaxiLot){Lots=BrkMaxiLot;} if(Lots<BrkMiniLot){Lots=BrkMiniLot;} return(Lots); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bool His_LasOrdWin_Magic_Symbol_Only(){ if(OrdersHistoryTotal()==0){return(true);} for(int i=OrdersHistoryTotal()-1; i>=0; i--){ if(OrderSelect(i, SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==Magic_OG && OrderSymbol()==Symbol()){ Last_OrSize=OrderLots(); if(OrderProfit()>0){return(true);} } } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
既然你已经有了原型,你能快速测试一下吗?
如果你根据你目前的赢/输比率,假设结果为负数,稍微调整一下手数,至少应该能稍微增加结果。
例如。
以你的随机系统为例,假设胜率为47%。
现在你通过以下方式获得修改器。47/实际赢率
而手数将是(47/实际胜率)*手数
我刚刚睡醒,决定试一试这种方法。
确实是个粗略的技巧。我想在某种程度上,它在追寻它已经知道的东西:)。轮盘系统确实遭受了较少的损失。所以我想这是改善系统的一个方法。我也会认为这是一种消极的进步形式。资金管理代码在下面,也不是没有错误。
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ double Lot_Size(int Switch){ static int Saved_His_Total; int His_Total=OrdersHistoryTotal(); if(His_Total==0){return(0.1);} if(Saved_His_Total != His_Total){ Saved_His_Total=His_Total; for(int i=His_Total; i>=0; i--){ if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() ){ static int Trade_Total; Trade_Total++; static int Buy_Wins; static int Sel_Wins; static int Buy_Loss; static int Sel_Loss; static double Buy_Profit, Buy_Losses; static double Sel_Profit, Sel_Losses; if(OrderType()==OP_BUY && OrderProfit()>0){ Buy_Wins++; Buy_Profit+=OrderProfit();} if(OrderType()==OP_BUY && OrderProfit()<=0){ Buy_Loss++; Buy_Losses+=OrderProfit();} if(OrderType()==OP_SELL && OrderProfit()>0){ Sel_Wins++; Sel_Profit+=OrderProfit();} if(OrderType()==OP_SELL && OrderProfit()<=0){ Sel_Loss++; Sel_Losses+=OrderProfit();} break; } } double Win_Total = Buy_Wins + Sel_Wins; double Loss_Total = Buy_Loss + Sel_Loss; double Profit_Total = Buy_Profit + Sel_Profit; double Losses_Total = Buy_Losses + Sel_Losses; if(Win_Total !=0){double Avg_Profit = Profit_Total / Win_Total;} if(Loss_Total!=0){double Avg_Losses = Losses_Total / Loss_Total;} if(Trade_Total !=0){double W2L_Ratio = Win_Total / Trade_Total;} if(Trade_Total !=0){double L2W_Ratio = Loss_Total / Trade_Total;} if(Avg_Losses !=0){double P2L_Ratio = Avg_Profit / Avg_Losses;} if(Avg_Losses !=0){double Kd=Avg_Profit/Avg_Losses;} //~~~~~~~~~~~~~~~~~~~~~ if(W2L_Ratio !=0){double RvRoulette=(0.47/W2L_Ratio)*0.1;} //~~~~~~~~~~~~~~~~~~~~~ //http://www.trader-soft.com/money-management/index.html if(Kd !=0){double Kelly=(W2L_Ratio-L2W_Ratio)/(Avg_Profit/Avg_Losses);} if(P2L_Ratio!=0){double Optimal_f=((P2L_Ratio + 1)*W2L_Ratio-1)/P2L_Ratio;} //~~~~~~~~~~~~~~~~~~~~~ if(Trade_Total==0){return(0.1);} if(Switch=='R'){return(RvRoulette);} if(Switch=='K'){return(Kelly);} if(Switch=='F'){return(Optimal_f);} //~~~~~~~~~~~~~~~~~~~~~ } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我包括了凯利和最佳F,因为我已经有了计算它们的统计资料。我不建议在小于100的小样本上使用这些数据。此外,他们是以银行的分数来计算风险的,所以你需要把你的(我的偏好)账户保证金*K或F*你的风险偏好(通常是0.5)。然后你需要确保Lots*Pip_Values*Stop_Loss<=Target,我在上面的一个代码中有这样的例子。
下面是Zzuegg的建议的结果。我想知道,它是否能把我们的盈亏平衡系统-14变成一个赢家?
Bars in test 812652 Ticks modelled 10091174 Modelling quality n/a Mismatched charts errors 22023 Initial deposit 100000.00 Total net profit -37756.90 The Losses decreased vs -41832 Gross profit 391593.03 Gross loss -429349.92 Profit factor 0.91 Expected payoff -0.83 Absolute drawdown 38180.64 Maximal drawdown 38280.06 (38.24%) Relative drawdown 38.24% (38280.06) Total trades 45448 Short positions (won %) 22883 (47.54%) Long positions (won %) 22565 (47.90%) Profit trades (% of total) 21687 (47.72%) Loss trades (% of total) 23761 (52.28%) Largest profit trade 46.00 loss trade -42.00 Average profit trade 18.06 loss trade -18.07 Maximum consecutive wins (profit in money) 17 (306.11) consecutive losses (loss in money) 14 (-251.89) Maximal consecutive profit (count of wins) 306.11 (17) consecutive loss (count of losses) -259.64 (13) Average consecutive wins 2 consecutive losses 2
如果价格走势是随机的,(如果每个人都认为它是随机的,那么这个论坛将是空的),一个交易员需要捕获/失去多少个点才能有和轮盘赌一样的赔率?在这种情况下,我们假设欧洲轮盘有36个数字和一个0,赌注是赔率对偶数,1比1的赔率。很明显,当你落在0/绿的时候你就输了。所以基本上0或绿是作为点差的。我们假设点差是1个点。
到目前为止,我的想法是,如果我正在寻找一个1点的利润,并有一个1点的止损。再次假设价格没有偏向哪一方,那么我就会用比轮盘更差的赔率来玩。我甚至不认为寻找10个点的止损和10个点的止盈能使交易成为更好的选择。前几天我在脑子里想出了答案,但今天我忘了,而且我对我的数学也不确定:)。
谁能帮帮我,因为我有个假设要测试/模拟。谢谢。