2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ラインをまたいだ検知

Posted at

TradingViewではpinescriptという、これまた独自すぎるプログラミング言語(と仕様)があります。

インジを作るにせよ、EAをつくるにせよ「線をまたいだ」ということを検知するのはとても重要です。
pinescriptでは crossOver, crossUnderなどの関数があり、簡単なのですがMQLにはなかったので作りました。
スニペットみたいなもんなんで張り付けておきます。

リファレンス:
https://jp.tradingview.com/pine-script-reference/#fun_crossover

/*
crossover
`x`の値が` y`の値よりも大きく、 `x`の値が現在のバーの直前のバーの` y`の値よりも小さかった場合、'x'系列は'y'系列を超えていると定義されています。
crossover(x, y) → series[bool]
戻り
`x`が` y`を越えた場合はtrue、そうでない場合はfalse
引数
x (float) データ系列'x'。
y (float) データ系列'y'。
*/
bool isCrossOver(double latestX, double prevX, double y){
   return (latestX > y && prevX < y);
}
/*
crossunder

`x`の値が` y`の値よりも小さく`x`の値が現在のバーの直前のバーの` y`の値より大きかった場合、'x'系列は'y'系列の下で交差していると定義されています。
*/
bool isCrossUnder(double latestX, double prevX, double y){
   return (latestX < y && prevX > y);
}

使い方は、例えば現在価格がボリバンの1シグマを上抜いたかを知りたいのであればこんな風に使えます。

if(crossOver(latestPrice, prevPrice, Up1Buffer[0])){
 // 上抜いた時の処理
}

ちなみに、OnTickなどで毎フレーム(?)チェックするのであれば、各情報をこんな風に取得、

 MqlTick last_tick; 
 if(SymbolInfoTick(Symbol(),last_tick)){ }
//    Print(last_tick.time,":Bid=",last_tick.bid,"Ask=",last_tick.ask,"Volume = ",last_tick.volume); 

もし時間足更新などであれば更新のたびに価格を取得して対応してください。

   int shift = 0;
   datetime time  = iTime(Symbol(),Period(),shift); 
   double   open  = iOpen(Symbol(),Period(),shift); 
   double   high  = iHigh(Symbol(),Period(),shift); 
   double   low   = iLow(Symbol(),Period(),shift); 
   double   close = iClose(NULL,PERIOD_CURRENT,shift); 
   long     volume= iVolume(Symbol(),0,shift); 
   int      bars  = iBars(NULL,0); 
   Comment(Symbol(),",",EnumToString(Period()),"\n", 
          "Time: " ,TimeToString(time,TIME_DATE|TIME_SECONDS),"\n", 
          "Open: " ,DoubleToString(open,Digits()),"\n", 
          "High: " ,DoubleToString(high,Digits()),"\n", 
          "Low: "   ,DoubleToString(low,Digits()),"\n", 
          "Close: " ,DoubleToString(close,Digits()),"\n", 
          "Volume: ",IntegerToString(volume),"\n", 
          "Bars: " ,IntegerToString(bars),"\n" 
          ); 
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?