私たちのファンページに参加してください
- ビュー:
- 55
- 評価:
- パブリッシュ済み:
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
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が 追加されました - これらは、入金通貨での利益、手数料、スワップを正しく計算するために必要です。
ティック保存時に選択されたテスト期間での作業順序:
- 実際のティック、必要なインストゥルメント、テスト日付によってテストモードを選択します。タスク変数を保存に設定し、ティックを保存するオプションを選択します。テスターを起動します。その後、ティックを含むファイルが指定されたフォルダに作成されます。
- タスク変数を Run_Strategyに 設定する。後で比較するために、実際の目盛りを使ってモードを残すことができます。テスターを起動する。計算は、ファイルからではなく、実際の刻みによって行われる。結果を得る。

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

- テスターを起動します。計算は、必要な年間ファイルからの目盛によって行われます。作業は1つのファイルではなく複数のファイルで行われるため、ファイルを開いたり閉じたりするのに時間がかかり、少し遅くなります。例えば、3年分の目盛りを生成するのに1.7秒ではなく2.7秒かかります。
- 下記の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、中間のATR、遅いATRの3つのATRに基づくボラティリティ・フィルター。
SAR ADX Signal
モバイル通知機能付きSAR ADXシグナル、MT4版からリライト(ソースが見つからなくなりました)。 再描画可能なインジケーターですので、ご使用の際はご注意ください。
ストキャスティック・モメンタム・カラーローソク
ウィリアム・ブラウの指標に基づくアンドレイ・F・ゼリンスキーのアイデア