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

 
Maxim Kuznetsov:

а оно им надо ?

Ренат же постоянно при случае пишет чем МТ5 лучше -- скорость -- очень важный фактор.

На моей практике -- ни один заказчик выбирал МТ5 именно из-за -- скорости -- даже есть парадоксы, торгует на МТ4, а делает клон под МТ5 чтобы там тестировать.

Так что на МТ5 народ своим большинством может перескочить буквально в один миг -- перейдётся Рубикон по какой-то причине и всё, кирдык МТ4.

 
ответов да в 2 раза больше чем ответов нет.
думаю производителям стоит прислушаться  к мнению пользователей... а то уйдут к конкурентам....
 
Сергей:
ответов да в 2 раза больше чем ответов нет.
думаю производителям стоит прислушаться  к мнению пользователей... а то уйдут к конкурентам....
Конкуренции с автоторговлей нет, в этом вся загвоздка. МТ вне конкуренции уже давно, и вряд-ли с ними кто сравниться, а тем более перегонит. Так что правила на их стороне)
 

хотя.. действительно, а чё цепляться за МТ4?.. привычка..

как чемодан без ручки..

прогресс на лицо..

даёшь МТ5!.. наверно, всё же, лучше развивать новое, чем поддерживать старое.. или нет..

я "против"

 
Yury Antipov:

хотя.. действительно, а чё цепляться за МТ4?.. привычка..

как чемодан без ручки..

прогресс на лицо..

даёшь МТ5!.. наверно, всё же, лучше развивать новое, чем поддерживать старое.. или нет..

я "против"

МТ4 с хорошо проверенной ручкой, с отлично обкатанной колеей под колёса. В общем, целиком и полностью выполняет свои функции. У кого есть "Нива" и ему хочется кенгурятник, то необязательно покупать джип, можно попросить чтоб его сварили на СТО и установили.

Тут аналогичная просьба, просто добавить мультитестирование - всё! 

 
Vitaly Muzichenko:

МТ4 с хорошо проверенной ручкой, с отлично обкатанной колеей под колёса. В общем, целиком и полностью выполняет свои функции. У кого есть "Нива" и ему хочется кенгурятник, то необязательно покупать джип, можно попросить чтоб его сварили на СТО и установили.

Тут аналогичная просьба, просто добавить мультитестирование - всё! 

Уточню, что это советует человек, который боится написать пару строчек на MQL5(копипаст с форума скорее всего, а не свой пример).

И вдруг такая щедрость по отношению к другим - "перепишите всю старую архитектуру ради того, чтобы я не перешел на МТ5, где все это уже есть".

Видимо, вы имеете мало отношения к программированию, раз делаете такие бесконечно далекие от реальности заявления.

 
Renat Fatkhullin:

Уточню, что это советует человек, который боится написать пару строчек на MQL5(копипаст с форума скорее всего, а не свой пример).

И вдруг такая щедрость по отношению к другим - "перепишите всю старую архитектуру ради того, чтобы я не перешел на МТ5, где все это уже есть".

Видимо, вы имеете мало отношения к программированию, раз делаете такие бесконечно далекие от реальности заявления.

Ренат, на самом деле Я не знаю на сколько сложно и возможно добавить в четвёрку мультитестер, но то, что не смог переписать бота на пятый, то это признал. Перечитав кучу литературы и прошерстив кодобазу на примеры, стандартные вещи перевёл, и всё упёрлось в трал, безубыток и торговые функции, вот их и не осилил. Предложение добавления поддерживаю потому, что была-бы возможность протестировать советник ничего не переделывая, и в будущем писать так-же как и писал - в четвёрке, мне её более чем достаточно, за исключением мультитестера.

Провокаций с моей стороны нет и небыло, всё на уровне конструктива.

Вот так есть переписано на текущий момент то, что смог переписать, и это не копипаст:

double diHigh(string symb,ENUM_TIMEFRAMES tf,int index) {
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 в режиме визуального тестирования добавить индикатор на чарт? В MT4 это делается легко. В MT5 не нашел такой возможности.

Так же не нашел, как сохранять картинку с чарта в режиме визуального тестирования MT5. Если кто знает - подскажите где.
 
RickD:
А как в MT5 в режиме визуального тестирования добавить индикатор на чарт? В MT4 это делается легко. В MT5 не нашел такой возможности.

Так же не нашел, как сохранять картинку с чарта в режиме визуального тестирования MT5. Если кто знает - подскажите где.
кажется еще не сделали этого
 
Vitaly Muzichenko:


А вот такие вещи не осилил:

Вы уверены, что это ваш код? Или чужой? Думаю, что не ваш. Даже уверен.

Такой код пишут нубы или самоубийцы. Его нельзя переписать, можно только выкинуть и написать чисто с нуля.

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