Doji Engulf
์ง€ํ‘œ
3 ๋‹ค์šด๋กœ๋“œ
๋ฒ„์ „ 1.0, Jul 2025
Windows, Mac
3
๋ฌด๋ฃŒ ์„ค์น˜

์„ค๋ช…

using cAlgo.API;

using cAlgo.API.Indicators;

using cAlgo.API.Internals;

using System;


namespace cAlgo.Indicators

{

[Indicator(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]

public class DojiStrategyIndicator : Indicator

{

[Parameter("Doji size", DefaultValue = 0.05, MinValue = 0.01, Step = 0.01)]

public double DojiSize { get; set; }


[Parameter("Long Candle Ratio", DefaultValue = 0.7, MaxValue = 1, Step = 0.1)]

public double LongCandleRatio { get; set; }


[Parameter("Use Volume Filter?", DefaultValue = false)]

public bool UseVolumeFilter { get; set; }


[Parameter("Volume Moving Average Period", DefaultValue = 24)]

public int VolumeMA { get; set; }


[Parameter("RSI Period", DefaultValue = 14)]

public int RSIPeriod { get; set; }


[Parameter("Wick-to-Body Ratio", DefaultValue = 2.5, MinValue = 1.0, Step = 0.1)]

public double WickToBodyRatio { get; set; }


private MovingAverage volumeMA;

private RelativeStrengthIndex rsi;


[Output("Doji Signal", Color = Colors.Orange, PlotType = PlotType.Points, Thickness = 2)]

public IndicatorDataSeries DojiSignal { get; set; }


protected override void Initialize()

{

if (UseVolumeFilter)

volumeMA = Indicators.MovingAverage(MarketSeries.TickVolume, VolumeMA, MovingAverageType.Simple);


rsi = Indicators.RelativeStrengthIndex(MarketSeries.Close, RSIPeriod);

}


public override void Calculate(int index)

{

double body = MarketSeries.Close[index] - MarketSeries.Open[index];

double range = MarketSeries.High[index] - MarketSeries.Low[index];

double abody = Math.Abs(body);

double ratio = abody / range;


bool isDoji = abody <= range * DojiSize;

bool goStar = isDoji && (!UseVolumeFilter || MarketSeries.TickVolume[index] > volumeMA.Result[index]);


if (goStar && IsHigherTimeFrame(out int timeFrameNumber, out string label))

{

DojiSignal[index] = MarketSeries.Close[index]; // ์ฐจํŠธ์— ๋„์ง€ ํ‘œ์‹œ

Chart.DrawIcon("Doji" + TimeFrame.ToString() + index, ChartIconType.Diamond, index, MarketSeries.Close[index], Color.Orange);


// ๋‹ค์Œ 3๊ฐœ์˜ ์บ”๋“ค์— ๊ฑธ์ณ ํ™•์žฅ๋˜๋Š” ์‹ค์„ ์œผ๋กœ ๋„์ง€ ์บ”๋“ค์˜ ๊ณ ๊ฐ€์™€ ์ €๊ฐ€๋ฅผ ๊ฐ•์กฐ ํ‘œ์‹œ

HighlightDojiHighLow(index, timeFrameNumber, label);

}


// SMT ๋‹ค์ด๋ฒ„์ „์Šค ๊ฐ์ง€๋Š” ์ด์ œ ๋ชจ๋“  ํƒ€์ž„ํ”„๋ ˆ์ž„์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค

DetectSMTDivergence(index);

}


private bool IsHigherTimeFrame(out int timeFrameNumber, out string label)

{

timeFrameNumber = 0;

label = string.Empty;


if (TimeFrame == TimeFrame.Minute15)

{

timeFrameNumber = 15;

label = "0.25";

return true;

}

else if (TimeFrame == TimeFrame.Minute30)

{

timeFrameNumber = 30;

label = "0.5";

return true;

}

else if (TimeFrame == TimeFrame.Minute45)

{

timeFrameNumber = 45;

label = "0.75";

return true;

}

else if (TimeFrame == TimeFrame.Hour)

{

timeFrameNumber = 1;

label = "1";

return true;

}

else if (TimeFrame == TimeFrame.Hour2)

{

timeFrameNumber = 2;

label = "48";

return true;

}

else if (TimeFrame == TimeFrame.Hour4)

{

timeFrameNumber = 4;

label = "4";

return true;

}

else if (TimeFrame == TimeFrame.Daily)

{

timeFrameNumber = 24;

label = "24";

return true;

}

else if (TimeFrame == TimeFrame.Weekly)

{

timeFrameNumber = 168;

label = "W";

return true;

}

else if (TimeFrame == TimeFrame.Monthly)

{

timeFrameNumber = 720;

label = "M";

return true;

}


return false;

}


private void HighlightDojiHighLow(int dojiIndex, int timeFrameNumber, string label)

{

double dojiHigh = MarketSeries.High[dojiIndex];

double dojiLow = MarketSeries.Low[dojiIndex];


// ๋‹ค์Œ 3๊ฐœ์˜ ์บ”๋“ค์— ๊ฑธ์ณ ํ™•์žฅ๋˜๋Š” ๋„์ง€ ์บ”๋“ค์˜ ๊ณ ๊ฐ€์™€ ์ €๊ฐ€์— ์‹ค์„  ์ˆ˜ํ‰์„  ๊ทธ๋ฆฌ๊ธฐ

Chart.DrawTrendLine("DojiHighLine" + TimeFrame.ToString() + dojiIndex, dojiIndex, dojiHigh, dojiIndex + 3, dojiHigh, Color.Blue, 2, LineStyle.Solid).IsInteractive = true;

Chart.DrawTrendLine("DojiLowLine" + TimeFrame.ToString() + dojiIndex, dojiIndex, dojiLow, dojiIndex + 3, dojiLow, Color.Red, 2, LineStyle.Solid).IsInteractive = true;


// ํŒŒ๋ž€ ์„  ์˜†์— ํƒ€์ž„ํ”„๋ ˆ์ž„ ๋ฒˆํ˜ธ ๋˜๋Š” ๋ผ๋ฒจ ํ…์ŠคํŠธ ์ถ”๊ฐ€

Chart.DrawText("TimeFrameHigh" + TimeFrame.ToString() + dojiIndex, label, dojiIndex + 3, dojiHigh, Color.Green).IsInteractive = true;

}


private void DetectSMTDivergence(int index)

{

// ํ˜„์žฌ ๊ณ ๊ฐ€ ๋˜๋Š” ์ €๊ฐ€๊ฐ€ RSI์™€ ๋‹ค์ด๋ฒ„์ „์Šค๋ฅผ ํ˜•์„ฑํ•˜๋Š”์ง€ ํ™•์ธ

double currentHigh = MarketSeries.High[index];

double currentLow = MarketSeries.Low[index];


double prevHigh = MarketSeries.High[index - 1];

double prevLow = MarketSeries.Low[index - 1];


double currentRSI = rsi.Result[index];

double prevRSI = rsi.Result[index - 1];


bool isWickDivergence = IsWickDivergence(index, currentHigh, currentLow, prevHigh, prevLow);


if (isWickDivergence)

{

// ์•ฝ์„ธ ๋‹ค์ด๋ฒ„์ „์Šค: ๊ฐ€๊ฒฉ์€ ๋” ๋†’์€ ๊ณ ๊ฐ€๋ฅผ ๋งŒ๋“ค๊ณ  RSI๋Š” ๋” ๋‚ฎ์€ ๊ณ ๊ฐ€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค

if (currentHigh > prevHigh && currentRSI < prevRSI)

{

// ์ด ํƒ€์ž„ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ๊ณ ์œ  ์‹๋ณ„์ž๋กœ ์ฐจํŠธ์— ๋‹ค์ด๋ฒ„์ „์Šค ํ‘œ์‹œ

Chart.DrawIcon("BearishDivergence" + TimeFrame.ToString() + index, ChartIconType.DownArrow, index, currentHigh, Color.Red);

}


// ๊ฐ•์„ธ ๋‹ค์ด๋ฒ„์ „์Šค: ๊ฐ€๊ฒฉ์€ ๋” ๋‚ฎ์€ ์ €๊ฐ€๋ฅผ ๋งŒ๋“ค๊ณ  RSI๋Š” ๋” ๋†’์€ ์ €๊ฐ€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค

if (currentLow < prevLow && currentRSI > prevRSI)

{

// ์ด ํƒ€์ž„ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ๊ณ ์œ  ์‹๋ณ„์ž๋กœ ์ฐจํŠธ์— ๋‹ค์ด๋ฒ„์ „์Šค ํ‘œ์‹œ

Chart.DrawIcon("BullishDivergence" + TimeFrame.ToString() + index, ChartIconType.UpArrow, index, currentLow, Color.Green);

}

}

}


private bool IsWickDivergence(int index, double currentHigh, double currentLow, double prevHigh, double prevLow)

{

double currentBody = Math.Abs(MarketSeries.Close[index] - MarketSeries.Open[index]);

double currentRange = currentHigh - currentLow;


double prevBody = Math.Abs(MarketSeries.Close[index - 1] - MarketSeries.Open[index - 1]);

double prevRange = prevHigh - prevLow;


// ํ˜„์žฌ ์บ”๋“ค์ด ์ž‘์€ ๋ชธํ†ต๊ณผ ๊ธด ๊ผฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํŒ๋‹จ

bool currentHasLongWicks = (currentHigh - MarketSeries.Close[index]) > currentBody * WickToBodyRatio &&

(MarketSeries.Open[index] - currentLow) > currentBody * WickToBodyRatio;


// ์ด์ „ ์บ”๋“ค์ด ์ž‘์€ ๋ชธํ†ต๊ณผ ๊ธด ๊ผฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํŒ๋‹จ

bool prevHasLongWicks = (prevHigh - MarketSeries.Close[index - 1]) > prevBody * WickToBodyRatio &&

(MarketSeries.Open[index - 1] - prevLow) > prevBody * WickToBodyRatio;


return currentHasLongWicks || prevHasLongWicks;

}

}

}

์š”์•ฝ

์ง€ํ‘œ ํ”„๋กœํ•„

๊ณ ๊ฐ ๋ฆฌ๋ทฐ

0.0
๋ฆฌ๋ทฐ: 0
๊ณ ๊ฐ ๋ฆฌ๋ทฐ
์ด ์ƒํ’ˆ์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ๊ฐ€ ์•„์ง ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์‚ฌ์šฉํ•ด ๋ณด์…จ๋‚˜์š”? ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ€์žฅ ๋จผ์ € ์†Œ๊ฐœํ•ด ์ฃผ์„ธ์š”!

์ƒ๋‹ด

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ(FAQ)

ํŠธ๋ ˆ์ด๋”ฉ ๋ด‡, ์ง€ํ‘œ, ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ cTrader Store์—์„œ ์ œ๊ณต๋˜๋Š” ์ƒํ’ˆ์€ ์ œ3์ž ๊ฐœ๋ฐœ์ž์— ์˜ํ•ด ์ œ๊ณต๋˜๋ฉฐ, ์ด๋Š” ๋‹จ์ˆœํžˆ ์ •๋ณด ๋ฐ ๊ธฐ์ˆ ์  ์ ‘๊ทผ์„ ๋ชฉ์ ์œผ๋กœ ์ œ๊ณต๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. cTrader Store๋Š” ์ค‘๊ฐœ์ธ์ด ์•„๋‹ˆ๋ฉฐ, ํˆฌ์ž ์กฐ์–ธ, ๊ฐœ์ธ๋ณ„ ์ถ”์ฒœ ๋˜๋Š” ํ–ฅํ›„ ์„ฑ๊ณผ์— ๋Œ€ํ•œ ์–ด๋– ํ•œ ๋ณด์žฅ๋„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์„ฑ์ž์˜ ์ƒํ’ˆ ๋” ๋ณด๊ธฐ

์ง€ํ‘œ
Theย Session Golden Hoursย indicator is designed for serious traders looking to visualize high-probability

์ข‹์•„ํ•˜์‹ค ๋งŒํ•œ ๋‹ค๋ฅธ ํ•ญ๋ชฉ

์ง€ํ‘œ
Forex
BTCUSD
+4
The Linear Regression Oscillator (LRO) is a technical indicator based on linear regression analysis.
์ง€ํ‘œ
RSI
SMC
+17
Turn WaveTrend Cross into a BTC profit machine precise buy sell signals, smart momentum edge, no lag trading system
์ง€ํ‘œ
BOS
MSS
+3
Orderblocks with Multi-Timeframe.
"HTF Power 3" ๋กœ๊ณ 
์ธ๊ธฐ
4.5
(2)
$19
/
$20
์ง€ํ‘œ
ATR
SMC
+2
HTF POWER 3 ICT Power of 3 ยท M1 Precision ยท H4 Intelligence Auto-detect Accumulation โ†’ Manipulation โ†’ Distribution
"Dem" ๋กœ๊ณ 
์ตœ๊ณ  ํ‰์ 
4.2
(4)
$20
์ง€ํ‘œ
Forex
BTCUSD
+5
Scalping indicator for Renko 100 using EMAs to show trend and entry zones with clear colored rectangles.
์ง€ํ‘œ
VWAP
Volume
+3
Don't trust static support and resistance levels, this indicator combines Fibonacci and VWAP in one powerful tool.
"UT Bot Alerts Nova" ๋กœ๊ณ 
์ธ๊ธฐ
5.0
(3)
$19
์ง€ํ‘œ
ATR
Forex
+6
UT Bot Alerts Nova: Advanced trend-following indicator using ATR for signals. Precise entries/exits.
์ง€ํ‘œ
AI
SMC
+14
Refined cleaner version of Key Levels indicator with broker UTC offset, styles & label alignment.
์ง€ํ‘œ
Signal
USDJPY
See USD demand in one lineโ€”Composite OBV fuses six major FX pairs into a clear momentum gauge.
์ง€ํ‘œ
EMA
SMA
+3
Pro MA Close Alert. Powerful indicator that instantly notifies you when price closes above or below your selected MA.
์ง€ํ‘œ
RSI
MACD
+2
A straightforward yet effective tool signals entry points for both buying and selling. Include 3 Moving Average
"ATR Bands" ๋กœ๊ณ 
์ธ๊ธฐ
4.6
(3)
$19
์ง€ํ‘œ
ATR
Prop
+13
Enhance trading with ATR Bands! Visualize market volatility using dynamic upper and lower ATR bands for precise decision
"ORB_Dashboard" ๋กœ๊ณ 
์ตœ๊ณ  ํ‰์ 
4.5
(4)
$25
์ง€ํ‘œ
Signal
Trades Opening Range Breakouts Indicator with dynamic stops/targets adapting to market volatility.
์ง€ํ‘œ
ATR
Fibonacci
+4
Emperor Signals Pro is a premium non-repainting indicator for Forex pairs on the 15-minute timeframe
์ง€ํ‘œ
Key Levels
Liquidity Grab
+3
Visual market context dashboard showing bias states, CE positioning, session status and sweep context.
"ORB v1.1" ๋กœ๊ณ 
์ธ๊ธฐ
4.0
(3)
$25
์ง€ํ‘œ
Breakout
Opening Range Breakout v1.1 - Visuals + Stats
์ง€ํ‘œ
Volume
Moving Average
Multi-Timeframe Rolling Volatility Indicator - Smart Volatility Breakout System
"Stochastic RSI PRO" ๋กœ๊ณ 
์ตœ๊ณ  ํ‰์ 
4.7
(4)
$28
/
$40
์ง€ํ‘œ
RSI
Prop
+14
Unlock Stochastic RSI PRO in cTrader! Overlay RSI, highlight zones, and identify divergences with customizable settings.

๊ฐ€๊ฒฉ

3
๋ฌด๋ฃŒ ์„ค์น˜