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"
);