記事"クロスプラットフォームEA: シグナル"についてのディスカッション - ページ 2

 

エンリコ、ありがとう、

あるシグナルを別のシグナルの追加フィルターとして使えるかどうか理解しようとしているのですが...。

例えば、メインシグナルがあり、エントリーシグナルLongを出す。次に2番目のシグナルをチェック します。そして、もしそのシグナルもロングを出した場合、合計のシグナルはロングになります。しかし、もし2つ目のシグナルがロングを出し、1つ目のシグナルがニュートラルであれば、2つ目のシグナルは1つ目のシグナルの追加フィルターに過ぎず、それ自体がエントリーシグナルではないので、トータルのシグナルはニュートラルになるはずです。

また、特定のシグナルに基づいて資金管理をコントロールする方法はありますか?例えば、そのシグナルのロットは1、別のシグナルのロットは2といった具合です。最初の質問に関連して、デフォルトのロットは1番目のシグナルのものですが、2番目のシグナルが確認された場合、ロットは例えば2倍になります。

ありがとうございます。

 
mbjen:

あるシグナルを別のシグナルの追加フィルターとして使用できるかどうかを理解しようとしています。

例えば、メインシグナルがあり、エントリーシグナルLongを出す。次に2つ目のシグナルをチェックする。そして、もしそのシグナルもロングを出した場合、合計のシグナルはロングになります。しかし、もし2つ目のシグナルがロングを出し、1つ目のシグナルがニュートラルであれば、2つ目のシグナルは1つ目のシグナルの追加フィルターに過ぎず、それ自体がエントリーシグナルではないので、トータルシグナルはニュートラルになるはずです。

それは可能です。最も簡単な方法は、2つのシグナルをCSignalの子孫の1つのインスタンスにまとめることです。また、CSignalの子孫の中にCSignalsのインスタンスを作成し、サブフィルターがそれに応じて親シグナルを変更することもできます。

mbjen

また、特定のシグナルに基づいて資金管理をコントロールする方法はありますか?例えば、そのシグナルのロットは1、別のシグナルのロットは2といった具合です。最初の質問に関連して、デフォルトのロットは1番目のシグナルのものですが、2番目のシグナルが確認された場合、ロットは例えば2倍になります。

はい、これは可能です。CSignalsインスタンスのコンテナはCExpertAdvisorの インスタンスで、各CSignalインスタンスは親として同じCSignalsインスタンスを持っています。CExpertAdvisorインスタンスに到達するまで、親/コンテナを取得し続け、そのマネー・マネージャーへのポインターを取得し、インデックスまたは名前で希望のマネー管理方法を割り当てる必要があります。

 
Enrico Lambino:

可能である。最も簡単な方法は、2つのシグナルをCSignalの子孫の1つのインスタンスにまとめることです。また、CSignalの子孫の中にCSignalsのインスタンスを作成し、サブフィルターがそれに応じて親シグナルを変更することもできます。

はい、これは可能です。CSignalsインスタンスのコンテナはCExpertAdvisorのインスタンスで、各CSignalインスタンスはCSignalsの同じインスタンスを親として持ちます。CExpertAdvisorインスタンスに到達するまで、親/コンテナを取得し続け、そのマネーマネージャーへのポインタを取得し、インデックスまたは名前で希望のマネー管理方法を割り当てる必要があります。


エンリコさん、ありがとうございます。

 

クロスプラットフォームのEAフレームワークを使い始めたばかりです。

TEMAインジケーターとMAインジケーターを組み合わせてSignalTEMA_MAにしました。計算とLongConditionとShortConditionは以下の通りです。EAコードも添付します。


bool SignalTEMA_MA::Calculate(void)
{
   int   tema_ma_state_current=0;
   bool  ret;
   
   if(m_ma.Main(m_signal_bar) >= m_tema.Main(m_signal_bar))
      tema_ma_state_current = 1;
   else
      tema_ma_state_current = -1;

   if (m_tema_ma_state != tema_ma_state_current) {
      ret = m_tema_ma_state == 0 ? false : true;
      m_tema_ma_state = tema_ma_state_current;
   }
   else {
      ret = false;
   }
   return ret;      
}

bool SignalTEMA_MA::LongCondition(void)
  {
   return m_tema.Main(m_signal_bar) > m_ma.Main(m_signal_bar);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool SignalTEMA_MA::ShortCondition(void)
  {
   return m_tema.Main(m_signal_bar) < m_ma.Main(m_signal_bar);
  }


EAは動作しているようですが、TEMA/MAインジケータの交差と注文の間に、以下に見られるような不要な遅延が発生します。
この例は2017年12月4日から6日までのMT5 EURUSD 15分足で行われました。

私の質問は、どうすれば注文をできるだけクロスの近くで入力できるようになるかということです。

これをクリアしたら、私はEA戦略を実装し続け、資金管理だけでなく、追加のエントリー/エグジット条件とフィルターで利益を上げられるようにしたいと思います。

/カール


ファイル:
 

こんにちは、カール、

取引条件には<と>ではなく、>=と<=を使うことができます:

bool SignalTEMA_MA::LongCondition(void)
  {
   return m_tema.Main(m_signal_bar) >= m_ma.Main(m_signal_bar);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool SignalTEMA_MA::ShortCondition(void)
  {
   return m_tema.Main(m_signal_bar) <= m_ma.Main(m_signal_bar);

あなたのスクリーンショットの3つ目のハイライトされた円では、EAはショートトレードを遅すぎました。上記のコードは、その売り取引を1バー早くエントリーさせます。

もし、クロス自体(2バー後ろ、ハイライトされた円があるローソク足)でトレードさせたいのであれば、同じ設定を使用することができますが、m_signal_bar = 0(現在のバー)とします。こうすることで、可能な限りクロスに近い位置で取引が行われるようになりますが、このバーのデータは再描画されることがよくあります。指標は、バーが形成されている間にクロスしたかもしれませんし、そのバーのクローズまでそれを維持するかもしれませんし、そうでないかもしれません。

 
Enrico Lambino:

カール、こんにちは、

取引条件には<と>ではなく、>=と<=を使うことができます:

あなたのスクリーンショットの3つ目のハイライトされた円では、EAはショートトレードを遅すぎました。上記のコードは、その売り取引を1バー早くエントリーさせます。

もし、クロス自体(2バー後ろ、ハイライトされた円があるローソク足)でトレードさせたいのであれば、同じ設定を使用することができますが、m_signal_bar = 0(現在のバー)とします。こうすることで、可能な限りクロスに近い位置で取引が行われるようになりますが、このバーのデータは再描画されることがよくあります。このバーのデータは再描画されることがよくあります。バーが形成されている間にインジケータがクロスしたかもしれませんし、そのバーのクローズまでそれを維持するかもしれませんし、そうでないかもしれません。


こんにちは、エンリコ、

お勧めの方法を試してみます。

/カール

 
Karl Klang:


エンリコ、こんにちは、

お勧めの方法を試してみます。

/カール

こんにちは、エンリコ、

今週末、いくつかテストしてみました。取引条件を>=と<=に変更したのですが、残念ながら1小節早く動きません。


また、signal_bar=0に設定してみたところ、クロス自体で取引されるようになったのですが、expert.Initのコールでone_trade_per_candle=true、position_reverse=trueを指定しても、不要な取引が大量に発生するようになりました(下記スニップ参照)。

現在の Expert ソース・ファイルを添付します。

ファイル:
 

多分、CExpertAdvisorBase::OnTick(void)の以下の条件が間違っているのでは?

   if((checkopenlong || checkopenshort)
      && (m_every_tick || IsNewBar(m_symbol_name,m_period))
      && (!CheckPointer(m_times) || m_times.Evaluate()) 
      && (!m_one_trade_per_candle || m_last_trade_time<Time(0))
   )

このようにすべきでしょうか?

   if((checkopenlong || checkopenshort)
      && (m_every_tick || m_last_trade_time<Time(0))
      && (!CheckPointer(m_times) || m_times.Evaluate()) 
      && (!m_one_trade_per_candle || IsNewBar(m_symbol_name,m_period))
   )


そうすると、次のようになります:



 
Karl Klang:

多分、CExpertAdvisorBase::OnTick(void)の以下の条件が間違っているのでは?

このようにすべきでしょうか?


そうすると、次のようになります:



カール、こんにちは、

これはTEMAのようなインジケーターでよく起こる問題です。このようなインジケータが示す値は非常に平坦で、クロスオーバーを確認するのが非常に難しいことがあります。例えば、あなたの最初のスクリーンショット(白い背景)、1番目と2番目のトレードで、よく見ると、これらのトレードの2つ前のバーでは、シグナルはまだ反対方向です。このため、1本前のローソク足がシグナルが反転した最初のローソク足ということになります(その結果、その次のバーでトレードが行われました)。3回目のトレードについては、過去ログにインジケータの値が印刷されていないと確認できません。視覚的には、インジケータは連続的に見えますが、実際には、データは離散的です。

CExpertAdvisorBase::OnTick(void)については、シグナルバー=0とした場合、エキスパートアドバイザーがm_every_tick = trueであることを確認してください。新しいローソク足をチェックすることは、ローソク足ごとに1つの取引を維持することとは異なります。

 

こんにちは、エンリコ、

MAとTEMAインジケータがクロスしたときに機能するように、ヒステリシス機能を含む計算機能を処理する方法を見つけました。

しかし、オーダーマネージャーで問題が発生しました。それは、最適化中にストラテジー・テスターをいくつかのループで実行したときに起こります。最初のループでは問題なく動作しますが、いくつかのループの後、すべてのローソク足に対して注文が発注されます。

ここでは問題なく動作します:


しかし、ここでOrder Managerが複数の注文を出し始めます:


COrderManagerの以下のコード部分をデバッグすると、orders_total = OrdersTotal();というステートメントが、うまくいくと1になり、失敗すると0になります。

bool COrderManager::TradeOpen(const string symbol,ENUM_ORDER_TYPE type,double price,bool in_points=true)
  {
   bool ret=false;
   double lotsize=0.0;
   int trades_total =TradesTotal();
   int orders_total = OrdersTotal();
   m_symbol=m_symbol_man.Get(symbol);
   if(!IsPositionAllowed(type))
      return true;
   if(m_max_orders>orders_total && (m_max_trades>trades_total || m_max_trades<=0))

うまくいけば、この問題を解決できるかもしれません。

よろしくお願いします/
Karl