ファイルからEAを自動で初期化・再初期化

 
タスク:再初期化、システムクラッシュ時の再起動などの後にEA環境(ポジションデータ、カウンタなど)を復元すること。

解決策:EAの動的変数の各変更をファイルに保存します。OnInit()中に、これらすべてのものがファイルに読み戻されます。

ただし、以下の場合は、過去の変数の状態をファイルから読み込むことはできません。
  • ファイル構造が変更されました(Expert Advisor の異なるバージョン、新しいビルド)。チェックするのは初歩的なことで、問題ありません。
  • 前回、ボットが不具合を起こしました。ボットがストップアウトでクラッシュしたり、ハングアップしたり、エラーリミットを超えたとすると、すぐにエラーを起こす変数がファイル内にある可能性があります。これは一部、非常に簡単に確認できるのですが(考慮すべきエラーリミット、クリティカルエラーの 記録...)、完全な解決策とは言えません。
  • ファイルがあまりにも「ほっこり」しているのです。前回EAをアップロードしたのがX日前、あるいは今日だとすると、その中の情報はすでに古くなっている。確認方法 - fudge knows.

今、私はそうしている:OnDeinit()の原因を分析し、プログラムが閉じれば、私はグローバルターミナル(再初期化のフラグのような)を削除します。

OnInit()中にこのフラグがない場合、毎回ユーザーに「ファイルから変数を復元しますか」とダムメッセージで尋ねなければなりません。

これはめちゃくちゃバカで不便な方法だ!


質問:このようなソリューションを完全に自動化する方法は?

アップロードできないファイルと、ダウンロードできるファイルの見分け方は?

せめて、このメッセージボックスの呼び出しは最小限にしてほしい。

 

MQL4 or MQL5 ?

MQL5 であれば、です。

OnInit()チェックで。

1.ポジション

if ( PositionSelect(_Symbol) )
{
}
else
{
}

2)受注

(何か問題があれば、どこから来たのか確認することなく、単純にすべての注文を削除します。)

//+------------------------------------------------------------------+
//| Expert Remove orders function                                    |
//+------------------------------------------------------------------+
void RemoveOrders()
{
  int orders_total = OrdersTotal();
//---  
  if ( orders_total > 0 )
  {
    for ( int i = ( orders_total - 1 ); i >= 0; i-- )
    {
      ulong temp_order_ticket = OrderGetTicket( i );
      
      if ( OrderSelect( temp_order_ticket ) )
      {
        string temp_symbol = OrderGetString( ORDER_SYMBOL );
        
        if ( ( temp_symbol == sec_symbol ) || ( temp_symbol == _Symbol ) )
        {
          RemoveOldOrder( temp_order_ticket );
        }
      }
    }
  }
}

3.端末のグローバル変数

  if ( !GlobalVariableCheck( "trans_count" ) )
  {
    datetime a_time = GlobalVariableSet( "trans_count", 0 );
    
    if ( ulong( a_time ) == 0 )
    {
      MessageBox( "Глобальная переменная терминала 'Счётчик транзакций' не создана!", "Ошибка", MB_OK | MB_ICONHAND );
      return( INIT_FAILED );
    }
  }

4.保存する変数

a) 負荷をかけること。

//+------------------------------------------------------------------+
//| Expert Load setings function                                     |
//+------------------------------------------------------------------+
void LoadSettings()
{
  string file_name = _Symbol + ".dat";
  int file_handle;
//---  
  if ( FileIsExist( file_name, 0 ) )
  {
    file_handle = FileOpen( file_name, FILE_READ|FILE_BIN );
    
    if ( file_handle != INVALID_HANDLE )
    {
      e_high = FileReadLong( file_handle );
      a_profit = FileReadLong( file_handle );
      e_low = FileReadLong( file_handle );
      ord_delta_high = FileReadLong( file_handle );
      ord_delta_low = FileReadLong( file_handle );
      order_delta = FileReadLong( file_handle );
      exit_delta = FileReadLong( file_handle );
      FileClose( file_handle );
    }
  } 
}

b) 保存 ( OnDeInit() )

//+------------------------------------------------------------------+
//| Expert Save settings function                                    |
//+------------------------------------------------------------------+
void SaveSettings()
{
  string file_name = _Symbol + ".dat";
  int file_handle;
  bool file_found = true;
//---  
  if ( FileIsExist( file_name, 0 ) )
  {
    if ( FileDelete( file_name, 0 ) ) file_found = false;
  }
  else
  {
    file_found = false;
  }
//---
  if ( !file_found )
  {
    file_handle = FileOpen( file_name, FILE_WRITE|FILE_BIN );
    
    if ( file_handle != INVALID_HANDLE )
    {
      FileWriteLong( file_handle, e_high );
      FileWriteLong( file_handle, a_profit );
      FileWriteLong( file_handle, e_low );
      FileWriteLong( file_handle, ord_delta_high );
      FileWriteLong( file_handle, ord_delta_low );
      FileWriteLong( file_handle, order_delta );
      FileWriteLong( file_handle, exit_delta );
      FileClose( file_handle );
    }
  } 
}
 
Fry_Антон:
タスク:再初期化、システム障害時の再起動などの後、EAの環境(ポジションデータ、カウンターなど)を復元すること。

カウンタークエスチョンは、「なぜ?

ファイルから環境を復元することは、長い目で見れば常に自殺行為であることをイマイチ理解していない。再起動する際は、必ずMetaTraderの取引環境に基づいてデータを再計算する必要があります。

 
Fry_Антон:
タスク:再初期化、システム障害時の再起動などの後、EA環境(位置データ、カウンタなど)をリストアする。
再計算
 
Vasiliy Sokolov:

カウンタークエスチョンは、「なぜ?

ファイルから環境を復元することは、長い目で見れば常に自殺行為です。再起動時には必ずMetaTraderの取引環境に基づいてデータを再計算する必要があります。

先物市場の特徴

すべてを再計算できるわけではありません。もちろん、環境からできることはアップデートしていますが...。さて、ここで一例をご紹介しましょう。

ポジションをクリアして注文がクローズ/オープンされたとき。ターミナルは取引をロックし、その日の注文を削除します(注文はキャンセルされるまでブローカーによって禁止されます)。新しいオーダーを作らなければならない。

そして、ポジションを開くときの 初値、ポジションを設定するときの初時刻、注文が必要です。

そのため、そのようなパラメータを自分なりに勘定しておく必要があります。

また、秒/分/時間/日あたりのリクエスト数、致命的でない誤操作の数、等々もあります。

喜んでファイルを譲ります!もし、それが現実なら。=(

このような状況があります:ターミナルがクラッシュした(今日のビルドは安定しており、以前は常にこのようであり、常に安定したリリースのみが存在するという事実ではありません)。

クラッシュターミナル後:クイックリブートとオートラン - ファイルからのリストアですべて動作します。

初期化ファイルをOnTrade()イベント(ディスクを苦しめないように1、2秒のタイマー付き)に常に保存しているので、非常に安定して動作しています。


ですから、私にとってこの質問はとても重要です。古いファイルや危険なファイルから変数を読み込まないようにするにはどうしたらよいでしょうか?

 
Михаил:

MQL4 or MQL5 ?

MQL5 であれば、です。

OnInit()チェックで。

1.ポジション

2)受注

(何か問題があれば、どこから来たのか確認することなく、単純にすべての注文を削除します。)

3.端末のグローバル変数

4.保存する変数

a) 負荷をかけること。

b) 保存 ( OnDeInit() )

ほぼこんな感じで作りました。しかし、私はタイマーを使ってOnTrade()に保存しています。

また、符号などの変数もクソほど種類があり、コードは常に進化しているので、1つ1つ保存するのは非常に不便でした。

ファイルに必要なものすべてを保持する基本構造を作りました(いくつかの文字列値を除く)。

一文字で名前をつけたので、コードはかなり短くなっています(b.volumeはほとんどvolumeです)。また、演算子=で構造体全体を一度に保存できるのは便利です。

 
Fry_Антон:

...

質問:このようなソリューションを完全に自動化する方法は?

...

EAプログラミングとは根本的に異なるアプローチ。

 
Dmitry Fedoseev:

EAプログラミングとは根本的に異なるアプローチ。

それなりに役に立つ考えで答えを広げていってくれれば、ありがたい。

EAコードを「より良く」するための基本原則とは?

 
Fry_Антон:

それなりに役に立つ考えで答えを広げていってくれれば、ありがたい。

EAコードを「より良く」するための基本原則とは?

すでにここに書かれていることですが、すべてを計算し直してください。つまり、命令で状況を分析するのです。あるデータがファイルに格納されているか、あるいは他の方法(グローバル変数など)で格納されているかは、基本的に重要ではありません。要は、何らかのデータが必要な場合は、オーダーチケットにバインドして保存され、この場合、オーダーがある→データがある、オーダーがない→データがない、というようにデータが古くても問題はないのです。特定のオーダーに縛られないデータもあるかもしれませんが、それぞれのケースを考えなければならないので、解決可能な問題だと思います。

クリアリングは本当に一番複雑な問題です。しかし、長期間のデータ保存(またはその陳腐化)の問題ではなく、Expert Advisor の単純な変数にデータを保存することができます(少し危険ですが、5 分間だけです)。ここで難しいのは、後でどう対処するかということです。注文ごとにグローバルターミナル変数のグループを作成し、そこに始値を格納することができます。そして、無印の注文が現れたら(あるいは新しい日の始まりに)、履歴の中の最後に決済された注文を調べ、使用できる特徴(例えばロットなど)に従ってそれらを照合し、決済された注文から新しい注文にすべてのグローバル変数をリセットします。

 

アントン!

この問題に対して「気負い」すぎなのです。

緊急事態が発生した後、専門家の仕事をきちんと復旧させたいことは明らかです

の状況です。私も、最初は頭を悩ませました。

しかし、そのような状況は極めて稀であると判断した

(半期に一度のMT5リアルトレードの経験から)なので、割に合わないと判断しました。

を「わざわざ」注文し、秋以降に存在するすべてのものに「釘を刺す」だけでいいのです。

落下前に注文があり、それが実行されていれば何もできないし、もし

もし、まだ「ぶら下がっている」のであれば、それを殺して、取引状況に合わせて設定し直せば、損をすることはありません

そうすると、残るはポジションだけ、つまり、あるのかない のか。

ファイルからの変数の書き込み/読み出しに関して。

私のEAでは、「ホット」(仕事中)に変数を変更しているので

Expert Advisorが新規起動時に「ホット」な設定を取り込むように、ファイルに書き込んで読み込む。

あなたが自分自身で作り出している問題

考えてみてください!

P/S MT5は注文が重要なMT4とは違う!

MT5では、注文ではなく、POSITIONで誘導する必要があります。

 
Fry_Антон:

それなりに役に立つ考えで答えを広げていってくれれば、ありがたい。

EAコードを「より良く」するための基本原則とは?

内輪で回答。

Z.I.さんの例は、有効ではありません。Fortsではそのような問題はありません。もちろん、どんな問題でも作って、それを長い時間かけて解いていくことは可能です。しかし、作り込まない方が楽なのに、なぜ解決するのでしょうか?

理由: