インディケータ: MACDのゼロレベルとの交差(色付きローソク足) - ページ 3

 
Andrey F. Zelinsky:

どのような編集をしたのか説明してください。

もし自分でやってみたいのであれば、解決できる可能性があります。


#property copyright   "Copyright 2009-2013, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version     "5.20"
#property description "It is important to make sure that the expert works with a normal"
#property description "chart and the user did not make any mistakes setting input"
#property description "variables (Lots, TakeProfit, TrailingStop) in our case,"
#property description "we check TakeProfit on a chart of more than 2*trend_period bars"
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
input double InpLots          =0.1; // たくさんある。
input int    InpTakeProfit    =50;  // テイクプロフィット(単位:pips)
input int    InpTrailingStop  =30;  // トレーリング・ストップ・レベル(単位:pips)
input int    InpMACDOpenLevel =3;   // MACDオープンレベル(単位:pips)
input int    InpMACDCloseLevel=2;   // MACD終値レベル(単位:pips)
input int    InpMATrendPeriod =26;  // MAトレンド期間
//---
int ExtTimeOut=10; // 取引操作間のタイムアウト(秒
//+------------------------------------------------------------------+
| MACD サンプル・エキスパート・クラス|
//+------------------------------------------------------------------+
class CSampleExpert
  {
protected:
   double            m_adjusted_point;             // 3点または5点に調整された点数
   CTrade            m_trade;                      // 取引オブジェクト
   CSymbolInfo       m_symbol;                     // シンボル情報オブジェクト
   CPositionInfo     m_position;                   // トレード・ポジション・オブジェクト
   CAccountInfo      m_account;                    // アカウント情報ラッパー
   //--- 指標
   int               m_handle_macd;                // MACD インジケーター・ハンドル
   
   //--- インジケータ・バッファ
   double            m_buff_MACD_main[];           // MACD インジケータのメイン・バッファ
   
  
   //--- 処理用指標データ
   double            m_macd_current;
   double            m_macd_previous;
   

   //---
   double            m_macd_open_level;
   double            m_macd_close_level;
   double            m_traling_stop;
   double            m_take_profit;

public:
                     CSampleExpert(void);
                    ~CSampleExpert(void);
   bool              Init(void);
   void              Deinit(void);
   bool              Processing(void);

protected:
   bool              InitCheckParameters(const int digits_adjust);
   bool              InitIndicators(void);
   bool              LongClosed(void);
   bool              ShortClosed(void);
   bool              LongModified(void);
   bool              ShortModified(void);
   bool              LongOpened(void);
   bool              ShortOpened(void);
  };
//--- グローバル・エキスパート
CSampleExpert ExtExpert;
//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
CSampleExpert::CSampleExpert(void) : m_adjusted_point(0),
                                     m_handle_macd(INVALID_HANDLE),
                                     
                                     m_macd_current(0),
                                     m_macd_previous(0),                                                                   
                                     m_macd_open_level(0),
                                     m_macd_close_level(0),
                                     m_traling_stop(0),
                                     m_take_profit(0)
  {
   ArraySetAsSeries(m_buff_MACD_main,true);
   
  
  }
//+------------------------------------------------------------------+
//| デストラクタ|
//+------------------------------------------------------------------+
CSampleExpert::~CSampleExpert(void)
  {
  }
//+------------------------------------------------------------------+
//| 初期化と入力パラメータのチェック
//+------------------------------------------------------------------+
bool CSampleExpert::Init(void)
  {
//--- 共通情報の初期化
   m_symbol.Name(Symbol());              // 記号
   m_trade.SetExpertMagicNumber(12345);  // マジック
//--- 3桁または5桁のチューニング
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;
//--- 調整後のポイントで取引する場合のデフォルトの偏差を設定する。
   m_macd_open_level =InpMACDOpenLevel*m_adjusted_point;
   m_macd_close_level=InpMACDCloseLevel*m_adjusted_point;
   m_traling_stop    =InpTrailingStop*m_adjusted_point;
   m_take_profit     =InpTakeProfit*m_adjusted_point;
//--- 調整後のポイントで取引する場合のデフォルトの偏差を設定する。
   m_trade.SetDeviationInPoints(3*digits_adjust);
//---
   if(!InitCheckParameters(digits_adjust))
      return(false);
   if(!InitIndicators())
      return(false);
//--- 成功
   return(true);
  }
//+------------------------------------------------------------------+
//| 入力パラメータのチェック|
//+------------------------------------------------------------------+
bool CSampleExpert::InitCheckParameters(const int digits_adjust)
  {
//--- 初期データのチェック
   if(InpTakeProfit*digits_adjust<m_symbol.StopsLevel())
     {
      printf("Take Profit must be greater than %d",m_symbol.StopsLevel());
      return(false);
     }
   if(InpTrailingStop*digits_adjust<m_symbol.StopsLevel())
     {
      printf("Trailing Stop must be greater than %d",m_symbol.StopsLevel());
      return(false);
     }
//--- 正しいロット量をチェックする
   if(InpLots<m_symbol.LotsMin() || InpLots>m_symbol.LotsMax())
     {
      printf("Lots amount must be in the range from %f to %f",m_symbol.LotsMin(),m_symbol.LotsMax());
      return(false);
     }
   if(MathAbs(InpLots/m_symbol.LotsStep()-MathRound(InpLots/m_symbol.LotsStep()))>1.0 E-10)
     {
      printf("Lots amount is not corresponding with lot step %f",m_symbol.LotsStep());
      return(false);
     }
//--- 警告
   if(InpTakeProfit<=InpTrailingStop)
      printf("Warning: Trailing Stop must be less than Take Profit");
//--- 成功
   return(true);
  }
//+------------------------------------------------------------------+
//| 指標の初期化|
//+------------------------------------------------------------------+
bool CSampleExpert::InitIndicators(void)
  {
//--- MACDインジケーターを作成する
   if(m_handle_macd==INVALID_HANDLE)
      if((m_handle_macd=iMACD(NULL,0,12,26,9,PRICE_CLOSE))==INVALID_HANDLE)
        {
         printf("Error creating MACD indicator");
         return(false);
        }
//--- EMAインジケータを作成し、コレクションに追加する。
  
      
//--- 成功
   return(true);
  }
//+------------------------------------------------------------------+
| ロング・ポジションのクローズをチェックする|
//+------------------------------------------------------------------+
bool CSampleExpert::LongClosed(void)
  {
   bool res=false;
//--- 閉鎖すべきか?
   
      if(m_macd_current<0 && m_macd_previous>0)
         if(m_macd_current<m_macd_close_level)
           {
            //--- クローズポジション
            if(m_trade.PositionClose(Symbol()))
               printf("Long position by %s to be closed",Symbol());
            else
               printf("Error closing position by %s : '%s'",Symbol(),m_trade.ResultComment());
            //--- 処理され、変更できない
            res=true;
           }
//--- 結果
   return(res);
  }
//+------------------------------------------------------------------+
//| ショート・ポジションの決済をチェック|
//+------------------------------------------------------------------+
bool CSampleExpert::ShortClosed(void)
  {
   bool res=false;
//--- 閉鎖すべきか?
   
      if(m_macd_current>0 && m_macd_previous<0)
         if(MathAbs(m_macd_current)>m_macd_close_level)
           {
            //--- クローズポジション
            if(m_trade.PositionClose(Symbol()))
               printf("Short position by %s to be closed",Symbol());
            else
               printf("Error closing position by %s : '%s'",Symbol(),m_trade.ResultComment());
            //--- 処理され、変更できない
            res=true;
           }
//--- 結果
   return(res);
  }
//+------------------------------------------------------------------+
| ロング・ポジションの変更をチェックする|
//+------------------------------------------------------------------+
bool CSampleExpert::LongModified(void)
  {
   bool res=false;
//--- トレーリング・ストップをチェックする
   if(InpTrailingStop>0)
     {
      if(m_symbol.Bid()-m_position.PriceOpen()>m_adjusted_point*InpTrailingStop)
        {
         double sl=NormalizeDouble(m_symbol.Bid()-m_traling_stop,m_symbol.Digits());
         double tp=m_position.TakeProfit();
         if(m_position.StopLoss()<sl || m_position.StopLoss()==0.0)
           {
            //--- 位置を修正する
            if(m_trade.PositionModify(Symbol(),sl,tp))
               printf("Long position by %s to be modified",Symbol());
            else
              {
               printf("Error modifying position by %s : '%s'",Symbol(),m_trade.ResultComment());
               printf("Modify parameters : SL=%f,TP=%f",sl,tp);
              }
            //--- 修正されたため、エキスパートから退出する必要がある
            res=true;
           }
        }
     }
//--- 結果
   return(res);
  }
//+------------------------------------------------------------------+
//| ショート・ポジションが変更されていないかチェックする。
//+------------------------------------------------------------------+
bool CSampleExpert::ShortModified(void)
  {
   bool   res=false;
//--- トレーリング・ストップをチェックする
   if(InpTrailingStop>0)
     {
      if((m_position.PriceOpen()-m_symbol.Ask())>(m_adjusted_point*InpTrailingStop))
        {
         double sl=NormalizeDouble(m_symbol.Ask()+m_traling_stop,m_symbol.Digits());
         double tp=m_position.TakeProfit();
         if(m_position.StopLoss()>sl || m_position.StopLoss()==0.0)
           {
            //--- 位置を修正する
            if(m_trade.PositionModify(Symbol(),sl,tp))
               printf("Short position by %s to be modified",Symbol());
            else
              {
               printf("Error modifying position by %s : '%s'",Symbol(),m_trade.ResultComment());
               printf("Modify parameters : SL=%f,TP=%f",sl,tp);
              }
            //--- 修正されたため、エキスパートから退出する必要がある
            res=true;
           }
        }
     }
//--- 結果
   return(res);
  }
//+------------------------------------------------------------------+
| ロング・ポジションのオープンをチェックする|
//+------------------------------------------------------------------+
bool CSampleExpert::LongOpened(void)
  {
   bool res=false;
//--- ロング・ポジション(買い)の可能性をチェックする。
   
      if(m_macd_current>0 && m_macd_previous<0)
         if(MathAbs(m_macd_current)>(m_macd_open_level))
           {
            double price=m_symbol.Ask();
            double tp   =m_symbol.Bid()+m_take_profit;
            //--- フリーマネーをチェックする
            if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,InpLots,price)<0.0)
               printf("We have no money. Free Margin = %f",m_account.FreeMargin());
            else
              {
               //--- オープンポジション
               if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
                  printf("Position by %s to be opened",Symbol());
               else
                 {
                  printf("Error opening BUY position by %s : '%s'",Symbol(),m_trade.ResultComment());
                  printf("Open parameters : price=%f,TP=%f",price,tp);
                 }
              }
            //--- いずれにせよ、エキスパートから退出しなければならない。
            res=true;
           }
//--- 結果
   return(res);
  }
//+------------------------------------------------------------------+
//| ショート・ポジションが開いているかチェックする。|
//+------------------------------------------------------------------+
bool CSampleExpert::ShortOpened(void)
  {
   bool res=false;
//--- ショート・ポジション(売り)の可能性をチェックする。
  
      if(m_macd_current<0 && m_macd_previous>0)
         if(m_macd_current<(m_macd_open_level) )
           {
            double price=m_symbol.Bid();
            double tp   =m_symbol.Ask()-m_take_profit;
            //--- フリーマネーをチェックする
            if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,InpLots,price)<0.0)
               printf("We have no money. Free Margin = %f",m_account.FreeMargin());
            else
              {
               //--- オープンポジション
               if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
                  printf("Position by %s to be opened",Symbol());
               else
                 {
                  printf("Error opening SELL position by %s : '%s'",Symbol(),m_trade.ResultComment());
                  printf("Open parameters : price=%f,TP=%f",price,tp);
                 }
              }
            //--- いずれにせよ、エキスパートから退出しなければならない。
            res=true;
           }
//--- 結果
   return(res);
  }
//+------------------------------------------------------------------+
//| main関数は、処理された位置があればtrueを返す。
//+------------------------------------------------------------------+
bool CSampleExpert::Processing(void)
  {
//--- リフレッシュ・レート
   if(!m_symbol.RefreshRates())
      return(false);
//--- インジケータの更新
   if(BarsCalculated(m_handle_macd)<2 )
      return(false);
   if(CopyBuffer(m_handle_macd,0,0,2,m_buff_MACD_main)  !=2 )
      
      
      return(false);
// m_indicators.Refresh();
//--- コーディングを簡素化し、アクセスを高速化する。
//--- データを内部変数に入れる
   m_macd_current   =m_buff_MACD_main[0];
   m_macd_previous  =m_buff_MACD_main[1];
   
  
//--- 市場に正しく参入することが重要だ、 
//--- しかし、正しく終了することの方が重要だ......。 
//--- まず、ポジションが存在するかどうかをチェックする。
   if(m_position.Select(Symbol()))
     {
      if(m_position.PositionType()==POSITION_TYPE_BUY)
        {
         //--- ロング・ポジションの決済または修正を試みる
         if(LongClosed())
            return(true);
         if(LongModified())
            return(true);
        }
      else
        {
         //--- ショート・ポジションを決済または修正する
         if(ShortClosed())
            return(true);
         if(ShortModified())
            return(true);
        }
     }
//--- オープンポジションは確認されていない
   else
     {
      //--- ロング・ポジション(買い)の可能性をチェックする。
      if(LongOpened())
         return(true);
      //--- ショート・ポジション(売り)の可能性をチェックする。
      if(ShortOpened())
         return(true);
     }
//--- ポジション処理なしで終了
   return(false);
  }
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- 必要なオブジェクトをすべて作成する
   if(!ExtExpert.Init())
      return(INIT_FAILED);
//--- 続く
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
|新しいティック処理関数のエキスパート|
//+------------------------------------------------------------------+
void OnTick(void)
  {
   static datetime limit_time=0; // 最後の取引処理時間 + タイムアウト
//--- タイムアウトの場合は処理しない
   if(TimeCurrent()>=limit_time)
     {
      //--- データをチェックする
      
        {
         //--- 処理された場合、タイムアウト(秒)で制限時間を変更する
         if(ExtExpert.Processing())
            limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
  }

移動平均線」と「MACDシグナル線」については、私が見つけたすべてのデータを削除した。

bool CSampleExpert::LongOpened(void)
  {
   bool res=false;
//--- ロング・ポジション(買い)の可能性をチェックする。
   
      if(m_macd_current>0 && m_macd_previous<0)
         if(MathAbs(m_macd_current)>(m_macd_open_level))

この場所では、"0 "という値の代わりに、中間線が与えられていた。売りのときも、手仕舞いのときも、すべて「0」に置き換えた。

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
Выберите подходящую торговую стратегию и оформите подписку на нее в пару кликов. Все Сигналы сопровождаются подробной статистикой и графиками. Станьте Поставщиком торговых сигналов и продавайте подписку тысячам трейдеров по всему миру. Наш сервис позволит вам хорошо зарабатывать на прибыльной стратегии даже при небольшом стартовом капитале...
 
Krivets:


移動平均線」と「MACDシグナル線」に関するデータを、すべて削除した。

この場所では、値 "0 "の代わりに平均線が指定されていた。売りのときも、トレースを閉じるときも、すべて「0」の値に置き換えた。


長い例について:

bool CSampleExpert::LongOpened(void)
  {
   bool res=false;
//--- ロング・ポジション(買い)の可能性をチェックする。
   
      if(m_macd_current>0 && m_macd_previous<0)
         if(MathAbs(m_macd_current)>(m_macd_open_level))
           {

-- ハイライトされた条件はどのような役割を果たしますか?

 

上記のハイライトを修正したものがこれだ(オープン戦の詳細についての小さなコメント):


 
Andrey F. Zelinsky:

ロングを例にして:

-- 強調表示された条件はどのような役割を果たすか?


MathAbs(m_macd_current)>m_macd_open_level-MACDインジケータの メイン・ラインの現在値。

 
Krivets:

MathAbs(m_macd_current)>m_macd_open_level-MACDインジケータの メインラインの現在値モジュロ。


はい、この条件だけは削除するか、正しく設定する必要があります -- 上記は、この条件を削除した場合のEAのパフォーマンスの画像です。

 
Andrey F. Zelinsky:

はい、しかしこの条件は削除するか、正しく設定すべきです - 上記はこの条件を削除したEAのパフォーマンスの画像です。


この条件は変更しませんでしたが、他の値を変更しました。

input double InpLots          =0.1; // たくさんある。
input int    InpTakeProfit    =0;  // テイクプロフィット(単位:pips)
input int    InpTrailingStop  =0;  // トレーリング・ストップ・レベル(単位:pips)
input int    InpMACDOpenLevel =0;   // MACDオープンレベル(単位:pips)
input int    InpMACDCloseLevel=0;   // MACD終値レベル(単位:pips)
input int    InpMATrendPeriod =26;  // MAトレンド期間

OpenLevelとCloselevelを0に変更しました。私の理解が正しければ、これはポジションをオープン するための条件の1つです。

そしてTakeprofitとStoplossを無効にしました。

 

ポジション・オープンは"0 "のクロスを通じて行われるが、何らかの理由で取引は10ピップス後にクローズされる。また、最初のバーが形成されておらず、偽エントリーがあるため、2つ目のバーの後に取引が行われたことが望ましい。

また、取引は60秒より早く行われないように設定したが、10秒であり、10秒ごとに、1分間に売買を行い、つまり1分間に6回の取引を行う。あなたは1ロットを設定し、1分間はライン "0 "が交差する場所に応じて、6ロットの購入または売却があります。

int ExtTimeOut=60; // 取引操作間のタイムアウト(秒
 

TakeProfitを10000に設定したところ、ロールオーバーは正常に行われるようになりました。ロールオーバーが2本目のバーで発生するように機能を追加する必要があります。

TakeProfitを必要な量、例えば "RTS "100ポイントに設定すると、TPで取引を終了し、インジケータが "0 "を越えると新しい取引を開始する。シグナルが多いので、分足でテストしました。