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

 

素晴らしい有益な記事をありがとうございます、

私は親切にエキスパートアドバイザーを書く際に、このクラスをどのように使用することができるか例を持って来るようにお願いしてもよろしいですか?

ありがとうございました。

 

こんにちは。モジュールが動作しません。

ログによると、 閾値利益のレベルは設定注文のレベルより大きくなければなりません。

コンストラクタで、空でなくゼロでない変数を初期化しました。なぜエラーになるのでしょうか?

 //+------------------------------------------------------------------+
//|TrailingFixedPips.mqh
//| Copyright 2009-2013, MetaQuotes Software Corp.
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
// ウィザードの説明開始
//+----------------------------------------------------------------------+
//| クラスの説明|
//| タイトル=ストップロス・フローティング・トレーリング(Fox104)
//| タイプ=トレーリング|
//| 名前=FixedPips|
//| クラス=CTrailingFixedPips|
//| ページ|
//| パラメータ=StopLevel,int,30,ストップロス・トレーリング・レベル(単位:ポイント
//| Parameter=ProfitLevel,int,50,テイク・プロフィットのトレーリング・レベル(単位:ポイント
//+----------------------------------------------------------------------+
// ウィザードの説明 終了
//+------------------------------------------------------------------+
//| クラス CTrailingFixedPips.|
//| 目的:ストップ・レベルをpips単位で固定したトレーリング・ストップのクラス。 目的:ストップ・レベルをpips単位で固定したトレーリング・ストップのクラス。
//| CExpertTrailingクラスから派生。|
//+------------------------------------------------------------------+
class CTrailingFixedPips : public CExpertTrailing
  {
protected:
   //--- 入力パラメータ
   int               m_stop_level;
   int               m_profit_level;

public:
                     CTrailingFixedPips(void);
                    ~CTrailingFixedPips(void);
   //--- 保護されたデータの初期化方法
   void              StopLevel(int stop_level)     { m_stop_level=stop_level;     }
   void              ProfitLevel(int profit_level) { m_profit_level=profit_level; }
   virtual bool      ValidationSettings(void);
   //---
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp);
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp);
  };
//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
void CTrailingFixedPips::CTrailingFixedPips(void)
  {
            m_stop_level = 30;
            m_profit_level = 50;
  }
//+------------------------------------------------------------------+
//| デストラクタ|
//+------------------------------------------------------------------+
CTrailingFixedPips::~CTrailingFixedPips(void)
  {
  }
//+------------------------------------------------------------------+
//|| バリデーション設定で保護されたデータ。
//+------------------------------------------------------------------+
bool CTrailingFixedPips::ValidationSettings(void)
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- 初期データのチェック
   if((m_profit_level-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit_level!=0.0)
     {
      printf(__FUNCTION__+": 閾値利益レベルは注文設定レベルより大きくなければならない");
      return(false);
     }
//--- OK
   return(true);
  }
//+------------------------------------------------------------------+
//| ロング・ポジションのトレーリング・ストップや利益をチェックする。
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
//--- チェック
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- パラメータ・チェック 
   if(m_profit_level==0.0)  return(false);
//--- すでに損益分岐点に達しているのか?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- 利益チェック
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| ショート・ポジションのトレーリング・ストップや利益をチェックする。
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp)
  {
//--- チェック
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- パラメータ・チェック
   if(m_profit_level==0.0)  return(false);
//--- すでに損益分岐点に達しているのか?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- 利益チェック
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Fox104:

こんにちは。モジュールが動作しません。

ログによると、 閾値利益のレベルは設定注文のレベルより大きくなければなりません。

コンストラクタで、空でなくゼロでない変数を初期化しました。なぜエラーが発生するのでしょうか?

フォーラムにコードを正しく挿入して ください。(あなたのメッセージはすでに修正されています)。
 
Andy:

記事で指定したモジュールを使用すると、Expert Advisorをチャートにロードする際にExpert Advisorのログにエラーが発生します:

2017.09.06 00:28:29.873 1 (EURUSD,M5) OnInit: インジケータの初期化エラー

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetPriceSeries: タイムシリーズの変更は禁止されています。

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetOtherSeries: 時系列の変更は禁止されています。

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::InitIndicators: 設定のパラメータがチェックされていません。

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpert::InitIndicators: 後続オブジェクトの指標初期化エラー

2017.09.06 00:31:20.256 1 (EURUSD,M5) OnInit: 指標の初期化エラー

多分それは古いもので、どこで新しいものを入手するか、またはこの中で何を修正するか?

トレイリングモジュール "sampleTrailing.mqh "を変更して ください:

//+------------------------------------------------------------------+
//| 設定パラメータをチェックする。|
//| INPUT: いいえ。|
//| OUTPUT: 設定が正しければ真、そうでなければ偽。 || OUTPUT: 設定が正しければ真、そうでなければ偽。
//| 注釈: いいえ。|
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- Initメソッドが呼ばれなかった場合
   if(m_symbol==NULL) return(false);
//--- パラメータ・チェック
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+": 閾値利益レベルは注文設定レベルより大きくなければならない");
      return(false);
     }
//--- OK
   return(true);
  }
 
Andy:

記事で指定されたモジュールを使用すると、Expert Advisorをチャートにロードする際にExpert Advisorのログにエラーが発生します:


おそらく古いものだと思われますが、新しいものを入手するにはどうすればよいでしょうか?

メッセージありがとうございます。

 
Andy:

ショートポジションを建て、パラメータで通常のストップロス(トレイリングではない)を0に設定すると、トレイリングストップはブレイクイーブンに設定されませんが、通常のストップを少し動かして少なくとも-1ピップに設定すると、すべてが機能します。ロングではすべてが正常に機能する。すでにブレイクイーブンがある(ストップが価格を下回っている)という条件のチェックでは、最初はストップの値に0を設定し、それ以上進ませない。


その通りです。このトレーリングモジュールがブレイクイーブンで機能するトリガーとなるのは、指定されたストップロスなのです。つまり、そのポジションは最初にストップロスを持たなければならないと仮定されているのです。


追記

どのような記事であれ、その目的は、ある問題を解決するためのアプローチを示し、それに慣れ親しむことです。そして、ユーザー自身が得た知識に基づいて独自のコードを開発すべきである。

 
Andy:

それは、ストップがない場合は、末尾にもあるように補完する必要があります - 変数を少なくともオープニング値で埋める。

(私はあなたのメッセージの2つのプッシュ通知を 受け取ったが、それらのいずれかが欠落している - 削除)?


あなたが何かを変更する必要がある場合 - これは、この記事の問題ではありません。ここでは、あなたが得た知識に基づいて、自分でそれを行うことができます。つまり、テクニカルアサインメントを作成し、その下で記事が書き直されると思っているのであれば、そうではありません。

私はあなたの行動を見るように:モジュール(少し変更)を書き直して使用してください。


追記:最後にもう一度、「返信」ボタンを使ってください。そうでなければ返信しません。

 
Andy:

わかりました、自分で書きます。自分の投稿を削除していませんか(削除していたら教えてください。)


そのようなトピックは役に立つと思います。

そうそう、私は自分の投稿を編集していて、間違えて「削除」をクリックしてしまいました。そのため、プッシュは正しく届きました。