無料でロボットをダウンロードする方法を見る
Facebook上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
ライブラリ

MathTicker - 数学モードの目盛りジェネレータ - MetaTrader 5のためのライブラリ

ビュー:
55
評価:
(4)
パブリッシュ済み:
\MQL5\Include\Forester\
MQL5フリーランス このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

EAToMath ライブラリの代替https://www.mql5.com/ja/code/61283

リアルティックモードでティックを記録し、記録されたティックごとにストラテジーを呼び出す数学モードでそれらを読み込みます。

作成理由: MQ テスターは、オプティマイザーを実行するたびに、各エージェントにティックデータファイルを書き込みます。私は、36のエージェントが1つのツールとテスト期間のためにそれぞれ10GBを書き込んでおり、480GBのドライブに合計360GBを書き込んでいます。このプロセスには、各最適化の前に約1時間かかります。一般的なSSDの寿命は500~1000回の書き込みサイクルです。360GBを毎回書き換えるのでは、リソースがあっという間に枯渇してしまいます。このライブラリは1つのファイルだけを書き込み、36のエージェントはこの1つのファイルからデータを読み込む。
この問題は、fxsaber(EAToMathの作者)と同時に調査し、それぞれ独自のバージョンを作成しました。

取引操作には MT4Orders ライブラリを使用しますhttps://www.mql5.com/ja/code/16006
バーチャル取引には Virtual ライブラリを使用する必要がありますhttps://www.mql5.com/ja/code/22577
取引結果を表示するには MT4Orders QuickReporthttps://www.mql5.com/ja/code/47816 または Report
ティックを圧縮するには TickCompressorhttps://www.mql5.com/ja/code/66201
不要と思われるティックを削除するには Control_Trade_Sessions ライブラリhttps://www.mql5.com/ja/code/48059 を接続します。例えば、気配値セッションが取引セッションより大きい場合などです。また、すべてのティックが使用されている場合、つまりセッションが一致している場合は削除することができます。


EAToMathとの違い:

長所:

  • コードは短くシンプルで、プラグイン・ライブラリは5つだけです。修正が必要な場合でも、理解しやすい。

  • 異なるアルゴリズム(https://www.mql5.com/ja/code/66201)により、データがより圧縮される time_msc、ask、bidのみを保存する場合、ティックの86%までが3文字、すなわち3バイトで保存される。2023年のBTCUSDTティックデータを保存した場合、1ティックあたりの平均サイズは3.266バイト。
    ボリューム付きで保存した場合、平均は4.835バイト。完全なティックを保存した場合は8.439バイト。
    さらに、内蔵のZIPアーカイブを使用することもできます。ファイルサイズは2倍小さくなります。このようなファイルのサイズは245Mbですが、2023年の.tcsのファイルサイズの合計は364Mbです。また、数学モードでのティック生成速度は~2倍速い。下の表をご覧ください。

  • 保存のオプションが増えた:


  • システム内でリンクを作成することで、ファイルをSSDまたはRAMディスクのいずれかに保存できます。ファイルは多くのスペースを取ることがあり、RAMドライブでは十分でない場合があるため、プライマリドライブに保存することを選択できます。SSDとRAMの読み込み速度はほぼ同じで、SSDは最も頻繁に要求されるデータを全容量の5%までキャッシュすると読んだことがある。
    読み出し時には、読み出しをせずに保存する場合よりも頻繁にメモリセルを上書きする必要があるため、SSDの消耗が少しあります。正確な数字は分かりませんが、例えば10回の読み出しにつき1回の上書き、あるいは1000回の読み出しにつき1回の上書き......。しかしこれは、MQテスターによるディスクの摩耗に比べれば、ほとんど重要ではない。

短所

  • バーチャルの接続は自分で行わなければならない(手順はこちらhttps://www.mql5.com/ja/code/22577)。EAToMathは、あなたのストラテジーをバーチャル自体に渡す。

BidAskのスピードはEAToMathに匹敵する。他のバージョンは、より多くのデータを含んでいるか、ZIP圧縮を追加しているため、より遅い。

使用上の特徴

標準関数Symbol()Digits() (=4)、Point()(=0.0001)はストラテジーの中では使えません。これらの代わりに、_Symbol_Digits_Pointを 使用してください。これらは、ファイルから読み込まれた値に対してオーバーライドされます。また、記録されたシンボルからの値を持つ新しい定数_TickSizeと _TickValueが 追加されました - これらは、入金通貨での利益、手数料、スワップを正しく計算するために必要です。

ティック保存時に選択されたテスト期間での作業順序:

  1. 実際のティック、必要なインストゥルメント、テスト日付によってテストモードを選択します。タスク変数を保存に設定し、ティックを保存するオプションを選択します。テスターを起動します。その後、ティックを含むファイルが指定されたフォルダに作成されます。

  2. タスク変数を Run_Strategyに 設定する。後で比較するために、実際の目盛りを使ってモードを残すことができます。テスターを起動する。計算は、ファイルからではなく、実際の刻みによって行われる。結果を得る。


  3. テストモードを数学的計算に設定する。テスターを起動します。ファイルからの刻みで計算が行われます。ステップ2の結果と比較してください。

アーカイブの作業順序

  1. 履歴からすべてのティックでアーカイブを作成する。<=最初のティックから>=最後のティックまでのテスト日付を、既存の履歴に設定します。タスク変数にSave...To_Archiveの いずれかを設定し、ティックの保存オプションを選択する。テスターを起動します。その後、指定されたフォルダ内にツール名のフォルダが作成され、そこに各年の目盛りのファイルが保存されます。必要に応じて最後の年を上書きすることができます。そのためには、前の年を上書きしないように、日付で現在の年だけを選択します。
  2. テスト・モードを数学に設定する。タスク変数を Run_Strategy_Fron_Archiveに 設定する。
  3. MathTicker: フル・アーカイブ・グループを使って
    Instrument - インストゥルメントの名前(そのティックが保存されているフォルダーの名前と一致しなければならない)、テストの開始日と終了日を設定する。

  4. テスターを起動します。計算は、必要な年間ファイルからの目盛によって行われます。作業は1つのファイルではなく複数のファイルで行われるため、ファイルを開いたり閉じたりするのに時間がかかり、少し遅くなります。例えば、3年分の目盛りを生成するのに1.7秒ではなく2.7秒かかります。
  5. 下記のExpert Advisorで得られるティックの合計は、最初の1ティックの小さな値によって異なる場合があります。リアルティックモードのカスタム文字でテストする場合、最初のティックはAskまたはBidのみを生成します(両方保存していない場合)。アーカイブからテストする場合、それらは両方とも以前のティックから復元されます。

最もシンプルなExpert Advisorの例です:

#property tester_no_cache
#include <Forester\MathTicker.mqh> // 数学モードでトレードを接続する
input int rep=0;//最適化のためのリピート
sinput bool AddVolumes=true;
void OnInit(){}

void OnTick(){
   static MqlTick Tick;
   if (SymbolInfoTick(_Symbol, Tick)){
      #ifdef _MathTick_
         if(MathTick.SaveTick(Tick)){ return; }//ティックを保存したら、終了して取引しない。 
      #endif
       Strategy(Tick);
   }
}
double Sum = 0;int tk=0;
void Strategy(MqlTick& Tick){ // 最も単純な戦略 - EAToMathとの読書速度の比較に使用。 
   Sum += Tick.bid+Tick.ask+(AddVolumes?Tick.volume_real:0.0); tk++;
   //if(tk<100){Print(Tick.time," ",Tick.ask," ",Tick.bid," ",Tick.last," ",Tick.volume_real," ",Tick.flags);}。
}

ulong StartTime  = GetMicrosecondCount();
double OnTester(){
   #ifdef _MathTick_ // MathTick を使って実行すると、ファイルからのシンボル・パラメータを刻みでカウントする。mat モードのテスト
      if(MathTick.SaveTicksEnd()){return 0;}// 刻みを記録した後、ファイルを閉じて終了する。
      if(MathTick.ReadSymbolVars()){
         MathTick.Ticker();// マットモードでは、すべてのティックをStrategy(MqlTick &Tick)に送る。
      }
   #endif
   Print("ticks: ",tk);
   long work_time = (long)(GetMicrosecondCount() - StartTime)/1000;
   //return(NormalizeDouble(work_time, 1)); // 作業速度と作業時間を求める。
   return Sum;// 計算結果を比較する
}

あなたは1の設定を切り替えることができます:

//#define RestoreFlags // восстановить флаги тика из изменения ask, bid, volume - добавит 7% к времени генерации тиков 931 вместо 869 мс


以下はティック生成の統計、ボリューム、時間のプリントアウトです。

-----------
MQtester without volumes
pass 1 returned result 4345830621850.311523 in0:00:08.232

C ZIP圧縮
AskBid.File size: 225 mb
-------------------- Statistics: --------------------
3 bytes: 86.6%, 62644158 ticks
4 bytes: 0.6%, 412167 ticks
5 bytes: 12.7%, 9185484 ticks
6 bytes: 0.0%, 15274 ticks
11 bytes: 0.1%, 46214 ticks
12 bytes: 0.0%, 1 ticks
24 bytes: 0.0%、1ティック
合計:72303299ティック、236108596バイト
平均:1ティックあたり3.266バイト
最終残高0.00米ドル

パス 10 返された結果 4345830621850.311523 in 0:00:01.485
正規化なし
パス 1 返された結果 4345830621850.311523 in0:00:00.892
AskBid_Zipped.File size: 106 mb
-------------------- Statistics: --------------------
3 bytes: 86.6%, 62644158 ticks
4 bytes: 0.6%, 412167 ticks
5 bytes: 12.7%, 9185484 ticks
6 bytes: 0.0%、15274ティック
11バイト: 0.1%、46214ティック
12バイト: 0.0%、1ティック
24バイト: 0.0%、1ティック
合計: 72303299ティック、236108596バイト
平均: 1ティックあたり3.266バイト
ZIPなしサイズ:236108596。ZIPサイズ:111720863。ZIP 圧縮: 47.3 %

パス 10 で結果 4345830621850.311523 を 0:00:02.548 で返しました
正規化なし
パス 2 で結果 4345830621850.311523 を0:00:01.890 で返しました。



ボリュームありのMQテスター
パス1が返した結果 4345879117123.356445 で0:00:07.962

C ZIP圧縮
AskBidVolume.File size: 333 mb
-------------------- Statistics: --------------------
4 bytes: 60.4%, 43684907 ticks
5 bytes: 1.1%, 809676 ticks
6 bytes: 33.5%, 24194111 ticks
7 bytes: 4.9%, 3548666 ticks
8 bytes: 0.0%, 7909 ticks
12 bytes: 0.1%, 40022 ticks
13 bytes: 0.0%, 17964 ticks
14 bytes: 0.0%, 2 ticks
19 bytes: 0.0%, 41 ticks
32 bytes: 0.0%, 1 ticks
Total: 72303299 ticks, 349571243 bytes.
Average: 4.835 bytes per tick

pass 1 returned result 4345879117123.356445 in 0:00:02.803
no normalisation
pass 4 returned result 4345879117123.356445 in0:00:01.659.
AskBidVolume_Zipped.File size: 204 mb
-------------------- Statistics: --------------------
4 bytes: 60.4%, 43684907 ticks
5 bytes: 1.1%, 809676 ticks
6 bytes: 33.5%, 24194111 ticks
7 bytes: 4.9%, 3548666 ticks
8 bytes: 0.0%、7909ティック
12バイト: 0.1%、40022ティック
13バイト: 0.0%、17964ティック
14バイト: 0.0%、2ティック
19バイト: 0.0%、41ティック
32バイト: 0.0%、1ティック
合計: 72303299ティック、349571243バイト
平均: 1ティックあたり4.835バイト
ZIPなしサイズ:349571243.ZIPサイズ:214897079。ZIP 圧縮: 61.5%

パス 2 で返された結果 4345879117123.356445 0:00:04.260
正規化なし
パス 2 で返された結果 4345879117123.356445 0:00:03.096
すべてファイルサイズ: 582 mb
-------------------- Statistics: --------------------
8 bytes: 61.5%, 44494583 ticks
9 bytes: 33.5%, 24194111 ticks
10 bytes: 4.9%, 3548666 ticks
11 bytes: 0.0%, 7909 ticks
15 bytes: 0.1%, 40022 ticks
16 bytes: 0.0%, 17964 ticks
17 bytes: 0.0%, 2 ticks
22 bytes: 0.0%, 41 ticks
44 bytes: 0.0%, 1 ticks
Total: 72303299 ticks, 610166056 bytes.
Average: 8.439 bytes per tick

pass 2 returned result 4345879117123.356445 in 0:00:03.768
no normalisation
pass 1 returned result 4345879117123.356445 in0:00:02.256.
All_Zipped.File size: 245 mb
-------------------- Statistics: --------------------
8 bytes: 61.5%, 44494583 ticks
9 bytes: 33.5%, 24194111 ticks
10 bytes: 4.9%, 3548666 ticks
11 bytes: 0.0%, 7909 ticks
15 bytes: 0.1%, 40022 ticks
16 bytes: 0.0%, 17964 ticks
17 bytes: 0.0%, 2 ticks
22 bytes: 0.0%, 41 ticks
44 bytes: 0.0%, 1 ticks
Total: 72303299 ticks, 610166056 bytes.
Average: 8.439 bytes per tick
UnZipped size:610166056.ZIPサイズ:257105213。ZIP 圧縮: 42.1 %

パス 1 で返された結果 4345879117123.356445 in 0:00:05.388
正規化なし
パス 10 で返された結果 4345879117123.356445 in0:00:03.936

同じ2023年の.tcsファイルのサイズ:

ZIPを使用した全バリアントは、フルティック保存でもよりコンパクトになります(3.5倍から1.5倍)。

仮想取引とレポート出力のExpert Advisorの例:

#property tester_no_cache

#include <MT4Orders.mqh> // https://www.mql5.com/ja/code/16006
#include <Forester\MathTicker.mqh> // 数学モードでトレードを接続する

#define  ORDER_CURRENCY_DIGITS 2 // 取引履歴の利益/手数料/スワップ計算の桁数設定。
#define  VIRTUAL_LIMITS_TP_SLIPPAGE // リミッターとTPは最初の受入価格で約定 - ポジティブ・スリッページ
#define  ORDER_COMMISSION -0 // コミッションの割り当て = ロット * ORDER_COMMISSION. 
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ja/code/22577


#define  REPORT_TESTER             // テスターは自動的にレポートを記録します。
#define  REPORT_BROWSER            // ブラウザ起動時にレポートを作成 - DLL許可が必要です。
#define  USE_highcharts //- すべてのHighcharts製品を無料でダウンロードしてお試しいただけます。プロジェクトや製品の準備ができたら、商用ライセンスを購入してください。https://shop.highcharts.com/
#include <MT4Orders_QuickReport.mqh>//


enum VirtTyp {MQ_Tester=0,Virtual1=1,Virtual2=2};
sinput VirtTyp tester1=1;//テスター1
sinput VirtTyp tester2=2;//テスター2

input int rep=0;//最適化のためのリピート

bool isOptimization = false, isTester=false; double balInit=0;
VIRTUAL_POINTER Virtual[10];

void OnInit(){
   Virtual[0] = 0; // 0 - 実際の取引環境
   Virtual[1] = VIRTUAL::Create(AccountBalance()); // 仮想化 1.
   Virtual[2] = VIRTUAL::Create(AccountBalance()); // 仮想化 2.
   //Virtual[tester1].Select();
   isOptimization = MQLInfoInteger(MQL_OPTIMIZATION) ;
   isTester = MQLInfoInteger(MQL_TESTER);
   balInit=AccountBalance();
}

void OnTick(){
   //Virtual[0].Select();
   VIRTUAL::NewTick();// 現在の仮想マシンにティックを送信する
   static MqlTick Tick;
   if (SymbolInfoTick(_Symbol, Tick)){
      #ifdef _MathTick_
         if(MathTick.SaveTick(Tick)){ return; }//ティックを書き込むと関数が終了し、Strategy()は呼び出されない。
      #endif
       Strategy(Tick);//取引
   }
}

void Strategy(MqlTick& Tick){ // 最も単純な戦略 - EAToMathとの読書速度の比較に使用。 
   if(Tick.ask==0 || Tick.bid==0){return;}//MQテスターは失敗したティックで取引を行うが、バーチャルは行わない。MQでも禁止
   if(tester1>0){Virtual[tester1].Select(); VIRTUAL::NewTick(Tick);}// 仮想化1を選択し、ティックを送信
   if(tester2>0){Virtual[tester2].Select(); VIRTUAL::NewTick(Tick);}//仮想化2を選択し、ティックを送信する。
   if(isNewHour(Tick.time)){//毎正時の最初の目盛り
      if(GetHour0(Tick.time) % 2==0){// テスター1で偶数時間に購入
         Virtual[tester1].Select();//仮想化1を選択
         OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, Tick.ask - 100 * _Point, Tick.ask + 100 * _Point); 
      }else{//テスター2で変な時間に売る
         Virtual[tester2].Select();//仮想化2を選択
         OrderSend(_Symbol, OP_SELL, 1, Tick.bid, 0, Tick.bid + 100 * _Point, Tick.bid - 100 * _Point);   
      } 
   }
}

double OnTester(){
   #ifdef _MathTick_ // MathTickで実行 - tickファイルからシンボル・パラメータを読み込みます。mat モードでのテスト
      if(MathTick.SaveTicksEnd()){return 0;}//ティック保存後に戻る
      if(MathTick.isMath && MathTick.ReadSymbolVars()){
         if(tester1==0){Alert("   >>>>>>>>>   Virtual tester 1=MQ. In math mode can be used only virtual tester.   <<<<<<<<");return 0;}
         if(tester2==0){Alert("   >>>>>>>>>   Virtual tester 1=MQ. In math mode can be used only virtual tester.   <<<<<<<<");return 0;}

         SYMBOL_BASE sb; sb.Point=_Point; sb.Digits=_Digits; sb.Symbol=_Symbol; sb.SymbolID=0; sb.TickSize=_TickSize; sb.TickValue=_TickValue / _TickSize;//this.TickValue /= this.TickSize; //as in SetSymbol() in \fxsaberVirtualSymbol_Base.mqh.
         Virtual[1].Select(); VIRTUAL::SetSymbolBase(sb); Virtual[2].Select(); VIRTUAL::SetSymbolBase(sb);
         //minFreezeLevel = _minFreezeLevel*_Point; minStopLevel = _minStopLevel*_Point;

         Virtual[tester1].Select();
         MathTick.Ticker();// マットモードでは、すべてのティックをStrategy(MqlTick &Tick)に送る。 
      }
   #endif

  double ret_val=0;
  for (int v = 0 ; v <= VIRTUAL::Total(); v++){
    if(Virtual[v].Select()){
      if(v > 0){
         VIRTUAL::Stop();
         #ifdef _MathTick_ // MathTickで実行 - tickファイルからシンボル・パラメータを読み込みます。mat モードでのテスト
            if(MathTick.isMath){ VIRTUAL::CalcSwaps( MathTick.swapShort, MathTick.swapLong, 0, MathTick.swap3days ); }//ティックファイルからのスワップ
            else{VIRTUAL::CalcSwaps( _Symbol, 0 );}
         #else
           VIRTUAL::CalcSwaps( _Symbol, 0 );//つまり、2つ以上の異なる商品がある場合、両方ともメイン・シンボルのスワップを持つ。
         #endif
      }// テスターのように、最後のティックの価格で不完全な取引を終了する。

      if( !isOptimization){QuickReport("report_"+(string)v, true, v,false,true);}
      Print((string)v+" AccountBalance = ",AccountBalance(), "   AccountEquity = ",AccountEquity());
      double prib=AccountBalance()-balInit;
      ret_val += prib; //
  }}
  return ret_val;// 計算結果を比較する
}



bool isNewHour  (datetime &t){ static int next_h=-1; if(t < next_h){ return false; } else { next_h = (GetHour0(t)+1)*3600;return true;}}
int GetHour0    (datetime &t){return((int)( t / 3600));}//1971年1月1日から現在時間

この例では、異なる取引を行う2つの仮想マシンを作成します。片方のテスターは偶数時間に買い、もう片方は奇数時間に売ります。

これは2つのテスターを使った複雑な例ですが、1つのテスターで作業する必要がある場合は簡略化できます。

MQテスターを選択し、仮想テスターの結果と比較することで、計算の正しさを管理することもできます。手数料だけが一致しないことがあります。なぜなら、手数料には様々な種類があり、バーチャルテスターには1つのバリエーションしかプログラムされていないからです。

MetaQuotes Ltdによってロシア語から翻訳されました。
元のコード: https://www.mql5.com/ru/code/65821

保証金あたりのリスクからロットサイズを計算する機能 保証金あたりのリスクからロットサイズを計算する機能

この関数は、オープンポジションのロットサイズを計算する。取引の開始価格、ストップロス・レベルの価格、および保証金のパーセンテージでの取引ごとのリスクがパラメータとして渡されます。

ATR Cycles ATR Cycles

速いATR、中間のATR、遅いATRの3つのATRに基づくボラティリティ・フィルター。

SAR ADX Signal SAR ADX Signal

モバイル通知機能付きSAR ADXシグナル、MT4版からリライト(ソースが見つからなくなりました)。 再描画可能なインジケーターですので、ご使用の際はご注意ください。

ストキャスティック・モメンタム・カラーローソク ストキャスティック・モメンタム・カラーローソク

ウィリアム・ブラウの指標に基づくアンドレイ・F・ゼリンスキーのアイデア