初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1426

 
vitaliy zamkovoy 現在の 価格から20秒前の価格を差し引き、一定の定数と比較して注文を開始する場合、Expert Advisorではどのように記述するのですか?

このコードを見てください:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//ВХОДНОЙ ПАРАМЕТР
input ushort Constanta=50; //Константа

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(20);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   double open_0=iOpen(_Symbol,PERIOD_CURRENT,0);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
  }
//+------------------------------------------------------------------+
よろしくお願いします。
 
MrBrooklin #:

このコードを見てください:

ウラジミール、ありがとう。
あいにく次の2日間はチェックできませんが、よろしくお願いします!
 
vitaliy zamkovoy #:
あいにく2日間はチェックできませんが、よろしくお願いします!

ありがとうございます。しかし、これは完成したコードではなく、あくまでも私の考えの方向性であることをご了承ください。間違っているかもしれません。確認してください。OnTimerを削除して、OnTick()で同じコードを試すという方法もあります。要するに、試してみてください。

それでは、ウラジミール。

 
vitaliy zamkovoy 現在の 価格から20秒前の価格を取り出し、その後の注文の開始とある定数と比較する場合、どのように記録しますか?

現在の価格と時間を記録する。ティックごとに現在時刻と比較し、20秒以上経過していれば2番目の価格を記憶します。最初の価格と2番目の価格の差を計算します。得られた結果を定数と比較し、注文を出すかどうかを決定します。

 
Valeriy Yastremskiy #:

現在の価格と時間を記憶します。ティックごとに現在時刻と比較し、20秒以上経過している場合は2番目の価格を記憶します。最初の価格と2番目の価格の差を計算する。得られた結果を定数と比較し、注文を出すかどうかを決定する。

つまり、1秒ごとに現在の価格を記憶し、このシリーズの各値を20秒間削除したときの現在の価格と比較する必要があるということですね。

比較は連続的でなければなりません。

 
vitaliy zamkovoy #:

このシリーズの各値が20秒間削除されたときに、現在の値と比較できるように、1秒ごとに現在の価格を記憶する必要があるということですね?

比較は連続的に行う必要があります。

ティックが均等に行くことはありません、問題は、それがすべてのティックをチェックする必要がある場合は、すべてのティックを記憶し、比較する必要があり、その後、アルゴリズムにあります。アルゴリズムに従った少ない回数で可能であれば、タイマーを使って1秒後に価格を記憶し、20秒後にも記憶して比較する。
1秒間に1ティック、5秒間に1ティック、1秒間に100ティックの場合もあります。5秒間に1ティックの場合と、1秒間に100ティックの場合にどう行動するかを決めなければなりません。

 
Valeriy Yastremskiy #:

すべてのティックをチェックする必要がある場合は、すべてのティックを記憶し、比較する必要があります。アルゴリズムによれば、頻度を少なくすることが可能であれば、タイマーで1秒後に価格を記憶し、20秒後にも記憶して比較します。
1秒間に1ティック、5秒間に1ティック、1秒間に100ティックの場合もあります。5秒間に1ティックの場合と、1秒間に100ティックの場合にどう行動するかを決めなければなりません。

選択肢を選ぶ問題ではなく、それを書き記すことの難しさの問題なのだが......。今日初めて来ました。全くの素人です。

自分のアイデアを試してみたいだけなんです...。

 
vitaliy zamkovoy #:

選択肢を選ぶことが問題なのではなく、それを書き記すことが私にとって難しいかどうかが問題なのだ......。今日初めて来ました。全くの素人です。

自分のアイデアを試してみたいだけです。

アルゴリズムは正確でなければならないし、適用条件を理解していなければならない。それ以外の方法でコードを書くことはできない。コードは1つの動作のアルゴリズムを実現するものであり、不正確であってはならない。

そしてここでは、まず自分で書いた方がいい。

あなたは等号を理解している。

 

リングバッファ:

価格、時間」構造体の十分な大きさの静的配列(または2つの別個の配列)をバッファとする。

バッファの先頭と末尾への「ポインタ」(インデックス)という2つの変数を取ります。

ティックごとに要素を先頭に追加し、ポインタを進める。

時刻と末尾の要素を比較し、必要ならポインタを移動する。

価格を末尾の要素と比較する。

ポインタが配列の末尾に達した場合は、このポインタをゼロにリセットする。

 
JRandomTrader 体の 十分な大きさの静的配列(または2つの別々の配列)をバッファに取る。

バッファの先頭と末尾への「ポインタ」(インデックス)。

ティックごとに、要素を先頭に追加し、ポインタを移動する。

その時間を末尾の要素と比較し、必要であればポインタを移動する。

価格を末尾の要素と比較する。

ポインタが配列の末尾に達している場合、このポインタをゼロにリセットする。

👍
理由: