EAのリモートコントロールの方法

26 11月 2018, 07:38
Dmitriy Gizlyk
0
142

コンテンツ

イントロダクション

金融相場でのトレードの様々な自動化システムは、今日では一般的になっています。 EAの主な利点は、完全なアルゴリズムの実行と1日24時間の稼働であると考えられています。 仮想ホスティングは、24時間自律的にEAを使用することができます。

残念ながら、すべてのEAが同じように動作するわけではありません。 あるケースでは、トレーダーは手動で有効または無効にする必要があります。 これは、ユーザーがターミナルに直接アクセスできる場合に簡単です。 しかし、ターミナルに迅速にアクセスできない場合はどうでしょうか。 このような場合には、EAの操作をリモートで制御できるとよいでしょう。 ターミナル内のEAリモートコントロールの可能な方法を考えてみましょう。

1. タスクの設定

一見すると、このタスクは明確です。外部コマンドの受信時にEAに指示を送信するプログラムを作成する必要があります。 しかし、よくよく考えると、MetaTrader5はプログラミング手段によってサードパーティによってEAに直接影響を与えられません。 各EAは別々のフローで動作し、開いているチャート上で実行中のEAを検出することは不可能です。 ユーザー fxsaber は、 "MetaTrader5 のエキスパートライブラリ" にこのソリューションを提供しました。

このコードでは、作成者はテンプレートを保存する関数を使用できます。 一見すると、テンプレートを保存しても、チャートで実行されているプログラムの操作には影響しません。 これは事実ですが、チャートテンプレートを保存すると、チャートに適用されるすべてのグラフィカルオブジェクトと、そのパラメータと共に起動したすべてのアプリケーションがファイルに保存されます。 保存されたテンプレートをチャートに適用すると、すべてのグラフィカルオブジェクトとプログラムが、保存されたパラメータと共に元に戻されます。

この影響のもう1つの側面は、テンプレートを読み込む前に存在していたすべてのオブジェクトとプログラムがチャートから削除されることです。 つまり、EAがチャート上で起動された場合、テンプレートにEAが含まれていない場合には削除されます。その逆も同様です。 したがって、チャートからEAをアップロードして削除すると、テンプレートファイルの編集が減少します。

もちろん、事前に必要なテンプレートを準備し、必要なものを編集することなくアップロードすることが可能です。 ただし、この場合、必要なテンプレートの数は、使用するEAの数の2倍の速さで増加します。 また、さまざまなシンボルに異なるEA設定が使用されている場合、各タスクシンボルを追加するとテンプレートの数が増加します。 テンプレートの作成はルーチンワークになり、適用する際に混乱しないようにする必要があります。

テンプレートの編集には、独自のニュアンスもあります。 デフォルトでは、テンプレートは "data_folder\Profiles\Templates\" に保存されます。 しかし、MQL5 は "サンドボックス " ファイルでのみ動作することができます。 fxsaberは再び解決策を提示しました。彼は、テンプレートファイル名を指定するときに、サンドボックスへのパスを追加することを提案しました。 その結果、サードパーティのライブラリを適用せずにテンプレートファイルにアクセスすることができます。

fxsaberの鋭く並外れた思考に感謝しましょう。

EAの管理方法を定義した後、プログラム・ユーザーのコミュニケーション・モデルに取り組みましょう。 今日の世界では、誰しもが常にスマートフォンを携帯しています。 MetaTrader5 プラットフォームは、iPhone と Android の両方のバージョンがあります。 ターミナルを自分のアカウントに接続した後、ユーザーはチャート上の価格の動きを分析し、手動でトレードすることができます。 現在、モバイルターミナルではEAおよびサードパーティのインジケータを使用できません。 EAを使用したい場合は、デスクトップターミナルと仮想ホスティングが必要です。

アカウントに接続されたモバイルターミナルでは、アカウント全体を表示できますが、モバイルターミナルとデスクトップターミナルの間に直接接続チャネルはありません。 影響を与えられる唯一のことは、オーダーを配置し、削除することです。 配置されたオーダーはすぐにアカウントに表示され、デスクトップターミナルで実行されているEAによって追跡することができます。 従って、オーダーを置くことと共に、マスターのEAに制御オーダーを移すことができます。 コマンドのリストとを渡すために使用するコードを定義する必要があります。 以下のセクションでは、問題に対処します。

2. テンプレートファイルの分析

まず、テンプレートファイルの構造を見てみましょう。 以下の例では、適用された ExpertMACDEAと MACD インジケータを持つ EURUSD M30 チャートテンプレートです。

<chart>
id=130874249669663027
symbol=EURUSD
period_type=0
period_size=30
digits=5
.....
.....
windows_total=2

<expert>
name=ExpertMACD
path=Experts\Advisors\ExpertMACD.ex5
expertmode=0
<inputs>
Inp_Expert_Title=ExpertMACD
Inp_Signal_MACD_PeriodFast=12
Inp_Signal_MACD_PeriodSlow=24
Inp_Signal_MACD_PeriodSignal=9
Inp_Signal_MACD_TakeProfit=50
Inp_Signal_MACD_StopLoss=20
</inputs>
</expert>

<window>
height=162.766545
objects=103

<indicator>
name=Main
........
</indicator>
<object>
.......
</object>

<object>
........
</object>
........
........
<object>
........
</object>

</window>

<window>
height=50.000000
objects=0

<indicator>
name=MACD
path=
apply=1
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=0
scale_fix_min_val=-0.001895
scale_fix_max=0
scale_fix_max_val=0.001374
expertmode=0
fixed_height=-1

<graph>
name=
draw=2
style=0
width=1
color=12632256
</graph>

<graph>
name=
draw=1
style=2
width=1
color=255
</graph>
fast_ema=12
slow_ema=24
MACD_sma=9
</indicator>
</window>
</chart>

コードからもわかるように、テンプレートファイル内の情報は構造化され、タグによって分けられます。 このファイルは、チャート ID、シンボル、タイムフレームなどのメインのチャートデータを含むチャート>タグで始まります。 今回意味がある情報は、<expert>と</expert>タグの間に位置します。

ブロックの先頭には、EAに関するデータ (チャートに表示される短い名前、ファイルパス) があります。 expertmode のフラグは次に来ます。 EAがトレードを許可されているかどうかを示すステータスです。 フラグの後には、 <inputs></inputs>タグで強調表示されたEAパラメータが続きます。 その後、チャートサブウィンドウ上のデータを見つけることができます。 各セーフサブウィンドウは、起動したインジケータ (..<indicator> . </indicator>) と適用されたグラフィカルオブジェクト (..<object> </object>.) の説明を含むタグ<window></window>によって強調表示されます。

また、チャート上で起動したEAおよび/またはインジケータがグラフィカルオブジェクトを作成する場合は、テンプレートから削除することに注意してください。 それ以外の場合は、オブジェクトがテンプレートからチャートに適用され、そのようなEAおよび/またはインジケータを起動すると、同じオブジェクトが再作成されます。

これより、チャートを乱雑にしている多数の同一オブジェクトと、コンピューティングリソースの過剰な消費を制御できなくなる可能性があります。 最悪のシナリオでは、必要なプログラムがオブジェクト作成エラーを示し、チャートからアンロードされます。

通常、プログラムによって作成されたオブジェクトは、ユーザーの変更から保護するために hidden プロパティを割り当てることによって、グラフィカルオブジェクトリストに表示されません。 ' hidden ' フラグは、このプロパティをテンプレートに設定するために用意されています。 非表示のオブジェクトの場合は1です。

したがって、EAを有効/無効にするには、 expertmode フラグ値を変更し、途中で隠しオブジェクトを削除するテンプレートファイルを書き換える必要があります。 新しいテンプレートを適用すると、EAが必要なプロパティで再起動します。

3. コマンドの定義

開発されたEAの主な原則を定義した後、通信システムを作成しましょう。 以前、コマンドを送信するためにオーダーを使うことを決めました。 しかし、どのようにすれば金融結果を損なうことなくオーダーを使用してコマンドを送信できるのでしょうか。 この目的のため、コマンドを受信した後、EAによって削除される予約オーダーを使用します。

予約オーダーを行う場合は、タスク時間内にアクティブ化されていないことを確認する必要があります。 ここでの解決策はかなり明白です-現在の価格から十分な距離でオーダーを配置する必要があります。

驚いたことに、モバイルターミナルのとき、オープンオーダーにコメントを残すことが不可能であることがわかりました。 同時に、ユーザーはデスクトップターミナルであれば作成されたオーダーにコメントを見ることができます。 したがって、マスターEAからユーザーに一方向の通信をすることができます。 ただし、ユーザーはこの方法でコマンドを発行することはできません。

したがって、EAによって読み取られる予約オーダーを配置することができますが、コメントを残すことはできません。 この場合、コマンドを渡すための価格とオーダーシンボルを使用することができます。 ここでは、コマンドをコーディングするための価格を定義する必要があります。 配置されたオーダーがどのような状況下でアクティブにされないように、現在の価格から十分な距離に位置する必要があります。

価格はゼロ付近が良いと考えています。 理論的には、任意のシンボルの値がゼロになる確率は極めて小さいです。 したがって、1-5 ティックにオーダー価格を設定する場合、おそらく活性化されることはありません。 もちろん、この場合においては、ストップオーダーの使用がフリーマージンに影響を及ぼさないため、ストップオーダーの売りに限定されます。

モバイルアプリケーションでオーダーのコメントを読むことができることに留意してください。すなわち、マスターEAはこのようにデータを送信することができます。

上記を要約すると、以下のコマンドコードが提案されます。

# Price Volume Command
1 1 tick any EAのステータスをリクエストします。
マスターEAは、EAのシンボルによって予約オーダーを設定しますが、トレードの名前と許可はオーダーコメントで指定されます。
2 2 ticks any EAによるトレードをストップします。
オーダーコメントがない場合は、すべてのEAがストップします。 コマンドが最初のコマンドの後にオーダー変更の結果として発行されている場合は、特定のシンボル上の特定のEAがストップされます。
3 3 ticks any EAを使用してトレードを開始します。
操作の原則は、コマンド2と同じです。
4 4 ticks 1 min. BUY lot
2 min. SELL lot
3 min. lot ALL
予約オーダーを削除
5 5 ticks 1 min. BUY lot
2 min. SELL lot
3 min. lot ALL
ポジションを決済


4. マスターEAの作成

操作方法と通信チャネルを十分に理解したので、EAの開発を始めましょう。 EAコードは、「MetaTrader5 のエキスパートライブラリー」から、マイナーチェンジでメソッドを適用します-すべてのライブラリメソッドは、より使いやすくするために公開されます。

まず、より利便性に、適用されたタグにニーモニック名を割り当ててみましょう。 そのうちのいくつかは、既に適用ライブラリで宣言されています。

#define FILENAME (__FILE__ + ".tpl")
#define PATH "\\Files\\"
#define STRING_END "\r\n"
#define EXPERT_BEGIN ("<expert>" + STRING_END)
#define EXPERT_END ("</expert>" + STRING_END)
#define EXPERT_INPUT_BEGIN ("<inputs>" + STRING_END)
#define EXPERT_INPUT_END ("</inputs>" + STRING_END)
#define EXPERT_CHART_BEGIN ("<chart>" + STRING_END)
#define EXPERT_NAME "name="
#define EXPERT_PATH "path="
#define EXPERT_STOPLEVEL "stops_color="

その他のものはEAコードで宣言されています。

#define OBJECT_BEGIN             ("<object>" + STRING_END)
#define OBJECT_END               ("</object>" + STRING_END)
#define OBJECTS_NUMBER           ("objects=")
#define OBJECT_HIDDEN            ("hidden=1")
#define EXPERT_EXPERTMODE        ("expertmode=")

また、fxsaber が他のコードとライブラリの互換性の世話をし、ライブラリのトレーリングストップにあるニーモニック名をキャンセルしたことに注意する必要があります。 この方法では、同じ名前を別のマクロに再割り当てするときのエラーがなくなります。 ただし、このような宣言をライブラリ外で使用することはできません。 EAコードで同様のマクロの宣言を繰り返さないために、ライブラリコードの #undef ディレクティブをコメントアウトします。

//#undef EXPERT_STOPLEVEL
//#undef EXPERT_PATH
//#undef EXPERT_NAME
//#undef EXPERT_CHART_BEGIN
//#undef EXPERT_INPUT_END
//#undef EXPERT_INPUT_BEGIN
//#undef EXPERT_END
//#undef EXPERT_BEGIN
//#undef STRING_END
//#undef PATH
//#undef FILENAME

その後、マスターEAの2つの外部変数を宣言します。(分の情報のオーダーのライフタイムとその識別のマジックナンバー)

sinput int      Expirations =  5;
sinput ulong    Magic       =  88888;

上記のライブラリとトレーディングオペレーションのライブラリをEAコードに追加します。

#include <fxsaber\Expert.mqh>
#include <Trade\Trade.mqh>

グローバル変数ブロックで、トレーディングオペレーションクラスのインスタンスと、ワーキングチャート ID と直近のコマンドオーダーチケットを格納するための変数を宣言します。

CTrade   *Trade;
ulong     chart;
ulong     last_command;

OnInit 関数で、グローバル変数を初期化します。

int OnInit()
  {
//---
   Trade =  new CTrade();
   if(CheckPointer(Trade)==POINTER_INVALID)
      return INIT_FAILED;
   Trade.SetDeviationInPoints(0);
   Trade.SetExpertMagicNumber(Magic);
   Trade.SetMarginMode();
   Trade.SetTypeFillingBySymbol(_Symbol);
//---
   chart=ChartID();
   last_command=0;
//---
   return(INIT_SUCCEEDED);
  }

OnDeinit 関数でトレード操作クラスのインスタンスを削除することを忘れないでください。

void OnDeinit(const int reason)
  {
//---
   if(CheckPointer(Trade)!=POINTER_INVALID)
      delete Trade;
  }


4.1. コマンドマネージャ

マスターEA関数の起動は、 OnTradeTransactionトランザクションから実行されます。 関数の呼び出しは、1つのオーダーに対して複数回処理される場合があることに注意してください。 したがって、プログラムコードを実行する前に、一連のチェックを行います。

処理中のイベントのオーダーチケットの空き状況を確認します。 また、オーダーの削除のイベントを処理しないために、オーダー状況を確認します。 その上、売りストップオーダーだけなので、オーダーのタイプを確認することを避けるためにオーダーのマジックナンバーを確認するべきです。 また、オーダーを追加または変更する必要があるため、トレード操作の種類を確認する必要があります。

すべてのチェックが正常に完了したら、CheckCommand 関数に配置されたコマンドマネージャを起動します。

void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
   if(trans.order>0 && trans.order_state!=ORDER_STATE_REQUEST_CANCEL && request.magic==0 && 
      trans.order_type==ORDER_TYPE_SELL_STOP && 
      (trans.type==TRADE_TRANSACTION_ORDER_ADD || trans.type==TRADE_TRANSACTION_ORDER_UPDATE))
      CheckCommand(trans,request);
  }

CheckCommand 関数を起動すると、そのパラメータでトレード操作とリクエスト構造が受信されます。 まず、このリクエストが前に処理されたかどうかを確認してみましょう。 コマンドが既に処理されている場合は、関数を終了します。

void CheckCommand(const MqlTradeTransaction &trans,
                  const MqlTradeRequest &request)
  {
   if(last_command==trans.order)
      return;

そうでない場合は、オーダー価格をコマンドにデコードします。

   double tick=SymbolInfoDouble(trans.symbol,SYMBOL_TRADE_TICK_SIZE);
   uint command=(uint)NormalizeDouble(trans.price/tick,0);

次に、switch 演算子を使用して、受信コマンドに対応する関数を呼び出します。

   switch(command)
     {
      case 1:
        if(StringLen(request.comment)>0 || trans.type==TRADE_TRANSACTION_ORDER_UPDATE)
           return;
        if(trans.order<=0 || (OrderSelect(trans.order) && StringLen(OrderGetString(ORDER_COMMENT))>0))
           return;
        GetExpertsInfo();
        break;
      case 2:
        ChangeExpertsMode(trans,request,false);
        break;
      case 3:
        ChangeExpertsMode(trans,request,true);
        break;
      case 4:
        DeleteOrders(trans);
        break;
      case 5:
        ClosePosition(trans);
        break;
      default:
        return;
     }

結論としては、直近のコマンドのオーダーのチケットを保存し、アカウントからオーダーを削除します。

   last_command=trans.order;
   Trade.OrderDelete(last_command);
  }

すべての関数の完全なコードは、添付ファイルで提供されています。


4.2. 起動されたEAのデータ

GetExpertsInfo 関数は、ターミナルで起動されたすべてのEAのデータを取得する役割があります。 前に決定したように、この関数は、EAが起動されるシンボルに表示されるシンボルのストップオーダーを配置しますが、EA名とそのステータスはオーダーコメントに表示します。

関数の先頭で、DeleteOrdersByMagic 関数を呼び出して、以前に設定したオーダーを削除します。

void GetExpertsInfo(void)
  {
   DeleteOrdersByMagic(Magic);

さらに、ターミナル内のすべてのアクティブなチャートを繰り返し処理するためのループを配置します。 このループは、分析されたチャートがマスターEAのワーキングチャートであるかどうかをチェックすることから始まります。 yes の場合は、次のチャートに移動します。

   long i_chart=ChartFirst();
   while(i_chart>=0 && !IsStopped())
     {
      if(i_chart==0 || i_chart==chart)
        {
         i_chart=ChartNext(i_chart);
         continue;
        }

次の段階で、チャート上のEAプレゼンスの予備チェックを使用してチャートテンプレートをアップロードします。 EAが存在しない場合、またはテンプレートがアップロードされていない場合は、次のチャートに進みます。

      string temp=EXPERT::TemplateToString(i_chart,true);
      if(temp==NULL)
        {
         i_chart=ChartNext(i_chart);
         continue;
        }

次に、テンプレート内のEAブロックを詳しく見ることができます。 ブロックが見つからない場合は、次のチャートに移動します。

      temp=EXPERT::StringBetween(temp,EXPERT_BEGIN,EXPERT_END);
      if(temp==NULL)
        {
         i_chart=ChartNext(i_chart);
         continue;
        }

その後、EAの名前とそのステータスを取得します。 未来の情報のオーダーのコメントを形成するために使用します。 EAがトレードを許可されている場合、 "T " の文字は名前の前に置かれ、それ以外の場合は "S " 文字が使用します。

      string name =  EXPERT::StringBetween(temp,EXPERT_NAME,STRING_END);
      bool state  =  (bool)StringToInteger(EXPERT::StringBetween(temp,EXPERT_EXPERTMODE,STRING_END));
      string comment =  (state ? "T " : "S ")+name;

ループの最後に、チャートのシンボルと情報のオーダーの有効期間を決定します。 オーダーを送信し、次のチャートに移動します。

      string symbol=ChartSymbol(i_chart);
      ENUM_ORDER_TYPE_TIME type=ORDER_TIME_GTC;
      datetime expir=0;
      if(Expirations>0)
        {
         expir=TimeCurrent()+Expirations*60;
         type=ORDER_TIME_SPECIFIED;
        }
      Trade.SellStop(SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN),SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE),symbol,0,0,type,expir,comment);
      i_chart=ChartNext(i_chart);
     }
  }

この関数では、fxsaber's ライブラリのメソッドを使用して、チャートテンプレートを文字列変数に取得し、指定したタグの間に部分文字列を取得します。

必要に応じて、指定したチャートの文字列変数にテンプレートを取得するために、EAがチャートに存在するかどうかを確認します。 次に、指定したチャートのテンプレートを保存し、取得したテンプレートをバイナリ配列として読み込みます。 数値配列を文字列に変換し、呼び出し元の関数を返します。 検証段階でエラーが発生した場合、この関数は NULL を返します。

  static string TemplateToString( const long Chart_ID = 0, const bool CheckExpert = false )
  {
    short Data[];
    return(((!CheckExpert || EXPERT::Is(Chart_ID)) && ::ChartSaveTemplate((ulong)Chart_ID, PATH + FILENAME) && (::FileLoad(FILENAME, Data) > 0)) ?
           ::ShortArrayToString(Data) : NULL);
  }

指定したタグの間の部分文字列を取得するには、最初と直近の部分文字列のポジションを定義します。

  static string StringBetween( string &Str, const string StrBegin, const string StrEnd = NULL )
  {
    int PosBegin = ::StringFind(Str, StrBegin);
    PosBegin = (PosBegin >= 0) ? PosBegin + ::StringLen(StrBegin) : 0;

    const int PosEnd = ::StringFind(Str, StrEnd, PosBegin);

次に、返される部分文字列を切り取り、元の文字列を生の元の文字列まで減らします。

    const string Res = ::StringSubstr(Str, PosBegin, (PosEnd >= 0) ? PosEnd - PosBegin : -1);
    Str = (PosEnd >= 0) ? ::StringSubstr(Str, PosEnd + ::StringLen(StrEnd)) : NULL;

    if (Str == "")
      Str = NULL;

    return(Res);
  }

添付ファイル内のすべての関数とクラスのコード全体を詳しく見ることができます。

4.3. EAステータス変更機能

EAの状態は ChangeExpertsMode 関数で変更されます。 そのパラメータでは、指定された関数は、EAを配置するための新しいステータスと同様に、トレード操作とリクエスト構造を取得します。

void ChangeExpertsMode(const MqlTradeTransaction &trans,
                       const MqlTradeRequest &request,
                       bool  ExpertMode)
  {
   string comment=request.comment;
   if(StringLen(comment)<=0 && OrderSelect(trans.order))
      comment=OrderGetString(ORDER_COMMENT);      
   string exp_name=(StringLen(comment)>2 ? StringSubstr(comment,2) : NULL);

次に、上記のようにすべてのチャートを繰り返し処理し、テンプレートをアップロードするためのループを配置します。

   long i_chart=ChartFirst();
   while(i_chart>=0 && !IsStopped())
     {
      if(i_chart==0 || i_chart==chart || (StringLen(exp_name)>0 && ChartSymbol()!=trans.symbol))
        {
         i_chart=ChartNext(i_chart);
         continue;
        }
      string temp=EXPERT::TemplateToString(i_chart,true);
      if(temp==NULL)
        {
         i_chart=ChartNext(i_chart);
         continue;
        }

次の段階で、必要に応じて、チャート上で必要なEAの可用性を確認します。 チャート上で起動したEAがリクエストに対応していない場合は、次のチャートに進みます。 また、現在のEAのステータスを確認してください。 配置に設定されているものに対応する場合は、次のチャートに移動します。

      string NewTemplate   =  NULL;
      if(exp_name!=NULL)
        {
         NewTemplate=EXPERT::StringBetween2(temp,NULL,EXPERT_NAME);
         string name=EXPERT::StringBetween(temp,NULL,STRING_END);
         if(name!=exp_name)
           {
            i_chart=ChartNext(i_chart);
            continue;
           }
         NewTemplate+=name+STRING_END;
        }
//---
      NewTemplate+=EXPERT::StringBetween2(temp,NULL,EXPERT_EXPERTMODE);
      bool state  =  (bool)StringToInteger(EXPERT::StringBetween(temp,NULL,STRING_END));
      if(state==ExpertMode)
        {
         i_chart=ChartNext(i_chart);
         continue;
        }

必要なチェックをすべて通過したら、EAのステータスを指定して新しいテンプレートを作成します。 テンプレートから非表示のオブジェクトを削除し、新しいテンプレートをチャートに適用します。 すべての操作を実行した後、次のチャートに移動します。

      NewTemplate+=IntegerToString(ExpertMode)+STRING_END+temp;
      NewTemplate=DeleteHiddenObjects(NewTemplate);
      EXPERT::TemplateApply(i_chart,NewTemplate,true);
//---
      i_chart=ChartNext(i_chart);
     }

チャートの繰り返しループが完了したら、EAの新しい状態をユーザーに示すために、アクティブなEAデータ収集関数を起動します。

   GetExpertsInfo();
  }

すべての関数の完全なコードは、添付ファイルで提供されています。

4.4. オーダーの削除およびポジションの決済の機能

クローズオーダーとオープンポジションの関数は、ターゲットオブジェクトでのみ異なる同じアルゴリズムに基づいています。 したがって、この記事ではそのうちの1つだけを検討してみましょう。 DeleteOrders 関数を呼び出すと、トレーディングオペレーション構造がパラメータに渡されます。 この構造は、(セクション3からのコマンドのテーブルに従って) クローズオーダーの方向にオーダー量をデコードするために使用します。

void DeleteOrders(const MqlTradeTransaction &trans)
  {
   int direct=(int)NormalizeDouble(trans.volume/SymbolInfoDouble(trans.symbol,SYMBOL_VOLUME_MIN),0);

アカウントに配置されたすべてのオーダーを繰り返し処理するためのループは、その後に配置します。 このループでは、オーダーの種類が受信コマンドに準拠しているかどうかがチェックされます。 一致するものがある場合は、オーダーの削除リクエストが送信されます。

   for(int i=total-1;i>=0;i--)
     {
      ulong ticket=OrderGetTicket((uint)i);
      if(ticket<=0)
         continue;
//---
      switch((ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE))
        {
         case ORDER_TYPE_BUY_LIMIT:
         case ORDER_TYPE_BUY_STOP:
         case ORDER_TYPE_BUY_STOP_LIMIT:
           if(direct==2)
              continue;
           Trade.OrderDelete(ticket);
           break;
         case ORDER_TYPE_SELL_LIMIT:
         case ORDER_TYPE_SELL_STOP:
         case ORDER_TYPE_SELL_STOP_LIMIT:
           if(direct==1)
              continue;
           Trade.OrderDelete(ticket);
           break;
        }
     }
  }

すべての関数の完全なコードは、添付ファイルで提供されています。


結論

この記事では、MetaTrader5 プラットフォームにおけるEAリモートコントロールの方法を提案しました。 このソリューションは、トレードロボットを使用してトレーダーの活動のモビリティを向上させます。 標準関数を使用するために適用される非標準のアプローチは、さまざまな.dll を使用せずに、より広い問題を解決することができます。

レファレンス

Expert - MetaTrader5のライブラリ

この記事で使用したプログラム

#
名称
タイプ
詳細
1 Expert.mqh クラスライブラリ Expert - MetaTrader5のライブラリ
2 Master.mq5 EA ターミナルで起動した他のEAを管理するためのマスターEA
3 Master.mqproj プロジェクトファイル マスターEAプロジェクト


MetaQuotes Software Corp.によりロシア語から翻訳された
元の記事: https://www.mql5.com/ru/articles/5166

添付されたファイル |
MQL5.zip (88.19 KB)
ディープニューラルネットワーク(その7)ニューラルネットワークのアンサンブル: スタッキング ディープニューラルネットワーク(その7)ニューラルネットワークのアンサンブル: スタッキング

アンサンブルの構築を続けます。今回は、以前に作成したバギングアンサンブルに、訓練可能な結合器、つまりディープニューラルネットワークが追加されます。ニューラルネットワークの1つは、刈り込み後に7つの最良アンサンブル出力を組み合わせます。2つ目はアンサンブルの500個の出力をすべて入力として取り込み、刈り込んで結合します。ニューラルネットワークは、Python用のKeras/TensorFlowパッケージを使用して構築されます。このパッケージの特徴には簡単に触れます。テストが実行されて、バギングアンサンブルとスタッキングアンサンブルの分類品質が比較されます。

ディープニューラルネットワーク(その8)バギングアンサンブルの分類品質の向上 ディープニューラルネットワーク(その8)バギングアンサンブルの分類品質の向上

本稿では、バギングアンサンブルの分類品質を高めるために使用できる3つの方法を検討し、その効率を評価します。ELMニューラルネットワークのハイパーパラメータと後処理パラメータの最適化の効果が評価されます。

ギャップ ー 収入戦略か50/50か? ギャップ ー 収入戦略か50/50か?

ギャップ現象の研究とは、前の時間枠の終値と次の時間の終値との間の有意差の状況や、日々のバーの向かう方向を分析することです。関数GetOpenFileNameのDLLシステムを使用します。

運動継続モデル-チャート上での検索と実行統計 運動継続モデル-チャート上での検索と実行統計

この記事では、運動継続モデルの1つをプログラムによって定義します。 この主なアイデアは、2つの波の定義です(メインと補正) 極値点については、フラクタルだけでなく、 "潜在的な " フラクタル-まだフラクタルとして形成されていない極値点を適用します。