Hey guys,

This maybe the opposite of what many people may ask on this forum and I am not sure if anyone here can help, but I was wondering if anyone can assist me in converting the ThreeXOscillator from ThinkScript to MetaTrader4? Is it possible?

Here is the code:

This maybe the opposite of what many people may ask on this forum and I am not sure if anyone here can help, but I was wondering if anyone can assist me in converting the ThreeXOscillator from ThinkScript to MetaTrader4? Is it possible?

Here is the code:

Code:

```
# RH_Three_X_OscillatorSTUDY.ts
# Code by rhouser
# copyright Richard Houser 11/20/2013 All rights reserved.
# Permission granted to use, copy, modify to members of the Yahoo TOS_thinkscript Group for personal use only
#hint:<b>RH_Three_X_Oscillator</b>\nThis is the companion study to the 9/30 Setup. It plots a Stochastic at three times the current timeframe, and the Stochastic at the current timeframe
declare lower;
input threeX_K_period = 21;
input threeX_D_period = 9;
input threeXsmoothing = 3;
input oneX_K_period = 14;
input oneX_D_period = 3;
input oneXsmoothing = 3;
input smoothing_type = AverageType.SIMPLE;
input threeXstochType = { FAST, default SLOW };
input oneXstochType = { FAST, default SLOW };
input over_bought = 75;
input over_sold = 25;
input maxLookback = 3;
def BarNum = if IsNaN( close ) then Double.NaN else BarNumber();
def aggPer = getAggregationPeriod();
def adjAggPer = if aggPer == AggregationPeriod.MIN then
AggregationPeriod.THREE_MIN
else if aggPer == AggregationPeriod.TWO_MIN then
AggregationPeriod.FIVE_MIN
else if aggPer == AggregationPeriod.THREE_MIN then
AggregationPeriod.TEN_MIN
else if aggPer == AggregationPeriod.FOUR_MIN then
AggregationPeriod.TEN_MIN
else if aggPer == AggregationPeriod.FIVE_MIN then
AggregationPeriod.FIFTEEN_MIN
else if aggPer == AggregationPeriod.TEN_MIN then
AggregationPeriod.THIRTY_MIN
else if aggPer == AggregationPeriod.FIFTEEN_MIN then
AggregationPeriod.HOUR
else if aggPer == AggregationPeriod.TWENTY_MIN then
AggregationPeriod.HOUR
else if aggPer == AggregationPeriod.THIRTY_MIN then
AggregationPeriod.TWO_HOURS
else if aggPer == AggregationPeriod.HOUR then
AggregationPeriod.FOUR_HOURS
else if aggPer == AggregationPeriod.TWO_HOURS then
AggregationPeriod.DAY
else if aggPer == AggregationPeriod.FOUR_HOURS then
AggregationPeriod.DAY
else if aggPer == AggregationPeriod.DAY then
AggregationPeriod.THREE_DAYS
else if aggPer == AggregationPeriod.TWO_DAYS then
AggregationPeriod.WEEK
else if aggPer == AggregationPeriod.THREE_DAYS then
AggregationPeriod.WEEK
else if aggPer == AggregationPeriod.FOUR_DAYS then
AggregationPeriod.MONTH
else if aggPer == AggregationPeriod.WEEK then
AggregationPeriod.MONTH
else if aggPer == AggregationPeriod.MONTH then
AggregationPeriod.MONTH
else
Double.NaN;
def _kPeriod = threeX_K_period;
def _dPeriod = threeX_D_period;
def _threeXsmoothing = threeXsmoothing;
def threeXhighestHigh = highest( high( period = adjAggPer ), _kPeriod );
def threeXlowestLow = lowest( low( period = adjAggPer ), _kPeriod );
def threeXfastK = if ( threeXhighestHigh - threeXlowestLow ) <= 0 then 0 else 100 * ( close( period = adjAggPer ) - threeXlowestLow ) / ( threeXhighestHigh - threeXlowestLow );
def threeXfastD = MovingAverage( smoothing_type, threeXfastK, _dPeriod );
def threeXslowK = threeXfastD;
def threeXslowD = MovingAverage( smoothing_type, threeXslowK, _dPeriod );
def oneXfastK = if ( highest( high, oneX_K_period ) - lowest( low, oneX_K_period ) ) <= 0
then 0
else 100 * ( close - lowest( low, oneX_K_period ) ) / ( highest( high, oneX_K_period ) - lowest( low, oneX_K_period ) );
def oneXfastD = MovingAverage( smoothing_type, oneXfastK, oneX_D_period );
def oneXslowK = oneXfastD ;
def oneXslowD = MovingAverage( smoothing_type, oneXslowK , oneX_D_Period );
#---Stochastic
plot ThreeX_Momentum = if threeXstochType == threeXstochType.FAST then threeXfastD else threeXslowD;
plot OneX_Trend = if oneXstochType == oneXstochType.FAST then oneXfastD else oneXslowD;
#---Reference lines
plot OverBought = over_bought;
plot OverSold = over_sold;
def state = { default init, up, down };
switch( state[1] ) {
case init:
if barNum == 1 then {
state = state.init;
} else {
state = if ThreeX_Momentum > ThreeX_Momentum[1]
then state.up
else if ThreeX_Momentum < ThreeX_Momentum[1]
then state.down
else state.init;
}
case up:
state = if ThreeX_Momentum >= ThreeX_Momentum[1]
then state.up
else state.down;
case down:
state = if ThreeX_Momentum <= ThreeX_Momentum[1]
then state.down
else state.up;
}
#===============================[ Look & Feel ]================================
ThreeX_Momentum.SetPaintingStrategy( PaintingStrategy.LINE_VS_POINTS );
ThreeX_Momentum.AssignValueColor( if state == state.up then Color.Dark_ORANGE else if state == state.down then Color.BLUE else Color.GRAY );
ThreeX_Momentum.HideBubble();
OneX_Trend.SetPaintingStrategy( PaintingStrategy.LINE );
OneX_Trend.AssignValueColor( if OneX_Trend >= OneX_Trend[1] then Color.MAGENTA else if OneX_Trend < OneX_Trend[1] then Color.DARK_RED else Color.GRAY );
OneX_Trend.HideBubble();
OverBought.SetDefaultColor( Color.LIGHT_GRAY );
OverBought.HideTitle();
OverSold.SetDefaultColor( Color.DARK_GRAY );
OverSold.HideTitle();
def Hundred = 100;
AddCloud( OverBought, Hundred, Color.RED, Color.RED );
def Zero = 0;
AddCloud( OverSold, Zero, Color.Yellow, Color.Yellow );
```

Last edited by a moderator: