私たちのファンページに参加してください
- ビュー:
- 136
- 評価:
- パブリッシュ済み:
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
セットアップ
必要なもの
- ジグザグ・プロット1枚
- 高値と安値用の2つのデータバッファ
- 入力パラメータ
- インジケータが再計算するたびにリセットされるシステム変数の継続的なセット
#property indicator_buffers 2 #property indicator_plots 1 input double retracement=23.6;//リトレースメント量 input double minSizeInAtrUnits=0.0;//波の最小サイズ(単位:atr input int rollingAtrPeriod=14;//ローリングatrピリオド input color Color=clrDodgerBlue;//波色 input int Width=3;// 波の幅 input ENUM_LINE_STYLE Style=STYLE_SOLID;//ウェーブスタイル //+------------------------------------------------------------------+ //| カスタムインジケータ初期化関数 //+------------------------------------------------------------------+ //--- 上昇波と下降波 double upWaves[],dwWaves[];
upWaves 配列に高値を、dwWaves 配列に安値を格納します。
システム変数:
直近の波の種類、開始した場所、終了した場所、開始と終了からの小節単位の距離を知る必要があります。
次に、ローカル高値とローカル安値の変数と、各ポイントからの小節単位の距離が必要です。
//--- ジグザグの追跡 //--- 波のタイプ [0] なし [1] アップ [2] ダウン int wave_type=0; //--- 波の価格(開始価格) double wave_start_price=0.0; //--- 波の価格(終値) double wave_end_price=0.0; //--- 開始価格からの棒グラフの距離 int wave_start_distance=0; //--- 終値からの棒グラフの距離 int wave_end_distance=0; //--- 高額トラッキング double high_mem=0.0; int distance_from_high=0; //--- 低価格のトラッキング double low_mem=0.0; int distance_from_low=0; //--- ローリング double rollingAtr=0.0; int rollingAtrs=0;
最後に、ローリングatrの単位とその数を計算します。
次に、システムリセット関数を作成します:
void resetSystem(){ ArrayFill(upWaves,0,ArraySize(upWaves),0.0); ArrayFill(dwWaves,0,ArraySize(dwWaves),0.0); wave_type=0; wave_start_price=0.0; wave_end_price=0.0; wave_start_distance=0; wave_end_distance=0; high_mem=0.0; low_mem=0.0; distance_from_high=0; distance_from_low=0; rollingAtr=0.0; rollingAtrs=0; }
標準的なもので、配列をゼロで満たし、システム変数をリセットする。
Oninitでバッファ、プロットをセットアップし、初めてresetを呼び出します:
SetIndexBuffer(0,upWaves,INDICATOR_DATA); SetIndexBuffer(1,dwWaves,INDICATOR_DATA); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_ZIGZAG); PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,Color); PlotIndexSetInteger(0,PLOT_LINE_WIDTH,Width); PlotIndexSetInteger(0,PLOT_LINE_STYLE,Style); resetSystem();
それでは早速計算に入りましょう。
最初に処理しなければならないのは、ローリングatrです。
atrの期間以上のバーを収集するまでは、他のことは何もしません。
ローリングATRを管理する部分は以下の通りです:
- 期間よりも多くのバーを収集していない場合は、見つかったバーの範囲を合計に加え続ける。
- 期間に達したら、最初の除算(平均)を行う。
- その後、ローリングatrの一部分(atr/期間)を切り取り、新しい部分(小節の範囲/期間)を追加する。
//--- atrの管理 rollingAtrs++; if(rollingAtrs>rollingAtrPeriod){ double new_portion=((high[i]-low[i])/_Point)/((double)rollingAtrPeriod); //--- 古い部分を削除し、新しい部分を追加する。 rollingAtr=(rollingAtr)-(rollingAtr/((double)rollingAtrPeriod))+new_portion; } else if(rollingAtrs<=rollingAtrPeriod){ rollingAtr+=(high[i]-low[i])/_Point; if(rollingAtrs==rollingAtrPeriod){ rollingAtr/=((double)rollingAtrs); //--- 高値と安値のメモリとシステムをスタートさせる。 high_mem=high[i]; low_mem=low[i]; distance_from_high=0; distance_from_low=0; } }
さて、もうひとつ問題がある。
このジグザグの基本はリトレースメントです。
しかし、リトレースメントが起こるには、少なくとも1つの波がなければならない。
しかし、最初の波は何をリトレースするのでしょうか?
そのため、次のようにします:
- atrが一杯になるとすぐに(atrの収集=期間)、私たちのシステム変数で高値と安値をつかむ。
- atr単位で有効なサイズの波を形成し、新高値(上昇波)または新安値(下降波)を形成できた方が勝ちです。
この方法では、最初の波としてのリトレースメントはありませんが、何らかの方法でシーケンスを開始する必要があります。
最初の波だけ古典的なフラクタル・アプローチを採用し、その後はリトレースメントを続けることもできます。
これは、波がない限り、私たちが行うことです:
//--- ウェーブ・タイプがまだない場合 else{ //--- 高値を更新し、安値を更新しなかった場合 if(high[i]>high_mem&&low[i]>=low_mem){ double new_wave_size_in_atr_units=((high[i]-low_mem)/_Point)/rollingAtr; //--- 新しい波のサイズが有効な場合 if(new_wave_size_in_atr_units>=minSizeInAtrUnits){ //--- 新しいアップウェーブを開始する wave_type=1; //--- スタート価格はローメム wave_start_price=low_mem; wave_start_distance=distance_from_low; //--- 終値は新高値 wave_end_price=high[i]; wave_end_distance=0; //--- 波を描く dwWaves[i-wave_start_distance]=low_mem; upWaves[i]=high[i]; //--- 高値を変更する high_mem=high[i]; distance_from_high=0; //--- ローを変更する low_mem=low[i]; distance_from_low=0; } } //--- 安値を更新し、高値を更新しなかった場合 else if(low[i]<low_mem&&high[i]<=high_mem){ double new_wave_size_in_atr_units=((high_mem-low[i])/_Point)/rollingAtr; //--- 新しい波のサイズが有効な場合 if(new_wave_size_in_atr_units>=minSizeInAtrUnits){ //--- 新しい下降波を開始する wave_type=-1; //--- 開始価格はハイメモ wave_start_price=high_mem; wave_start_distance=distance_from_high; //--- 終値は新安値 wave_end_price=low[i]; wave_end_distance=0; //--- 波を描く upWaves[i-wave_start_distance]=high_mem; dwWaves[i]=low[i]; //--- 高値を変更する high_mem=high[i]; distance_from_high=0; //--- ローを変更する low_mem=low[i]; distance_from_low=0; } } //--- 両方を破った場合 else if(low[i]<low_mem&&high[i]>high_mem){ //--- 変更する high_mem=high[i]; low_mem=low[i]; distance_from_high=0; distance_from_low=0; } }
素晴らしい。さて、最後のピースだ。
- もし上昇波があれば:
- また、安値と安値からの距離も更新します。そうすることで、ピークからの最低安値をキャッチし、新しい安値を開始するために十分なリトレースをするかどうかをチェックすることができます。
- 新しい安値が作られた場合、または新しい安値が設定された場合、ピークから安値までの距離を計算し、波のサイズで割ります。波のサイズが100ポイントで、リトレースメントが24ポイントであれば、24/100 0.24となり、x 100 24%となります。もし、前の波をリトレースする新しい波のサイズもatr単位に対して有効であれば、新しい下降波を開始し、新しいローカル高値と安値を設定し、バー距離を設定します。
これが上記の関連コードです:
//--- もし上昇波があれば if(wave_type==1){ //--- 波が上に膨らむ場合 if(high[i]>wave_end_price){ //--- 配列の位置から前の終了価格を削除する (0.0=空) upWaves[i-wave_end_distance]=0.0; //--- 新しい位置に置く upWaves[i]=high[i]; wave_end_price=high[i]; wave_end_distance=0; //--- 高値を変更する high_mem=high[i]; distance_from_high=0; //--- ローを変更する low_mem=low[i]; distance_from_low=0; } //--- リトレースメントをチェックする if(low[i]<low_mem||distance_from_low==0){ low_mem=low[i]; distance_from_low=0; double size_of_wave=(wave_end_price-wave_start_price)/_Point; double size_of_retracement=(wave_end_price-low_mem)/_Point; if(size_of_wave>0.0){ double retraced=(size_of_retracement/size_of_wave)*100.0; double new_wave_size_in_atr_units=((wave_end_price-low_mem)/_Point)/rollingAtr; //--- 新しい波のサイズが有効な場合 if(new_wave_size_in_atr_units>=minSizeInAtrUnits){ //--- リトレースメントが大きい場合、下降波を開始する。 if(retraced>=retracement){ //--- 新しい下降波を開始する wave_type=-1; //--- 開始価格はハイメモ wave_start_price=high[i-distance_from_high]; wave_start_distance=distance_from_high; //--- 終値は新安値 wave_end_price=low[i]; wave_end_distance=0; //--- 波を描く upWaves[i-wave_start_distance]=high_mem; dwWaves[i]=low[i]; //--- 高値を変更する high_mem=high[i]; distance_from_high=0; //--- ローを変更する low_mem=low[i]; distance_from_low=0; } } } } }
下降波があるときは、逆のことをします。
リトレースメント・ジグザグの準備は完了です。
これが 23.6% リトレースメントと 0.0分の波のサイズ(atr単位)のジグザグです。
同じジグザグをatr単位で波のサイズを3分に したものがこちらです。
MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/56619

TradeReportExporterスクリプトは、取引(トレード)の履歴を便利なCSVファイルにエクスポートするように設計されています。このスクリプトは、インストールされている商品の過去1年間の全取引データを自動的に収集します。ファイルには、日時、取引タイプ(買い/売り)、価格、数量、手数料、損益などのデータが含まれます。結果はエクセルやその他の表計算エディターで開くことができるファイルに保存されます。

単一シンボルのロング・スワップとショート・スワップを監視するためのシンプルなユーティリティ。ブローカー・ディーラーのスワップが口座通貨ではなくポイントで指定されている場合、このユーティリティは自動的にポイントを口座通貨に変換する。スワップは水曜日に 3 倍になる。水平方向と垂直方向のアライメントは入力で調整できる。

波の方向変化を検知するために、1つの入力を使ってステップサイズを調整するジグザグインジケーター

その目的は、MQL5開発におけるあらゆるTelegram統合タスクで関数をすぐに利用できるようにすることです。このファイルをCodeBaseに追加することで、Expert Advisorsにインクルードするだけで、インクルードされたモジュールから関数を直接呼び出すことができます。これにより、コードをゼロから何度も再開発する必要がなくなり、複数のプロジェクトにわたって再利用性を確保できます。