Sponsored Links
過去一定期間(A)の移動平均(MA)の変動幅(MAの最大値-MAの最小値)が閾値(MAneutralRange)以下であれば垂直線を引くプログラムをまとめました。

目次
パラメータ
パラメータ | 説明 |
---|---|
neutralPeriod | 期間Aの長さ |
MAneutralRange | 移動平均が水平であると判断するための閾値 |
neutralOffset | 期間Aの現在からのオフセット。 |
水平チェックの式
maMax – maMin <= MAneutralRange なら期間AのMAは水平であると判断する。記号 | 説明 |
---|---|
maMax | 期間AのMAの最大値 |
maMin | 期間AのMAの最小値 |
maMax – maMin | 期間AのMAの変動幅 |
プログラムの流れ
- 初期化
- 移動平均の指標ハンドルを取得する。
- 毎ティックごとに次の処理を実行
- 移動平均の値を取得する。
- 期間Aの移動平均線が水平かチェックする
- 水平なら垂直線を引く
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | //--- input parameters input double MAneutralRange=0.001; input int neutralPeriod=10; input int neutralOffset=0; input int maPeriod = 500; int maHandle; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- maHandle = iMA(_Symbol,_Period,maPeriod,0,MODE_EMA,PRICE_CLOSE); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { CheckMAneutral(); } //+------------------------------------------------------------------+ //| Check the MA indicates neutral or not. | //+------------------------------------------------------------------+ void CheckMAneutral(){ double maBuffer_neutral[]; ArraySetAsSeries(maBuffer_neutral,true); CopyBuffer(maHandle,0,neutralOffset,neutralPeriod,maBuffer_neutral); if (maBuffer_neutral[ArrayMaximum(maBuffer_neutral)] - maBuffer_neutral[ArrayMinimum(maBuffer_neutral)] <= MAneutralRange){ double price; SymbolInfoDouble(_Symbol,SYMBOL_ASKHIGH,price); ObjectCreate(0,"Nagare-"+TimeCurrent(),OBJ_VLINE,0,TimeCurrent(),price); } } |
1.初期化
maPeriodは移動平均線の期間です。サンプルコードでは500期間を初期値としています。他は上述した通りです。1 2 3 4 | input double MAneutralRange=0.001; input int neutralPeriod=10; input int neutralOffset=0; input int maPeriod = 500; |
毎ティックの処理
ティックごとの処理はOnTick()に記述します。移動平均の値を取得する
maBuffer_neutralに期間AのMAをコピーしますがmaBuffer_neutralのインデックス0に一番新しいMAの値が入るようにします。サンプルコードのようにArraySetAsSeries()に任意の配列とtrueを渡すと、CopyBuffer()を使ったときにインデックス0から新しい値が入るようになります。 CopyBuffer()を使って指標ハンドルからMAの値を取得します。1 2 3 4 5 | double maBuffer_neutral[]; ArraySetAsSeries(maBuffer_neutral,true); CopyBuffer(maHandle,0,neutralOffset,neutralPeriod,maBuffer_neutral); |
期間Aの移動平均線が水平かチェックする
これは上述した水平チェックの式を書いただけです。 ArrayMaximum()は配列要素を比較して最大値の要素のインデックスを返します。ArrayMinimum()は最小値の要素のインデックスを返します。1 2 3 | if (maBuffer_neutral[ArrayMaximum(maBuffer_neutral)] - maBuffer_neutral[ArrayMinimum(maBuffer_neutral)] <= MAneutralRange){ // 省略 } |
水平なら垂直線を引く
チャートに線などのオブジェクトを配置するにはObjectCreate()を使います。1 | ObjectCreate(0,"Nagare-"+TimeCurrent(),OBJ_VLINE,0,TimeCurrent(),0.0); |

Sponsored Links