ライブラリ: BestInterval - ページ 14

 
gspencer:
私はコーディングやMeta EditorでのEAの操作について何も知りませんが、BestIntervalのコンセプトはとても気に入っています。私がテストしたいEAにこれを追加する方法を教えていただくのは面倒でしょうか?

このスレッドの議論を 理解するようにしてください。

Библиотеки: BestInterval
Библиотеки: BestInterval
  • 2018.10.12
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: BestInterval
 
// チャートにBestIntervalバランスチャートを表示する。

#property strict
#property script_show_inputs

input int inAmountIntervals = 3; // ワーストケースのトレード間隔をいくつ捨てるか

#include <Graphics\Graphic.mqh> //https://www.mql5.com/ja/articles/2866

void ToChart( const double &Y[] )
{
   CGraphic graphic;
   graphic.Create(0, __FUNCTION__, 0, 30, 30, 780, 380);
   graphic.CurveAdd(Y, CURVE_LINES);
   graphic.CurvePlotAll();
   graphic.Update();   
}

#include <MT4Orders.mqh> // MT4 の場合は必要ありません。
#include <fxsaber\BestInterval\BestInterval.mqh> // 最適な取引間隔の計算

void OnStart()
{
  BESTINTERVAL BestInterval; // 最適な取引間隔を計算するオブジェクトを作成
  
  BestInterval.Set(); // 入札履歴を掲載
          
  for (int i = 0; i < inAmountIntervals; i++)
    if (BestInterval.DeleteWorseInterval()) // 何かが捨てられた場合
      Print(BestInterval.ToString());       // 得られた取引データを出力しよう
    else
      break;                                // そうでなければ退場
      
  double Profits[];
  double Balance[];
  
  const int Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // BestIntervalトランザクションの利益を得た
  Balance[0] = 0;  
  
  // バランス曲線を計算する
  for (int i = 1; i < Size; i++)
    Balance[i] = Balance[i - 1] + Profits[i - 1];
    
  ToChart(Balance); // 視覚化された。
}
 
標準配送のEAの最後にこれを挿入する場合
// オプティマイザーの各パスの見積もりをターミナルに送信。BestIntervalを適用して可視化する。

#include <MT4Orders.mqh>                         //https://www.mql5.com/ja/code/16006
#include <fxsaber\BestInterval\BestInterval.mqh> //https://www.mql5.com/ja/code/22710
#include <TypeToBytes.mqh>                       //https://www.mql5.com/ja/code/16280
#include <Graphics\Graphic.mqh>                  //https://www.mql5.com/ja/articles/2866

input int inAmountIntervals = 1; // ワーストケースのトレード間隔をいくつ捨てるか

// グラフを出力する
void ToChart( const double &Y[] )
{
   CGraphic graphic;
   graphic.Create(0, __FUNCTION__, 0, 30, 30, 780, 380);
   graphic.CurveAdd(Y, CURVE_LINES);
   graphic.CurvePlotAll();
   graphic.Update();   
}

// 貿易史の収集
int GetDeals( DEAL_BASE &Deals[] )
{  
  const int Total = ArrayResize(Deals, OrdersHistoryTotal());
  int Amount = 0; 
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      Deals[Amount].OpenTime = OrderOpenTime();
      Deals[Amount++].Profit = OrderProfit() + OrderCommission() + OrderSwap();
    }
      
  return(ArrayResize(Deals, Amount));    
}

// ここから(エージェント)、ターミナルにデータを送信する。
double OnTester()
{
  DEAL_BASE Deals[];
  
  if (MQLInfoInteger(MQL_OPTIMIZATION) && GetDeals(Deals)) // 最適化の場合、取引履歴を収集
  {    
    CONTAINER<uchar> Container; //https://www.mql5.com/ru/forum/95447/page4#comment_5464205
    
    Container[0] = Deals; // 入札履歴をコンテナに入れる
  
    FrameAdd(NULL, 0, 0, Container.Data); // エージェントからターミナルへデータを送信
  }
  
  return(0);
}

// ここで(端末)はエージェントからデータを受け取る
void OnTesterPass()
{    
  ulong Pass;
  string Name;
  long ID;
  double Value;

  CONTAINER<uchar> Container; //https://www.mql5.com/ru/forum/95447/page4#comment_5464205

  while (FrameNext(Pass, Name, ID, Value, Container.Data))
  {
    Print("Pass = " + (string)Pass); // パス番号
    
    DEAL_BASE Deals[];
   
    // エージェントからデータを受信
    Container[0].Get(Deals);
          
    BESTINTERVAL BestInterval; // 最良の取引間隔を計算するオブジェクトを作成
    
    BestInterval.Set(Deals);   // 送信された入札履歴を掲載

    Print(BestInterval.ToString() + "\n");           // 得られた取引データを出力しよう
            
    for (int i = 0; i < inAmountIntervals; i++)
      if (BestInterval.DeleteWorseInterval())        // 何かが捨てられた場合
        Print(BestInterval.ToString() + "\n");       // 得られた取引データを出力しよう
      else
        break;                                       // そうでなければ退場
        
    double Profits[];
    double Balance[];
    
    const int Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // BestIntervalトランザクションの利益を得た
    Balance[0] = 0;  
    
    // バランス曲線を計算する
    for (int i = 1; i < Size; i++)
      Balance[i] = Balance[i - 1] + Profits[i - 1];
      
    ToChart(Balance); // 視覚化された。    
  }
}


ターミナルログに以下のように表示されます(標準移動平均の例)。

Pass = 0
Amount of Delete Intervals = 0 (2018.10.01 - 2019.02.05)
00:00:00 - 23:59:59 : Profit = -8498.94 (100.00%), Total = 6394 (26.07%), PF = 0.52, Mean = -1.33, DD = 8660.23, RF = -0.98
SUMMARY: 00:00:00 - 23:59:59 : Profit = -8498.94 (100.00%), Total = 6394 (26.07%), PF = 0.52, Mean = -1.33, DD = 8660.23, RF = -0.98

Amount of Delete Intervals = 1 (2018.10.01 - 2019.02.05), 18:00 - 18:00, CountHours = -1
17:40:01 - 17:42:59 : Profit = 364.25 (100.00%), Total = 9 (100.00%), PF = Max, Mean = 40.47, DD = 4.63, RF = 78.67
SUMMARY: 00:00:00 - 23:59:59 : Profit = 364.25 (100.00%), Total = 9 (100.00%), PF = Max, Mean = 40.47, DD = 4.63, RF = 78.67

Pass = 1
Amount of Delete Intervals = 0 (2018.10.01 - 2019.02.05)
00:00:00 - 23:59:59 : Profit = -9757.53 (100.00%), Total = 6394 (24.70%), PF = 0.55, Mean = -1.53, DD = 10076.19, RF = -0.97
SUMMARY: 00:00:00 - 23:59:59 : Profit = -9757.53 (100.00%), Total = 6394 (24.70%), PF = 0.55, Mean = -1.53, DD = 10076.19, RF = -0.97

Amount of Delete Intervals = 1 (2018.10.01 - 2019.02.05), 09:00 - 10:00, CountHours = 0
08:27:01 - 10:14:59 : Profit = 628.59 (100.00%), Total = 472 (39.41%), PF = 1.39, Mean = 1.33, DD = 550.93, RF = 1.14
SUMMARY: 00:00:00 - 23:59:59 : Profit = 628.59 (100.00%), Total = 472 (39.41%), PF = 1.39, Mean = 1.33, DD = 550.93, RF = 1.14


そしてチャート上には、対応するパスの BestInterval-profit チャートが表示されます。


 

通りかかったんだ。私はそれを読んだ。

説明にはこうある。

  • アイデアは作者のものです。類似品があるかもしれません。

"

もっと一般的なことは、英語のブログで紹介した(その1その2)。時間間隔だけの断面積は、非常に特殊なアプローチである。アイデアとしては、他のパラメータの断面積も同じように面白いかもしれない。

 
Stanislav Korotky:

通りかかったんだ。私はそれを読んだ。

説明にはこうある。

  • アイデアは作者のものです。類似品があるかもしれない。

"

より一般的なものについては、英語のブログポジション・オープンの 瞬間にМАшкаが何であったか(それをOrderCommentに書きます)がわかっています。したがって、取引履歴のすべてのポジションをこれらのMA値と比較することができます。

そして、これらのMAにBestIntervalを適用します。そして出力で、ポジションを建てるべきМАшкиの範囲と、建てるべきでないМАшкиの範囲が得られます。


もちろん、MAの代わりに任意の数値関数を使用することもできます。その結果、時間を凌駕するクールなフィルターを見つけることができます。

 
fxsaber:

残念ながら、言葉の壁があるため、あなたの作品に触れることができない。他のフィルターへの興味については、もちろん同感だ

いつからそんな壁ができたんだ?;-)以前は明確だった。それとも、私の英語が間違っていたのでしょうか?

 
Stanislav Korotky:

いつからそんな壁ができたのか?;-)昔はクリアだったんだけどね。それとも僕の英語がめちゃくちゃだったのかな?

いつも壁があった。ソースコードを読みながら直進することもあった。

 
fxsaber:

残念ながら、言葉の壁があるため、あなたの作品に触れることができない。他のフィルターへの興味については、もちろん同感だ

神はあなたの審判です。

 
メモ
#include <fxsaber\BestInterval\BestInterval.mqh>

void OnStart()
{
  BESTINTERVAL BestInterval;

  // BestInterval全体の対応値
  Print(BestInterval.GetTotal());          // クローズドポジションの数。
  Print(BestInterval.GetTotalPlus());      // クローズしたポジションの数。
  Print(BestInterval.GetTotalMinus());     // 不採算のクローズポジション数。
  Print(BestInterval.GetMean());           // 期待値
  Print(BestInterval.GetProfit());         // 利益
  Print(BestInterval.GetProfitFactor());   // プロフィット・ファクター
  Print(BestInterval.GetProfitPlus());     // プラス取引の利益
  Print(BestInterval.GetProfitMinus());    // マイナス取引の損失
  Print(BestInterval.GetRecoveryFactor()); // 回復係数
  Print(BestInterval.GetMaxDrawDown());    // 絶対残高の最大ドローダウン

  Print(BestInterval.GetAmountDeleteIntervals()); // 不良インターバルの削除数

  INTERVAL Intervals[];

  const int Size = BestInterval.GetIntervals(Intervals); // BestIntervalを構成する区間を取得する。

  // 各区間について、そのインデックスを表示した
  for (int i = 0; i < Size; i++)
  {
    Print(Intervals[i].Total);          // クローズドポジションの数。
    Print(Intervals[i].TotalPlus);      // クローズしたポジションの数。
    Print(Intervals[i].TotalMinus);     // 不採算のクローズポジション数。
    Print(Intervals[i].Mean);           // 期待値
    Print(Intervals[i].Profit);         // 利益
    Print(Intervals[i].ProfitFactor);   // プロフィット・ファクター
    Print(Intervals[i].ProfitPlus);     // プラス取引の利益
    Print(Intervals[i].ProfitMinus);    // マイナス取引の損失
    Print(Intervals[i].RecoveryFactor); // 回復係数
    Print(Intervals[i].MaxDrawDown);    // 絶対残高の最大ドローダウン

    Print(Intervals[i].OpenTime);       // インターバルオープン時間。
    Print(Intervals[i].CloseTime);      // インターバル終了時間。
  }
}
 
Stanislav Korotky:

時間間隔だけによる断面積の作成は、非常に特殊なアプローチである。実際、他のパラメータによる断面積も、それに劣らず興味深いものである。

いろいろ考えてみたが、時間のように効果的にフィルターにかけられるものは思いつかなかった。

これは戦略の一部ではなく、市場の 動きに直接影響するものでなければならない。

スタックか、他のデータフィードか?

理屈の上では、個々にうまくフィルタリングされるはずです。