MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 4

 
Artyom Trishkin:

任意のフラクタル値を得るための関数を指標から完全に切り離すには、配列 high[], low[] や限界値を参照渡しにしないようにすればよい。

今回のコードはMQL5に近いので、High[]、Low[]、iHigh()、iLow()関数はお断りすることにします。このインジケータではこのように表示されます。

ただし、GetPriceHigh()、GetPriceLow()関数から-1が出るかどうかもチェックする必要があります。
ありがとうございます。
 
strongflex:
RSIは15分とする。例えば、10-20でレベル70の下から上へのクロスがあった場合、その価格を記憶し、10-40でその価格が10-20より低い場合、ショートを開くというものです。

そうですね......まず、時間を 所定の分数だけ戻せるようにする必要があります。以下はテストスクリプトです。

//+------------------------------------------------------------------+
//|                                                sTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input ENUM_TIMEFRAMES   TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int               MinutesBefore  =20;           // Количество минут назад
int minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   datetime time_before=TimeCurrent()-minutesBefore*PeriodSeconds(PERIOD_M1);
   int shift=Bars(Symbol(),TimeframeRSI,TimeCurrent(),time_before);
   double value=iRSI(Symbol(),TimeframeRSI,14,PRICE_CLOSE,shift);
   Comment("\nCurrent time: ",TimeToString(TimeCurrent()),
           "\nВремя ",minutesBefore," минут назад: ",TimeToString(time_before),
           "\nБар времени ",TimeToString(time_before)," = ",shift," на таймфрейме ",EnumToString(TimeframeRSI),
           "\nЗначение RSI на баре ",shift," периода ",EnumToString(TimeframeRSI),": ",DoubleToString(value,Digits()));
  }
//+------------------------------------------------------------------+

このスクリプトは、現在のサーバー時刻からカウントダウンしています - 指定された数分前のRSIデータのみを取得するテストです。

 

次に、現在時刻 と、その値がチェック間隔の分の倍数であるかどうかを知る必要がある。テスト用EAにしました。

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES      TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int                  PeriodRSI      = 14;          // Период расчёта RSI
input ENUM_APPLIED_PRICE   PriceRSI       = PRICE_CLOSE; // Цена расчёта RSI
input int                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore; // Количество минут назад
int      periodRSI;     // Период расчёта RSI
double   prevRSIValue;  // Значение RSI xxx минут назад
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад
   periodRSI=(PeriodRSI<1?1:PeriodRSI);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   if(server_time.min%minutesBefore==0) prevRSIValue=GetLastDataRSI(Symbol(),TimeframeRSI,TimeCurrent(),minutesBefore);
   Comment("\nТекущее время: ",TimeCurrent(),"\nМинуты текущего времени: ",server_time.min,"\nЗначение RSI: ",DoubleToString(prevRSIValue,Digits()));
  }
//+------------------------------------------------------------------+
double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, datetime start_time, int minutes_before,
                      int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE)
  {
   datetime time_before=start_time-minutes_before*PeriodSeconds(PERIOD_M1);
   int shift=Bars(symbol_name,timeframe,start_time,time_before);
   return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift));
  }
//+------------------------------------------------------------------+

次に、何を知るべきか。

 
こんにちは。私は取引は初めてなので、ソフトウェアの質問も含め、多くの質問があります、私の場合はMT4です。例えば通貨ペアのスプレッドをチャートウィンドウに数字で表示し、同じようにATRの指標を表示することは可能でしょうか?市場の状況について、このような情報の出し方をすると便利だと思います。平均値で計算し、評価する方が早いですから。2点目は、ATRに基づくムービングストップです。自動化することは可能ですか?もし、ポーズをとって座っているのなら、電卓と視力の良さのおかげで、手動で計算し、ストップを設定することも問題ないでしょう。また、自動売買にすることは、デメリットがあるにせよ、トレーダーにとってはいいアイデアだと思います。しかし、いいトレンドではトレーリングストップは初心者が間違ったストップをするリスクを減らすことができます。ありがとうございました。
 
Artyom Trishkin:

次に、現在時刻 と、その値がチェック間隔の分の倍数であるかどうかを知る必要がある。テスト用EAにしました。

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES      TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int                  PeriodRSI      = 14;          // Период расчёта RSI
input ENUM_APPLIED_PRICE   PriceRSI       = PRICE_CLOSE; // Цена расчёта RSI
input int                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore; // Количество минут назад
int      periodRSI;     // Период расчёта RSI
double   prevRSIValue;  // Значение RSI xxx минут назад
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад
   periodRSI=(PeriodRSI<1?1:PeriodRSI);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   if(server_time.min%minutesBefore==0) prevRSIValue=GetLastDataRSI(Symbol(),TimeframeRSI,TimeCurrent(),minutesBefore);
   Comment("\nТекущее время: ",TimeCurrent(),"\nМинуты текущего времени: ",server_time.min,"\nЗначение RSI: ",DoubleToString(prevRSIValue,Digits()));
  }
//+------------------------------------------------------------------+
double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, datetime start_time, int minutes_before,
                      int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE)
  {
   datetime time_before=start_time-minutes_before*PeriodSeconds(PERIOD_M1);
   int shift=Bars(symbol_name,timeframe,start_time,time_before);
   return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift));
  }
//+------------------------------------------------------------------+

次に、何を知るべきか。

次に、20分前のRSIレベルのクロスがあれば、価格を確認します。つまり、ショートの場合は、20分前より価格が下がっているはずです。ありがとうございました。もしうまくいったら、約束しなきゃね))
 
Vladymyr Glushko:
ごきげんよう。私はトレーディングの初心者です。そのため、ソフトウェア(私の場合はMT4)を含め、多くの質問があります。チャート上に通貨ペアのスプレッドを数値で表示し、ATR指標も同様に表示することは可能でしょうか。市場の状況について、このような情報の出し方をすると便利だと思います。平均値で計算し、評価する方が手っ取り早いと思います。2点目は、ATRに基づくムービングストップです。自動化することは可能ですか?もし、ポーズをとって座っているのなら、電卓と視力の良さのおかげで、手動で計算し、ストップを設定することも問題ないでしょう。また、自動売買にすることは、デメリットがあるにせよ、トレーダーにとってはいいアイデアだと思います。しかし、いいトレンドではトレーリングストップは初心者が間違ったストップをするリスクを減らすことができます。よろしくお願いします。

グラフオブジェクト、特にテキストラベルを必要なデータとともにチャート上に表示し、目盛り ごとに更新するという、シンプルでわかりやすいものです。

という方は、ぜひ探してみてください(^^)

 
strongflex:
次に、RSIレベルが20分前に交差していれば、価格を確認します。つまり、ショートの場合、価格は20分前より低くなければなりません。ありがとうございました。もしうまくいったら、約束の充電をします))
その時間に対応するローソクの開閉・高値・安値で「今」「その時」の価格を確認するのみで、MT4でのティック履歴は ありません。そこで、最も正確な価格決定のために、分足でクロスオーバーを見つける必要があるのです。 しかし、RSIのクロスオーバーとはどういう意味ですか?
 

Artyom Trishkin:
Мы сможем "сейчас" проверить цену "тогда" лишь только открытия/закрытия/хай/лоу свечи, соответствующей тому времени - нету в МТ4 тиковой истории. Поэтому нужно найти пересечение на минутках для наиболее точного определения цены из имеющихся в наличии возможностей. Но что вы имеете в виду под пересечением RSI ?

RSIが70を超えた場合、10-00のRSIが70以下、10-20が70以上、10-40が10-40より高いことを確認する。
 
Artyom Trishkin:

グラフオブジェクト、特にテキストラベルを必要なデータとともにチャート上に表示し、目盛り ごとに更新する、というのは簡単でシンプルな方法です。

また、kodobaseには 様々なトロールがあり、適切なものを探すことができます;)

ありがとうございました......探します))

 
Artyom Trishkin:

グラフオブジェクト、特にテキストラベルを必要なデータとともにチャート上に表示し、目盛り ごとに更新するという、すべてが簡単でシンプルなものです。

また、kodobaseの トロールは多種多様であり、自分に合ったものを見つけることができます。)

しかし、どのようにステップバイステップでそれを行うには? ... グラフィカルオブジェクト(それが何であるか、それらを設定する方法)、グラフ上のデータでラベルを置く(どこに入力し、どのデータと)......愚問で申し訳ありません。