Backtesting/Optimisation - page 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);

}
 

Aidez-nous !

Existe-t-il un moyen de filtrer les rapports du testeur de stratégie en utilisant les "positions courtes gagnées %" et les "positions longues gagnées %" comme critères dans le rapport d'optimisation. Actuellement, vous ne pouvez filtrer que sur le profit, le nombre total de transactions, le facteur de profit, le gain attendu, etc.

Merci d'avance !

 

MT4 Vs. Trade Station

Salutations à tous,

Je me demandais si je pouvais obtenir quelques réactions/opinions/idées de la part des nombreuses personnes plus intelligentes que moi sur ce forum.

Lorsque je fais un back-testing d'une stratégie sur MT4, j'obtiens des résultats différents de ceux que j'obtiens lorsque je fais un back-testing avec Trade Station..... Le codage est le même... lorsque je regarde des transactions en direct, elles se déclenchent et sortent en même temps, etc.... mais le back-testing donne des résultats très différents... Qui dois-je croire ?

J'ai entendu dire que les données de TS sont meilleures que celles de MT4 mais je voulais savoir ce que certains d'entre vous pensaient...

Merci à tous

 
amyfor:
Salutations à tous,

Je me demandais si je pouvais obtenir des commentaires/opinions/idées de la part des nombreuses personnes plus intelligentes que moi sur ce forum.

Lorsque je rétrocontrôle une stratégie sur MT4, j'obtiens des résultats différents de ceux que j'obtiens lorsque je rétrocontrôle à l'aide de Trade Station.... le codage est le même... lorsque je regarde des transactions en direct, elles se déclenchent et se terminent au même moment, etc.... mais le rétrocontrôle donne des résultats très différents... qui dois-je croire ?

J'ai entendu dire que les données de TS sont meilleures que celles de MT4, mais je voulais savoir ce que certains d'entre vous pensaient...

Merci à tous

Ce sont des programmes complètement différents, il y aura des différences.

 
Linuxser:
Ce sont des programmes complètement différents, les différences le seront.

Bonjour Linuxser...., merci encore pour votre réponse et merci d'avoir déplacé ce sujet vers le fil de discussion approprié.

Absolument, je m'attends à ce qu'il y ait quelques différences, car ce sont des programmes différents... Je suppose que ce que je me demande, c'est si je dois faire confiance aux résultats du back test de l'un plutôt que de l'autre... les trades en direct se rejoignent 95% du temps... A titre d'exemple... que feriez-vous (ou n'importe quel autre membre ici) si on vous présentait deux séries de résultats de trading de la même stratégie... rejeter les deux... faire confiance à celui qui a les meilleurs résultats...

Encore une fois, merci pour tous les efforts et le temps que vous consacrez à rendre cet endroit si utile.

 
amyfor:
exemple... que feriez-vous (ou n'importe quel autre membre ici) si on vous présentait deux séries de résultats pour la même stratégie... je rejetterais les deux... je ferais confiance à celui qui a les meilleurs résultats... Encore une fois, merci pour tous les efforts et le temps que vous consacrez à rendre cet endroit si utile.

Je fais toujours la même chose. Papier + stylo + excel + système sur le tableau + mon propre jugement.

 

Comment optimiser ?

Quelle est la meilleure façon d'optimiser un EA ? J'ai trouvé un très bon EA qui a besoin d'être optimisé et je n'ai aucune idée de la façon de le faire.

Quelqu'un l'a fait pour Alpari et je dois le faire pour IBFX ? Quelqu'un peut-il m'aider ?

Merci d'avance pour toute aide.

M. Chips

 
Linuxser:
Je fais toujours la même chose. Papier + stylo + excel + système sur le tableau + mon propre jugement.

Bonne réponse... merci encore.

 

Est-il possible d'obtenir des résultats de test différents ?

J'obtiens des résultats différents lorsque je teste le même EA sur le même symbole en utilisant la même plage de dates.

Le fait de cliquer plusieurs fois sur démarrer renvoie des résultats différents. Ma première réaction était qu'il y avait une fonction aléatoire dans l'EA, mais je ne vois rien de tel dans le code. Si je regarde le rapport détaillé de chaque ligne d'ordre, les lignes sont décalées d'un centime ou deux en termes de prix, de S/L et de T/P.

Qu'ai-je manqué ? Il s'agit de MT4, build 218.

 

? ??

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

Raison: