ニコライ!ラグが最も少なく、誤信号の数が最も少ないあなたの頭脳集団はどれだ?
Makser:
ここで質問です。私はJFatlSpeedをクロスに、そして最近は他の全てに使っています。しかし、4時間足だけです。そして、X2MA_BBx9の5分足トレードでバウンスをキャッチしています。
ニコライ!君の頭脳集団の中で、ラグが最も少なく、誤信号の数が最も少ないのはどれだろう(もちろん、これがまったく判断できないとしても)。
だから、それは絶対に私のプログラミング・スタイルではない。
木を見て森を見ず=コメントばかりでコードが見えない。
加えて、入力パラメーター「シフト」はまったく使われていない。
スーパー・プログラマー」は私の本を見習うことができるかもしれない。
//+------------------------------------------------------------------+ //|スーパートレンドmq5||スーパートレンド //| オリジナルのコードは https://www.mql5.com/ja/code/527 |に ある。 //| 元のコードはJason Robinsonによるもので、Nikolay Kositsinによって書き直された。 //| クロネンチャクラことオットー・パウザー氏による改良版。 //+------------------------------------------------------------------+ //--- インクード #include <Utils.mqh> //--- 一般特性 #property copyright COPY #property link LINK #property version "1.00" //--- インジケータのプロパティ #property indicator_chart_window #property indicator_buffers 4 #property indicator_plots 4 //--- 入力パラメータ input int CCIPeriod = 50; // CCI指標期間 input int ATRPeriod = 5; // ATR指標期間 input int Level = 0; // CCIアクティベーション・レベル //---- インジケーター・バッファ double ATR[], CCI[]; double TrendUp[], TrendDn[]; double SignUp[], SignDn[]; //---- グローバル変数 int min_rates_total; int ATR_Handle, CCI_Handle; //+------------------------------------------------------------------+ //| カスタムインジケータ初期化関数 //+------------------------------------------------------------------+ int OnInit() { min_rates_total=MathMax(CCIPeriod,ATRPeriod); CCI_Handle=iCCI(NULL,0,CCIPeriod,PRICE_TYPICAL); if(InvalidHandle(CCI_Handle,"iCCI")) return(INIT_FAILED); ATR_Handle=iATR(NULL,0,ATRPeriod); if(InvalidHandle(ATR_Handle,"iATR")) return(INIT_FAILED); string shortname=IndiShortName("Supertrend",CCIPeriod,ATRPeriod); IndicatorSetString(INDICATOR_SHORTNAME,shortname); IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); InitBuffer(TrendUp,DRAW_LINE ,"Supertrend Up" ,clrLime,min_rates_total,0 ,2,true); InitBuffer(TrendDn,DRAW_LINE ,"Supertrend Down" ,clrRed ,min_rates_total,0 ,2,true); InitBuffer(SignUp ,DRAW_ARROW,"Supertrend signal Buy" ,clrLime,min_rates_total,108,1,true); InitBuffer(SignDn ,DRAW_ARROW,"Supertrend signal Sell",clrRed ,min_rates_total,108,1,true); ArraySetAsSeries(ATR,true); ArraySetAsSeries(CCI,true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| カスタム・インジケータ反復関数 //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double& high[], const double& low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if // チェック ( BarsCalculated(CCI_Handle)<rates_total || // CCIインジケーターをチェックする BarsCalculated(ATR_Handle)<rates_total || // ATRインジケーターをチェックする rates_total<min_rates_total // 十分なバーがあるかチェックする ) return(0); // 次のティックを試す int limit,to_copy,bar; ArraySetAsSeries(high,true); // ティックごとに AsSeries を設定する必要がある。 ArraySetAsSeries(low ,true); if(prev_calculated>rates_total || prev_calculated<=0) // インジケータ計算の最初の開始をチェックする limit=rates_total-min_rates_total; すべてのバーの計算のための // 開始インデックス else limit=rates_total-prev_calculated; // 新しいバーを計算するための開始インデックス to_copy=limit+1; // ATRデータをバッファにコピーする if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(0); to_copy++; // CCIデータをバッファにコピーする if(CopyBuffer(CCI_Handle,0,0,to_copy,CCI)<=0) return(0); for(bar=limit; bar>=0; bar--) // 計算メインループ { TrendUp[bar]=NULL; // すべてのバッファをクリアする TrendDn[bar]=NULL; SignUp [bar]=NULL; SignDn [bar]=NULL; // 行を計算する if(CCI[bar]>=Level && CCI[bar+1]<Level) TrendUp[bar]=TrendDn[bar+1]; if(CCI[bar]<=Level && CCI[bar+1]>Level) TrendDn[bar]=TrendUp[bar+1]; if(CCI[bar]>Level) { TrendUp[bar]=low[bar]-ATR[bar]; if(TrendUp[bar]<TrendUp[bar+1] && CCI[bar+1]>=Level) TrendUp[bar]=TrendUp[bar+1]; } if(CCI[bar]<Level) { TrendDn[bar]=high[bar]+ATR[bar]; if(TrendDn[bar]>TrendDn[bar+1] && CCI[bar+1]<=Level) TrendDn[bar]=TrendDn[bar+1]; } if(TrendDn[bar+1]!=0.0 && TrendUp[bar]!=0.0) SignUp[bar]=TrendUp[bar]; // シグナルUPをチェックする if(TrendUp[bar+1]!=0.0 && TrendDn[bar]!=0.0) SignDn[bar]=TrendDn[bar]; // シグナルDOWNをチェックする } return(rates_total); }
//+------------------------------------------------------------------+ //|ユーティリティmqh //| Copyright © 2018, Ing.オットー・パウザー //|https://www.mql5.com/ja/users/kronenchakra //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 定義| //+------------------------------------------------------------------+ #define COPY "Copyright © 2018, Ing. Otto Pauser" #define LINK "https://www.mql5.com/ja/users/kronenchakra" #define SPACER "---------------------" //+------------------------------------------------------------------+ //| 略語| //+------------------------------------------------------------------+ #define PRICE ENUM_APPLIED_PRICE #define TIMEF ENUM_TIMEFRAMES //+------------------------------------------------------------------+ //| 補助関数| //+------------------------------------------------------------------+ void InitBuffer(double &_buffer[], ENUM_DRAW_TYPE _type, string _label, color _color, int _begin, int _arrow=159, int _width=1, bool _series=false) { static int idx=0; // バッファインデックスを0に初期化する SetIndexBuffer (idx,_buffer); // バッファの初期化 ArrayInitialize (_buffer ,NULL); // バッファの初期化 ArraySetAsSeries (_buffer ,_series); // AsSeries を設定する // プロパティを設定する PlotIndexSetInteger(idx,PLOT_DRAW_TYPE ,_type ); PlotIndexSetInteger(idx,PLOT_LINE_COLOR ,_color); PlotIndexSetInteger(idx,PLOT_LINE_WIDTH ,_width); PlotIndexSetInteger(idx,PLOT_DRAW_BEGIN ,_begin); PlotIndexSetInteger(idx,PLOT_ARROW ,_arrow); PlotIndexSetString (idx,PLOT_LABEL ,_label); PlotIndexSetDouble (idx,PLOT_EMPTY_VALUE,NULL ); idx++; // 次の呼び出しのためにバッファインデックスをインクリメントする } bool InvalidHandle(int _handle, string _msg) { if(_handle==INVALID_HANDLE) // ハンドルのチェック Alert("*ERROR* creating "+_msg+" handle."); // 情報 return(_handle==INVALID_HANDLE); // 無効な場合はtrueを返す } string IndiShortName(string _name, int val_1, int val_2=NULL, int val_3=NULL) { string result=_name+"("+IntegerToString(val_1); if(val_2!=NULL) result=result+","+IntegerToString(val_2); if(val_3!=NULL) result=result+","+IntegerToString(val_3); return(result+")"); } //+------------------------------------------------------------------+ //| 計算関数| //+------------------------------------------------------------------+ double StdDeviation(int position,const double &price[],const double &MAprice[],int period) { int i; double StdDev_dTmp=0.0; if(position<period) return(StdDev_dTmp); // 位置を確認する for(i=0;i<period;i++) // 標準偏差の計算 StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2); StdDev_dTmp=MathSqrt(StdDev_dTmp/period); return(StdDev_dTmp); // 計算された値を返す }
すぐに理解できるだろう。
おそらくMetaQutesも、例えばプロットバッファを たった1行で定義する方法など、何かを学ぶことができるだろう。
ファイル:
supertrend.mq5
11 kb
Utils.mqh
7 kb
オットー
それは
TrendUp[bar]=NULL; // すべてのバッファをクリアする TrendDn[bar]=NULL; SignUp [bar]=NULL; SignDn [bar]=NULL;
は危険です。NULLは'void'型です。MT5をさらに高速化するために、おそらく後で、実際には何も代入されないようにするか(その場合、古い値が残ります)、メモリ位置が変更されたときにランダムな値が作成されます。
シンボルには_symbolを 使用し、値にはEMPTY_VALUEか 0を直接使用する方が良いと思う。そうすれば、無に存在を与えることができる。)
どうすれば
このインジケーターを使いたい
ka03ht8096:
入手方法
入手方法
ステップ1
ステップ 2:
乗数とATR値はどの入力ですか?
MT4で使用できますか?
取引の機会を逃しています。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
SuperTrend:
SuperTrendトレンドインディケータ
作者: Nikolay Kositsin