自動で標準偏差チャネルを描画する処理のMQLコードです。
パラメータの期間(period)で指定した期間無いの最高値と最安値で、単純にチャネルを結びます。
期間の設定によっては最新箇所でチャネルを引かないケースもありますが、方向性の確認として無いよりはマシかなというレベルです。
インジケーターのコードを乗せておきます。
ダウンロードは「
AutoStdDevChannel.mq4」からどうぞ。
//+------------------------------------------------------------------+ //| AutoStdDevChannel.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://fxtrading.greeds.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://fxtrading.greeds.net" #property version "1.00" #property strict #property indicator_chart_window input int SERCH_PERIOD=50; input double DEVIATION=1; string obj_name = "AUTO_STDDEVCHANNEL"; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { CreateStdChannel(); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { ObjectDelete(obj_name); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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(!isNewBar()) return 0; ObjectDelete(obj_name); CreateStdChannel(); return(rates_total); } void CreateStdChannel() { int upperIdx=iHighest(NULL,0,MODE_HIGH,SERCH_PERIOD,1); int lowerIdx=iLowest (NULL,0,MODE_LOW ,SERCH_PERIOD,1); if(upperIdx>lowerIdx) { int chart_id = 0; ObjectCreate(chart_id,obj_name, OBJ_STDDEVCHANNEL, 0, Time[upperIdx], 0, Time[lowerIdx], 0 ); ObjectSetInteger(chart_id,obj_name,OBJPROP_COLOR,Pink); ObjectSetInteger(chart_id,obj_name,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(chart_id,obj_name,OBJPROP_WIDTH,1); ObjectSetInteger(chart_id,obj_name,OBJPROP_BACK,false); ObjectSetInteger(chart_id,obj_name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,obj_name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,obj_name,OBJPROP_HIDDEN,true); ObjectSetInteger(chart_id,obj_name,OBJPROP_ZORDER,0); ObjectSetInteger(chart_id,obj_name,OBJPROP_RAY_LEFT,false); ObjectSetInteger(chart_id,obj_name,OBJPROP_RAY_RIGHT,true); ObjectSetInteger(chart_id,obj_name,OBJPROP_FILL,false); ObjectSetDouble(chart_id,obj_name,OBJPROP_DEVIATION,DEVIATION); } if(upperIdx<lowerIdx) { int chart_id = 0; ObjectCreate(chart_id,obj_name, OBJ_STDDEVCHANNEL, 0, Time[lowerIdx], 0, Time[upperIdx], 0 ); ObjectSetInteger(chart_id,obj_name,OBJPROP_COLOR,SkyBlue); ObjectSetInteger(chart_id,obj_name,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(chart_id,obj_name,OBJPROP_WIDTH,1); ObjectSetInteger(chart_id,obj_name,OBJPROP_BACK,false); ObjectSetInteger(chart_id,obj_name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,obj_name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,obj_name,OBJPROP_HIDDEN,true); ObjectSetInteger(chart_id,obj_name,OBJPROP_ZORDER,0); ObjectSetInteger(chart_id,obj_name,OBJPROP_RAY_LEFT,false); ObjectSetInteger(chart_id,obj_name,OBJPROP_RAY_RIGHT,true); ObjectSetInteger(chart_id,obj_name,OBJPROP_FILL,false); ObjectSetDouble(chart_id,obj_name,OBJPROP_DEVIATION,1.0); } } bool isNewBar() { static datetime time=Time[0]; bool ret=false; if(Time[0]!=time) { time=Time[0]; ret=true; } return ret; }
『呼び出し元で下記コードをコールするだけで簡単に実装できます。』
と言う事ですが、あまりにも素人すぎて実装できません。
もう少し手順を噛み砕いてお願いできませんでしょうか?
失礼しました。
実装方法は人ぞれぞれかなと思いまして、かなり省略していました(;´∀`)
インジケーターのダウンロードとコード全文を載せて記事を修正しましたので、また見ておいてください。
素晴らしいコードを公開してくださりどうもありがとうございます。
ObjectSetDouble(chart_id,obj_name,OBJPROP_DEVIATION,1.0);
この行の1.0はDEVIATIONですかね。
半年以上コメントに気付かず申し訳ありません。
下記コードで1.0にセットしているので、ご認識の通りです。
ObjectSetDouble(chart_id,obj_name,OBJPROP_DEVIATION,1.0);
【MQL】自動で標準偏差チャネルを描画する処理のコード、ありがとうございます。
このソースを基に改良したいと考えて色々試しているのですが、MQL全くの素人で、直し方が判りません。
お手数おかけしますが、チャンネルの始まるポイントを、前回高値、安値に固定する事は出来ないでしょうか。
高値、安値を更新されたら次のポイントに移動すると言った感じです。現状は本数で固定されているので、同じ幅でのチャンネルとなっています。前回高値(安値)でその波の間は現在値で更新していき、その波が終わって反転しだしたら反転したポイントをスタートにしたいのです。 ご検討よろしくお願いいたします。
こんばんは。
ずいぶん前に作ったコードですので詳細をハッキリと覚えていないのですが、とりあえず検討してみます。
が、あまり期待はしないで下さい。
MQLの知識もそうですが、そもそものロジック部分が非常に難しい部分です。
人間の目で見て直近の高値と安値というのは明確なのですが、これをプログラムで制御しようとすると思いの外難しくてですね、実際の所簡単にできません。
いつからいつまでの期間の間で判断するのかをプログラムに指示してあげないといけませんし、その閾値が正しいのかなんてプログラムには分からないのです。
どういう基準で高値と安値を判断するのか?という話になります。
それを簡素にするために、このインジケーターではSERCH_PERIODを使って簡易的な処理としています。
取り急ぎ返信だけ致しました。
早速の、お返事ありがとうございます。
高値と安値の判断、難しそうですね(><
今まで、MT4に入っている標準偏差チャンネルを使っていたのですが、
1分足で、更新毎に手動で伸ばしていました。その時に、高値(安値)をスタートに合わせていても何度か更新していく度にズレるので、修正をしていました。
このインジケーターで、毎回更新を手動でしなくても良くなり助かっています。
スタートの高値(安値)セットを自動で出来れば助かりますので、宜しくお願いいたします。