mql5 - 最後の取引から一定時間後の垂直線 - ページ 2

 
Vladimir Karputov:

ラスト・トレード」という言葉を明確にしたい。

現在の日中の最後の取引か?それとも直近のN日間?

24時間以内の最後の取引 - あなたはさらに歴史をさかのぼる必要はありません。

 
renatmt5:

24時間以内に最後のトランザクションが行われるため、これ以上話を進める必要はありません。

その仕組みはこうだ。

このインジケータは、OBJ_VLINE ヘルプから垂直線を作成、移動、削除するコードを使用します。(今のところインジケータではライン作成のみ動作します)。ライン名は入力パラメータ"Vertical line name"で設定する。

ラストディールムーブ 縦線

縦線はOnOnit()で作成さ れます。

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   VLineCreate(0,InpVLineName);
//---
   return(INIT_SUCCEEDED);
  }


負荷を最小限にするため、1分間に1回、履歴を照会しています。そのために、プログラムのグローバル変数の領域(この場合はインジケータ)で変数ExtLastMoveを 宣言しましょう

//---
datetime ExtLastMove=0;                   // "0" -> D'1970.01.01 00:00';

- この変数には、取引履歴への最後のリクエストの時刻が格納されます。


そしてOnCalculate()で、現在の時刻(任意のTimeCurrent シンボルを使って最後に引用した時刻)から保存した時刻ExtLastMoveを 引き、その差が60秒未満であれば終了 します。

//---
   datetime time_current=TimeCurrent();
   if(time_current-ExtLastMove<60) // 60 seconds
      return(rates_total);
   ExtLastMove=time_current;

が大きい場合、ExtLastMoveに新しい時刻を 記録 する。


取引履歴は、LastProfitForPeriod()を使用してアクセスします。

ここでは、fromとtoの2つの日付が使われています。Toは未来(現在時刻+1日)、Fromは 現在時刻から24時間 引いた時刻に設定されます

   datetime from_date   = time_current-60*60*24;   // time one day ago
   datetime to_date     = time_current+60*60*24;   // time from the future :)
   double   last_profit = LastProfitForPeriod(from_date,to_date);

   Comment("Last profit: ",DoubleToString(last_profit,2));


とりあえず以上です、文字数が多いですね...。

ファイル:
 
Vladimirさん、あなたのコードとその断片へのコメントをどうもありがとうございました。
ただ、なぜto_dateが未来と等しい必要があるのかが理解できない。もしかして、今現在まで?今後、取引の 結果を判断することはできないようです :)それとも、未来の時間の中で線引きをするために、この日が必要なのでしょうか?
ループについてもう一つ質問です。
私が理解している限りでは、取引に関するデータを配列にロードし、0件の取引から最後の取引までループさせ、最後に書き込まれた時刻と比較し、取引時刻が遅ければ、変数 last_time を上書きしています。それとも逆で、配列の末尾から検索できるのでしょうか?実際、配列の最後の要素は、データが必要な最後のクローズドトランザクションになるのでしょうか?
もしかしたら、論理的に間違っているかもしれませんが、あまり厳しく判断しないでください :)
 
for(uint i=0;i<total;i++) を for(uint i=total;i>=0;i--) に変更したことを意味します。
 
一般に、ループも必要なく、序数 i=total の配列要素に アクセスするだけです。
 
ただ、なぜto_dateが将来のノックと等しくなければならないのかが理解できない。

そのように必要なのです。現在時刻までの 保証を得るため。

あるいは、配列の末尾から検索することも可能なのでしょうか?

もし、最後の取引を見つけることがタスクなら、配列はその時間を正確に調べなければならない。万が一、何かが起こったり、内部のカーネルロジックが変更されたりして、取引が異なる時間にリセットされることを想定している。

 
Vladimir Karputov:

これが、その方法です。から」「現在時刻まで」の取得を保証すること。

もし、最後の取引を見つけることがタスクであるなら、アレイは正確な時間を調べなければならない。何かが起こったり、内部のカーネルロジックが変わったりして、取引がランダムに破棄される場合に備えてだ。

OK、了解です。原理的には、履歴が24時間という制約があるため、データを見る際に大きな負荷がかからないことは明らかです :)

 
renatmt5:

OK、了解です。原理的には、24時間の履歴制限を考えると、データを調べる際に大きな作業負荷がかからないことは明らかです :)

そこで、最後の仕上げとして、儲けに応じてラインを移動させる。

そこでの引越しのルールを覚えていますか?

 
last_timeとresultが扱う変数であることは正しく理解しています。その結果、線をどれだけ未来にシフト(再描画)させるかが決まります。そして、"Move the vertical line" ブロックの前に "Profit for theperiod" というコードブロックを置き、最後の取引のデータを考慮してラインを移動させます。
正しいですか、それとも私が何かを勘違いしているのでしょうか?
 

ここで、"before "パラメータを今後行うべき理由を説明します。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

エラー、バグ、質問

レナート・ファットフーリン さん 2016.11.04 12:43

TimeCurrent()を終了日として使用せず、TimeCurrent()+86400とし、すべての終了トレードを確実に捕捉するようにします。

TimeCurrentは正確な最終時刻ではなく、「更新中の最後の既知の サーバー時刻」であり、100%正確ではありません。特にスタート時は。