Indicators Used
Miscellaneous
0
Views
0
Downloads
0
Favorites
EMMA
//+------------------------------------------------------------------+
//| EMMA.mq4 |
//| Extremums Market Moving Average |
//| Copyright © 2010, Àíàòîëèé Ñåðãååâ |
//| mql.sergeev@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Àíàòîëèé Ñåðãååâ"
#property link "mql.sergeev@yandex.ru"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue
//+------------------------------------------------------------------+
extern double EMMA_Deviation_in_Percent = 0.1; //Ôèëüòðàöèÿ èçãèáîâ ñêîëüçÿùåãî ñðåäíåãî, îòêëîíåíèå â ïðîöåíòàõ.
//+------------------------------------------------------------------+
extern int EMMA_Mode = 0; //Ðåæèì ðàáîòû èíäèêàòîðà
//PRICE_CLOSE 0 Ïî öåíàì çàêðûòèÿ
//PRICE_HIGH/LOW 1 Ïî öåíàì ìàêñ./ìèí.
//+------------------------------------------------------------------+
extern bool EMMA_Redraw = true; //ÂÊË./ÂÛÊË. ïåðåðèñîâêè
//+------------------------------------------------------------------+
extern int MA_Period = 18; //Ïåðèîä óñðåäíåíèÿ äëÿ âû÷èñëåíèÿ ñêîëüçÿùåãî ñðåäíåãî.
//+------------------------------------------------------------------+
extern int MA_Method = 0; //Ìåòîä óñðåäíåíèÿ ñêîëüçÿùåãî ñðåäíåãî. Ìîæåò áûòü ëþáûì èç çíà÷åíèé ìåòîäîâ ñêîëüçÿùåãî ñðåäíåãî (Moving Average):
/*MODE_SMA 0 Ïðîñòîå ñêîëüçÿùåå ñðåäíåå
MODE_EMA 1 Ýêñïîíåíöèàëüíîå ñêîëüçÿùåå ñðåäíåå
MODE_SMMA 2 Ñãëàæåííîå ñêîëüçÿùåå ñðåäíåå
MODE_LWMA 3 Ëèíåéíî-âçâåøåííîå ñêîëüçÿùåå ñðåäíåå */
//+------------------------------------------------------------------+
extern int MA_Applied_Price = 0; //Èñïîëüçóåìàÿ öåíà ñêîëüçÿùåãî ñðåäíåãî. Ìîæåò áûòü ëþáîé èç öåíîâûõ êîíñòàíò:
/*PRICE_CLOSE 0 Öåíà çàêðûòèÿ
PRICE_OPEN 1 Öåíà îòêðûòèÿ
PRICE_HIGH 2 Ìàêñèìàëüíàÿ öåíà
PRICE_LOW 3 Ìèíèìàëüíàÿ öåíà
PRICE_MEDIAN 4 Ñðåäíÿÿ öåíà, (high+low)/2
PRICE_TYPICAL 5 Òèïè÷íàÿ öåíà, (high+low+close)/3
PRICE_WEIGHTED 6 Âçâåøåííàÿ öåíà çàêðûòèÿ, (high+low+close+close)/4 */
//+------------------------------------------------------------------+
extern int Maximum_History = 500; //Îãðàíè÷åíèå èñòîðèè äëÿ ðàñ÷åòîâ, åñëè 0 òî ðàñ÷åò âñåé èñòîðèè
//+------------------------------------------------------------------+
extern bool Manager_Murrey = false; //Ìåíåäæåð èíäèêàòîðà Murrey_Math_Line v2
//+------------------------------------------------------------------+
extern bool Signal = false; //ÂÊË./ÂÛÊË. îïîâåùåíèÿ àëåðò
//+------------------------------------------------------------------+
extern bool Fibo = false; //ÂÊË./ÂÛÊË. Óðîâíè Ôèáîíà÷÷è.
//+------------------------------------------------------------------+
extern bool Fibo_Fan = false; //ÂÊË./ÂÛÊË. Âååð Ôèáîíà÷÷è.
//+------------------------------------------------------------------+
extern bool Regression_Channel = false; //ÂÊË./ÂÛÊË. Êàíàë ëèíåéíîé ðåãðåññèè.
//+------------------------------------------------------------------+
extern bool StdDevChennel = false; //ÂÊË./ÂÛÊË. Êàíàë ñòàíäàðòíûõ îòêëîíåíèé.
//+------------------------------------------------------------------+
extern bool TrafficLight = false;
//+------------------------------------------------------------------+
extern string TrafficLight_initialization = "|0/3-Red|1/3-Yellow|2/3-LawnGreen|";
//+------------------------------------------------------------------+
extern int TrafficLight_width_line = 2;
//+------------------------------------------------------------------+
double EMMABuffer[]; //Èíäèêàòîðíèé ìàññèâ
double ima;
double save_Price;
datetime home_Time;
int position;
int shift;
int ctrl = -1;
bool flag;
bool flag_history;
string TLDate [][2];
//+------------------------------------------------------------------+
//| EMMA initialization function |
//+------------------------------------------------------------------+
int init(){
IndicatorBuffers(1);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
SetIndexStyle(0,DRAW_SECTION);
SetIndexBuffer(0,EMMABuffer);
SetIndexEmptyValue(0,0.0);
IndicatorShortName("EMMA("+DoubleToStr(EMMA_Deviation_in_Percent, 4)+","+MA_Period+")");
if(MA_Applied_Price > 6 || MA_Applied_Price < 0)MA_Applied_Price = 0; //
if(EMMA_Mode > 1 || EMMA_Mode < 0)EMMA_Mode = 0; // Áëîê ïðîâåðêè êîððåêòíîñòè ââåäåííûõ ïàðàìåòðîâ
if(MA_Method > 3 || MA_Method < 0)MA_Method = 0; //
if(MA_Period < 2)MA_Period = 18; //
EMMA_Deviation_in_Percent /= 100;
if(TrafficLight && EMMA_Redraw)initTrafficLight();
}
//+------------------------------------------------------------------+
//| EMMA |
//+------------------------------------------------------------------+
int start(){
if(Bars-IndicatorCounted()-1 > 1)recount(); //Ïðè "îáíîâëåíèè" èñòîðèè, î÷èñòèòü âñå, è íà÷àòü ïîñòðîåíèå çàíîâî
if(Maximum_History == 0){ //Åñëè èñòîðèÿ íå îãðàíè÷åíà
shift = Bars-IndicatorCounted()-1; //Îäíîêðàòíûé ïåðåñ÷åò âñåé | Äàëåå òîëüêî 0 áàð
}else{ //Åñëè îãðàíè÷åíà
if(!flag_history){
shift = Maximum_History; //Îäíîêðàòíûé ïåðåñ÷åò âñåé (îãðàíè÷åííîé)
home_Time = Time[Maximum_History + 1]; //Åñëè èñòîðèÿ îãðàíè÷åíà, òî çàäàåòñÿ íà÷àëüíàÿ äàòà ïîèñêà
flag_history = true;
}else{
shift = Bars-IndicatorCounted()-1; //Äàëåå òîëüêî 0 áàð
}
}
for(; shift >= 1; shift--){ //Öèêë ïî íåïîñ÷èòàííûì áàðàì
ima = iMA(NULL, 0, MA_Period, 0, MA_Method, MA_Applied_Price, shift);
//+-------------------------------------------------------------------------------------------+
if(ctrl != 0 && !flag && getTop() != -1){ //Ïîèñê òî÷êè ïåðåëîìà ïèêà
save_Price = getTop();
flag = true;
ctrl = 0;
}
if(ctrl == 0 && flag && ima <= save_Price - save_Price * EMMA_Deviation_in_Percent){ //Ôèëüòðàöèÿ òî÷êè ïåðåëîìà ïèêà
search(0); //Ïîèñê ýêñòðåìóìà ïèêà
flag = false;
position = 1; //top
}
if(ctrl == 0 && flag && ima >= save_Price){ //Ñáðîñ ôèëüòðà
flag = false;
ctrl = 1;
}
//+-------------------------------------------------------------------------------------------+
if(ctrl != 1 && !flag && getBottom() != -1){ //Ïîèñê òî÷êè ïåðåëîìà âïàäèíû
save_Price = getBottom();
flag = true;
ctrl = 1;
}
if(ctrl == 1 && flag && ima >= save_Price + save_Price * EMMA_Deviation_in_Percent){ //Ôèëüòðàöèÿ òî÷êè ïåðåëîìà âïàäèíû
search(1); //Ïîèñê ýêñòðåìóìà âïàäèíû
flag = false;
position = 2; //bottom
}
if(ctrl == 1 && flag && ima <= save_Price){ //Ñáðîñ ôèëüòðà
flag = false;
ctrl = 0;
}
//+-------------------------------------------------------------------------------------------+
reDraw(); //redraw
}
manageMurrey(); //manager
signal(); //alert
fibo(); //fibonacci
fiboFan(); //fibonacci fan
regressionChannel(); //regression channal
stdDevChennel(); //standart deviation channal
trafficLight(); //color indication
}
//+------------------------------------------------------------------+
//| Search extremums |
//+------------------------------------------------------------------+
void search(int type, bool write = true){
int searchShift;
if(type == 0){
switch(EMMA_Mode){
case 0:
searchShift = iHighest(NULL, 0, MODE_CLOSE, iBarShift(NULL, 0, home_Time)-shift, shift);
EMMABuffer[searchShift] = Close[searchShift];
break;
case 1:
searchShift = iHighest(NULL, 0, MODE_HIGH, iBarShift(NULL, 0, home_Time)-shift, shift);
EMMABuffer[searchShift] = High[searchShift];
break;
}
}else{
switch(EMMA_Mode){
case 0:
searchShift = iLowest(NULL, 0, MODE_CLOSE, iBarShift(NULL, 0, home_Time)-shift, shift);
EMMABuffer[searchShift] = Close[searchShift];
break;
case 1:
searchShift = iLowest(NULL, 0, MODE_LOW, iBarShift(NULL, 0, home_Time)-shift, shift);
EMMABuffer[searchShift] = Low[searchShift];
break;
}
}
if(write)home_Time = Time[searchShift];
}
//+------------------------------------------------------------------+
//| Search top |
//+------------------------------------------------------------------+
double getTop(){
double previous = iMA(NULL, 0, MA_Period, 0, MA_Method, MA_Applied_Price, shift + 1);
if(ima < previous)return(previous);
return(-1);
}
//+------------------------------------------------------------------+
//| Search bottom |
//+------------------------------------------------------------------+
double getBottom(){
double previous = iMA(NULL, 0, MA_Period, 0, MA_Method, MA_Applied_Price, shift + 1);
if(ima > previous)return(previous);
return(-1);
}
//+------------------------------------------------------------------+
//| Manager Murrey |
//+------------------------------------------------------------------+
void manageMurrey(){
if(ObjectFind("MML_StartBar") != -1 && Manager_Murrey){
ObjectSet("MML_StartBar", OBJPROP_TIME1, getTime());
ObjectSet("MML_StartBar", OBJPROP_PRICE1, getDate());
WindowRedraw();
}
}
//+------------------------------------------------------------------+
//| Alert |
//+------------------------------------------------------------------+
void signal(){
static double price;
if(!Signal)return;
if(position == 1 && price != getDate()){
if(EMMA_Redraw)Alert(Symbol()," Íîâàÿ âïàäèíà.");else Alert(Symbol()," Íîâûé ïèê.");
}
if(position == 2 && price != getDate()){
if(EMMA_Redraw)Alert(Symbol()," Íîâûé ïèê.");else Alert(Symbol()," Íîâàÿ âïàäèíà.");
}
price = getDate();
}
//+------------------------------------------------------------------+
//| Redraw |
//+------------------------------------------------------------------+
void reDraw(){
if(!EMMA_Redraw)return;
if(!iBarShift(NULL, 0, home_Time)-1 > shift)return;
for(int loop = iBarShift(NULL, 0, home_Time)-1; loop > shift; loop--)EMMABuffer[loop] = 0.0;
if(position == 2)search(0, false);
if(position == 1)search(1, false);
}
//+------------------------------------------------------------------+
//| getDate |
//+------------------------------------------------------------------+
double getDate(bool next = false){
for(int loop = shift;loop < Bars;loop++){
if(EMMABuffer[loop] != 0){
if(next){
next = false;
continue;
}
return(EMMABuffer[loop]);
}
}
}
//+------------------------------------------------------------------+
//| getTime |
//+------------------------------------------------------------------+
datetime getTime(bool next = false){
for(int loop = shift;loop < Bars;loop++){
if(EMMABuffer[loop] != 0){
if(next){
next = false;
continue;
}
return(Time[loop]);
}
}
}
//+------------------------------------------------------------------+
//| Fibo |
//+------------------------------------------------------------------+
void fibo(){
if(!Fibo)return;
if(ObjectFind("EMMA_FIBO") != -1){
ObjectSet("EMMA_FIBO", OBJPROP_TIME1, getTime(true));
ObjectSet("EMMA_FIBO", OBJPROP_PRICE1, getDate(true));
ObjectSet("EMMA_FIBO", OBJPROP_TIME2, getTime());
ObjectSet("EMMA_FIBO", OBJPROP_PRICE2, getDate());
WindowRedraw();
}else{
ObjectCreate("EMMA_FIBO", OBJ_FIBO, 0, getTime(true), getDate(true), getTime(), getDate());
ObjectSet("EMMA_FIBO", OBJPROP_COLOR, Black);
ObjectSet("EMMA_FIBO", OBJPROP_LEVELCOLOR, Black);
}
}
//+------------------------------------------------------------------+
//| Fibo Fan |
//+------------------------------------------------------------------+
void fiboFan(){
if(!Fibo_Fan)return;
if(ObjectFind("EMMA_FIBO_FAN") != -1){
ObjectSet("EMMA_FIBO_FAN", OBJPROP_TIME1, getTime(true));
ObjectSet("EMMA_FIBO_FAN", OBJPROP_PRICE1, getDate(true));
ObjectSet("EMMA_FIBO_FAN", OBJPROP_TIME2, getTime());
ObjectSet("EMMA_FIBO_FAN", OBJPROP_PRICE2, getDate());
WindowRedraw();
}else{
ObjectCreate("EMMA_FIBO_FAN", OBJ_FIBOFAN, 0, getTime(true), getDate(true), getTime(), getDate());
ObjectSet("EMMA_FIBO_FAN", OBJPROP_COLOR, Black);
ObjectSet("EMMA_FIBO_FAN", OBJPROP_LEVELCOLOR, Black);
}
}
//+------------------------------------------------------------------+
//| Regression Channel |
//+------------------------------------------------------------------+
void regressionChannel(){
if(!Regression_Channel)return;
if(ObjectFind("EMMA_Regression_Channel") != -1){
ObjectSet("EMMA_Regression_Channel", OBJPROP_TIME1, getTime(true));
ObjectSet("EMMA_Regression_Channel", OBJPROP_PRICE1, getDate(true));
ObjectSet("EMMA_Regression_Channel", OBJPROP_TIME2, getTime());
ObjectSet("EMMA_Regression_Channel", OBJPROP_PRICE2, getDate());
WindowRedraw();
}else{
ObjectCreate("EMMA_Regression_Channel", OBJ_REGRESSION, 0, getTime(true), getDate(true), getTime(), getDate());
ObjectSet("EMMA_Regression_Channel", OBJPROP_COLOR, Black);
}
}
//+------------------------------------------------------------------+
//| Standart Deviation Chennel |
//+------------------------------------------------------------------+
void stdDevChennel(){
if(!StdDevChennel)return;
if(ObjectFind("EMMA_StdDevChennel") != -1){
ObjectSet("EMMA_StdDevChennel", OBJPROP_TIME1, getTime(true));
ObjectSet("EMMA_StdDevChennel", OBJPROP_PRICE1, getDate(true));
ObjectSet("EMMA_StdDevChennel", OBJPROP_TIME2, getTime());
ObjectSet("EMMA_StdDevChennel", OBJPROP_PRICE2, getDate());
WindowRedraw();
}else{
ObjectCreate("EMMA_StdDevChennel", OBJ_STDDEVCHANNEL, 0, getTime(true), getDate(true), getTime(), getDate());
ObjectSet("EMMA_StdDevChennel", OBJPROP_COLOR, Black);
}
}
//+------------------------------------------------------------------+
//| TrafficLight |
//+------------------------------------------------------------------+
void trafficLight(){
if(!(TrafficLight && EMMA_Redraw))return;
if(ObjectFind("EMMA_TrafficLight") != -1){
ObjectSet("EMMA_TrafficLight", OBJPROP_TIME1, getTime(true));
ObjectSet("EMMA_TrafficLight", OBJPROP_PRICE1, getDate(true));
ObjectSet("EMMA_TrafficLight", OBJPROP_TIME2, getTime());
ObjectSet("EMMA_TrafficLight", OBJPROP_PRICE2, getDate());
ObjectSet("EMMA_TrafficLight", OBJPROP_COLOR, getTrafficLightColor());
WindowRedraw();
}else{
ObjectCreate("EMMA_TrafficLight", OBJ_TREND, 0, getTime(true), getDate(true), getTime(), getDate());
ObjectSet("EMMA_TrafficLight", OBJPROP_WIDTH, TrafficLight_width_line);
ObjectSet("EMMA_TrafficLight", OBJPROP_RAY, false);
}
}
//+------------------------------------------------------------------+
//| initTrafficLight |
//+------------------------------------------------------------------+
color initTrafficLight(){
int start, a, b, c;
for(int l = 0; l < StringLen(TrafficLight_initialization); l++){
a = StringFind(TrafficLight_initialization, "|", start);
b = StringFind(TrafficLight_initialization, "/", start);
c = StringFind(TrafficLight_initialization, "-", start);
if(c == -1)break;
ArrayResize(TLDate, l+1);
TLDate[l][0] = (EMMA_Deviation_in_Percent/StrToInteger(StringSubstr(TrafficLight_initialization, b+1, c-b-1)))*StrToInteger(StringSubstr(TrafficLight_initialization, a+1, b-a-1));
start = c+1;
TLDate[l][1] = StringSubstr(TrafficLight_initialization, c+1, StringFind(TrafficLight_initialization, "|", start)-c-1);
}
}
//+------------------------------------------------------------------+
//| getTrafficLightColor |
//+------------------------------------------------------------------+
color getTrafficLightColor(){
string colors;
if(StrToDouble(TLDate[0][0]) == 0){
colors = TLDate[0][1];
}
for(int pos = 0; pos < ArraySize(TLDate)/2; pos++){
if(position == 1){ //search bottom
if(ima >= save_Price + save_Price * StrToDouble(TLDate[pos][0]))colors = TLDate[pos][1];
}else{ //search top
if(ima <= save_Price - save_Price * StrToDouble(TLDate[pos][0]))colors = TLDate[pos][1];
}
}
return(getColor(colors));
}
//+------------------------------------------------------------------+
//| fStrToColor |
//+------------------------------------------------------------------+
color getColor(string title){
color arrayColors[] =
{
Black, DarkGreen, DarkSlateGray, Olive, Green, Teal, Navy, Purple, Maroon, Indigo, MidnightBlue, DarkBlue, DarkOliveGreen, SaddleBrown,
ForestGreen, OliveDrab, SeaGreen, DarkGoldenrod, DarkSlateBlue, Sienna, MediumBlue, Brown, DarkTurquoise, DimGray, LightSeaGreen,
DarkViolet, FireBrick, MediumVioletRed, MediumSeaGreen, Chocolate, Crimson, SteelBlue, Goldenrod, MediumSpringGreen, LawnGreen,
CadetBlue, DarkOrchid, YellowGreen, LimeGreen, OrangeRed, DarkOrange, Orange, Gold, Yellow, Chartreuse, Lime, SpringGreen, Aqua, DeepSkyBlue,
Blue, Magenta, Red, Gray, SlateGray, Peru, BlueViolet, LightSlateGray, DeepPink, MediumTurquoise, DodgerBlue, Turquoise, RoyalBlue, SlateBlue,
DarkKhaki, IndianRed, MediumOrchid, GreenYellow, MediumAquamarine, DarkSeaGreen, Tomato, RosyBrown, Orchid, MediumPurple, PaleVioletRed,
Coral, CornflowerBlue, DarkGray, SandyBrown, MediumSlateBlue, Tan, DarkSalmon, BurlyWood, HotPink, Salmon, Violet, LightCoral, SkyBlue,
LightSalmon, Plum, Khaki, LightGreen, Aquamarine, Silver, LightSkyBlue, LightSteelBlue, LightBlue, PaleGreen, Thistle, PowderBlue, PaleGoldenrod,
PaleTurquoise, LightGray, Wheat, NavajoWhite, Moccasin, LightPink, Gainsboro, PeachPuff, Pink, Bisque, LightGoldenrod, BlanchedAlmond,
LemonChiffon, Beige, AntiqueWhite, PapayaWhip, Cornsilk, LightYellow, LightCyan, Linen, Lavender, MistyRose, OldLace, WhiteSmoke, Seashell,
Ivory, Honeydew, AliceBlue, LavenderBlush, MintCream, Snow, White
};
string arrayTitle[] =
{
"Black", "DarkGreen", "DarkSlateGray", "Olive", "Green", "Teal", "Navy", "Purple", "Maroon", "Indigo", "MidnightBlue", "DarkBlue", "DarkOliveGreen", "SaddleBrown",
"ForestGreen", "OliveDrab", "SeaGreen", "DarkGoldenrod", "DarkSlateBlue", "Sienna", "MediumBlue", "Brown", "DarkTurquoise", "DimGray", "LightSeaGreen",
"DarkViolet", "FireBrick", "MediumVioletRed", "MediumSeaGreen", "Chocolate", "Crimson", "SteelBlue", "Goldenrod", "MediumSpringGreen", "LawnGreen",
"CadetBlue", "DarkOrchid", "YellowGreen", "LimeGreen", "OrangeRed", "DarkOrange", "Orange", "Gold", "Yellow", "Chartreuse", "Lime", "SpringGreen", "Aqua", "DeepSkyBlue",
"Blue", "Magenta", "Red", "Gray", "SlateGray", "Peru", "BlueViolet", "LightSlateGray", "DeepPink", "MediumTurquoise", "DodgerBlue", "Turquoise", "RoyalBlue", "SlateBlue",
"DarkKhaki", "IndianRed", "MediumOrchid", "GreenYellow", "MediumAquamarine", "DarkSeaGreen", "Tomato", "RosyBrown", "Orchid", "MediumPurple", "PaleVioletRed",
"Coral", "CornflowerBlue", "DarkGray", "SandyBrown", "MediumSlateBlue", "Tan", "DarkSalmon", "BurlyWood", "HotPink", "Salmon", "Violet", "LightCoral", "SkyBlue",
"LightSalmon", "Plum", "Khaki", "LightGreen", "Aquamarine", "Silver", "LightSkyBlue", "LightSteelBlue", "LightBlue", "PaleGreen", "Thistle", "PowderBlue", "PaleGoldenrod",
"PaleTurquoise", "LightGray", "Wheat", "NavajoWhite", "Moccasin", "LightPink", "Gainsboro", "PeachPuff", "Pink", "Bisque", "LightGoldenrod", "BlanchedAlmond",
"LemonChiffon", "Beige", "AntiqueWhite", "PapayaWhip", "Cornsilk", "LightYellow", "LightCyan", "Linen", "Lavender", "MistyRose", "OldLace", "WhiteSmoke", "Seashell",
"Ivory", "Honeydew", "AliceBlue", "LavenderBlush", "MintCream", "Snow", "White"
};
for(int loop = 0;loop < ArraySize(arrayTitle); loop++)if(title == arrayTitle[loop])return(arrayColors[loop]);
return(CLR_NONE);
}
//+------------------------------------------------------------------+
//| EMMA Recount |
//+------------------------------------------------------------------+
void recount(){
ArrayInitialize(EMMABuffer,0.0);
flag_history = false;
flag = false;
ctrl = -1;
save_Price = 0;
ima = 0;
home_Time = 0;
position = 0;
shift = 0;
}
//+------------------------------------------------------------------+
//| EMMA deinitialization function |
//+------------------------------------------------------------------+
int deinit(){
if(ObjectFind("EMMA_FIBO") != -1)ObjectDelete("EMMA_FIBO");
if(ObjectFind("EMMA_FIBO_FAN") != -1)ObjectDelete("EMMA_FIBO_FAN");
if(ObjectFind("EMMA_Regression_Channel") != -1)ObjectDelete("EMMA_Regression_Channel");
if(ObjectFind("EMMA_StdDevChennel") != -1)ObjectDelete("EMMA_StdDevChennel");
if(ObjectFind("EMMA_TrafficLight") != -1)ObjectDelete("EMMA_TrafficLight");
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---