- 記事"ユニバーサルEA: シンボルプロパティへのアクセス (その 8)"についてのディスカッション
- 記事"ユニバーサルEA:カスタムトレーリングストップ(その6)"についてのディスカッション
- ユニバーサルEA: CUnIndicator と予約オーダーの使用 (その 9)
インジケーターのラッパーについてです。
個人的に、この素晴らしいユニバーサルエキスパートアドバイザーに 唯一欠けているのは、1つの口座で多くの異なるエキスパートアドバイザーを使ってFORTSに取り組む可能性、つまり、標準的な手段ではなく、マジックによってエキスパートアドバイザーによるポジションを追跡することです。
そのため、当面の間、私は独自のソリューションを使用しています。
インジケーターのラッパーについてです。
個人的に、この素晴らしいユニバーサルエキスパートアドバイザーに欠けている唯一の点は、1つの口座で多くの異なるエキスパートアドバイザーを使ってFORTSに取り組む可能性、つまり、標準的な手段ではなく、マジックによってエキスパートアドバイザーによるポジションを追跡することです。
そのため、今のところ私は独自のソリューションを使用しています。
この目的のためにHedgeTerminalが あり、このAPIはユニバーサルエキスパートアドバイザーと統合されています。ところで、ユニバーサル・エキスパートはもともとヘッジターミナルのラッパーとして作られた。しかし、このエンジンを普及させるために、HTから切り離し、独立したプロジェクトとして開発を始めました。
ユニバーサル・エキスパートとは どういう意味ですか?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を加えた数 }
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
