エキスパート: Polish Layer

 

Polish Layer:

このエキスパートアドバイザーはRSI、WPR、ストキャスティクス、移動平均、deMarker指標に基づいています。

Polish Layerテスタ

作者: Vladimir Karputov

 

こんにちは、ウラジミール、

私はいつもあなたのコードを見つけています。これも良いEAです。


ありがとうございます。

 

こんにちは、ウラジミール、

いくつかのインジケータの結果を組み合わせて、その結果を描画したいのです。どうすればできますか?

 
csezo2 :

こんにちは、ウラジミール、

いくつかのインジケータの結果を組み合わせて、その結果を描画したいのです。どうすればできますか?

あなたがしたことを詳しく説明してください。コードを見せてください。さらに何が必要か教えてください。

 
コードを正しく挿入するにはどうすればよいですか?それともコピーペーストするだけですか?Alt+S機能が 見えますが、どのように機能するのかわかりません。
 
csezo2:
コードを正しく挿入するにはどうすればよいですか?それともコピーペーストするだけですか?Alt+S機能が 見えますが、どのように機能するのかわかりません。

取引、自動取引システム、取引戦略のテストに関するフォーラム

フォーラムの一般的なルールとベストプラクティス。

Alain Verleyen, 2017.07.19 11:03

コードを投稿するときは、SRCボタンを使用してください!

エディターのコードボタン

ありがとうございます。

 
 
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>
CPositionInfo  m_position;                   // トレード・ポジション・オブジェクト
CTrade         m_trade;                      // 取引オブジェクト
CSymbolInfo    m_symbol;                     // シンボル情報オブジェクト
CAccountInfo   m_account;                    // アカウント情報ラッパー
//--- 入力パラメータ
input ENUM_TIMEFRAMES      per_kis    = PERIOD_M15; 
input ENUM_TIMEFRAMES      per_nagy   = PERIOD_H1; 
input int                  kis_trend_gyors_per= 99;
input int                  kis_trend_lassú_per= 99;
input int                  nagy_trend_gyors_per= 99;
input int                  nagy_trend_lassú_per= 99;
input ENUM_MA_METHOD       MA_method_kis   = MODE_SMA;                    
input ENUM_MA_METHOD       MA_method_nagy    = MODE_SMA;                    
input int                  ST_indikátor_periódus     = 14;    
input int                  RSI_indikátor_periódus     = 14;
input int                  STh_alsó    = 20;  
input int                  ST_lassuló    = 3; 
input ushort               TakeProfit=11111;
input ushort               StopLoss=90;
input ushort               TrailingStop=20;
input double               Lots=0.1;

ulong          m_magic=1;              // マジックナンバー
ulong          m_slippage=30;                // スリップ

int            handle_iMA_kis_trend_gyors;               // iMAインジケータのハンドルを格納する変数。 
int            handle_iMA_kis_trend_lassú;    
int            handle_iMA_nagy_trend_gyors;
int            handle_iMA_nagy_trend_lassú;
int            handle_iRSI;
int            handle_iStochastic_M15;       // iStochastic インジケータのハンドルを格納する変数。 

ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
double         m_adjusted_point;             // 3点または5点に調整された点数
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
   SetMarginMode();
   if(!IsHedging())
     {
      Print("Hedging only!");
      return(INIT_FAILED);
     }
     if(TrailingStop>=TakeProfit)
     {
      Print("Error! TrailingStop>=TakeProfit!");
      return(INIT_PARAMETERS_INCORRECT);
     }
//---
   m_symbol.Name(Symbol());                  // シンボル名を設定する
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
   m_symbol.Refresh();
//---
   m_trade.SetExpertMagicNumber(m_magic);
//---
   m_trade.SetDeviationInPoints(m_slippage);
//--- 3桁または5桁のチューニング
   int digits_adjust=1;
    
   m_adjusted_point=m_symbol.Point()*digits_adjust;

//--- インジケーターiMAのハンドルを作成
   handle_iMA_kis_trend_gyors=iMA(m_symbol.Name(),per_kis,kis_trend_gyors_per,0, MA_method_kis,PRICE_CLOSE);
//--- インジケーターiMAのハンドルを作成
   handle_iMA_kis_trend_lassú=iMA(m_symbol.Name(),per_kis,kis_trend_lassú_per ,0,MA_method_kis , PRICE_CLOSE );
//--- インジケーターiMAのハンドルを作成
   handle_iMA_nagy_trend_gyors=iMA(m_symbol.Name(),per_nagy,nagy_trend_gyors_per ,0, MA_method_nagy , PRICE_CLOSE ); 
//--- インジケーターiMAのハンドルを作成
   handle_iMA_nagy_trend_lassú=iMA(m_symbol.Name(),per_nagy,nagy_trend_lassú_per ,0, MA_method_nagy , PRICE_CLOSE );
//--- iRSI インジケータのハンドルを作成する。
   handle_iRSI=iRSI(m_symbol.Name(),per_kis,RSI_indikátor_periódus, PRICE_CLOSE);
//--- iStochastic インジケータのハンドルを作成する。
   handle_iStochastic_M15=iStochastic(m_symbol.Name(),per_kis,ST_indikátor_periódus,3,ST_lassuló,MODE_SMA,STO_CLOSECLOSE);
 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
 
//---

  }
//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
 if(kis_trend_gyors_per>=kis_trend_lassú_per || nagy_trend_gyors_per>=nagy_trend_lassú_per)
  return;
 
 static datetime PrevBars=0;
   datetime time_0=iTime(0);
   if(time_0==PrevBars)
      return;
   PrevBars=time_0;
//--- вычисляем начальные параметры индикаторов для поиска условий входа
   double MA_kis_trend_gyors   = iMAGet(handle_iMA_kis_trend_gyors,0);
   double MA_kis_trend_lassú    = iMAGet(handle_iMA_kis_trend_lassú,0);
   double MA_nagy_trend_gyors    = iMAGet(handle_iMA_nagy_trend_gyors,0);
   double MA_nagy_trend_lassú    = iMAGet(handle_iMA_nagy_trend_lassú,0);
   
    
   double Stoh_fast = iStochasticGet(MAIN_LINE,0);
   double Stoh_fast_prew=iStochasticGet(MAIN_LINE,1);

   double RSI0    = iRSIGet(0);
   double RSI1    = iRSIGet(1);
       
   double StRSI=(Stoh_fast*RSI0)/100;//------------------------------------------------------------------------ I would like to draw out these outcomes.
   double StRSI_prew=(Stoh_fast_prew*RSI1)/100;//--------------------------------------------------------------
    
   double price_M15=iClose(1,NULL,per_kis);
   bool Long=false;
       
   if(MA_kis_trend_gyors>MA_kis_trend_lassú   &&   MA_nagy_trend_gyors>MA_nagy_trend_lassú)
     Long=true;
       
   if(!Long  )
      return; 

//--- условий для совершения сделки
   if(Long==true  )
     {
       if(  StRSI>STh_alsó && StRSI_prew<=STh_alsó  )
         { 
         
         if(!RefreshRates())
            return;

         //--- 資金不足」エラーを避けるため、OrderSendの前に出来高をチェックする。
         double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),Lots,m_symbol.Ask(),ORDER_TYPE_BUY);

         if(chek_volime_lot!=0.0)
            if(chek_volime_lot>=Lots)
              {
               Print("BUY разница (MA_M15-price_M15) = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits()),
                     " MA_M15 = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits()),
                     " price_M15 = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits()));
               double sl=m_symbol.NormalizePrice(m_symbol.Bid()-StopLoss*m_adjusted_point);
               double tp=m_symbol.NormalizePrice(m_symbol.Bid()+TakeProfit*m_adjusted_point);

               if(m_trade.Buy(Lots,NULL,m_symbol.Ask(),sl,tp))
                 {
                  if(m_trade.ResultDeal()==0)
                     Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
                           ", description of result: ",m_trade.ResultRetcodeDescription());
                  else
                     Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
                           ", description of result: ",m_trade.ResultRetcodeDescription());
                 }
               else
                  Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
                        ", description of result: ",m_trade.ResultRetcodeDescription());
              }
            }     
        }
//--- трейлинг
   if(TrailingStop==0)
      return;

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // プロパティにさらにアクセスするために、インデックスによって位置を選択する。
         if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
           {
             if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
             if(!RefreshRates())
                  continue;

               if(m_symbol.Bid()-m_position.PriceOpen()>TrailingStop*m_adjusted_point)
                 {
                  if(m_position.StopLoss()<m_symbol.Bid()-TrailingStop*m_adjusted_point)
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_symbol.Bid()-TrailingStop*m_adjusted_point),
                        m_position.TakeProfit()))
                        Print("PositionModify -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                    }
                 }
              }
            }
//---
   return;
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void SetMarginMode(void)
  {
   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool IsHedging(void)
  {
   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
  }
//+------------------------------------------------------------------+
//| シンボルのクォートデータを更新する。|
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- リフレッシュ・レート
   if(!m_symbol.RefreshRates())
      return(false);
//--- "ゼロ "の戻り値からの保護
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| iMAのバッファーの値を取得する。|
//+------------------------------------------------------------------+
double iMAGet(int handle_iMA,const int index)
  {
   double MA[1];
//--- エラーコードをリセットする 
   ResetLastError();
//--- iMABuffer配列の一部を、インデックスが0のインジケータ・バッファの値で埋める。 
   if(CopyBuffer(handle_iMA,0,index,1,MA)<0)
     {
      //--- コピーに失敗したら、エラーコードを伝える。 
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
      //--- これは、インジケータが計算されていないとみなされることを意味する。 
      return(0.0);
     }
   return(MA[0]);
  }
//+------------------------------------------------------------------+
//| iStochastic|のバッファの値を取得する。
//| バッファ番号は以下の通り:|
| 0 - メイン・ライン、1 - シグナル・ライン|
//+------------------------------------------------------------------+
double iStochasticGet(const int buffer,const int index)
  {
   double Stochastic[1];
//--- エラーコードをリセットする 
   ResetLastError();
//--- iStochasticBuffer配列の一部を、インデックスが0のインジケータ・バッファの値で埋める。 
   if(CopyBuffer(handle_iStochastic_M15,buffer,index,1,Stochastic)<0)
     {
      //--- コピーに失敗したら、エラーコードを伝える。 
      PrintFormat("Failed to copy data from the iStochastic indicator, error code %d",GetLastError());
      //--- これは、インジケータが計算されていないとみなされることを意味する。 
      return(0.0);
     }
   return(Stochastic[0]);
  }
 
  
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| iRSIのバッファの値を取得する。|
//+------------------------------------------------------------------+
double iRSIGet(const int index)
  {
   double RSI[1];
//--- エラーコードをリセットする 
   ResetLastError();
//--- iRSI配列の一部を、インデックスが0のインジケータ・バッファの値で埋める。 
   if(CopyBuffer(handle_iRSI,0,index,1,RSI)<0)
     {
      //--- コピーに失敗したら、エラーコードを伝える。 
      PrintFormat("Failed to copy data from the iRSI indicator, error code %d",GetLastError());
      //--- これは、インジケータが計算されていないとみなされることを意味する。 
      return(0.0);
     }
   return(RSI[0]);
  }
  
  //+------------------------------------------------------------------+ 
| 指定されたバー・インデックスのクローズを取得| 
//+------------------------------------------------------------------+ 
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=per_kis;
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }
//+------------------------------------------------------------------+ 
| 指定したバー・インデックスの時間を取得| 
//+------------------------------------------------------------------+ 
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=per_kis;
   datetime Time[1];
   datetime time=0;
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied>0) time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+
 
ポリッシュレイヤーとゲットトレンドの組み合わせ。空白の背景で問題を強調した。
 
csezo2:
ポリッシュレイヤーとゲットトレンドの組み合わせ。空白の背景で問題を強調した。
//--- インジケーターiMAのハンドルを作成
   handle_iMA_kis_trend_gyors=iMA(m_symbol.Name(),per_kis,kis_trend_gyors_per,0,MA_method_kis,PRICE_CLOSE);
//--- ハンドルが作成されていない場合 
   if(handle_iMA_kis_trend_gyors==INVALID_HANDLE)
     {
      //--- 失敗を伝え、エラーコードを出力する。 
      PrintFormat("Failed to create handle \"handle_iMA_kis_trend_gyors\" of the iMA indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(per_kis),
                  GetLastError());
      //--- インジケータは早期に停止する 
      return(INIT_FAILED);
     }
//--- インジケーターiMAのハンドルを作成
   handle_iMA_kis_trend_lassú=iMA(m_symbol.Name(),per_kis,kis_trend_lassú_per,0,MA_method_kis,PRICE_CLOSE);
//--- ハンドルが作成されていない場合 
   if(handle_iMA_kis_trend_lassú==INVALID_HANDLE)
     {
      //--- 失敗を伝え、エラーコードを出力する。 
      PrintFormat("Failed to create handle \"handle_iMA_kis_trend_lassú" of iMA indicator for symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(per_kis),
                  GetLastError());
      //--- インジケータは早期に停止する 
      return(INIT_FAILED);
     }
//--- インジケーターiMAのハンドルを作成
   handle_iMA_nagy_trend_gyors=iMA(m_symbol.Name(),per_nagy,nagy_trend_gyors_per,0,MA_method_nagy,PRICE_CLOSE);
//--- ハンドルが作成されていない場合 
   if(handle_iMA_nagy_trend_gyors==INVALID_HANDLE)
     {
      //--- 失敗を伝え、エラーコードを出力する。 
      PrintFormat("Failed to create handle \"handle_iMA_nagy_trend_gyors\" of the iMA indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(per_kis),
                  GetLastError());
      //--- インジケータは早期に停止する 
      return(INIT_FAILED);
     }
//--- インジケーターiMAのハンドルを作成
   handle_iMA_nagy_trend_lassú=iMA(m_symbol.Name(),per_nagy,nagy_trend_lassú_per,0,MA_method_nagy,PRICE_CLOSE);
//--- ハンドルが作成されていない場合 
   if(handle_iMA_nagy_trend_lassú==INVALID_HANDLE)
     {
      //--- 失敗を伝え、エラーコードを出力する。 
      PrintFormat("Failed to create handle \"handle_iMA_nagy_trend_lassú" of iMA indicator for symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(per_kis),
                  GetLastError());
      //--- インジケータは早期に停止する 
      return(INIT_FAILED);
     }
//--- iRSI インジケータのハンドルを作成する。
   handle_iRSI=iRSI(m_symbol.Name(),per_kis,RSI_indikátor_periódus,PRICE_CLOSE);
//--- ハンドルが作成されていない場合 
   if(handle_iRSI==INVALID_HANDLE)
     {
      //--- 失敗を伝え、エラーコードを出力する。 
      PrintFormat("Failed to create handle \"handle_iRSI\" of the iRSI indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(per_kis),
                  GetLastError());
      //--- インジケータは早期に停止する 
      return(INIT_FAILED);
     }
//--- iStochastic インジケータのハンドルを作成する。
   handle_iStochastic_M15=iStochastic(m_symbol.Name(),per_kis,ST_indikátor_periódus,3,ST_lassuló,MODE_SMA,STO_CLOSECLOSE);
//--- ハンドルが作成されていない場合 
   if(handle_iStochastic_M15==INVALID_HANDLE)
     {
      //--- 失敗を伝え、エラーコードを出力する。 
      PrintFormat("Failed to create handle \"handle_iStochastic_M15\"  of the iStochastic indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(per_kis),
                  GetLastError());
      //--- インジケータは早期に停止する 
      return(INIT_FAILED);
     }

//--- これらの結果を引き出したい。
   double StRSI=(Stoh_fast*RSI0)/100.0;
   double StRSI_prew=(Stoh_fast_prew*RSI1)/100.0;
//---
ファイル:
1.mq5  33 kb
 
ストキャスティクスと RSIを掛け合わせた結果を引き出したい。
 
csezo2 :
ストキャスティクスとRSIを掛け合わせた結果を引き出したい

理解できません

他の言葉で説明するか、絵を描いてみてください。