私たちのファンページに参加してください
- ビュー:
- 1046
- 評価:
- パブリッシュ済み:
- 2017.09.08 15:44
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
MQL5 の主要な問題の1つは、組み込みの時系列関数がないことです。 一方、プログラマは、1つの時間シリーズのデータにアクセスする必要があります.
... if(CopyTime(symbol,timeframe,time,1,checkcandle)==1) { ...
iBarShift アルゴリズムを見てみましょう。 datetime によってバーのインデックスを返すには、まず次のようにコールする必要があります:: CopyTime は、動的配列を作成し、サイズを変更し、データをコピーしてから、メモリ内で破棄します。 呼び出しの問題ではありませんが、時系列関数は通常、多くの異なるタイムフレーム上でわずか数回呼ばれるので、このメモリのオーバーヘッドは、大幅なスローダウンを追加することができます. このタイプのメソッドを使用して、すべての時間シリーズのデータをプログラムが呼び出し、新しいメモリを割り当てるために必要なオーバーヘッド及び無駄なリソースのすべての可能性を熟考します。
このライブラリを高速化するために、標準ライブラリの CObject および CArrayObj クラスを実装して、レート配列を1回コピーしてから、その特定のシンボルと期間のすべての時系列呼び出し、再アクセスします。 初期化フェーズが通常の実装よりも長くかかり、すべての呼び出しが約100分の1の時間でデータにアクセスできるため、両刃の剣になる可能性があります。 iBarShift () の例では、この新しいアルゴリズムは、配列にバーのインデックス整数を格納し、配列アドレスとして時間 (int 型にキャスト) を使用してアクセスする int [] 配列を作成することにより、より高速に動作します。 つまり、データにアクセスするための直接アドレスとして時間を渡します。
これには注意が必要です。
初期化フェーズでは、大量の時間が消費されます。 時系列データへのアクセスを計画していない場合は、期間バーごとに数千 (集計) 時間を超え、別のメソッドを検討することをお勧めします。
CiTimeSeries クラスのオブジェクトは、新しいバーが形成されたときに、格納データを自動的に更新するように設定されます。 "false" に設定すると、ミッションクリティカルな "ホットパス" からの高速呼び出しを許可する高性能モードにオブジェクトが配置されますが、その後のメンテナンスサイクル中に更新が必要です。
例:
#includeitimeseries_nicholishen mqh > //---iTimeSeries オブジェクトのグローバル宣言 CiTimeSeries iBar; int() { //---初期化フェーズ iBar.Init( NULL, PERIOD_CURRENT, false // bool auto-refresh ); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(hot_path_operations) { //example index = iBar.Shift(time); } else if(maintenance_path_operations) { iBar.Refresh(); } }
さらに、CiTimeSeries のオブジェクトをインスタンス化せずに (MQL4 と同様に) グローバル関数を直接呼び出すことができますが、最初のアクセス時間は、最初にシーンの背後にあるグローバルオブジェクトを初期化する必要があるため、低速になります。 このメソッドでライブラリを使用すると、タイムシリーズ関数のいずれかを数回呼び出すだけでも低速になる場合がありますが、アルゴリズムで同じシンボル + 期間の時系列データの数千の繰り返し (>) を呼び出す必要がある場合には、パフォーマンス上の利点が異なります。
iBarShift アルゴリズムの開発者は、ここでhttps://www.mql5.com/en/code/1864"iBarShift" の競争力のあるベンチマークテストを行いました。
最も正確かつ最速のメソッド (この記事の時点で) テストのベンチマークとして使用することを決めたからです。
10万の直接 (グローバル) 関数呼び出しの計算時間は、現在利用可能な最速のメソッドの50よりも速く、"パフォーマンスモード" で初期化後にパブリックメソッドを呼び出すと、 100 倍以上高速になります。
利用可能なパブリックメソッドとグローバル関数:
注: グローバル関数は、MT4など iBarShift、iTime などと同じです。
//---1 つのシンボルとピリオドを初期化します。パフォーマンスモードで自動更新を false に設定する bool Init(string symbol=NULL, ENUM_TIMEFRAMES period = PERIOD_CURRENT, const bool autoRefresh = true ); //---ENUM_TIMEFRAMES 配列内の1つのシンボルとすべてのピリオドを初期化します。パフォーマンスモードで自動更新を false に設定 bool Init(string symbol, ENUM_TIMEFRAMES &period[], const bool autoRefresh = true );
//---すべての期間を初期化します bool InitAllPeriods ( string symbol = NULL, const bool autoRefresh=true);
//---自動更新を false に設定すると、データの更新が管理されます。 void AutoRefresh(const bool ref) { m_autoRefresh=ref; } bool AutoRefresh() const { return m_autoRefresh; }
//---裁量リフレッシュコール;初期化されたすべての期間のデータを更新します bool Refresh();
CRatesArray *GetArrayObjPointer(string symbol, ENUM_TIMEFRAMES period);
- .Open = iOpen https://docs.mql4.com/series/iopen
- .High = iHigh https://docs.mql4.com/series/ihigh
- .Low = iLow https://docs.mql4.com/series/ilow
- .Close = iClose https://docs.mql4.com/series/iclose
- .Highest = iHighest https://docs.mql4.com/series/ihighest
- .Lowest = iLowest https://docs.mql4.com/series/ilowest
- .Volume = iVolume https://docs.mql4.com/series/ivolume
- .BarsTotal = iBars https://docs.mql4.com/series/ibars
- .Time = iTime https://docs.mql4.com/series/itime
- .Shift = iBarShift https://docs.mql4.com/series/ibarshift
MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/18305

このEA は、TP または SL がトリガするのを待ってから、反対方向にポジションを開きます。 トレードリクエストを送る前に十分な資金があるかどうか確認します。 OnTradeTransaction.

ZeroLag MACD の MQL5 バージョンです。

1つのウィンドウに2つのヒストグラムがあり、初期値からのポイントの最大平均価格偏差が表示されます。

インプットパラメータで使用できるタイムフレームの選択オプションを持つ TotalPowerIndicatorX インジケーター。