仮想マシンでMT4? - ページ 5

 
DayTrader:

しかし、少なくとも私のブローカー(できればもっと多くのブローカー)がMT5を提供するまで、私は自分のコードをすべて書き直すことは考えません。

その間、W7/64の4倍のスピードとティックスキップの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-Ticksを使用し、これはバックテストのスピードアップに役立ちます。

その線で、誰かM1データのインポート中にVolume(s)を100と入力してみたことがありますか?私の推測では、これがうまくいけば、Tick-Dataに代わる有効な手段になるはずです。私はそれをテストすることを計画していたが、それまでには至らなかった:)

 
zzuegg:
すべてのバーオープン、新高値、新安値はスキップされません。
または、Strategy Testerの速度向上 - MQL4フォーラムを ご覧ください。
 

私のブローカーはライブ口座でMT5を有効にしたので、学問的なことはできなくなりました。昨晩、最初のMQL5インジケータ(スプレッドを表示する)を書き、今晩、このスレッドの最初のページにあるスピードテストEAを変換してみた。これがそれです.

// 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で最も根本的に変わったことを忘れていました。ヘッジができないのです。実際、見たところ、1つのシンボルにつき1つのポジションしか開くことができません。つまり、MAGIC_NUMBERSで区切られたマルチストラテジーは不可能なようです。

私のテストEAは、1時間ごとにトレードを行い、その時間を見るだけなので、惨憺たる結果に終わりました。この方法で同種の比較をするのは不可能です :-(