백테스팅/최적화 - 페이지 47

 
#property copyright "HS"

#property link ""

//---- input parameters

extern bool AccountIsIBFXmini=false;

extern double Lots=0.1;

extern double MaximumRisk=0.03;

extern double DecreaseFactor=300;

extern double MinLot=0.01;

extern int Slippage=3;

extern double TrailingStop=30;

double StartBalance,StartEquity;

extern bool UseHourTrade = false;

extern int FromHourTrade = 6;

extern int ToHourTrade = 18;

//---- global variables

int dir=0;

int openorders=0;

int cnt;

string pair;

int MagicNumber;

int bsflag=0;

int bstarget=0;

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

if (Symbol() == "AUDCADm" || Symbol() == "AUDCAD") { MagicNumber = 427101; }

if (Symbol() == "AUDJPYm" || Symbol() == "AUDJPY") { MagicNumber = 427102; }

if (Symbol() == "AUDNZDm" || Symbol() == "AUDNZD") { MagicNumber = 427103; }

if (Symbol() == "AUDUSDm" || Symbol() == "AUDUSD") { MagicNumber = 427104; }

if (Symbol() == "CHFJPYm" || Symbol() == "CHFJPY") { MagicNumber = 427105; }

if (Symbol() == "EURAUDm" || Symbol() == "EURAUD") { MagicNumber = 427106; }

if (Symbol() == "EURCADm" || Symbol() == "EURCAD") { MagicNumber = 427107; }

if (Symbol() == "EURCHFm" || Symbol() == "EURCHF") { MagicNumber = 427108; }

if (Symbol() == "EURGBPm" || Symbol() == "EURGBP") { MagicNumber = 427109; }

if (Symbol() == "EURJPYm" || Symbol() == "EURJPY") { MagicNumber = 427110; }

if (Symbol() == "EURUSDm" || Symbol() == "EURUSD") { MagicNumber = 427111; }

if (Symbol() == "GBPCHFm" || Symbol() == "GBPCHF") { MagicNumber = 427112; }

if (Symbol() == "GBPJPYm" || Symbol() == "GBPJPY") { MagicNumber = 427113; }

if (Symbol() == "GBPUSDm" || Symbol() == "GBPUSD") { MagicNumber = 427114; }

if (Symbol() == "NZDJPYm" || Symbol() == "NZDJPY") { MagicNumber = 427115; }

if (Symbol() == "NZDUSDm" || Symbol() == "NZDUSD") { MagicNumber = 427116; }

if (Symbol() == "USDCHFm" || Symbol() == "USDCHF") { MagicNumber = 427117; }

if (Symbol() == "USDJPYm" || Symbol() == "USDJPY") { MagicNumber = 427118; }

if (Symbol() == "USDCADm" || Symbol() == "USDCAD") { MagicNumber = 427119; }

if (MagicNumber == 0) { MagicNumber = 427199; }

pair = Symbol();

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

return(0);

}

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| Calculate open positions |

//+------------------------------------------------------------------+

int GetCurrentOrders()

{

//---- calc open OrderSelect

openorders=0;

dir=0;

for(int i=0;i<OrdersTotal();i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)

{

openorders+=1;

if(OrderType()==OP_BUY) dir=1;

if(OrderType()==OP_SELL) dir=-1;

}

}

}

//+-------------------End Calculate open positions-------------------+

//+------------------------------------------------------------------+

//| Calculate optimal lot size |

//+------------------------------------------------------------------+

double LotsOptimized()

{

double lot=Lots;

int orders=HistoryTotal(); // history orders total

int losses=0; // number of losses orders without a break

//---- select lot size

lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/500.0,1);

//---- calculate number of losses orders without a break

if(DecreaseFactor>0)

{

for(int i=orders-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }

if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber || OrderType()>OP_SELL) continue;

//----

if(OrderProfit()>0) break;

if(OrderProfit()<0) losses++;

}

if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

}

//---- return lot size

if(lot>999) lot=999;

if(lot<MinLot) lot=MinLot;

return(lot);

}

//+-------------------End Calculate optimal lot size-----------------+

//+------------------------------------------------------------------+

//| Close Open Position |

//+------------------------------------------------------------------+

int CloseTrade()

{

for(int i=0;i<OrdersTotal();i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)

{

if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow);

if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,Yellow);

}

}

}

//+----------------------End Close Open Position---------------------+

//+------------------------------------------------------------------+

//| Open Trade Position |

//+------------------------------------------------------------------+

int OpenTrade()

{

int vLots=LotsOptimized();

if (bsflag==1) OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,Slippage,0,Ask+bstarget*Point,"NoLoss",MagicNumber,0,Green);

if (bsflag==2) OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,Slippage,0,Ask-bstarget*Point,"NoLoss",MagicNumber,0,Red);

}

//+----------------------End Open Trade Position---------------------+

//+------------------------------------------------------------------+

//| Buy/Sell Indicator |

//+------------------------------------------------------------------+

int CalcBSI()

{

//---- calc current indicators

//double val1=iCustom("GBPJPY",0,"NoLoss",0,0,0);

//double val2=iCustom("GBPJPY",0,"NoLoss",0,1,0);

//double val3=iCustom("USDJPY",0,"NoLoss",0,0,0);

//double val4=iCustom("USDJPY",0,"NoLoss",0,1,0);

double val1=iOpen("GBPJPY",0,0);

double val2=iClose("GBPJPY",0,0);

double val3=iOpen("USDJPY",0,0);

double val4=iClose("USDJPY",0,0);

double nval1=xDiv(val1,val2);

double nval2=xDiv(val3,val4);

if(nval1>nval2)

{

bsflag=2;

bstarget=(nval1-nval2)*10000;

} else

if(nval1<nval2)

{

bsflag=1;

bstarget=(nval2-nval1)*10000;

}

else

{

bsflag=0;

bstarget=0;

}

if(bstarget<10)

{

bsflag=0;

bstarget=0;

}

}

//+-----------------------End Buy/Sell Indicator---------------------+

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

if (Period()<PERIOD_H1) { Alert("Only on H1 or larger!"); return(0); } // For use only on H4 --- NO ERROR if activated

for(cnt=0;cnt<OrdersTotal();cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && // check for opened position

OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) // check for symbol and magic number

{

if(OrderType()==OP_BUY) // long position is opened

{

// check for trailing stop

if(TrailingStop>0)

{

if(Bid-OrderOpenPrice()>Point*TrailingStop)

{

if(OrderStopLoss()<Bid-Point*TrailingStop)

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}

else // go to short position

{

// check for trailing stop

if(TrailingStop>0)

{

if((OrderOpenPrice()-Ask)>(Point*TrailingStop))

{

if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

}

}

//+--------------------End TrailingStop & BreakEven------------------+

if (UseHourTrade)

{

if (!((Hour() >= FromHourTrade) && (Hour() <= ToHourTrade)))

{

Comment("Non-Trading Hours!");

return(0);

}

}

GetCurrentOrders();

CalcBSI();

Comment("\nStart Balance= ",StartBalance,",","Start Equity= ",StartEquity,

"\nBalance: ",AccountBalance(),","," Equity: ",AccountEquity(),","," TotalProfit: ",AccountProfit(),

"\nBSFlag: ",bsflag,"\nbstarget: ",bstarget);

//---- exit trades

if (openorders!=0) {

if ((bsflag==1) && (dir<0)) CloseTrade();

if ((bsflag==2) && (dir>0)) CloseTrade();

}

//---- open trades

else

{

if (bsflag != 0 && bstarget>20) OpenTrade();

}

}

//+---------------------End Expert Start Function--------------------+

double xDiv(double a, double b)

{

if(b==0) return(b); else return(a/b);

}
 

아무나 도와주세요!

최적화 보고서의 기준으로 "숏 포지션 획득 %" 및 "롱 포지션 획득 %"를 사용하여 전략 테스터 보고서를 필터링하는 방법이 있습니까? 현재는 이익, 총 거래, 이익 요인, 예상 수익 등만 필터링할 수 있습니다.

미리 감사드립니다!

 

MT4 대 무역 역

모두 인사드립니다.

이 게시판에서 나보다 똑똑한 사람들로부터 피드백/의견/아이디어를 얻을 수 있는지 궁금합니다.

MT4에서 전략을 백테스트할 때 Trade Station을 사용하여 백테스트 할 때와 다른 결과를 얻습니다....코딩은 동일합니다...라이브 거래를 볼 때 동시에 트리거하고 종료합니다. 백 테스트는 매우 다른 결과를 제공합니다...누구를 믿어야 합니까?

TS 데이터가 MT4보다 낫다고 들었는데 어떻게 생각하시는지 여쭙고 싶습니다...

모두 덕분에

 
amyfor:
모두 인사드립니다.

이 게시판에서 나보다 똑똑한 사람들로부터 피드백/의견/아이디어를 얻을 수 있는지 궁금합니다.

MT4에서 전략을 백테스트할 때 Trade Station을 사용하여 백테스트할 때와 다른 결과를 얻습니다....코딩은 동일합니다...라이브 거래를 볼 때 동시에 트리거하고 종료합니다. 백 테스트는 매우 다른 결과를 제공합니다...누구를 믿어야 합니까?

TS 데이터가 MT4보다 낫다고 들었는데 어떻게 생각하시는지 여쭙고 싶습니다...

모두 덕분에

그것들은 완전히 다른 프로그램이고 차이점이 있을 것입니다.

 
Linuxser:
그것들은 완전히 다른 프로그램이고 차이점이 있을 것입니다.

안녕 Linuxser....다시 한 번 답변에 감사드리며 적절한 스레드로 이동해 주셔서 감사합니다.

확실히, 나는 그들이 다른 프로그램이기 때문에 약간의 차이가 있을 것으로 예상합니다...제가 궁금한 것은 서로의 백 테스트 결과 를 믿어야 하는 것 같습니다...라이브 포워드는 95%의 지베를 거래합니다. 시간...예를 들어...동일한 전략을 거래하는 두 세트의 결과에 접근하면 귀하(또는 여기 다른 회원)는 어떻게 하시겠습니까...둘 다 무시하고...최고의 결과를 가진 것을 신뢰하십시오. ..

이 장소를 매우 유용하게 만드는 데 들인 모든 노력과 시간에 다시 한 번 감사드립니다.

 
amyfor:
예를 들어 ... 동일한 전략을 거래하는 두 가지 결과 세트에 접근하는 경우 귀하(또는 여기의 다른 회원)는 어떻게 하시겠습니까... 둘 다 무시... 최상의 결과를 가진 것을 신뢰하십시오... 다시 한 번 모든 분들께 감사드립니다 이 장소를 매우 유용하게 만드는 데 들인 노력과 시간.

내가 항상하는 것과 동일합니다. 종이+펜+엑셀+차트의 시스템+나의 판단.

 

어떻게 최적화합니까?

EA를 최적화하는 가장 좋은 방법은 무엇입니까? 최적화가 필요한 아주 좋은 EA를 찾았는데 어떻게 해야 할지 모르겠습니다.

누군가 Alpari를 위해 그것을 했고 내가 IBFX를 위해 그것을 해야 합니까? 누구든지 도울 수 있습니까?

도움을 주셔서 미리 감사드립니다.

미스터 칩스

 
Linuxser:
내가 항상하는 것과 동일합니다. 종이+펜+엑셀+차트의 시스템+나의 판단.

좋은 답변... 다시한번 감사드립니다.

 

다른 테스터 결과 를 얻을 수 있습니까?

동일한 날짜 범위를 사용하여 동일한 기호에서 동일한 EA를 테스트할 때 다른 결과가 나타납니다.

시작을 여러 번 클릭하면 다른 결과가 반환됩니다. 내 초기 반응은 EA에 임의의 기능이 있다는 것이지만 코드에서는 그런 것을 볼 수 없습니다. 각 주문 라인에 대한 세부 보고서를 보면 행이 가격, S/L 및 T/P에서 1~2센트 차이가 있습니다.

내가 무엇을 놓쳤습니까? 이것은 MT4, 빌드 218입니다.

 

???

------------------------------------