インディケータ: 逆転 - ページ 2 12 新しいコメント Otto Pauser 2019.12.10 22:04 #11 Christian:ここでは繁殖と秩序が優先される!:-) ...それはクリスマス前の魅力にあふれたバターのような柔らかさだった...少なくとも私はそう思った。;) Otto Pauser 2019.12.11 01:55 #12 私はこのインディをプログラムし直した。 286本の分かりにくい線から151本の明確な線に絞られ、さらに多くのことができるようになりました。 今では、例えばEMA50(スティーブン・プリモの売買ライン)や適切なエグジットと組み合わせることで、可能性を秘めた非常にシンプルなインジケーターに なりました。 //+------------------------------------------------------------------+ //|リバーサル_V2.0.mq5 //| Copyright © 2019, Ing.オットー・パウザー //| https://www.mql5.com/ja/users/kronenchakra //| https://www.mql5.com/ja/code/19605 で見つかった。 //+------------------------------------------------------------------+ #property copyright "Copyright © 2019, Ing. Otto Pauser" #property link "https://www.mql5.com/ja/users/kronenchakra" #property version "2.00" #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 2 //+------------------------------------------------------------------+ //| 入力パラメータ| //+------------------------------------------------------------------+ input int inp_PeriodBack = 10; // ピリオド・ルックバック input int inp_ArrowCodeDN = 242; // アローコードを売る input int inp_ArrowCodeUP = 241; // アローコード購入 input color inp_ArrowColorDN = clrRed; // アローカラー input color inp_ArrowColorUP = clrLime; // アローカラー input int inp_ArrowSize = 3; // アローサイズ input int inp_ArrowOffs = 30; // アローオフセット input bool inp_DrawRange = true; // チェックした範囲を描画する input bool inp_SendMail = false; // シグナルでメールを送信 //+------------------------------------------------------------------+ //| インジケータ・バッファ| //+------------------------------------------------------------------+ double buDN[]; // バッファー 矢印を下に double buUP[]; // バッファ 矢印を上に //+------------------------------------------------------------------+ //| カスタムインジケータ初期化関数 //+------------------------------------------------------------------+ int OnInit() { InitArrows(buDN,inp_ArrowCodeDN,inp_ArrowColorDN,inp_ArrowSize,-inp_ArrowOffs,"Sell"); InitArrows(buUP,inp_ArrowCodeUP,inp_ArrowColorUP,inp_ArrowSize,+inp_ArrowOffs,"Buy" ); 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[]) { ArraySetAsSeries(high ,true); ArraySetAsSeries(close,true); ArraySetAsSeries(open ,true); ArraySetAsSeries(low ,true); ArraySetAsSeries(time ,true); int limit=(prev_calculated==0)?0:rates_total-prev_calculated-1; for(int i=limit; i>=0; i--) { buDN[i]=NULL; buUP[i]=NULL; if(i>=MathMin(5000-1,rates_total-1-50)) continue; //アレイの範囲外」や遅い計算を防ぐために、古いレートを使用する。 //矢印の下 if(high[1+i]==HH(high,inp_PeriodBack)) //キャンドルスティックの高値はレジスタンスに等しい if(close[1+i]<open[1+i]) //ローソク足終値 < ローソク足始値(弱気バー) { buDN[i]=high[i]; //ローソク足の高値にインジケータの値を設定する if(i==1) myAlert(time[1],"Sell"); //次のバーが開いたらアラート } //矢印を上に if(low[1+i]==LL(low,inp_PeriodBack)) /安値が支持線に等しい if(close[1+i]>open[1+i]) //ローソク足終値 > ローソク足始値(強気バー) { buUP[i]=low[i]; //ローソク足の安値にインジケータの値を設定します。 if(i==1) myAlert(time[1],"Buy"); //次のバーが開いたらアラート } } if(inp_DrawRange) DrawRange("Range",time[inp_PeriodBack],HH(high,inp_PeriodBack),time[0],LL(low,inp_PeriodBack)); return(rates_total); } //+------------------------------------------------------------------+ void myAlert(datetime aTime, string aMsg) // アラート機能 { static datetime lastTime=NULL; if(aTime!=lastTime) { aMsg="Reversal_V2.9 @ "+_Symbol+","+PeriodShortStr(_Period)+" -> "+aMsg; Print(aMsg); if(inp_SendMail) SendMail("Reversal_V2.9", aMsg); lastTime=aTime; } } string PeriodShortStr(ENUM_TIMEFRAMES _tf) // 先頭の'PERIOD_'をカット/'M1'、'M10'、...を返す。 { return(StringSubstr(EnumToString(_tf),7)); } //+------------------------------------------------------------------+ double HH(const double &aBuffer[], int aPeriBack) // 一定期間の最高値 { return(aBuffer[ArrayMaximum(aBuffer,0,aPeriBack)]); } double LL(const double &aBuffer[], int aPeriBack) // 後方安値 { return(aBuffer[ArrayMinimum(aBuffer,0,aPeriBack)]); } void DrawRange(string aName, datetime aBegin, double aHigh, datetime aEnd, double aLow) { if(ObjectFind (0,aName)==0) ObjectDelete (0,aName); ObjectCreate (0,aName,OBJ_RECTANGLE,0,aBegin,aHigh,aEnd,aLow); ObjectSetInteger(0,aName,OBJPROP_STYLE,STYLE_DASHDOT); } //+------------------------------------------------------------------+ |矢印でインジケータ・バッファを開始する| //+------------------------------------------------------------------+ void InitArrows(double &aBuffer[], int aArrowCode, color aArrowColor, int aArrowSize, int aArrowOffs, string aPlotLabel) { static int idx=0; SetIndexBuffer(idx,aBuffer,INDICATOR_DATA); PlotIndexSetInteger(idx,PLOT_DRAW_TYPE ,DRAW_ARROW); PlotIndexSetInteger(idx,PLOT_ARROW ,aArrowCode); PlotIndexSetInteger(idx,PLOT_LINE_COLOR ,aArrowColor); PlotIndexSetInteger(idx,PLOT_LINE_WIDTH ,aArrowSize); PlotIndexSetInteger(idx,PLOT_ARROW_SHIFT,aArrowOffs); PlotIndexSetString (idx,PLOT_LABEL ,aPlotLabel); PlotIndexSetDouble (idx,PLOT_EMPTY_VALUE,NULL); ArrayInitialize (aBuffer,NULL); ArraySetAsSeries (aBuffer,true); idx++; } このインジケーターは、来年の初めにオンラインになる私のホームページの良い候補です。 ファイル: Reversal_V2.0.mq5 14 kb Nibelungen 2019.12.11 23:36 #13 Otto Pauser:私はこのインディをプログラムし直した。286本の分かりにくい線から151本の明確な線に絞られ、さらに多くのことができるようになった。EMA50(スティーブン・プリモの売り買いライン)や適切なエグジットと組み合わせれば、間違いなく可能性がある。 このインジケーターは、来年初めにオンラインに開設する私のホームページの候補になります。 ありがとうございます!早速試してみましたが、完璧に機能 しました。ありがとうございました! CDBCM170270 2020.08.05 02:01 #14 動作しない Juan David Paternina Hernandez 2023.03.17 19:15 #15 動作しない Joseph Kisakye 2024.01.23 02:32 #16 可能であれば、修正してください。このような素晴らしいインジケーターのコンセプトを無料で提供していただき、ありがとうございます。 bitcoin razak 2024.09.10 13:43 #17 Joseph Kisakye #: メタエディタでのコンパイル時にエラーが発生します。可能であれば修正してください。 これはエラーが出ないように修正したコードです。 //+------------------------------------------------------------------+ //|インジケーター:reversal.mq5 //|| //|| //+------------------------------------------------------------------+ #property copyright "Sergey Vradiy" #property version "1.00" #property description "" //--- インジケーターの設定 #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 2 #property indicator_type1 DRAW_ARROW #property indicator_width1 3 #property indicator_color1 0x0000FF #property indicator_label1 "Sell" #property indicator_type2 DRAW_ARROW #property indicator_width2 3 #property indicator_color2 0xFFAA00 #property indicator_label2 "Buy" //--- インジケータ・バッファ double Buffer1[]; double Buffer2[]; input int Interval=10; datetime time_alert; //アラート送信時に使用 input bool Send_Email=true; double myPoint; //OnInitで初期化 //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void myAlert(string type,string message) { if(type=="print") Print(message); else if(type=="error") { Print(type+" | reversal @ "+Symbol()+","+(string)Period()+" | "+message); } else if(type=="indicator") { if(Send_Email) SendMail("reversal",type+" | reversal @ "+Symbol()+","+(string)Period()+" | "+message); } } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void DrawLine(string objname,double price,int count,int start_index) //必要に応じて、既存のオブジェクトを作成または修正する。 { if((price<0) && ObjectFind(0,objname)>=0) { ObjectDelete(0,objname); } else if(ObjectFind(0,objname)>=0 && ObjectGetInteger(0,objname,OBJPROP_TYPE)==OBJ_TREND) { datetime Time[]; ArraySetAsSeries(Time,true); CopyTime(Symbol(),Period(),0,start_index+count,Time); ObjectSetInteger(0,objname,OBJPROP_TIME,Time[start_index]); ObjectSetDouble(0,objname,OBJPROP_PRICE,price); ObjectSetInteger(0,objname,OBJPROP_TIME,1,Time[start_index+count-1]); ObjectSetDouble(0,objname,OBJPROP_PRICE,1,price); } else { datetime Time[]; ArraySetAsSeries(Time,true); CopyTime(Symbol(),Period(),0,start_index+count,Time); ObjectCreate(0,objname,OBJ_TREND,0,Time[start_index],price,Time[start_index+count-1],price); ObjectSetInteger(0,objname,OBJPROP_RAY_LEFT,0); ObjectSetInteger(0,objname,OBJPROP_RAY_RIGHT,0); ObjectSetInteger(0,objname,OBJPROP_COLOR,C'0x00,0x00,0xFF'); ObjectSetInteger(0,objname,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,objname,OBJPROP_WIDTH,2); } } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ double Support(int time_interval,bool fixed_tod,int hh,int mm,bool draw,int shift) { int start_index=shift; int count=time_interval/PeriodSeconds(); if(fixed_tod) { datetime start_time; datetime Time[]; ArraySetAsSeries(Time,true); CopyTime(Symbol(),Period(),0,Bars(Symbol(),Period())-count,Time); if(shift==0) start_time=TimeCurrent(); else start_time=Time[shift-1]; datetime dt=StringToTime(TimeToString(start_time,TIME_DATE)+" "+(string)hh+":"+(string)mm); //最も近い時間 hh:mm if(dt>start_time) dt-=86400; //24時間戻る int dt_index = iBarShift(Symbol(), Period(), dt, true); datetime dt2 = dt; while(dt_index<0 && dt>Time[Bars(Symbol(),Period())-1-count]) //バーが見つかりません。 { dt-=86400; //24時間戻る dt_index=iBarShift(Symbol(),Period(),dt,true); } if(dt_index<0) //まだ見つかりません。 dt_index =iBarShift(Symbol(), Period(), dt2, false); start_index=dt_index+1; //S/Rがdtで開いた後のバー } double _Low[]; ArraySetAsSeries(_Low,true); CopyLow(Symbol(),Period(),start_index,count,_Low); double ret=_Low[ArrayMinimum(_Low,0,count)]; if(draw) DrawLine("Support",ret,count,start_index); return(ret); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ double Resistance(int time_interval,bool fixed_tod,int hh,int mm,bool draw,int shift) { int start_index=shift; int count=time_interval/PeriodSeconds(); if(fixed_tod) { datetime start_time; datetime Time[]; ArraySetAsSeries(Time,true); CopyTime(Symbol(),Period(),0,Bars(Symbol(),Period())-count,Time); if(shift==0) start_time=TimeCurrent(); else start_time=Time[shift-1]; datetime dt=StringToTime(TimeToString(start_time,TIME_DATE)+" "+(string)hh+":"+(string)mm); //最も近い時間 hh:mm if(dt>start_time) dt-=86400; //24時間戻る int dt_index = iBarShift(Symbol(), Period(), dt, true); datetime dt2 = dt; while(dt_index<0 && dt>Time[Bars(Symbol(),Period())-1-count]) //バーが見つかりません。 { dt-=86400; //24時間戻る dt_index=iBarShift(Symbol(),Period(),dt,true); } if(dt_index<0) //まだ見つかりません。 dt_index =iBarShift(Symbol(), Period(), dt2, false); start_index=dt_index+1; //S/Rがdtで開いた後のバー } double _High[]; ArraySetAsSeries(_High,true); CopyHigh(Symbol(),Period(),start_index,count,_High); double ret=_High[ArrayMaximum(_High,0,count)]; if(draw) DrawLine("Resistance",ret,count,start_index); return(ret); } //+------------------------------------------------------------------+ //| カスタムインジケータ初期化関数 //+------------------------------------------------------------------+ int OnInit() { SetIndexBuffer(0,Buffer1); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); PlotIndexSetInteger(0,PLOT_ARROW,242); SetIndexBuffer(1,Buffer2); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0); PlotIndexSetInteger(1,PLOT_ARROW,241); //myPointを初期化する myPoint=Point(); if(Digits()==5 || Digits()==3) { myPoint*=10; } 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[]) { int limit=rates_total-prev_calculated; if(limit<=0) return(rates_total); //--- 0からrates_totalまでカウントする。 ArraySetAsSeries(Buffer1,true); ArraySetAsSeries(Buffer2,true); //--- 初期値ゼロ if(prev_calculated<1) { ArrayInitialize(Buffer1,0); ArrayInitialize(Buffer2,0); } else limit++; //--- メインループ for(int i=limit-1; i>=0; i--) { if(i>=MathMin(5000-1,rates_total-1-50)) continue; //古いレートを削除する //インジケータ・バッファ1(売り) if(high[i]==Resistance(Interval*PeriodSeconds(),false,00,00,false,i) && close[i]<open[i]) //販売条件 { Buffer1[i]=high[i]; //ローソク足の高値にインジケータの値を設定する if(i==1 && time[1]!=time_alert) myAlert("indicator","Sell"); //次のバーが開いたらアラート time_alert=time[1]; } else { Buffer1[i]=0; } //インジケータ・バッファ2(買い) if(low[i]==Support(Interval*PeriodSeconds(),false,00,00,false,i) && close[i]>open[i]) //購入条件 { Buffer2[i]=low[i]; //ローソク足の安値にインジケータの値を設定します。 if(i==1 && time[1]!=time_alert) myAlert("indicator","Buy"); //次のバーが開いたらアラート time_alert=time[1]; } else { Buffer2[i]=0; } } return(rates_total); } //+------------------------------------------------------------------+ Joseph Kisakye 2025.01.30 16:32 #18 bitcoin razak #: これは、エラーが出ないように修正したコードである。 ラザック、ありがとう。更新されたコードは正常にコンパイルされました。このインジケータが紹介されたとおりに機能するかどうか、テストしてみます。 デフォルトの設定でバックテストしてみましたが、チャート上に売買の矢印が表示されません。このエラーが確認された場合は、コードを見直してください。ありがとうございました。 12 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ここでは繁殖と秩序が優先される!:-)
...それはクリスマス前の魅力にあふれたバターのような柔らかさだった...少なくとも私はそう思った。
私はこのインディをプログラムし直した。
286本の分かりにくい線から151本の明確な線に絞られ、さらに多くのことができるようになりました。
今では、例えばEMA50(スティーブン・プリモの売買ライン)や適切なエグジットと組み合わせることで、可能性を秘めた非常にシンプルなインジケーターに なりました。
このインジケーターは、来年の初めにオンラインになる私のホームページの良い候補です。
私はこのインディをプログラムし直した。
286本の分かりにくい線から151本の明確な線に絞られ、さらに多くのことができるようになった。
EMA50(スティーブン・プリモの売り買いライン)や適切なエグジットと組み合わせれば、間違いなく可能性がある。
このインジケーターは、来年初めにオンラインに開設する私のホームページの候補になります。
ありがとうございます!早速試してみましたが、完璧に機能 しました。ありがとうございました!
メタエディタでのコンパイル時にエラーが発生します。可能であれば修正してください。
これはエラーが出ないように修正したコードです。
これは、エラーが出ないように修正したコードである。
ラザック、ありがとう。更新されたコードは正常にコンパイルされました。このインジケータが紹介されたとおりに機能するかどうか、テストしてみます。
デフォルトの設定でバックテストしてみましたが、チャート上に売買の矢印が表示されません。このエラーが確認された場合は、コードを見直してください。ありがとうございました。