Нужно ли в МТ4 сделать возможность тестирования мультивалютных советников? - страница 2

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
а оно им надо ?
Ренат же постоянно при случае пишет чем МТ5 лучше -- скорость -- очень важный фактор.
На моей практике -- ни один заказчик выбирал МТ5 именно из-за -- скорости -- даже есть парадоксы, торгует на МТ4, а делает клон под МТ5 чтобы там тестировать.
Так что на МТ5 народ своим большинством может перескочить буквально в один миг -- перейдётся Рубикон по какой-то причине и всё, кирдык МТ4.
думаю производителям стоит прислушаться к мнению пользователей... а то уйдут к конкурентам....
ответов да в 2 раза больше чем ответов нет.
думаю производителям стоит прислушаться к мнению пользователей... а то уйдут к конкурентам....
хотя.. действительно, а чё цепляться за МТ4?.. привычка..
как чемодан без ручки..
прогресс на лицо..
даёшь МТ5!.. наверно, всё же, лучше развивать новое, чем поддерживать старое.. или нет..
я "против"
хотя.. действительно, а чё цепляться за МТ4?.. привычка..
как чемодан без ручки..
прогресс на лицо..
даёшь МТ5!.. наверно, всё же, лучше развивать новое, чем поддерживать старое.. или нет..
я "против"
МТ4 с хорошо проверенной ручкой, с отлично обкатанной колеей под колёса. В общем, целиком и полностью выполняет свои функции. У кого есть "Нива" и ему хочется кенгурятник, то необязательно покупать джип, можно попросить чтоб его сварили на СТО и установили.
Тут аналогичная просьба, просто добавить мультитестирование - всё!
МТ4 с хорошо проверенной ручкой, с отлично обкатанной колеей под колёса. В общем, целиком и полностью выполняет свои функции. У кого есть "Нива" и ему хочется кенгурятник, то необязательно покупать джип, можно попросить чтоб его сварили на СТО и установили.
Тут аналогичная просьба, просто добавить мультитестирование - всё!
Уточню, что это советует человек, который боится написать пару строчек на MQL5(копипаст с форума скорее всего, а не свой пример).
И вдруг такая щедрость по отношению к другим - "перепишите всю старую архитектуру ради того, чтобы я не перешел на МТ5, где все это уже есть".
Видимо, вы имеете мало отношения к программированию, раз делаете такие бесконечно далекие от реальности заявления.
Уточню, что это советует человек, который боится написать пару строчек на MQL5(копипаст с форума скорее всего, а не свой пример).
И вдруг такая щедрость по отношению к другим - "перепишите всю старую архитектуру ради того, чтобы я не перешел на МТ5, где все это уже есть".
Видимо, вы имеете мало отношения к программированию, раз делаете такие бесконечно далекие от реальности заявления.
Ренат, на самом деле Я не знаю на сколько сложно и возможно добавить в четвёрку мультитестер, но то, что не смог переписать бота на пятый, то это признал. Перечитав кучу литературы и прошерстив кодобазу на примеры, стандартные вещи перевёл, и всё упёрлось в трал, безубыток и торговые функции, вот их и не осилил. Предложение добавления поддерживаю потому, что была-бы возможность протестировать советник ничего не переделывая, и в будущем писать так-же как и писал - в четвёрке, мне её более чем достаточно, за исключением мультитестера.
Провокаций с моей стороны нет и небыло, всё на уровне конструктива.
Вот так есть переписано на текущий момент то, что смог переписать, и это не копипаст:
if(symb=="0") { symb=Symbol();}
double _High[];
double high=0;
ArraySetAsSeries(_High,true);
int copied=CopyHigh(symb,tf,0,Bars(symb,tf),_High);
if(copied>0 && index<copied) high=_High[index];
return(high);
}
double diLow(string symb,ENUM_TIMEFRAMES tf,int index) {
if(symb=="0") { symb=Symbol();}
double _Low[];
double low=0;
ArraySetAsSeries(_Low,true);
int copied=CopyLow(symb,tf,0,Bars(symb,tf),_Low);
if(copied>0 && index<copied) low=_Low[index];
return(low);
}
int diHighest(string symb,ENUM_TIMEFRAMES tf,int count=WHOLE_ARRAY,int _start=0) {
if(symb=="0") { symb=Symbol();}
double _iHigh[];
ArraySetAsSeries(_iHigh,true);
CopyHigh(symb,tf,_start,count,_iHigh);
return(ArrayMaximum(_iHigh,0,count)+_start);
}
int diLowest(string symb,ENUM_TIMEFRAMES tf,int count=WHOLE_ARRAY,int _start=0) {
if(symb=="0") { symb=Symbol();}
double _iLow[];
ArraySetAsSeries(_iLow,true);
CopyLow(symb,tf,_start,count,_iLow);
return(ArrayMinimum(_iLow,0,count)+_start);
}
datetime diTime(string symb,ENUM_TIMEFRAMES tf,int index) {
if(symb=="0") { symb=Symbol();}
datetime _iTime[];
datetime time=0;
ArraySetAsSeries(_iTime,true);
int copied=CopyTime(symb,tf,0,Bars(symb,tf),_iTime);
if(copied>0 && index<copied) time=_iTime[index];
return(time);
}
А вот такие вещи не осилил:
//------------------------- Сопровождение позиции выбранным тралом -----------------------------+
//===============================================================================================
void TrailingSingle(string symb="0", int type=-1, int mg=-1) {
double p,tv,pb=0,lb=0,ps=0,ls=0,osl,oop,otp,ask,bid,StHiLo=0,NoLossBuy=0,NoLossSell=0;
bool success=false;
int tk=-1,err=-1,dg;
if(symb=="0") { symb=Symbol();}
p=MarketInfo(symb, MODE_POINT);
dg=(int)MarketInfo(symb, MODE_DIGITS);
tv=MarketInfo(symb,MODE_TICKVALUE);
//
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
if(OrderType()==OP_BUY) {
pb+=OrderProfit()+OrderSwap()+OrderCommission();
lb+=OrderLots();
}
if(OrderType()==OP_SELL) {
ps+=OrderProfit()+OrderSwap()+OrderCommission();
ls+=OrderLots();
}
}}}
//
for(int i=OrdersTotal(); i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
if(OrderType()==OP_BUY) {
tk=OrderTicket();
oop=NormalizeDouble(OrderOpenPrice(),dg);
osl=NormalizeDouble(OrderStopLoss(),dg);
otp=NormalizeDouble(OrderTakeProfit(),dg);
ask=NormalizeDouble(MarketInfo(symb,MODE_ASK),dg);
bid=NormalizeDouble(MarketInfo(symb,MODE_BID),dg);
StHiLo=PriceModify(symb,OP_BUY,bid);
if(PortfelTrailing==1) { NoLossBuy=ND(bid-(pb/(tv*lb))*p,dg); } // текущий безубыток
if(StHiLo==0) continue;
if((PortfelTrailing==0 && StHiLo > oop) || (ProfitTrailing==0) || (PortfelTrailing==1)) { // отдельно только прибыльные
if((PortfelTrailing==0 && StHiLo > osl+TrailingStep*p) || (PortfelTrailing==1)) { // отдельно с убыточными
if((PortfelTrailing==1 && StHiLo > NoLossBuy) || (PortfelTrailing==0) || (ProfitTrailing==0)) { // портфельный трал, только прибыль
if((PortfelTrailing==1 && StHiLo > osl+TrailingStep*p) || (PortfelTrailing==0)) { // портфельный трал с убыточными
for(int it=1; it<=NumberOfTry; it++) {
if(!MQLInfoInteger(MQL_TESTER) && (!IsExpertEnabled() || IsStopped())) { break; }
while(!IsTradeAllowed()) Sleep(2000);
RefreshRates();
success=OrderModify(tk,oop,StHiLo,otp,0,clModifyBuy);
if(success==true) {
if(UseSound) {PlaySound(SoundModify);} break;
} else {
err=GetLastError();
if(UseSound) { PlaySound(SoundError); }
Print("Error(",err,") TrailingStop modifying order: ",Error(err),", try ",it);
Print(symb," Ask=",ask," Bid=",bid," type="+GetNameOP(OrderType()),
" OrderOpenPrice=",oop," sl=",StHiLo," tp=",otp," Ticket=",tk);
Sleep(1000*10);
}}}}}}}
if(OrderType()==OP_SELL) {
tk=OrderTicket();
oop=NormalizeDouble(OrderOpenPrice(),dg);
osl=NormalizeDouble(OrderStopLoss(),dg);
otp=NormalizeDouble(OrderTakeProfit(),dg);
ask=NormalizeDouble(MarketInfo(symb,MODE_ASK),dg);
bid=NormalizeDouble(MarketInfo(symb,MODE_BID),dg);
StHiLo=PriceModify(symb,OP_SELL,ask);
if(PortfelTrailing==1) { NoLossSell=ND(ask+(ps/(tv*ls))*p,dg); } // текущий безубыток
if(StHiLo==0) continue;
if((PortfelTrailing==0 && StHiLo < oop) || (ProfitTrailing==0) || (PortfelTrailing==1)) { // отдельно только прибыльные
if((PortfelTrailing==0 && StHiLo < osl-TrailingStep*p) || (osl==0) || (PortfelTrailing==1)) { // отдельно с убыточными
if((PortfelTrailing==1 && StHiLo < NoLossSell) || (PortfelTrailing==0) || (ProfitTrailing==0)) { // портфельный трал, только прибыль
if((PortfelTrailing==1 && StHiLo < osl-TrailingStep*p) || (PortfelTrailing==0) || (osl==0)) { // портфельный трал с убыточными
for(int it=1; it<=NumberOfTry; it++) {
if(!MQLInfoInteger(MQL_TESTER) && (!IsExpertEnabled() || IsStopped())) { break; }
while(!IsTradeAllowed()) Sleep(2000);
RefreshRates();
success=OrderModify(tk,oop,StHiLo,otp,0,clModifySell);
if(success==true) {
if(UseSound) {PlaySound(SoundModify);} break;
} else {
err=GetLastError();
if(UseSound) {PlaySound(SoundError);}
Print("Error(",err,") TrailingStop modifying order: ",Error(err),", try ",it);
Print(symb," Ask=",ask," Bid=",bid," type="+GetNameOP(OrderType()),
" OrderOpenPrice=",oop," sl=",StHiLo," tp=",otp," Ticket=",tk);
Sleep(1000*10);
}}}}}}}}}}}
//---------------------------------------- Выбор трала -----------------------------------------+
double PriceModify(string symb="0", int type=-1, double _price=-1) {
double res=0,point=0,iMAB=0,iMAS=0,PSAR=0;
int jj,ii,StopLevel=0,digit=0,ma_price=MApriceTr,ma_method=MAmethodTr;
if(symb=="0") { symb=Symbol();}
StopLevel=(int)SymbolInfoInteger(symb,SYMBOL_TRADE_STOPS_LEVEL)+1;
point=SymbolInfoDouble(symb,SYMBOL_POINT);
digit=(int)SymbolInfoInteger(symb,SYMBOL_DIGITS);
//-------------------- простой тралл
if(UseTrailing==1) {
if(TrailingShift<StopLevel) TrailingShift=StopLevel;
if(type==OP_BUY) res=_price-TrailingShift*point;
if(type==OP_SELL) res=_price+TrailingShift*point;
}
//-------------------- тралл по свечам
if(UseTrailing==2) {
if(type==OP_BUY) {
for(ii=1; ii<400; ii++) {
res=iLow(symb,PeriodIndTrail,ii);
if(res!=0) { if(_price-StopLevel*point > res && res < Low[0]) {
res-=TrailingShift*point;
break;
} else { res=0; }}
}}
if(type==OP_SELL) {
for(jj=1; jj<400; jj++) {
res=iHigh(symb,PeriodIndTrail,jj);
if(res!=0) { if(_price+StopLevel*point < res && res > High[0]) {
break;
res+=TrailingShift*point;
break;
} else { res=0; }}
}}}
//-------------------- тралл по Fractals
if(UseTrailing==3) {
if(type==OP_BUY) {
for(ii=1; ii<400; ii++) {
res=iFractals(symb,PeriodIndTrail,MODE_LOWER,ii);
if(res!=0) { if(_price-StopLevel*point > res && res < Low[0]) {
res-=TrailingShift*point;
break;
} else { res=0; }}
}}
if(type==OP_SELL) {
for(jj=1; jj<400; jj++) {
res=iFractals(symb,PeriodIndTrail,MODE_UPPER,jj);
if(res!=0) { if(_price+StopLevel*point < res && res > High[0]) {
res+=TrailingShift*point;
break;
} else { res=0; }}
}}}
//-------------------- тралл по Parabolic SAR
if(UseTrailing==4) {
PSAR=iSAR(symb,PeriodIndTrail,SARstepTr,SARmaximumTr,0);
if(type==OP_BUY) {
if(_price-StopLevel*point > PSAR) res=PSAR-TrailingShift*point;
else res=0;
}
if(type==OP_SELL) {
if(_price+StopLevel*point < PSAR) res=PSAR+TrailingShift*point;
else res=0;
}}
//-------------------- тралл по ATR
if(UseTrailing==5) {
if(type==OP_BUY) {
res=_price-(FastATRTrailingTr*iATR(symb,PeriodIndTrail,ATRperiodTr,0))-TrailingShift*point;
}
if(type==OP_SELL) {
res=_price+(FastATRTrailingTr*iATR(symb,PeriodIndTrail,ATRperiodTr,0))+TrailingShift*point;
}}
//-------------------- тралл по MA
if(UseTrailing==6) {
iMAB=iMA(symb,PeriodIndTrail,MAperiodTr,0,ma_method,ma_price,0)-TrailingShift*point;
iMAS=iMA(symb,PeriodIndTrail,MAperiodTr,0,ma_method,ma_price,0)+TrailingShift*point;
if(type==OP_BUY) {
if(_price-StopLevel*point > iMAB) res=iMAB;
else res=0;
}
if(type==OP_SELL) {
if(_price+StopLevel*point < iMAS) res=iMAS;
else res=0;
}}
//------------------------------- Визуализация ценовых уровней ---------------------------------+
if(ChartGetInteger(0,CHART_VISIBLE_BARS,0)>0) { // если не видно график, то не выводим (оптимизация)
if((DrawInfo==2 || DrawInfo==3) && UseTrailing) {
if(type==OP_BUY && res!=0) {
ObjectCreate(0,"SL Buy",OBJ_ARROW,0,0,0,0);
ObjectSetInteger(0,"SL Buy",OBJPROP_TIME1,diTime(symbol,PERIOD_CURRENT,0)+PERIOD_CURRENT*60);
ObjectSetDouble(0,"SL Buy",OBJPROP_PRICE1,res);
ObjectSetInteger(0,"SL Buy",OBJPROP_ARROWCODE,4);
ObjectSetInteger(0,"SL Buy",OBJPROP_COLOR, clModifyBuy);
}
if(type==OP_SELL && res!=0) {
ObjectCreate(0,"SL Sell",OBJ_ARROW,0,0,0,0);
ObjectSetInteger(0,"SL Sell",OBJPROP_TIME1,diTime(symbol,PERIOD_CURRENT,0)+PERIOD_CURRENT*60);
ObjectSetDouble(0,"SL Sell",OBJPROP_PRICE1,res);
ObjectSetInteger(0,"SL Sell",OBJPROP_ARROWCODE,4);
ObjectSetInteger(0,"SL Sell",OBJPROP_COLOR, clModifySell);
}}}
return(NormalizeDouble(res,digit));
}
Так же не нашел, как сохранять картинку с чарта в режиме визуального тестирования MT5. Если кто знает - подскажите где.
А как в MT5 в режиме визуального тестирования добавить индикатор на чарт? В MT4 это делается легко. В MT5 не нашел такой возможности.
Так же не нашел, как сохранять картинку с чарта в режиме визуального тестирования MT5. Если кто знает - подскажите где.
А вот такие вещи не осилил:
Вы уверены, что это ваш код? Или чужой? Думаю, что не ваш. Даже уверен.
Такой код пишут нубы или самоубийцы. Его нельзя переписать, можно только выкинуть и написать чисто с нуля.