Price Data Components
Orders Execution
Indicators Used
Miscellaneous
0
Views
0
Downloads
0
Favorites
v128-2
//+------------------------------------------------------------------+
//| v128-2.mq4 |
//| Copyright © 2011, Andrey N. Bolkonsky |
//| 21/03.2011 |
//| email: abolk@yandex.ru | skype: abolk1 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Andrey N. Bolkonsky"
#property link "abolk@yandex.ru"
//
extern string rem2 = "=== Êîëè÷åñòâî ëîòîâ ===";
extern double _Lots0_1 = 0.1; // Áàçîâûé óðîâåíü (äëÿ 1-ãî îðäåðà)
extern double _Lots0_2 = 0.1; // Áàçîâûé óðîâåíü (äëÿ 2-ãî îðäåðà)
//
extern string rem3 = "=== Äîïîëíèòåëüíûå ïàðàìåòðû ===";
extern int _TakeProfit1_Proc = 50; // Ïðîöåíò ðèñêà äëÿ òåéê-ïðîôèòà 1-ãî îðäåðà
extern int _SpaseFromMaxMin = 1; // Îòñòóï îò Âåðøèíû/Äíà
//
extern string rem4 = "=== Ïàðàìåòðû áåçóáûòêà ===";
extern bool _IsStopLoss_0 = false; // Âêëþ÷åíèå èñïîëüçîâàíèÿ óðîâíÿ áåçóáûòêà
extern int _StopLoss_0_From = 0; // Îòñòóï îò óðîâåíÿ áåçóáûòêà (â ïóíêòàõ)
extern int _StopLoss_0_Level = 15; // Óðîâåíü áåçóáûòêà
//
extern string rem5 = "=== Ïàðàìåòðû òðåéëèíã ñòîïà ===";
extern bool _IsTrailingStop = false; // Âêëþ÷åíèå òðåéëèíã ñòîïà
bool _IsTrailingStopProfit = true; // Âêëþ÷åíèå òðåéëèíã ñòîïà ñ ïîçèöèè áåçóáûòêà
//extern int _TrailingStopProfit_From = 0; // Îòñòóï îò óðîâåíÿ áåçóáûòêà (â ïóíêòàõ)
extern int _TrailingStopLevel = 15; // Óðîâåíü òðåéëèíã ñòîïà
extern int _TrailingStopStep = 5; // Øàã ïåðåìåùåíèÿ òðåéëèíã ñòîïà
//
extern string rem6 = "=== Íàñòðîéêè èíñòðóìåíòà ===";
extern string _Symbol = ""; // Ñèìâîëüíîå èìÿ èíñòðóìåíòà: "" - òåêóùèé ñèìâîë
extern int _Timeframe = 0; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
int _Digits; // Êîëè÷åñòâî öèôð ïîñëå äåñÿòè÷íîé òî÷êè â öåíå
double _Point; // Ðàçìåð ïóíêòà â âàëþòå êîòèðîâêè
extern int _Slippage = 2; // Ïðîñêàëüçûâàíèå
extern int _Magic1 = 1281; // Óíèêàëüíûé íîìåð îðäåðîâ ñîâåòíèêà (1-é îðäåð)
extern int _Magic2 = 1282; // Óíèêàëüíûé íîìåð îðäåðîâ ñîâåòíèêà (2-é îðäåð)
//
extern string rem7 = "=== Ïàðàìåòðû èíäèêàòîðà MA1 ===";
extern int _MA1_Timeframe = PERIOD_D1; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
extern int _MA1_Period = 20; // Ïåðèîä óñðåäíåíèÿ äëÿ âû÷èñëåíèÿ ñêîëüçÿùåãî ñðåäíåãî
extern int _MA1_Shift = 0; // Ñäâèã èíäèêàòîðà îòíîñèòåëüíî öåíîâîãî ãðàôèêà
extern int _MA1_Method = 0; // Ìåòîä óñðåäíåíèÿ: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern int _MA1_Applied_Price = 0; // Èñïîëüçóåìàÿ öåíà: 0 - close, 1 - open, 2 - high, 3 - low
//
extern string rem8 = "=== Ïàðàìåòðû èíäèêàòîðà MA2 ===";
extern int _MA2_Timeframe = PERIOD_H4; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
extern int _MA2_Period = 20; // Ïåðèîä óñðåäíåíèÿ äëÿ âû÷èñëåíèÿ ñêîëüçÿùåãî ñðåäíåãî
extern int _MA2_Shift = 0; // Ñäâèã èíäèêàòîðà îòíîñèòåëüíî öåíîâîãî ãðàôèêà
extern int _MA2_Method = 0; // Ìåòîä óñðåäíåíèÿ: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern int _MA2_Applied_Price = 0; // Èñïîëüçóåìàÿ öåíà: 0 - close, 1 - open, 2 - high, 3 - low
//
extern string rem9 = "=== Ïàðàìåòðû èíäèêàòîðà Bollinger Bands ===";
//extern int _BB_Timeframe = 0; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
extern int _BB_Period = 20; // Ïåðèîä óñðåäíåíèÿ îñíîâíîé ëèíèè èíäèêàòîðà
extern int _BB_Deviation = 2; // Îòêëîíåíèå îò îñíîâíîé ëèíèè
extern int _BB_Bands_Shift = 0; // Ñäâèã èíäèêàòîðà îòíîñèòåëüíî öåíîâîãî ãðàôèêà
extern int _BB_Applied_Price = 0; // Èñïîëüçóåìàÿ öåíà: 0 - close
//
extern string rem10 = "=== Ïàðàìåòðû èíäèêàòîðà ZigZag ===";
//extern int _ZZ_Timeframe = 0; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
extern int _ZZ_ExtDepth = 12;
extern int _ZZ_ExtDeviation = 5;
extern int _ZZ_ExtBackstep = 3;
//
datetime _TimePrevious;
datetime _TimeCurrent;
//
string _fstr;
int _tp;
//
//=++==============================================================++=
int init()
{
if(_Symbol == "") _Symbol = Symbol();
//
_Digits = MarketInfo(_Symbol, MODE_DIGITS);
_Point = MarketInfo(_Symbol, MODE_POINT);
//
if(_Timeframe == 0) _Timeframe = Period();
Print("v128-2 > init() >> _Timeframe=", _Timeframe,
" rem4=",_IsStopLoss_0,
" rem5=",_IsTrailingStop,_IsTrailingStopProfit);
//
_fstr = "v128_";
_tp = _FileReadWriteDouble(_fstr+"_tp.dat", 0); // óáåäèòüñÿ â íàëè÷èè ôàéëà, åñëè åãî íåò - ñîçäàòü
Print("v128-2 > init() >> _Timeframe=", _Timeframe, " _tp=",_tp);
//
_TimePrevious=iTime(_Symbol, _Timeframe, 0);
//
Print("v128-2 > Çàâåðøåíî: init() >> _TimePrevious=", _TimePrevious, " (", TimeToStr(_TimePrevious,TIME_DATE|TIME_MINUTES), ")");
return(0);
}
//=++==============================================================++=
int start()
{
double P_Close1, P_Close2;
double BB_1_upper, BB_1_lower;
double MA1_0, MA2_0;
double P_ask, P_bid;
bool is_signal_2_buy, is_signal_2_sell;
double P1_buy, P2_buy, P3_buy;
double P1_sell, P2_sell, P3_sell;
bool is_b1 = false, is_s1 = false;
bool is_b2 = false, is_s2 = false;
int ticket;
//
_TimeCurrent = iTime(_Symbol, _Timeframe, 0);
if(_TimeCurrent != _TimePrevious)
{
MA1_0 = iMA(_Symbol, _MA1_Timeframe, _MA1_Period, _MA1_Shift, _MA1_Method, _MA1_Applied_Price, 0);
MA2_0 = iMA(_Symbol, _MA2_Timeframe, _MA2_Period, _MA2_Shift, _MA2_Method, _MA2_Applied_Price, 0);
BB_1_upper = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_UPPER, 1);
BB_1_lower = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_LOWER, 1);
P_Close1 = iClose(_Symbol, _Timeframe, 1);
P_Close2 = iClose(_Symbol, _Timeframe, 2);
P_ask = MarketInfo(_Symbol, MODE_ASK);
P_bid = MarketInfo(_Symbol, MODE_BID);
Print("v120-4 > ", _Symbol, " | ", _Timeframe,
" -> MA1_0=", MA1_0, " | MA2_0=", MA2_0,
" -> BB_1_upper=", BB_1_upper, " | BB_1_lower=", BB_1_lower,
" -> P_Close1=", P_Close1, " | P_Close2=", P_Close2,
" -> ask=", P_ask, " | bid=", P_bid);
//
is_signal_2_buy = P_bid >= MA1_0 && P_bid >= MA2_0 && P_Close1 >= BB_1_lower && P_Close2 <= BB_1_lower && P_bid >= BB_1_lower;
is_signal_2_sell = P_bid <= MA1_0 && P_bid <= MA2_0 && P_Close1 <= BB_1_upper && P_Close2 >= BB_1_upper && P_bid <= BB_1_upper;
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> is_signal2 -> buy=", is_signal_2_buy, " | sell=", is_signal_2_sell);
// ========== ïî ðûíêó
// ========== îòêðûòèå îðäåðà BUY
if( is_signal_2_buy )
{
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> ñèãíàë íà îòêðûòèå îðäåðà BUY");
OrdersDeleteAll(OP_SELL);
//
if(!is_b1 || !is_b2)
{
P1_buy = P_ask;
P3_buy = FindPriceMinMax(false) - (_SpaseFromMaxMin) * _Point;
_tp = (P1_buy - P3_buy) / _Point * (_TakeProfit1_Proc / 100.0);
P2_buy = DoubleTestZero(_tp, P1_buy + (_tp) * _Point);
//
_FileWriteDouble(_fstr+"_tp.dat", _tp);
//
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> BUY -> P1_buy=", P1_buy, " | P2_buy=", P2_buy, " | P3_buy=", P3_buy, "_tp=", _tp);
//
ticket = OrderSend(_Symbol, OP_BUY, _Lots0_1, ND(P1_buy), _Slippage, ND(P3_buy), ND(P2_buy),
NULL, _Magic1, 0, CLR_NONE);
if(ticket == -1)
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> BUY (1) > Îøèáêà (îòêðûòèå) #", GetLastError());
else is_b1 = true;
//
ticket = OrderSend(_Symbol, OP_BUY, _Lots0_2, ND(P1_buy), _Slippage, ND(P3_buy), 0,
NULL, _Magic2, 0, CLR_NONE);
if(ticket == -1)
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> BUY (2) > Îøèáêà (îòêðûòèå) #", GetLastError());
else is_b2 = true;
//
}
else { is_b1 = true; is_b2 = true; }
}
else { is_b1 = true; is_b2 = true; }
//Print("= buy +++",is_b1,is_b2,"==",is_s1,is_s2);
// ========== îòêðûòèå îðäåðà SELL
if( is_signal_2_sell )
{
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> ñèãíàë íà îòêðûòèå îðäåðà SELL");
OrdersDeleteAll(OP_BUY);
//
if(!is_s1 || !is_s2)
{
P1_sell = P_bid;
P3_sell = FindPriceMinMax(true) + (_SpaseFromMaxMin) * _Point;
_tp = (P3_sell - P1_sell) / _Point * (_TakeProfit1_Proc / 100.0);
P2_sell = DoubleTestZero(_tp, P1_sell - (_tp) * _Point);
//
_FileWriteDouble(_fstr+"_tp.dat", _tp);
//
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> BUY -> P1_sell=", P1_sell, " | P2_sell=", P2_sell, " | P3_sell=", P3_sell);
//
ticket = OrderSend(_Symbol, OP_SELL, _Lots0_1, ND(P1_sell), _Slippage, ND(P3_sell), ND(P2_sell),
NULL, _Magic1, 0, CLR_NONE);
if(ticket == -1)
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> SELL (1) > Îøèáêà (îòêðûòèå) #", GetLastError());
else is_s1 = true;
//
ticket = OrderSend(_Symbol, OP_SELL, _Lots0_2, ND(P1_sell), _Slippage, ND(P3_sell), 0,
NULL, _Magic2, 0, CLR_NONE);
if(ticket == -1)
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> SELL (2) > Îøèáêà (îòêðûòèå) #", GetLastError());
else is_s2 = true;
//
}
else { is_s1 = true; is_s2 = true; }
}
else { is_s1 = true; is_s2 = true; }
//Print("= sell +++",is_b1,is_b2,"==",is_s1,is_s2);
// ==========
if(is_b1 && is_s1 && is_b2 && is_s2)
_TimePrevious=_TimeCurrent;
}
//
if(_IsTrailingStop)
{
if( !FindOrders(_Magic1) ) TrailingStop(_tp);
}
//
if(_IsStopLoss_0)
StopLoss_0(_StopLoss_0_From);
//
return(0);
}
//=++==============================================================++=
double DoubleTestZero(double value, double new_value)
{
if(value==0) return(value);
else return(new_value);
}
//=++==============================================================++=
double ND(double value)
{
return( NormalizeDouble(value, _Digits) );
}
//=++==============================================================++=
// çàêðûòèå îðäåðîâ. Çàâåðøåíèå ïðè çàêðûòèè âñåõ
void OrdersDeleteAll(int cmd)
{
while(CountOrders(cmd) > 0)
{
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol)
&& (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)
&& (OrderType() == cmd) )
{
if(OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), _Slippage, CLR_NONE))
Print("v128-2 > ", _Symbol, " > BUY -> ticket=", OrderTicket(),
" -> Îøèáêà (çàêðûòèå) #", GetLastError());
if(OrderType() == OP_SELL)
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), _Slippage, CLR_NONE))
Print("v128-2 > ", _Symbol, " > SELL -> ticket=", OrderTicket(),
" -> Îøèáêà (çàêðûòèå) #", GetLastError());
}
}
}
}
}
//=++==============================================================++=
// ïîäñ÷¸ò êîëè÷åñòâà îðäåðîâ ïî íàïðàâëåíèþ
int CountOrders(int cmd)
{
int n = 0;
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol)
&& (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)
&& (OrderType() == cmd) ) n++;
}
}
return(n);
}
//=++==============================================================++=
// ïîèñê îðäåðà ïî ìàãèêó
bool FindOrders(int magic)
{
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == magic) )
return(true);
}
}
return(false);
}
//=++==============================================================++=
// îòðàáîòêà óðîâíÿ áåçóáûòêà ïî ìàãèêó
void StopLoss_0(int from)
{
double profitpoint, bid, ask;
bool is;
double P3_buy, P3_sell;
//
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) continue;
//
if(OrderType() == OP_BUY)
{
bid = MarketInfo(_Symbol, MODE_BID);
profitpoint = (bid - OrderOpenPrice()) / _Point;
is = profitpoint >= _StopLoss_0_Level + from;
P3_buy = ND( OrderOpenPrice() + from * _Point );
//
if( is && ( OrderStopLoss() == 0 || OrderStopLoss() < P3_buy ) )
{
Print("v128-2 á4 >", _Symbol, " | ", _Timeframe,
" -> Bid=", MarketInfo(_Symbol, MODE_BID),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_buy=", P3_buy,
" | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_buy, OrderTakeProfit(), 0, CLR_NONE))
Print("v128-2 á4 > ", _Symbol, " | ", _Timeframe,
" -> BUY > ticket=", OrderTicket(), " > Îøèáêà (áåçóáûòîê) #", GetLastError());
}
}
//
else if(OrderType() == OP_SELL)
{
ask = MarketInfo(_Symbol, MODE_ASK);
profitpoint = (OrderOpenPrice() - ask) / _Point;
is = profitpoint >= _StopLoss_0_Level + from;
P3_sell = ND( OrderOpenPrice() - from * _Point );
//
if( is && ( OrderStopLoss() == 0 || OrderStopLoss() > P3_sell ) )
{
Print("v128-2 á4 >", _Symbol, " | ", _Timeframe,
" -> Ask =", MarketInfo(_Symbol, MODE_ASK),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_sell=", P3_sell,
" | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_sell, OrderTakeProfit(), 0, CLR_NONE))
Print("v128-2 á4 > ", _Symbol, " | ", _Timeframe,
" -> SELL -> ticket=", OrderTicket(), " > Îøèáêà (áåçóáûòîê) #", GetLastError());
}
}
}
}
}
//=++==============================================================++=
// îòðàáîòêà òðåéëèíã ñòîïà ïî ìàãèêó
void TrailingStop(int from)
{
double profitpoint, bid, ask;
double fromprice;
//
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) continue;
//
if(OrderType() == OP_BUY)
{
if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() + from * _Point;
else fromprice = OrderStopLoss();
//
bid = MarketInfo(_Symbol, MODE_BID);
profitpoint = (bid - ND(fromprice)) / _Point;
//
if( profitpoint >= _TrailingStopLevel &&
bid > (OrderStopLoss() + (_TrailingStopLevel + _TrailingStopStep) * _Point) )
{
Print("v128-2 ò4 >", _Symbol, " | ", _Timeframe,
" -> Bid=", MarketInfo(_Symbol, MODE_BID),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),
" | d=", _TrailingStopLevel, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(bid - (_TrailingStopLevel) * _Point),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("v128-2 ò4 >", _Symbol, " | ", _Timeframe,
" -> BUY > ticket=", OrderTicket(), " > Îøèáêà (òðåéëèíã ñòîï) #", GetLastError());
}
}
}
//
else if(OrderType() == OP_SELL)
{
if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() - from * _Point;
else fromprice = OrderStopLoss();
//
ask = MarketInfo(_Symbol, MODE_ASK);
profitpoint = (ND(fromprice) - ask) / _Point;
//
if( profitpoint >= _TrailingStopLevel &&
ask < (OrderStopLoss() - (_TrailingStopLevel + _TrailingStopStep) * _Point) )
{
Print("v128-2 ò4 >", _Symbol, " | ", _Timeframe,
" -> Ask=", MarketInfo(_Symbol, MODE_ASK),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),
" | d=", _TrailingStopLevel, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(ask + (_TrailingStopLevel) * _Point),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("v128-2 ò4 >", _Symbol, " | ", _Timeframe,
" -> SELL > ticket=", OrderTicket(), " > Îøèáêà (òðåéëèíã ñòîï) #", GetLastError());
}
}
}
}
}
}
//=++==============================================================++=
// Ïîèñê ëîêàëüíîãî äíà. Âîçâðàùàåò öåíó
double FindPriceMinMax(bool isUp)
{
int shift = 1;
double price = 0, p0,p1,p2;
while(price == 0)
{
p0 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 0, shift);
p1 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 1, shift);
p2 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 2, shift);
//Print("v128-2 >", _Symbol, " | ", _Timeframe,
// " > sift=", shift, " | p0=", p0, " | p1=", p1, " | p2=", p2);
if(isUp)
{
if(p0 !=0 && p0 == p1) // íàéäåíà âåðøèíà
price = p0;
}
else
{
if(p0 != 0 && p0 == p2) // íàéäåíî äíî
price = p0;
}
shift++;
}
//Print("v128-2 >", _Symbol, " | ", _Timeframe,
// " -> return(price)=", price);
return(price);
}
//====================================================================
// C÷èòàòü ïåðåìåííóþ èç ôàéëà.
//  ñëó÷àå îòñóòñòâèÿ ôàéëà - ñîçäàòü ôàéë è çàïèñàòü ïåðåìåííóþ â ôàéë
double _FileReadWriteDouble(string filename, double value)
{
int h1 = FileOpen(filename, FILE_BIN);
if(h1 > 0)
{
value = FileReadDouble(h1, DOUBLE_VALUE);
FileClose(h1);
}
else
{
h1 = FileOpen(filename, FILE_BIN|FILE_WRITE);
FileWriteDouble(h1, value, DOUBLE_VALUE);
FileClose(h1);
}
return(value);
}
//====================================================================
// Çàïèñàòü ïåðåìåííóþ â ôàéë
void _FileWriteDouble(string filename, double value)
{
int h1 = FileOpen(filename, FILE_BIN|FILE_WRITE);
FileWriteDouble(h1, value, DOUBLE_VALUE);
FileClose(h1);
}
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
---