無料でロボットをダウンロードする方法を見る
Twitter上で私たちを見つけてください。
私たちのファンページに参加してください
私たちのファンページに参加してください
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
理想的なジグザグ - MetaTrader 5のためのインディケータ
- ビュー:
- 1811
- 評価:
- パブリッシュ済み:
- 2016.06.16 10:38
- アップデート済み:
- 2016.11.22 07:34
- このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
これはシンプルでありながら非常に高速ジグザグです。
中断されたピークや誤ったピークがありません。ピークの検索は時間の面で最適化されています。
メリット:
- 計算に最も時間のかかる関数はiBarShiftです。それはピーク検索に必要なすべてのサイクルを完全に置き換えます。したがってArrayBSearchによって置換されています。これは、この指標がそのMQL4版よりも効率的になることを意味します。
- 各バーに必要なすべてのデータはその瞬間だけでなく、履歴中の任意の瞬間のEAによってアクセス可能です。
- 中断されたピークはありません。
- 指標値を検索せずにピークを見つける効率的な方法
- 非常に高速
- 履歴の挿入および時間枠切り替えの際に正常に動作する
- EAでの使用に最適
デメリット:
- メモリ要件。ジグザグは、正確な描画のために2つのバッファを必要とし(ラグのため1つでは足りません)、5つのバッファがここで使用されています。私の意見では、この欠点は利点#6によっ完全に補われます。高速ジグザグのいずれかも2つのバッファの履歴過去の挿入を正しく処理することはできません。
- 追加のラインが利用できます。これはエキスパートアドバイザーにデータが表示されるために必要です。これらの線は見えてはいけません。
原則:
ジグザグは、チャネリングの原理によって描かれています。チャネル幅が点(IdealZZ)または百分率(IdealZZP)で定義されます。
ピークの検索:ピークの検索
input int ChannelWidth=100; #property indicator_chart_window datetime LastTime; int ZZHandle; //+------------------------------------------------------------------+ //| カスタムインディケータ初期化関数 | //+------------------------------------------------------------------+ void OnInit() { LastTime = 0; ZZHandle = iCustom(_Symbol, Period(), "IdealZZ", ChannelWidth); } //+------------------------------------------------------------------+ //| GetValue | //+------------------------------------------------------------------+ bool GetValue(double dir,int bar,int prevBar,double &peak, int &peakBar,datetime &peakTime,const datetime &T[]) { if(dir<0) { double t[1]; if(0>=CopyBuffer(ZZHandle,2,bar,1,t)) return false; int i= ArrayBsearch(T, (datetime)t[0]); if(i==prevBar) { if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); } double v[1]; if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false; if(v[0]==EMPTY_VALUE) { if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false; } peak=v[0]; peakBar=i; peakTime=(datetime)t[0]; } else if(dir>0) { double t[1]; if(0>=CopyBuffer(ZZHandle,3,bar,1,t)) return false; int i= ArrayBsearch(T, (datetime)t[0]); if(i==prevBar) { if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); } double v[1]; if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false; if(v[0]==EMPTY_VALUE) { if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false; } peak=v[0]; peakBar=i; peakTime=(datetime)t[0]; } else { return(false); } return(true); } //+------------------------------------------------------------------+ //| GetValue | //+------------------------------------------------------------------+ void SetPt(string name,double price,datetime time) { ObjectCreate(0,name,OBJ_ARROW,0,time,price); ObjectSetInteger(0,name,OBJPROP_ARROWCODE,108); ObjectSetDouble(0,name,OBJPROP_PRICE,price); ObjectSetInteger(0,name,OBJPROP_TIME,time); } //+------------------------------------------------------------------+ //| カスタムインディケータ反復関数 | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &T[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if(LastTime==T[0]) return(rates_total); LastTime=T[0]; ArraySetAsSeries(T,true); double dir_[1]; if(0>=CopyBuffer(ZZHandle,4,1,1,dir_)) return rates_total; double dir=dir_[0]; double rdir=-dir; if(dir==EMPTY_VALUE) return(rates_total); double v1,v2,v3,v4,v5; int i1,i2,i3,i4,i5; datetime t1,t2,t3,t4,t5; if( GetValue(dir,1,0,v1,i1,t1,T) && GetValue(rdir,i1,0,v2,i2,t2,T) && GetValue(dir,i2,i1,v3,i3,t3,T) && GetValue(rdir,i3,i2,v4,i4,t4,T) && GetValue(dir,i4,i3,v5,i5,t5,T) ) { SetPt("1",v1,t1); SetPt("2",v2,t2); SetPt("3",v3,t3); SetPt("4",v4,t4); SetPt("5",v5,t5); Print(v1," ",v2," ",v3," ",v4," ",v5," ",i1," ",i2," ",i3," ",i4," ",i5); } else { Print("Seems to be error available..."); } return(rates_total); } //+------------------------------------------------------------------+
この例は(現在形成しているものを含む)最初の5つのピーク(バーごとに一回)マークする指標です。
注意事項ゼロバーモードが有効になっている場合、コードは、間違って動作する可能性があります。
ゼロバーモード:
このモードはDrawZeroBar変数コードで有効にできます。デフォルトでは無効になっています。指標ががエキスパートアドバイザーで使用されている場合は特に、それを有効にすることは推奨されません。
お楽しみ下さい。不都合などをお知らせください。
MetaQuotes Ltdによってロシア語から翻訳されました。
元のコード: https://www.mql5.com/ru/code/925
修正平均(Corrected Average、CA)
A.Uhlによる修正平均指標(別名「Optimal moving average」)。
Jolly Roger EAバージョン自動売買チャンピオンシップ2011年に提出されたPiratのエキスパートアドバイザーによってインスピレーションを得ました。