Re: Renko Levels
Добавлено: 22 дек 2021, 22:01
Может тип переменой надо поменять, int на double ?
Неофициальный форум клиентского терминала Альфа-Инвестиции (Альфа-Директ 4). Обсуждение терминала, обмен опытом, разработка скриптов индикаторов и стратегий.
https://www.alfadirect4.ru/
BugsDigger писал(а):Я уже объяснял причину и возможный обход проблемы (не блестящий с принципиальной точки зрения, но пригодный практически), почитайте внимательнее.
viewtopic.php?f=4&t=1161&start=10#p6436
Код: Выделить всё
function Initialize()
{
IndicatorName = "RenkoLevels_US";
PriceStudy=false;
AddInput("Input", Inputs.Candle);
// AddParameter("DEMAperiod", 1);
AddParameter("ATRperiod", 14);
// AddParameter("Sens", 1.0);
AddSeries("RenkoBuySell", DrawAs.Custom, Color.Black, AxisType.ZeroBased);
AddSeries("RenkoUp", DrawAs.Custom, Color.LightGray, true, Axes.Parent);
AddSeries("RenkoDn", DrawAs.Custom, Color.LightGray, true, Axes.Parent);
AddGlobalVariable("Global_ATR", Types.Double);
AddGlobalVariable("Global_UP", Types.Double);
AddGlobalVariable("Global_DN", Types.Double);
AddGlobalVariable("Global_COLOR", Types.Int);
}
function Evaluate()
{
double ATR;
double UP;
double DN;
double H;
int bs;
var TR = 0.0;
Color c = Color.LightGray; ;
int Change;
if (CurrentIndex < 1)
ATR = Input.High[0]-Input.Low[0];
else
{
TR = ( Math.Max(Input.High[0] , Input.Close[-1]) - Math.Min(Input.Low[0], Input.Close[-1]));
ATR = ((ATRperiod-1.0) * Global_ATR + TR)/ATRperiod;
}
Global_ATR=ATR;
if (CurrentIndex == 0)
{
UP = ((Input.High[0]+Input.Low[0])/2.0) + (ATR/2.0);
DN = ((Input.High[0]+Input.Low[0])/2.0) - (ATR/2.0);
H = UP - DN ;
bs=0;
}
else
{
UP = RenkoUp[-1];
DN = RenkoDn[-1];
H= UP - DN ;
bs=(int)RenkoBuySell[-1];
}
Change = 0;
if ( (Change < 1 ) && (Input.Close[0] >= UP+H*3) )
{
Change = 1;
Global_COLOR = 1;
Global_UP = UP+Global_ATR*3;
Global_DN = UP+Global_ATR*2;
c = Color.LightGreen;
}
if ( (Change < 1) && (Input.Close[0] <= DN-H*3) )
{
// ShowMessage("минус 3 " + (UP + H *3) );
Change = 1;
Global_COLOR = 0;
Global_DN = DN-Global_ATR*3;
Global_UP = DN-Global_ATR*2;
c = Color.LightCoral;
}
if ( (Change < 1) & (Input.Close[0] >= UP+H*2) )
{
// ShowMessage("плюс 2 " + (UP + H *2) );
Change = 1;
Global_COLOR = 1;
Global_UP = UP+Global_ATR*2;
Global_DN = UP+Global_ATR;
c = Color.LightGreen;
}
if ( (Change < 1) && (Input.Close[0] <= DN-H*2) )
{
// ShowMessage("минус 2 " + (UP + H *2) );
Change = 1;
Global_COLOR = 0;
Global_DN = DN-Global_ATR*2;
Global_UP = DN-Global_ATR;
c = Color.LightCoral;
}
if ( (Change < 1) && (Input.Close[0] >= UP+H) )
{
// ShowMessage("плюс 0 " + (UP + H) );
Change = 1;
Global_COLOR = 1;
Global_UP = UP+Global_ATR;
Global_DN = UP;
c = Color.LightGreen;
}
if ( (Change < 1) && (Input.Close[0] <= DN-H) )
{
// ShowMessage("минус 0 " + (UP + H) );
Change = 1;
Global_COLOR = 0;
Global_DN = DN-Global_ATR;
Global_UP = DN;
c = Color.LightCoral;
}
if (Change < 1)
{
if (Global_COLOR == 1)
{
c = Color.LightGreen;
}
else
{
c = Color.LightCoral;
}
}
//ShowMessage("усё");
// int Up, Dn;
//
// Up=(int)((Input.Close[0]-UP)/H); if(Up>3) Up=3;
// Dn=(int)((DN-Input.Close[0])/H); if(Dn>3) Dn=3;
//
//ShowMessage("UP " + UP );
//ShowMessage("DN " + DN );
// if(Up>0)
// {
// UP+=Global_ATR*Up;
// DN=UP-Global_ATR;
// }
// if(Dn>0)
// {
// DN-=Global_ATR*Dn;
// UP=DN+Global_ATR;
// }
//
RenkoUp[0]=Global_UP;
RenkoDn[0]=Global_DN;
//RenkoBuySell[0]=bs;
RenkoDn.DrawChannel(RenkoUp, c, 50);
}
Код: Выделить всё
AddInput("Input", Inputs.Candle);
Код: Выделить всё
function Initialize()
{
IndicatorName = "RenkoLevels_US";
PriceStudy=false;
AddInput("Input", Inputs.Candle);
AddParameter("ATRperiod", 60);
AddSeries("RenkoUp", DrawAs.Custom, Color.LightGray, true, Axes.Parent);
AddSeries("RenkoDn", DrawAs.Custom, Color.LightGray, true, Axes.Parent);
AddGlobalVariable("Global_ATR", Types.Double);
AddGlobalVariable("Global_UP", Types.Double);
AddGlobalVariable("Global_DN", Types.Double);
AddGlobalVariable("Global_COLOR", Types.Int);
}
function Evaluate()
{
double ATR;
double UP=0.00;
double DN=0.00;
double H=0.00;
double ATR_Period;
double TR = 0.0;
Color c = Color.LightGray; ;
int Change;
ATR_Period = ATRperiod;
if (CurrentIndex == 0)
ATR = Input.High[0]-Input.Low[0];
else
{
TR = ( Math.Max(Input.High[0] , Input.Close[-1]) - Math.Min(Input.Low[0], Input.Close[-1]));
ATR = ((ATR_Period-1.0) * Global_ATR + TR)/ATR_Period;
}
Global_ATR=ATR;
if (CurrentIndex == 0)
{
UP=(double)((Input.High[0]+Input.Low[0])/2.00) + (ATR/2.00);
DN=(double)((Input.High[0]+Input.Low[0])/2.00) - (ATR/2.00);
H = UP - DN ;
}
if (CurrentIndex > ATR_Period)
{
UP=(double)(RenkoUp[-1]);
DN=(double)(RenkoDn[-1]);
H = UP - DN ;
}
if ( (CurrentIndex == 0) || (CurrentIndex > ATR_Period) )
{
Change = 0;
if ( (Change < 1 ) && (Input.Close[0] >= UP+H*3.00) )
{
Change = 1;
Global_COLOR = 1;
Global_UP = (double) UP+Global_ATR*3.00;
Global_DN = (double) UP+Global_ATR*2.00;
c = Color.LightGreen;
}
if ( (Change < 1) && (Input.Close[0] <= DN-H*3.00) )
{
Change = 1;
Global_COLOR = 0;
Global_DN = (double) DN-Global_ATR*3.00;
Global_UP = (double) DN-Global_ATR*2.00;
c = Color.LightCoral;
}
if ( (Change < 1) & (Input.Close[0] >= UP+H*2.00) )
{
Change = 1;
Global_COLOR = 1;
Global_UP = (double) UP+Global_ATR*2.00;
Global_DN = (double) UP+Global_ATR;
c = Color.LightGreen;
}
if ( (Change < 1) && (Input.Close[0] <= DN-H*2.00) )
{
Change = 1;
Global_COLOR = 0;
Global_DN = (double) DN-Global_ATR*2.00;
Global_UP = (double) DN-Global_ATR;
c = Color.LightCoral;
}
if ( (Change < 1) && (Input.Close[0] >= UP+H) )
{
Change = 1;
Global_COLOR = 1;
Global_UP = (double) UP+Global_ATR;
Global_DN = (double) UP;
c = Color.LightGreen;
}
if ( (Change < 1) && (Input.Close[0] <= DN-H) )
{
Change = 1;
Global_COLOR = 0;
Global_DN = (double) DN-Global_ATR;
Global_UP = (double) DN;
c = Color.LightCoral;
}
if (Change < 1)
{
if (Global_COLOR == 1)
{
c = Color.LightGreen;
}
else
{
c = Color.LightCoral;
}
}
RenkoUp[0]=Global_UP;
RenkoDn[0]=Global_DN;
RenkoDn.DrawChannel(RenkoUp, c, 50);
}
}