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

 
fxsaber:

今までやったのはこれだけだ。

あとはロットで修正する必要はない。しかし、他の(古い)ものに関連するエラーがある。修正する必要がある。

更新しました。BestIntervalモードでは、このオプションを使用することをお勧めします。

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

ライブラリ: バーチャル

fxsaber, 2019.12.11 12:15 pm.

開発者がシンボル初期価格の正常化の状況を いつ修正するのか、また、まったく修正しないのかについては、何とも言えません。そのため、このモードが導入されました。
//https://www.mql5.com/ru/forum/321656/page34#comment_14192799
#define  TICKS_FORCE_NORMALIZE // 入力されるティック価格の強制的な正規化
 

予想外の動作だ。

Action=falseで一度実行すれば、パス結果をファイルに保存し、後で適用できるようだ。しかし、予想外なのは、トータル、RF、DDなどのすべてのパラメーターも保存されることだ。言い換えれば、同じシンボルの別のインターバルや別のシンボルなどでAction=trueで実行すると、取引に最適な時間が適用されるだけでなく、ログに古い値が記録されます。

 
traveller00:

その後、同じシンボルや別のシンボルなどの別の間隔でAction=trueで実行すると、取引に最適な時間が適用されるだけでなく、ログに古い値が記録される。

真の実行の値は表示されず、適用された偽の実行のデータが表示されます。シンボルやインターバルなどを変更しても、表示される値は変わりません。表示される値は、エントリーが行われた時点のものである。これは意図的に行われている。

 
念のため、アーキテクチャの観点からStopLossと正しく機能しないことを指摘しておきます。理論的には、action=falseでトリガーされたStopLossは、BestIntervalが捨てると決めた範囲に入る可能性があります。その結果、action=trueのときにずれることになり、action=falseのときに予測された数値と大きく異なる結果になることがあります。
 
traveller00:
念のため、アーキテクチャの観点からStopLossと正しく機能しないことを指摘しておきます。理論的には、action=falseでトリガーされたStopLossは、BestIntervalが捨てると決めた範囲に入るかもしれません。その結果、action=trueでシフトし、結果の数値がaction=falseで予測された数値と大きく異なることがあります。

何か誤解されているようですね。理論的にも問題はないはずです。

 
はい、問題はVirtualに含まれ、BestIntervalを使用するSyncがStopLossとTakeProfitを無視することにあるようです。問題はアーキテクチャーではなく、私がそれを理解しきれていないことです。
 
traveller00:
はい、問題はVirtualに含まれ、BestIntervalを使用するSyncがStopLossとTakeProfitを無視することにあるようです。問題はアーキテクチャの問題ではなく、私がそれを理解しきれていないことです。

私はリミッターとテイカーを通してTCを書いているので、問題を再現する原始的な例を示すのが良いだろう。

 
BestInterval.mqhでactive=trueの時、voidOnTick( void ) があり、その中にSYNC::Positions<BEST_TIME>(); があり、これはSync.mqh にはstaticvoid Positions( constint Handle = 0, constbool Reverse = false ) があります。内部では、ロットが再計算され、必要な間隔に収まっていれば、SYNC::NewOrderSend(_Symbol, Type, ::MathAbs(AddLots), Price, 100, 0, 0, 0); を介して仮想環境から実環境に転送されます。 価格がポジションから取得されるのではなく、その場で読み込まれるのは少し奇妙ですが、問題ありません。見ての通り、StopLossとTakeProfitはゼロで渡されています。おそらく、BESTINTERVAL_LIMITSYNC_NETTING オプションを使用していて、TakeProfitが考慮されているのでしょう。
 
traveller00:
BestInterval.mqhでactive=trueの場合、voidOnTick( void ) があり、その中にSYNC::Positions<BEST_TIME>(); があり、Sync.mqh にはstaticvoid Positions( constint Handle = 0, constbool Reverse = false ) があります。内部では、ロットが再計算され、必要な間隔に収まっていれば、SYNC::NewOrderSend(_Symbol, Type, ::MathAbs(AddLots), Price, 100, 0, 0, 0); を介して仮想環境から実環境に転送されます。 価格がポジションから取得されるのではなく、その場で読み取られるのは少し奇妙ですが、まあいいでしょう。見ての通り、StopLossとTakeProfitはゼロで渡されています。おそらく、BESTINTERVAL_LIMITSYNC_NETTING オプションを使用していて、TakeProfitが考慮されているのでしょう。

はい、私はこのモードを使っています。普遍的な解決策を考えても、すべてが無駄になってしまうからです。

少しいじれば、クローズド・ソース・コード(Marketなど)のExpert Advisorのシングル・パスにBestInterval-trueを使うことができます。

それでも、BestIntervalの主な機能は最適化モードで 動作することです。Trueは良い機能ですが、必須ではありません。

 
  int FromFile( const string FileName = __FILE__, const int CommonFlag = 0 )
  {
    const bool Res = (::FileLoad(FileName, this.Intervals, CommonFlag) > 0) && (this.IsCalculated = true);

    if (Res)
    {
      this.AmountDeleteIntervals = ::ArraySize(this.Intervals) - (this.Intervals[0].OpenTime ? 0 : 1);

      this.FullInterval.Calculate(this.Intervals);
    }
    else
      ::Print("ERROR: Can not load the File " + FileName + "!");

    return(Res);
  }
int=>boolに変更しました。あるいは、代わりにAmountDeleteIntervalsを返すように提案してもよい。