記事"ユニバーサルEA: CUnIndicator と予約オーダーの使用 (その 9)"についてのディスカッション

 

インジケーターのラッパーについてです。

個人的に、この素晴らしいユニバーサルエキスパートアドバイザーに 唯一欠けているのは、1つの口座で多くの異なるエキスパートアドバイザーを使ってFORTSに取り組む可能性、つまり、標準的な手段ではなく、マジックによってエキスパートアドバイザーによるポジションを追跡することです。

そのため、当面の間、私は独自のソリューションを使用しています。

 
Viktor Vlasenko:

インジケーターのラッパーについてです。

個人的に、この素晴らしいユニバーサルエキスパートアドバイザーに欠けている唯一の点は、1つの口座で多くの異なるエキスパートアドバイザーを使ってFORTSに取り組む可能性、つまり、標準的な手段ではなく、マジックによってエキスパートアドバイザーによるポジションを追跡することです。

そのため、今のところ私は独自のソリューションを使用しています。

この目的のためにHedgeTerminalが あり、このAPIはユニバーサルエキスパートアドバイザーと統合されています。ところで、ユニバーサル・エキスパートはもともとヘッジターミナルのラッパーとして作られた。しかし、このエンジンを普及させるために、HTから切り離し、独立したプロジェクトとして開発を始めました。

 
Vasiliy Sokolov:

この目的のためにヘッジターミナルが あり、そのAPIはユニバーサル・エキスパート・アドバイザーと統合されている。ところで、ユニバーサル・エキスパートはもともとヘッジターミナルのラッパーとして作られました。しかし、このエンジンを普及させるため、HTから切り離し、独立したプロジェクトとして開発を始めました。

ありがとう、HedgeTerminalのことは読んだよ。僕のニーズには冗長だし、他人の閉じたツールで作業したくないんだ。

現在のバージョンでは、ファイル・フォルダ構造が変更されているのがとても気に入っています。

 

ユニバーサル・エキスパートとは どういう意味ですか?MT4とMT5の両方に対応しているというところから始まったと思います。しかし、MT4用にコンパイルされておらず、ライブラリはすべてMQL5にあります。

 
void CUnIndicator::PushName(string name)
{
   int old_size = ArraySize(m_params);
   int size = ArrayResize(m_params, ArraySize(m_params) + 1);
   for(int i = 0; i < old_size; i++)
      m_params[i+1] = m_params[i];
   m_params[0].type = TYPE_STRING;
   m_params[0].string_value = name;
}

ここで、m_params配列全体が、最初に適用されたパラメーターによって詰まっているのではないかと思う。

 

void CUnIndicator::PushName(string name)
{
int old_size = ArraySize(m_params);
int size = ArrayResize(m_params, ArraySize(m_params) + 1);
for(int i = 0; i < old_size; i++)
m_params[i+1] = m_params[i];
m_params[0].type = TYPE_STRING;
m_params[0].string_value = name;
m_params_count++;
}.

m_params_count++に注意してください。渡されたパラメーターの配列のサイズを大きくしているので、渡されたパラメーターのカウンターを大きくしています。少なくとも、パラメーターなしでインジケーターを呼び出すと、このように動作しました。他のケースでは、インジケーターの開始時に最後のパラメーターが認識されていないようです。

 

そう、同じ関数の中だ:

For(int i = old_size-1; i >= 0; i--)
m_params[i+1] = m_params[i];

 

いい記事ですね。

CUnIndicatorクラスのCreateメソッドが顧客定義インジケータに使用される場合、そのコードにはPushName()への呼び出しがあり、これはバギー関数です。

ユーザー定義インジケータを作成する場合、MqlParam parameters_array[]の最初の要素にカスタム・インジケータの名前を格納する必要があります。

カスタム・インジケータ名用に要素0を解放するために、すべての要素を1つ右に移動する必要があります。

以下を修正してください:

void CUnIndicator::PushName(string name)
{
   int old_size = ArraySize(m_params);
   int size = ArrayResize(m_params, ArraySize(m_params) + 1);
   //for(int i = 0; i < old_size; i++) m_params[i+1] = m_params[i]; // このように書くのは間違いだ。
   for(int i=old_size-1;i>=0;i--) m_params[i+1] = m_params[i]; //その通りだ。
   m_params[0].type = TYPE_STRING;
   m_params[0].string_value = name; // インジケーター名のカスタマイズ
   m_params_count++;// パラメータの数に1を加えた数 
}
 
作者への質問:CUnIndicat経由で呼び出されたインジケータをロード可能にする方法を教えてください。
 

こんにちは。

著者への質問:記事に添付されている取引エンジンの最新版がダウンロードされ、添付のストラテジーImpluse 2.0がテストされています。

1.ストラテジーテスターの視覚化モードでは、取引モードのコントロールパネルは機能しますか?

2.TradeState.SetTradeStateメソッドで設定した取引モードは実行されますか?

口座で取引する場合、パネルは機能し、モードも切り替わりますが、ストラテジーテスターでは切り替わりません。