MT4 в виртуальной машине? - страница 5

 
DayTrader:

Да, это хорошо само по себе, но пока хотя бы МОЙ брокер (а лучше больше) не предложит MT5, я даже не буду думать о переписывании всего своего кода.

А пока я буду работать за счет увеличения скорости в +4 раза в W7/64, в сочетании с 10-кратным увеличением от пропуска тиков.... в сумме мы получаем примерно 40-кратное увеличение скорости.

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

Используйте код, подобный этому:

bool SkipTick(){
   static datetime curr=0;
   static double askHi=0;
   static double askLo=0;
   static double bidHi=0;
   static double bidLo=0;
   if(curr!=Time[0]){
      curr=Time[0];
      askHi=Ask;
      askLo=Ask;
      bidHi=Bid;
      bidLo=Bid;
      return (false);
   }else{
      if(Ask>askHi || Ask<askLo){
         askHi=MathMax(Ask,askHi);
         askLo=MathMin(Ask,askLo);
         return(false);
      }
      if(Bid>bidHi || Bid<bidLo){
         bidHi=MathMax(Bid,bidHi);
         bidLo=MathMin(Bid,bidLo);
         return(false);
      }
   }
   return(true);
}

чтобы пропускать тики без потери важной информации.

Все открытия баров, а также новые максимумы и новые минимумы не пропускаются.

 
Хорошая идея!
 
zzuegg:

Ваш код пропускает тики, но делает это таким образом, что важная информация может быть потеряна.

Используйте код, подобный этому:

чтобы пропускать тики без потери важной информации.

Все открытия баров, а также новые максимумы и новые минимумы не пропускаются.


Я не знаю, будет ли это эквивалентом. Однако, можно удалить информацию об объеме при импорте данных в mt4. По умолчанию, он будет использовать минимальный O-H-L-C или 4 тика, это помогает ускорить обратное тестирование.

В связи с этим, кто-нибудь пробовал вводить Volume(ы), скажем, 100 во время импорта данных M1? Я думаю, что это должно быть жизнеспособной альтернативой Tick-Data, если это работает. Я планировал протестировать это, но так и не дождался :)

 
zzuegg:
Все открытия баров, а также новые максимумы и новые минимумы не пропускаются.
Также смотрите увеличение скорости работы тестера стратегий - Форум MQL4
 

Мой брокер теперь включил MT5 на реальных счетах, и это делает его менее академичным. Вчера вечером я написал свой первый индикатор на MQL5 (для отображения спреда), а сегодня вечером я попробовал преобразовать советника для спидтеста с первой страницы этой темы. Вот он...

// MQL5 code

const int SECONDSPERHOUR=3600;

input int stops = 250;

double lots= 0.0;

//+-------------------------------------------------------------------------------------------+
int OnInit(){
    lots = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
    return(0);
}
//+-------------------------------------------------------------------------------------------+
void OnDeinit(const int reason){ 
}
//+-------------------------------------------------------------------------------------------+
void OnTick(){
    static long lastHour=0;
    
    datetime now= TimeCurrent();
    long hourNow = SECONDSPERHOUR *(((long)now) / SECONDSPERHOUR); 
    
    if( lastHour== hourNow )
        return;
    
    lastHour= hourNow;
    
    MqlTick lastTick;
    SymbolInfoTick(_Symbol,lastTick);
    
    MqlTradeResult result={0};
    
    MqlTradeRequest requestA={0};
    requestA.action=TRADE_ACTION_DEAL;
    requestA.symbol= Symbol();
    requestA.type = ORDER_TYPE_BUY;
    requestA.volume= lots;                  
    requestA.sl=    NormalizeDouble( lastTick.ask - stops*_Point, _Digits );
    requestA.tp=    NormalizeDouble( lastTick.ask + stops*_Point, _Digits );

    OrderSend(requestA,result);
    if( result.retcode != TRADE_RETCODE_DONE )
        Print("BUY order failed: " + IntegerToString(result.retcode));
    
    SymbolInfoTick(_Symbol,lastTick);
      
    MqlTradeRequest requestB={0};
    requestB.action=TRADE_ACTION_DEAL;
    requestB.symbol= Symbol();
    requestB.type = ORDER_TYPE_SELL;

    requestB.volume= lots;                  
    requestB.sl=    NormalizeDouble( lastTick.bid + stops*_Point, _Digits );
    requestB.tp=    NormalizeDouble( lastTick.bid - stops*_Point, _Digits );
    
    OrderSend(requestB,result);
    if( result.retcode != TRADE_RETCODE_DONE )
        Print("SELL order failed: " + IntegerToString(result.retcode));
    
    return;
}

Идея заключалась в том, чтобы сравнить скорости в тестере стратегий, совершая одинаковые сделки. Конечно, я забыл о самом фундаментальном изменении в MQL5. Вы не можете хеджировать. Фактически, вы можете иметь только одну открытую позицию на символ, судя по всему. Это означает, что мультистратегия, разделенная MAGIC_NUMBERS, кажется невозможной.

Мой тестовый советник потерпел неудачу, поскольку он просто размещает сделки каждый час, чтобы посмотреть, сколько времени это займет. Провести сравнительный анализ таким образом не представляется возможным :-(