Бэктестинг/оптимизация - страница 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 против Trade Station

Приветствую всех,

Хотел узнать, могу ли я получить некоторые отзывы/мнения/идеи от множества людей умнее меня на этом форуме.

Когда я тестирую стратегию на MT4, я получаю другие результаты, чем при бэктесте с помощью Trade Station.... кодирование одинаковое... при наблюдении за реальными сделками они срабатывают и выходят в одно и то же время и т.д..... но бэктест дает совершенно другие результаты... кому я должен верить?

Я слышал, что данные TS лучше, чем MT4, но хотел узнать, что думаете вы...

Спасибо всем

 
amyfor:
Приветствую всех,

Мне было интересно, могу ли я получить некоторые отзывы/мнения/идеи от множества людей умнее меня на этом форуме.

Когда я тестирую стратегию на MT4, я получаю другие результаты, чем при бэктесте с помощью Trade Station.... кодирование одинаковое... при просмотре живых сделок они срабатывают и выходят в одно и то же время и т.д..... но бэктест дает совсем другие результаты... кому верить?

Я слышал, что данные TS лучше, чем MT4, но хотел узнать ваше мнение...

Спасибо всем

Это совершенно разные программы, различия будут.

 
Linuxser:
Это совершенно разные программы, различия будут.

Привет Linuxser....again спасибо за ответ и спасибо, что переместили это в соответствующую тему.

Конечно, я ожидаю, что будут некоторые различия, так как это разные программы... Я думаю, что я задаюсь вопросом, должен ли я доверять результатам обратного тестирования одной из них, а не другой... живые сделки вперед jibe 95% времени... Как пример... что бы вы (или любой другой член здесь) сделали, если бы вам предложили два набора результатов торговли по одной и той же стратегии... отклонить оба... доверять тому, у кого лучшие результаты....

Еще раз спасибо за все усилия и время, которые вы вкладываете в то, чтобы сделать это место таким полезным.

 
amyfor:
Например... что бы вы (или любой другой участник здесь) сделали, если бы к вам пришли с двумя наборами результатов торговли по одной и той же стратегии... отклоните оба... доверьтесь тому, у кого лучшие результаты... Еще раз спасибо за все усилия и время, которые вы вкладываете в то, чтобы сделать это место таким полезным.

То же самое я делаю всегда. Бумага + ручка + excel + система на графике + мое собственное суждение.

 

Как вы оптимизируете?

Как лучше всего оптимизировать советника? Я нашел очень хороший советник, который нужно оптимизировать, и я понятия не имею, как это сделать.

Кто-то сделал это для Alpari, а мне нужно сделать это для IBFX? Кто-нибудь может помочь?

Заранее спасибо за любую помощь.

Мистер Чипс

 
Linuxser:
То же самое я делаю всегда. Бумага + ручка + эксель + система на графике + мое собственное суждение.

Хороший ответ... еще раз спасибо.

 

Возможно ли получить разные результаты тестера?

Я получаю разные результаты при тестировании одного и того же советника на одном и том же символе с использованием одного и того же диапазона дат.

Многократное нажатие кнопки "Старт" дает разные результаты. Моя первоначальная реакция заключалась в том, что в советнике есть какая-то случайная функция, но я не вижу ничего подобного в коде. Если посмотреть на подробный отчет по каждой строке ордера, то строки отличаются на цент или два по цене, S/L и T/P.

Что я упустил? Это MT4, сборка 218.

 

???

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

Причина обращения: