記事"MQL5ウィザード:トレーディングシグナル用モジュール作成方法"についてのディスカッション - ページ 7

 
t101:
OnInit()に手動で追加するのですか?ウィザードでやりたいことができないのですか?
何が問題なのでしょうか?追加機能を導入するわけですから、ちょっとした手作業が必要です。
 
Karputov Vladimir:
何が問題なのか?追加機能を導入するわけですから、ちょっとした手作業が必要です。

まったく問題ありませんが、マスターがシグナルや資本などのカスタムモジュールに基づいてすべてを行うというコンセプトには対応していません。また、この記事は古く、事実ではありません:

CheckCloseLong() メソッドは、エグジットレベルを決定してロングポジションをクローズするシグナルを生成します。このメソッドはエキスパートアドバイザーによって呼び出され、ロングポジションを決済する必要性を判断します。ロング・ポジションを決済するシグナルの生成を意図している場合は、このメソッドをオーバーライドする必要があります。

virtual bool CheckCloseLong(double& price);
いずれにせよ、ご協力ありがとうございました。
削除済み  
もう6年近くが経過しているが、この記事は古くないのだろうか? 端末がほぼ毎週更新されているのを見るので、よく分からない。
 
yerlan Imangeldinov:
ほぼ6年が経過しているが、この記事は古くないのだろうか? 端末がほぼ毎週更新されているのを見るので、よく分からない。
トレーディング・シグナル・モジュールの作成については、「6時間でトレーディング・ロボットを作ろう!」という最新の記事がある。
 

皆さん、こんにちは、

CExpertSignalの子孫で、「ブレイクアウト」と「ブレイクイン」の2つのパターンを持つシグナルを作成するにはどうすればよいでしょうか 。私の認識では、すべてのシグナル・クラスは

//+------------------------------------------------------------------+
//| 価格が上昇することに "投票 "する。|
//| INPUT: いいえ。|
//| 出力:価格が上昇する「票」の数。
//| REMARK: No.|
//+------------------------------------------------------------------+
int CSignalBreakOutOrIn::LongCondition()
  {
   int result=0;
   int idx   =StartIndex();
//---
   //--- 念のため、デフォルトのパターンを用意しておく。
   if(IS_PATTERN_USAGE(0)) result=m_pattern_0;                                   // 「確認中」シグナル番号 0
   //--- モデル1を使用する場合は、パターン1の条件をチェックする。
   if(IS_PATTERN_USAGE(1) && ConditionForPattern1(idx)) result=m_pattern_1;      // シグナル番号1
   //--- モデル2が使用されている場合、パターン2の条件をチェックする。
   if(IS_PATTERN_USAGE(2) && ConditionForPattern2(idx)) result=m_pattern_2;      // シグナル2
//--- 結果を返す
   return(result);
  }

そして

//+------------------------------------------------------------------+
//| 価格が下落することに "投票 "する。|
//| INPUT: いいえ。|
//| 出力:価格が下落する「票」の数。
//| REMARK: No.|
//+------------------------------------------------------------------+
int CSignalBreakOutOrIn::ShortCondition()
  {
   int result=0;
   int idx   =StartIndex();
//---
   //--- 念のため、デフォルトのパターンを用意しておく。
   if(IS_PATTERN_USAGE(0)) result=m_pattern_0;                                   // 「確認中」シグナル番号 0
   //--- モデル1を使用する場合は、パターン1の条件をチェックする。
   if(IS_PATTERN_USAGE(1) && ConditionForPattern1(idx)) result=m_pattern_1;      // シグナル番号1
   //--- モデル2が使用されている場合、パターン2の条件をチェックする。
   if(IS_PATTERN_USAGE(2) && ConditionForPattern2(idx)) result=m_pattern_2;      // シグナル2
//--- 結果を返す
   return(result);
  }

そして

int CExpertSignal::Direction()
  {
   ...
   int result=LongCondition()-ShortCondition();
   ...
  }

signal.m_threshold_ openと signal.m_threshold_closeに対してテストされます。

  1. bool CExpertSignal::CheckOpenLong(...)
  2. bool CExpertSignal::CheckOpenShort(...)
  3. bool CExpertSignal::CheckCloseLong(...)
  4. bool CExpertSignal::CheckCloseShort(...)
  5. bool CExpertSignal::CheckReverseLong(...), および
  6. bool CExpertSignal::CheckReverseShort(...) です。

市場に参入し、損切りと利食いの価格を設定するためのレベルを指定するパラメータは、標準的な実装によって呼び出される

//+------------------------------------------------------------------+
//| 買いレベル検出|
//+------------------------------------------------------------------+
bool CExpertSignal::OpenLongParams(double &price,double &sl,double &tp,datetime &expiration)
  {
  }
//+------------------------------------------------------------------+
//| 売りのレベルを検出する|
//+------------------------------------------------------------------+
bool CExpertSignal::OpenShortParams(double &price,double &sl,double &tp,datetime &expiration)
  {
  }

これは 、ベース・クラスで定義されているbool CExpertSignal::CheckOpenLong(...)bool CExpertSignal::CheckOpenShort(...)の標準実装によって 呼び出さ れます。 したがって、次のようにオーバーロードすれば十分です。

  1. int CExpertSignal::LongCondition(...) を オーバーロードすれば十分です、
  2. int CExpertSignal::ShortCondition(...) をオーバーロードすれば十分です、
  3. bool CExpertSignal::OpenLongParams(...)
  4. bool CExpertSignal::OpenShortParams(...)
  5. bool CExpertSignal::CloseLongParams(...), および
  6. bool CExpertSignal::CloseShortParams(...) です

で、任意の新しいシグナルを定義できます。 CExpertTrade には、希望するエントリー価格が成行注文を発注するための現在価格から離れすぎているかどうかを検出するコードが含まれており、ストップ注文を発注するかリミット注文を発注するかを自動的に決定するためにエントリー価格の選択を使用することに注意してください。

ただし、取引レンジが直近n バーの最高値 (HH) と最低値 (LL) の間の領域と定義されている場合、LL < 価格 < HH という条件は常に真となります。したがって 、int CExpertSignal::LongCondition(...) int CExpertSignal::ShortCondition(...) は 常にパターン 0 の「ブレイクアウト」を検出し、関数 int CExpertSignal::Direction() がこのパターンにどのような値を関連付けたとしても 、常にゼロを返します!

をオーバーロードするのが自然です。

  1. bool CExpertSignal::CheckOpenLong(...)
  2. bool CExpertSignal::CheckOpenShort(...)

前者が

  1. LongCondition()>m_threshold_openを チェックし、後者は
  2. ShortCondition()> m_threshold_openをチェックします。

の代わりに

  1. m_direction>=m_threshold_openおよび
  2. -m _ direction>=m_threshold_openである。

の代わりに-m_direction>=m_threshold_openを使用することは、まだ成功したバージョンにはなっていない。ご指摘のように、 bool CExpertSignal::OpenLongParams(...) がエントリー価格 HH を返し、 bool CExpertSignal::OpenShortParams(...) がエントリー価格 LL を返すようにすれば、シグナルが連続的に2つのストップ注文を生成するようになります。

私の目には、この標準的なブレイクアウト戦略を標準ライブラリの観点からどのように実装するかを示す例があり、LLとHHで指値注文を出す「ブレイクイン」という代替パターンを提供することで十分な柔軟性を持たせることが望ましいと映ります。明らかに、このようなシグナルは、以下の戦略を組み合わせることになる。

  1. 高値で買って高値で売る、または安値で売って安値で買う。
  2. 高値で買って高値で売る、あるいは高値で売って安値で買う。

それらをパターンとして提供することによって。このようなアプローチを完成させる手助けをしていただけると非常にありがたい。

 
AnonymousTrades:

皆さん、こんにちは、

CExpertSignalの子孫で、「ブレイクアウト」と「ブレイクイン」の2つのパターンを持つシグナルを作成するにはどうすればよいでしょうか 。私の認識では、すべてのシグナルクラスは以下の2つの関数を オーバーロードする ことで実装できる(はず)です

int CSignalBreakOutOrIn::LongCondition()  { if(IS_PATTERN_USAGE(X) && LongConditionForPatternX(idx)) return(m_pattern_X); }
int CSignalBreakOutOrIn::ShortCondition() { if(IS_PATTERN_USAGE(X) && ShortConditionForPatternX(idx)) return(m_pattern_X); }

CExpertTradeには、希望するエントリー価格が成行注文を出すには現在価格から遠すぎるかどうかを検出するコードと、ストップ注文を出すかリミット注文を出すかを自動的に決定するためのエントリー価格の選択が含まれていることに注意して ください

[...]

私の目には、この標準的なブレイクアウト戦略を標準ライブラリの観点からどのように実装するかを示す例があり、LLとHHで指値注文を出す代替パターン「ブレイクイン」を提供することで十分に柔軟性を持たせることが望まれます


できるだけわかりやすくするために、私の懸念を言い換えることにしました。私の目には、2つの記事

  1. MQL5ウィザード:売買シグナルのモジュールを作成する方法(この記事)と
  2. 標準ライブラリの取引戦略クラスを探る - Harvester Tradingによる戦略のカスタマイズ

は、最も簡単な方法で独自のシグナルクラスを書く方法を一般的に示して います。以下に、私のこの認識についてまとめようと思う。

しかし、過去n 期間に観測された最高値/最安値よりも価格が高く/低くなったときに買い/売りを提案するという、このアプローチを使ったシグナルの実装を完成させるためのアイデアがまだ必要です。これは、現在の価格の上下に一対の逆指値注文を置くことになる。私はすでに、次の条件を置き換えることでこれを達成しようとしました。

  • Direction()>=m_threshold_openを
  • 例えば、LongCondition()>=m_threshold_open、

しかし、それでもうまくいかないようだ。なぜなら、OpenLongParams(...)OpenShortParams(...) という関数もオーバーロードしたからです。これらの関数は、希望する逆指値注文を発注するレベルを決定します。MetaQuotesの開発者の考え方に詳しい方、この最も基本的なブレイクアウト戦略をどのように実装したのか説明していただけませんか?

ソースコードはどんなソフトウェアでも最高のドキュメントとみなされることが多いので、私はMQL5のCExpertSignalクラスの分析に時間を費やした。

その結果、取引条件をチェックする関数は、基本的に以下のように関数Direction() { return(LongCondition()-ShortCondition()); }の 値をテストすることに集約されることがわかった:

bool CExpertSignal::CheckOpenLong(...)     { if(Direction()>=m_threshold_open && OpenLongParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckOpenShort(...)    { if(-Direction()>=m_threshold_open && OpenShortParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckCloseLong(...)    { if(-Direction()>=m_threshold_close && CloseLongParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckCloseShort(...)   { if(Direction()>=m_threshold_close && CloseShortParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckReverseLong(...)  { if(!CheckCloseLong(c_price) || !CheckOpenShort(price,sl,tp,expiration)) return(false); return(true); }
bool CExpertSignal::CheckReverseShort(...) { if(!CheckCloseShort(c_price) || !CheckOpenLong(price,sl,tp,expiration)) return(false); return(true); }

(安定した実行のために必要だと思われるコードだけを削除し、機能性には一切寄与していない)。

この要約から、カスタマイズされたストラテジークラスであれば、以下の関数をオーバーロードすれば十分であることがわかります。

  1. int CExpertSignal::LongCondition(...)
  2. int CExpertSignal::ShortCondition(...)
  3. bool CExpertSignal::OpenLongParams(...)
  4. bool CExpertSignal::OpenShortParams(...)
  5. bool CExpertSignal::CloseLongParams(...), および
  6. bool CExpertSignal::CloseShortParams(...)

でマクロIS_PATTERN_USAGE(x) を使用する方法が説明されています。

直近n本の バーの最高値と最安値の間に価格があるかどうかという条件は常に真でなければなりません したがって、LongCondition(...)ShortCondition(...)の 両方は、ブレイクアウト取引のパターンに関連付けられた同じ値を返し、CheckOpenLong(...)CheckOpenShort(...) の条件が変更されない限り、Direction() の値は必然的にゼロになります。

しかし、LongCondition()>=m_threshold_open、ShortCondition()>=m_threshold_open で十分ではないでしょうか?

 
yankai0219:

記事に添付していただいたファイルを使用すると、何かがおかしいのです。

Typeに関するコメントは以下のようになっているはずです:

//| Type=SignalAdvanced                                          |

メッセージをありがとう。あなたのメッセージが私の問題を解決してくれました。ありがとう!

ジョージ

 

こんにちは、

コードをコンパイルすると、3つの警告が表示されました。

m_open' の宣言がメンバを隠しています samplesignal.mqh 42 23

m_close' の宣言がメンバ を非表示にしている samplesignal.mqh 43 23

m_expiration' の宣言がメンバを隠す samplesignal.mqh 52 23


m_openとm_closeはExpertBase.mqhで定義されているが、型が異なる。

m_expiratin は ExpertSignal.mqh で定義されています。

上記3行をコメントアウト。警告は消えました。

ジョージ

 
もし可能なら、このプログラムの完全で実行可能なコードを正確に書き直し、バグを修正してここに置いてほしい。
 
touhid Qolizadeh #:
このプログラムの正確で完全で実行可能なコードを書き直し、バグを修正してここに置くことが可能なら

どうぞ!

乾杯、ザリック

ファイル: