エラー、バグ、質問 - ページ 2859

 
fxsaber:

一般的に、実装の可能性についてどのようにお考えですか?

様々な実装が可能です

しかし、すべてはEA間のデータ交換の 作業に帰結する

最も簡単な方法は、初期化の許可を確認し、OnTick()で初期化自体を実行することです。そうすれば、チャートを復元してその上でEAを実行することを避けられますし、閉じる前にEAを保存すれば、OnDeinit()で実行 できます。

この動物園を誰が管理するかは重要では ありません - メインEAかサービスか

 

テスターログで

2020.09.28 00:41:09.491 wrong tester bar time
2020.09.28 00:41:09.491 history error 9 in undefined function

どういう意味ですか?

 
Aleksey Vyazmikin:

テスターログで

どういう意味ですか?

これは、m1 ohlcの次の値を受信したとき(または建値で テストする場合はバーの状態)、時間フィールドに0が含まれていることを意味します。

未定義関数とは、あらかじめ定義された関数(OnTick、OnTimerなど)の外側、つまりテスターのメインループで問題が発生したことを意味します。

 
Slava:

これは、次のm1 ohlc値(または建値で テストするときのバーの状態)を取得するときに、時間フィールドに0が含まれることを意味します。

未定義関数とは、あらかじめ定義された関数(OnTick、OnTimerなど)の外側、つまりテスターのメインループで問題が発生したことを意味します。

一日中、すべてが順調に動いていたのに、それが始まってしまった。ユーザーとして何ができるのか?

 
Slava:

これは、次のm1 ohlc値(または建値で テストするときのバーの状態)を取得するときに、時間フィールドに0が含まれることを意味します。

未定義関数とは、あらかじめ定義された関数(OnTick、OnTimerなど)の外側、つまりテスターのメインループで問題が発生したことを意味します。

よくわからないのですが、私のコードに誤りがあるのでしょうか、それともターミナルの誤りなのでしょうか?履歴をすべて消去したが、改善されなかった。

追加されました。

私のコードで関数を見つけ、それを無効にすることでエラーを回避しましたが、別のEAではこの関数は正常に動作しています。どうしてですか?プライベートメッセージで投下することができる

このバグ機能を有効にした場合でも、OnTick()は最初のバーで完全に実行され、その後そのエラーは 発生します。

異なる端末で、エラーが確認される。

ティックで実行 - エラーなし...

でも、不思議なのはログにあるんです。

2020.09.28 17:22:22.327 2020.09.18 09:45:02   Test_01

ツールで見ると、最初のティックがちょうど10:00で、この時点ではまだ取引セッションが終了していません。これはビジュアルモードで、ティックなしだと最初の印刷が10時位置に来る。

 
Igor Makanu:

一番簡単な方法は、各EAの最初のOnTick()で初期化許可をチェック することです。

これがこの問題の最大の難関です。
 
fxsaber:
これがこの課題の最大の問題点です。

チャートIDに注意して、年功序列で実行するようにしてください。しかし、これはEAとの相互作用をキャンセルするものではありません。あるいは、起動順にチャートIDを記載したファイル、あるいはSQLiteデータベースを作成する。

最初の初期化時に、リストにChart_ID()がなければ、リストに入力する、みたいなこと。端末 クローズによりクローズされない場合は、リストから削除される。これにより、EA同士の相互作用を設定することが可能になります。

 
fxsaber:
これがこの問題の最大の難関です。

をスケッチしてみました。このコードで2つのEAを作成しました。

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
const string this_ea_name = PREFIX_NAME + MQLInfoString(MQL_PROGRAM_NAME);
void OnTick()
{
   static ENUM_EA_STATE state = GlobalVariableSet(this_ea_name, ENUM_EA_STATE::READY_TO_INIT) > 0 ? READY_TO_INIT : ERROR_GLOBAL_VARIABLE;
   Comment(EnumToString(state));
   if(state != WORK)
   {
      if(state == ERROR_GLOBAL_VARIABLE) return;
      if(!My_Init(this_ea_name)) return;
      GlobalVariableSet(this_ea_name, ENUM_EA_STATE::WORK);
      state = WORK;
   }
   Print(this_ea_name, " ", __FUNCTION__);
}
//+------------------------------------------------------------------+
bool My_Init(const string chek_ea_name)
{
   if(GlobalVariableGet(chek_ea_name) == (ENUM_EA_STATE)ENABLE_INIT)
   {
      Print("EA is init");
      return(true);
   }
   return(false);
}
//+------------------------------------------------------------------+

と、タイマー(5秒)で動作する1つの制御EA

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
   for(int i = GlobalVariablesTotal() - 1; i >= 0; i--)
   {
      string curr_gname = GlobalVariableName(i);
      if(StringFind(curr_gname, PREFIX_NAME) !=-1)
      {
         if(GlobalVariableGet(curr_gname) == (ENUM_EA_STATE)READY_TO_INIT)
         {
            if(GlobalVariableSet(curr_gname, ENUM_EA_STATE::ENABLE_INIT) > 0)
            {
               Print("Enable Init : ", curr_gname, ".....exit");
               return;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+


確認したところ、すべてうまくいきました。ただ一つ、グローバル変数にレコードを作成するGlobalVariableSetOnCondition()がうまくいかなかったです。

 
fxsaber:
これがこの課題の最大の問題点です。

GlobalVariableSetOnConditionだけで 解決します。

GlobalVariableSetOnConditionがtrueを返したときのみ、操作が可能です。
初期化に成功し、リソースを解放した後、main変数を元の状態に戻すと、別のEAが開始されます。

DeInitでは、EAが全くない状態でターミナルに突入しないように、無条件で変数を削除します(前の読み込みが正しく完了しなかった場合)。

 
Alexey Viktorov:
イゴール・マカヌ
アンドレイ・ハチムリアンスキー

お勧めの商品を教えていただきありがとうございました。GlobalVariableSetOnConditionを見て みます。