無料でロボットをダウンロードする方法を見る
Twitter上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
ビュー:
51
評価:
(4)
パブリッシュ済み:
\MQL5\Include\
MQL5フリーランス このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

更新した:

このライブラリは、私がエキスパート・アドバイザーを最適化するために使っているものだ。このバージョンは合理化されているが、自動化したい日常的なタスクを含むように簡単に拡張できる。例えば、プロップファームのチャレンジが失敗した後の取引に制限を加えたり、チャレンジが成功または失敗した後、月曜日に取引を再開したりすることができる。

このライブラリに対するすべての変更と追加は、コードの最後に概説されている。このフレームワークは柔軟で、取引制限のためのより複雑なロジックの追加、取引のスケジューリング、最適化結果に基づくパフォーマンスの微調整など、特定のニーズに適応させることができる。

ルーチン・タスクのために自由にカスタマイズしてください!


このライブラリは、MetaTrader 5のExpert Advisor (EA)をテストするために設計されています。目標は、トレーダーが会社の挑戦に合格するために特定の利益と損失のしきい値を満たさなければならない取引環境をシミュレートすることです。EAは、多くのプロップ会社のルールを模倣し、指定された利益または損失のパーセンテージに達するたびに、初期値にリセットすることによって口座残高を調整します。

以下は、BalanceReset.mqh ライブラリを使用した Expert Advisor (EA) の完全な構造です。このセットアップは、#include ディレクティブを通して関数のきれいな分離を維持しながら、バランスリセットロジックをEAに直接統合します:


#include <BalanceReset.mqh>   // バランス・リセット・ライブラリを含める

//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
{
    InitBalance();  // 開始残高を初期化する
    return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
{
    CheckBalanceAndReset();  // 閾値に基づくバランスのチェックとリセット
}

//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    PrintBalanceResetResults();  // バランスリセットの結果をログに出力
}


主な機能

  1. 調整可能な損益しきい値

    • このライブラリでは、バックテストプロセス中に残高リセットをトリガーする利益と損失のしきい値を調整することができます。これらのしきい値は入力パラメータを使用して変更することができ、テスト条件のカスタマイズが容易になります。

input double profit_threshold = 8.0;  // 利益のしきい値、デフォルトは8
input double loss_threshold = -6.0;   // 損失のしきい値、デフォルトは-6


2. 初期バランスの初期化

  • この関数はテスト開始時の初期口座残高を保存します。初期開始残高を取得するために最初のティックでのみ実行されます。

void InitBalance()
{
    initial_balance = AccountInfoDouble(ACCOUNT_BALANCE);  // 初期残高の保存
}


3.バランス・リセット・ロジック

  • ライブラリのコアは、利益または損失の割合を計算するために、初期残高に対して現在の残高をチェックします。利益が指定されたしきい値(例えば、8%)を超えた場合、または損失がそのしきい値(例えば、-6%)を超えた場合、残高は初期値にリセットされます。
  • 利益のリセット: TesterWithdrawal 関数は、利益のしきい値に達した時に、超過分を引き出して残高を初期値に戻すために使用されます。
  • 損失リセット: TesterDeposit 関数は、損失しきい値に達すると残高を初期値に戻します。

void CheckBalanceAndReset()
{
    double current_balance = AccountInfoDouble(ACCOUNT_BALANCE);
    if (initial_balance == 0) {
        initial_balance = current_balance; // 最初のティック、初期残高を保存
    }
    double profit_percentage = (current_balance - initial_balance) / initial_balance * 100.0;

    if (profit_percentage >= profit_threshold) {
        double withdrawal_amount = current_balance - initial_balance;
        if (TesterWithdrawal(withdrawal_amount)) {
            successful_resets++;
            ArrayResize(reset_times, ArraySize(reset_times) + 1);
            reset_times[ArraySize(reset_times) - 1] = TimeCurrent();
            Print("Profit reached. Balance has been reset to the initial value.");
        }
    }

    if (profit_percentage <= loss_threshold) {
        double deposit_amount = initial_balance - current_balance;
        if (TesterDeposit(deposit_amount)) {
            unsuccessful_resets++;
            ArrayResize(reset_times, ArraySize(reset_times) + 1);
            reset_times[ArraySize(reset_times) - 1] = TimeCurrent();
            Print("Loss reached. Balance has been reset to the initial value.");
        }
    }
}

4. 結果の記録

  • テスト終了後、この関数はリセットに成功した回数(利益と損失の両方)と各リセット間の日数を出力します。これにより、テスト中に残高リセットがどの程度の頻度で発生したかを知ることができます。

void PrintBalanceResetResults()
{
    PrintFormat("Number of successful profit resets: %d", successful_resets);
    PrintFormat("Number of successful loss resets: %d", unsuccessful_resets);
    
    for (int i = 1; i < ArraySize(reset_times); i++)
    {
        int days_between_resets = (reset_times[i] - reset_times[i-1]) / 86400; // 1日で86400秒
        PrintFormat("Days between reset %d and reset %d: %d days", i, i + 1, days_between_resets);
    }
}


結論

本ライブラリは、一般的な自己勘定取引会社の要件に準拠した取引環境のシミュレー ションに役立ちます。事前に定義された利益と損失のしきい値を満たすと残高がリセットされることにより、トレーダーはより効果的に戦略をテストし、プロップ会社のルールに基づいてEAのパフォーマンスを分析することができます。


コードの変更と追加の説明

新しいコードには、古いコードと比較していくつかの機能強化と追加が含まれています。以下は、追加・変更された内容の詳細です:

新しい入力パラメータ:

  • max_loss と min_won :

input double max_loss = 1;   // 最大損失
input double min_won = 1;    // ミン・ウォン


目的: これらの入力パラメーターは、最大許容損失額(max_loss )と最小必要利益リセット回数(min_won )を設定することができます。最適化条件をよりコントロールすることができます。

追加の変数

  • reset_status[] :

string reset_status[]; // 各リセットの状態を格納する配列

目的: 各残高リセットイベントのステータス("Profit reset "または "Loss reset")を格納するために追加される配列。

stopOptimization :

bool stopOptimization = false;

目的: 特定の条件に基づいて最適化を停止するタイミングを示すために使用されるフラグ。

badResult :

bool badResult = false; // 不適切な最適化結果を示すフラグ

目的: 最適化の結果を不利なものとしてマークするフラグで、OnTester() の結果に影響を与えるために使用できます。

CheckBalanceAndReset() での変更:

  • リセット・ステータスの記録:

ArrayResize(reset_status, ArraySize(reset_status) + 1); // リセット状態を記録するために配列のサイズを変更する。
reset_status[ArraySize(reset_status) - 1] = "Profit reset"; // ステータスを記録する

目的: 利益リセットが発生すると、ステータスがreset_status[]配列に記録される。

最適化停止条件による損失リセットの処理:

if (TesterDeposit(deposit_amount))
{
    unsuccessful_resets++;  // ロスのリセットに失敗した場合のカウンターを増やす
    // リセット時間とステータスを記録する
    ArrayResize(reset_status, ArraySize(reset_status) + 1);
    reset_status[ArraySize(reset_status) - 1] = "Loss reset";
    {
        stopOptimization = true;
        CheckStopCondition();  // 最適化を停止すべきかどうかをチェックする
    }
    PrintFormat("Loss reached. Balance has been reset to the initial value.");
}

目的: ロス・リセット後、コードは unsuccessful_resets をインクリメントし、ステータスを記録し、stopOptimization を true に設定し、CheckStopCondition() を呼び出して最適化を停止すべきかどうかを判断する。

新しい関数 CheckStopCondition() :

void CheckStopCondition()
{
    if(stopOptimization)
    {
        Print("Stopping current optimization pass");
        badResult = true;  // 結果を悪いものとしてマークする
        TesterStop();
    }
}

目的: この関数は、stopOptimization が真であるかどうかをチェックし、真である場合には、結果を 不良としてマークし、TesterStop() を使用して現在の最適化パスを停止します。

New Function OnTester() :

double OnTester()
{
    // リセット成功回数が必要最低回数に満たないか、badResultが設定されている場合
    if(successful_resets < min_won || badResult)
    {
        Print("Optimization failed: returning a highly unfavorable result.");
        // 最適化パスを台無しにするため、非常に不利な結果を返す。
        return -999999;
    }

    // 成功したリセットと失敗したリセットの差を計算する。
    int reset_difference = successful_resets - unsuccessful_resets;

    // 差が負かどうかをチェックする
    if(reset_difference < 0)
    {
        Print("Negative difference between successful and unsuccessful resets. Returning a highly unfavorable result.");
        // 差がマイナスの場合、非常に不利な結果を返す
        return -999999;
    }

    // 差分をログに出力する
    PrintFormat("Difference between successful and unsuccessful resets: %d", reset_difference);

    // 差分をテスターの結果として返す
    return reset_difference;
}


目的: この関数は、最適化プロセスに対するカスタム基準を提供する。成功したリセットの回数が最低条件を満たしているか、あるいは結果が悪いかをチェックします。成功したリセットと失敗したリセットの差を計算し、差が負でない限りこの値を返します。


PrintBalanceResetResults() の 拡張

// 各リセットの日付とその間の日数を出力する。
for(int i = 1; i < ArraySize(reset_times); i++)
{
    // リセットまでの日数を計算する
    int days_between_resets = (reset_times[i] - reset_times[i-1]) / 86400; // 1日で86400秒
    // リセット日、ステータス、およびその間の日数を表示する。
    PrintFormat("Reset %d: %s (%s), Reset %d: %s (%s), Days between: %d days",
                i, TimeToString(reset_times[i-1], TIME_DATE), reset_status[i-1],
                i + 1, TimeToString(reset_times[i], TIME_DATE), reset_status[i],
                days_between_resets);
}


目的: この関数は、リセットの回数を出力するだけでなく、日付、ステータス、リセット間の日数 など、各リセット・イベントの詳細も出力するようになりました。これにより、リセット活動のより包括的なログが提供されます。

変数の初期化と使用:

  • 初期バランス・チェック:

if(initial_balance == 0)
{
    initial_balance = current_balance;
}

目的: 最初のティックでinitial_balanceが正しく設定されていることを確認する。

利益率の計算:

double profit_percentage = (current_balance - initial_balance) / initial_balance * 100.0;

目的: 初期残高に対する利益または損失の割合を計算します。


追加の概要:

  • 最適化プロセスの制御:

    • コードには、失敗したリセットの最大回数を超えたり、成功したリセットの最小回数を達成しなかったりといった特定の条件に基づいて最適化プロセスを停止するメカニズムが含まれるようになりました。
  • ロギングとトラッキングの強化:

    • PrintBalanceResetResults()にreset_status[]と詳細なロギングが追加されたため、リセット・イベントとその結果の追跡が向上しました。
  • OnTester() による Optimizer との統合:

    • OnTester() を実装することで、スクリプトは結果を最適化エンジンに伝え、カスタム基準に基づくパラメータセットの選択に影響を与えることができます。
これらの変更により、最適化中の取引操作の制御が改善され、イベントのログがより詳細に記録され、カスタム定義された基準に基づいて最適化プロセスに影響を与えることができるようになり、スクリプトの機能が強化されました。









MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/52163

TardioBot TardioBot

TardioBot V1.05は、歴史上の人物ジュゼッペ・タルディオにちなんで命名された、三角裁定取引戦略を採用するMetaTrader 5用にデザインされたExpert Advisorです。

Cincin EA Cincin EA

Cincin EA (v2.24)はMetaTrader 5用の自動売買システムで、指定したシンボル(例えばEURUSD)で保守的なランダムトレードを実行し、バスケット管理、ヘッジ、ポジションコントロールなどの機能を備えています。

Manual Scalping With Keyboard Manual Scalping With Keyboard

MT5でキーボードショートカットを使った手動スキャルピングのための軽量ツール

AdaptiveTrader Pro EA AdaptiveTrader Pro EA

このMetaTrader用Expert Advisor (EA)は、RSI、ATR、移動平均を含むテクニカル指標の組み合わせを活用し、高い確率で取引機会を特定します。ダイナミックなロットサイジング、トレーリングストップ、パフォーマンスベースの調整機能を備え、不安定な市場環境において取引判断を最適化し、リスクを効果的に管理します。