Price Data Components
Orders Execution
Indicators Used
Miscellaneous
0
Views
0
Downloads
0
Favorites
Agent_Fx_v07_XZ_d
//+------------------------------------------------------------------+
//| Agent_Fx_v07_XZ_d.mq4 |
//| Voloshin Yuri |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Voloshin Yuri"
#property link "http://www.metaquotes.net"
#define Magic 3017
extern string block_01 = " îñíîâíûå ïàðàìåòðû äëÿ èíäèêàòîðîâ";
extern double lots = 0.25; // Âåëè÷èíà òîðãóåìîãî ëîòà
extern int SL = 180; // ÑòîïËîñ äëÿ îðäåðà, åñëè SL=0 çíà÷åíèå îïðåäåëÿåòñÿ ïî ïåðâîé ñâå÷å
extern int TP = 170; // ÒåéêÏðîôèò äëÿ îðäåðà
extern int DistSet = 10; // Äèñòàíöèÿ îò öåíû íà êîòîðóþ âûñòàâëÿåì îòëîæåííûé îðäåð
extern int kCCI = 27; // Êîýôôèöèåíò îñíîâíîãî èíäèêàòîðà
extern string block_02 = " íàñòðîéêà òðàëà ñòîïîâûõ îðäåðîâ";
extern bool UseTrailS = true; // âêë/âûêë ôóíêöèè òðàëà ñòîïîâûõ îðäåðîâ
bool AllStopOrders = false; // Óïðàâëÿòü âñåìè ñòîïîâûìè îðäåðàìè
// Åñëè ïîñòàâèòü íà îäèí ñ ïàðàìåòðîì AllSymbols=True, ñîâåòíèê áóäåò òðàëèòü âñå ñòîïîâûå îðäåðà.
// Íà íåñêîëüêî ãðàôèêîâ ñîâåòíèê íóæíî ñòàâèòü ñ ïàðàìåòðîì AllSymbols=False, ÷òîáû ðàçíûå êîïèè
// ñîâåòíèêîâ íå ìåøàëè äðóã äðóãó
extern int TrailingStop = 15; // Ôèêñèðîâàííûé ðàçìåð òðàëà
extern int TrailingStep = 6; // Øàã òðàëà
extern bool TrailSL = true;
extern bool TrailTP = true;
bool UseSound = True; // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
color clModifyBuy = Aqua; // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè
color clModifySell = Tomato; // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè
//------- Ãëîáàëüíûå ïåðåìåííûå òðàëà -------------------------------------+
string SoundSuccess = "ok.wav"; // Çâóê óñïåõà
string SoundError = "timeout.wav"; // Çâóê îøèáêè
int NumberOfTry = 4; // Êîëè÷åñòâî òîðãîâûõ ïîïûòîê
//------- Ïîäêëþ÷åíèå âíåøíèõ ìîäóëåé -----------------------------------------+
#include <stdlib.mqh> // Ñòàíäàðòíàÿ áèáëèîòåêà
#include <WinUser32.mqh>
extern string block_03 = " íàñòðîéêà òðàëà ðûíî÷íûõ îðäåðîâ";
extern bool UseTrailM = true; // âêë/âûêë ôóíêöèè òðàëà ðûíî÷íûõ îðäåðîâ
bool SymbolsAll = false; // óïðàâëÿòü ñòîïëîñàìè âñåõ ñèìâîëîâ
extern int MinProfit = 6; // ïóíêòîâ ïðîôèòà êîãäà òðåéëèíã íà÷èíàåò ðàáîòó
extern int Tr_Stop = 12; // âåëè÷èíà òðàëà
extern int Tr_Step = 1; // øàã òðàëà
extern string block_04 = " íàñòðîéêà ôóíêöèè óïðàâëåíèÿ êàïèòàëîì";
extern bool uplot = true; // âêë/âûêë èçìåíåíèå âåëè÷èíû ëîòà
extern double lotmin = 0.1; // íà÷àëüíîå çíà÷åíèå
extern double lotmax = 0.7; // ïîòîëîê
extern double lotstep = 0.1; // ïðèðàùåíèå ëîòà
extern int lastprofit = 1; // ïðèíèìàåò çíà÷åíèÿ -1/1.
// -1 - óâåëè÷åíèå ëîòà ïîñëå ìèíóñîâîé ñäåëêè äî ïåðâîé ïëþñîâîé.
// 1 - óâåëè÷åíèå ëîòà ïîñëå ïëþñîâîé ñäåëêè äî ïåðâîé ìèíóñîâîé.
//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+
double cci[10];
datetime LastCheck = 0;
int i, total;
int order_type;
int ticket;
int slip = 3;
double pAsk;
double pBid;
double ldStop;
double ldTake;
string SMB;
double PNT;
int MinLevel;
int init() {
SMB=Symbol(); //Ñèìâîë âàëþòíîé ïàðû
PNT=MarketInfo(SMB,MODE_POINT); //Ðàçìåð ïóíêòà â âàëþòå êîòèðîâêè,
//äëÿ òåêóùåãî èíñòðóìåíòà õðàíèòñÿ â ïðåäîïðåäåëåííîé ïåðåìåííîé Point
MinLevel=MarketInfo(SMB,MODE_STOPLEVEL); //Ìèíèìàëüíî äîïóñòèìûé óðîâåíü ñòîï-ëîññà/òåéê-ïðîôèòà â ïóíêòàõ
Proverka();
return(0);
}
int deinit() {
//----
//----
return(0);
}
// ========================================================
// =================== ÍÀ×ÈÍÀÅÌ ÐÀÁÎÒÓ ====================
// ========================================================
int start() {
RefreshRates();
// îïðåäåëÿåì íàëè÷èå äîñòàòî÷íûõ ñðåäñòâ íà äåïîçèòå
if(AccountFreeMargin()<(1000*lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
Alert("We have no money. Free Margin = ", AccountFreeMargin());
}
// îïðåäåëÿåì âðåìÿ äëÿ ðàñ÷åòîâ è ðàáîòû ýêñïåðòà
if(DayOfWeek()!=0 || DayOfWeek()!=6) // íå ðàáîòàåò â âûõîäíûå äíè.
{
double j, swo_L, swo_Y, swo_R;
int m,s,k;
m=Time[0]+Period()*60-CurTime(); // îïðåäåëÿåì âðåìÿ íà ñâå÷å
j=m/60.0;
s=m%60;
m=(m-m%60)/60;
if (m == 00 && s < 20) order(); // óñëîâèå äëÿ ïðèíÿòèÿ ðåøåíèÿ â êîíöå êàæäîé ñâå÷è
}
return(0);
}
// ========================================================
// =============== ÔÓÍÊÖÈß ÏÐÎÂÅÐÊÈ ÎÐÄÅÐÎÂ ===============
// ========================================================
void order() {
total=OrdersTotal(); // ôóíêöèÿ ïðîâåðÿåò íàëè÷èå îòêðûòûõ îðäåðîâ
// åñëè îðäåðîâ íåò, èùåì âîçìîæíîñòü îòêðûòèÿ
if(total<1)
{
// ôîðìèðóåì ìàñèâû èíäèêàòîðîâ è îïðåäåëÿåì òðåíä
for(i=0; i<10; i++)
{
cci[i] = iCCI(NULL, 0, kCCI, PRICE_TYPICAL, i);
}
raschet();
}
for (int i=0; i<OrdersTotal(); i++) // åñëè îòêðûòûå îðäåðà èìåþòñÿ
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
// âûáèðàåì ñòîïîâûå îðäåðà è ïåðåõîäèì íà îáðàáîòêó
if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
{
if (UseTrailS) Tr_StOrd();
}
// âûáèðàåì ðûíî÷íûå îðäåðà è ïåðåõîäèì íà îáðàáîòêó
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if (UseTrailM) Tr_Mrkt();
}
}
}
return;
}
// ========================================================
// ============ ÈÙÅÌ ÂÎÇÌÎÆÍÎÑÒÜ ÎÒÊÐÛÒÜ ÎÐÄÅÐ ============
// ========================================================
void raschet() {
Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==",
"\n"," ======================",
"\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD),
"\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL),
"\n"," ======================",
"\n"," Àíàëèçèðóþ ÈÍÄÈÊÀÒÎÐÛ ");
// óñëîâèå ïîêóïêè íà íèæíåé âåðøèíå
if(cci[1]<5 && cci[2]<cci[3] && cci[1]<cci[2] && cci[0]>cci[1] &&
Open[2]>Close[2] && Open[1]>Close[1] && Open[0]<Close[0] && Open[1]<Close[0]) pokypka();
// óñëîâèå ïðîäàæè íà âåðõíåé âåðøèíå
if(cci[1]>-5 && cci[2]>cci[3] && cci[1]>cci[2] && cci[0]<cci[1] &&
Open[2]<Close[2] && Open[1]<Close[1] && Open[0]>Close[0] && Open[1]>Close[0]) prodaza();
return;
}
// ========================================================
// =================== ÎÒÊÐÛÂÀÅÌ ÎÐÄÅÐÀ ===================
// ========================================================
void pokypka() { // îòêðûâàåì ÑÒÎÏÎÂÛÉ îðäåð "ÊÓÏÈÒÜ"
GetLots(); // îïðåäåëÿåì ðàçìåð ëîòà äëÿ òîðãîâëè
pAsk = Ask + DistSet*Point;
if (SL!=0) ldStop=pAsk-SL*Point;
if (SL==0) ldStop=Low[1]-7*Point;
if (TP!=0) ldTake=pAsk+TP*Point;
ticket = OrderSend(Symbol(), OP_BUYSTOP, lots, pAsk, slip, ldStop, ldTake, NULL, Magic, 0, RoyalBlue);
if (GetLastError()>0) Alert("îøèáêà ïîêóïêè = ", GetLastError());
if (ticket>0)
{
Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==",
"\n"," ======================",
"\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD),
"\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL),
"\n"," ======================",
"\n"," ÎÒÊÐÛË ÎÒËÎÆÅÍÍÛÉ îðäåð <<ÊÓÏÈÒÜ>>");
}
return;
}
void prodaza() { // îòêðûâàåì ÑÒÎÏÎÂÛÉ îðäåð "ÏÐÎÄÀÒÜ"
GetLots(); // îïðåäåëÿåì ðàçìåð ëîòà äëÿ òîðãîâëè
pBid=Bid - DistSet*Point;
if (SL!=0) ldStop=pBid+SL*Point;
if (SL==0) ldStop=High[1]+7*Point;
if (TP!=0) ldTake=pBid-TP*Point;
ticket = OrderSend(Symbol(), OP_SELLSTOP, lots, pBid, slip, ldStop, ldTake, NULL, Magic, 0, DeepPink);
if (GetLastError()>0) Alert("îøèáêà ïðîäàæè = ", GetLastError());
if (ticket>0)
{
Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==",
"\n"," ======================",
"\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD),
"\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL),
"\n"," ======================",
"\n"," ÎÒÊÐÛË ÎÒËÎÆÅÍÍÛÉ îðäåð <<ÏÐÎÄÀÒÜ>>");
}
return;
}
// ========================================================
// =========== ÐÀÁÎÒÀ Ñ ÎÒËÎÆÅÍÍÛÌÈ ÎÐÄÅÐÀÌÈ ==============
// ========================================================
void Tr_StOrd() {
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (AllStopOrders || OrderSymbol()==Symbol())
{
TrailingOrders();
}
}
}
return;
}
//+-------------------------------------------------------+
//| Ñîïðîâîæäåíèå îðäåðîâ ïðîñòûì òðàëîì |
//+-------------------------------------------------------+
void TrailingOrders() {
double di, pa, pb, pp, sl, tp;
pp=MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUYSTOP)
{
pa=MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pa>(TrailingStop+TrailingStep-1)*pp)
{
di=OrderOpenPrice()-pa-TrailingStop*pp;
if (TrailSL==true && OrderStopLoss() >0) sl=OrderStopLoss() -di; else sl=ldStop;
if (TrailTP==true && OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=ldTake;
ModifyOrder(pa+TrailingStop*pp, sl, tp);
}
}
if (OrderType()==OP_SELLSTOP)
{
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (pb-OrderOpenPrice()>(TrailingStop+TrailingStep-1)*pp)
{
di=pb-OrderOpenPrice()-TrailingStop*pp;
if (TrailSL==true && OrderStopLoss() >0) sl=OrderStopLoss() +di; else sl=ldStop;
if (TrailTP==true && OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=ldTake;
ModifyOrder(pb-TrailingStop*pp, sl, tp);
}
}
return;
}
//+-------------------------------------------------------+
//| Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ |
//| çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ. |
//+-------------------------------------------------------+
color IIFc(bool condition, color ifTrue, color ifFalse) {
if (condition) return(ifTrue); else return(ifFalse);
}
//+-------------------------------------------------------+
//| Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî |
//| ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà. |
//+-------------------------------------------------------+
//| Ïàðàìåòðû: |
//| pp - öåíà óñòàíîâêè îðäåðà |
//| sl - öåíîâîé óðîâåíü ñòîïà |
//| tp - öåíîâîé óðîâåíü òåéêà |
//| ex - äàòà èñòå÷åíèÿ |
//+-------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
bool fm;
color cl=IIFc(OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell);
double op, pa, pb, os, ot;
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
if (pp<=0) pp=OrderOpenPrice();
if (sl<0 ) sl=OrderStopLoss();
if (tp<0 ) tp=OrderTakeProfit();
pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
op=NormalizeDouble(OrderOpenPrice() , dg);
os=NormalizeDouble(OrderStopLoss() , dg);
ot=NormalizeDouble(OrderTakeProfit(), dg);
if (pp!=op || sl!=os || tp!=ot) {
for (it=1; it<=NumberOfTry; it++) {
RefreshRates();
fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
if (fm) {
if (UseSound) PlaySound(SoundSuccess); break;
} else {
er=GetLastError();
if (UseSound) PlaySound(SoundError);
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(),
" op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
Sleep(1000*10);
}
}
}
return;
}
//+-------------------------------------------------------+
//| Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè |
//+-------------------------------------------------------+
//| Ïàðàìåòðû: |
//| op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè |
//+-------------------------------------------------------+
string GetNameOP(int op) {
switch (op)
{
case OP_BUYSTOP : return("BuyStop");
case OP_SELLSTOP : return("SellStop");
default : return("Unknown Operation");
}
return;
}
// ========================================================
// =============== ÒÐÀË ÐÛÍÎ×ÍÛÕ ÎÐÄÅÐΠ==================
// ========================================================
void Tr_Mrkt() {
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (SymbolsAll || OrderSymbol()==Symbol())
{
TrailPositions();
}
}
}
return;
}
void TrailPositions() {
int cnt = OrdersTotal();
for (int i=0; i<cnt; i++)
{
if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() == OP_BUY)
{
Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==",
"\n"," ======================",
"\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD),
"\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL),
"\n"," ======================",
"\n"," Òðàëèì ÐÛÍÎ×ÍÛÉ îðäåð <<ÊÓÏÈÒÜ>>");
if (Bid-OrderOpenPrice() > MinProfit*Point)
{
if (OrderStopLoss() < Bid-(Tr_Stop+Tr_Step-1)*Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Tr_Stop*Point, OrderTakeProfit(), 0, Blue);
}
}
}
if (OrderType() == OP_SELL)
{
Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==",
"\n"," ======================",
"\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD),
"\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL),
"\n"," ======================",
"\n"," Òðàëèì ÐÛÍÎ×ÍÛÉ îðäåð <<ÏÐÎÄÀÒÜ>>");
if (OrderOpenPrice()-Ask > MinProfit*Point)
{
if (OrderStopLoss() > Ask+(Tr_Stop+Tr_Step-1)*Point || OrderStopLoss() == 0)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Ask+Tr_Stop*Point, OrderTakeProfit(), 0, Blue);
}
}
}
}
return;
}
// ========================================================
// ============ ÔÓÍÊÖÈß ÓÏÐÀÂËÅÍÈß ÊÀÏÈÒÀËÎÌ ==============
// ========================================================
double GetLots() {
lots = lots;
if (!uplot) return (lots);
int ticket = GetLastOrderHist();
if (ticket == -1) return (lots);
if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (lots);
if (OrderProfit()*lastprofit < 0) return (lots);
lots = MathMin(OrderLots() + lotstep, lotmax);
//Alert(" ÔÓÍÊÖÈß óïðàâëåíèÿ êàïèòàëîì ");
return (lots);
}
int GetLastOrderHist(int type = -1) {
int ticket = -1;
datetime dt = 0;
int cnt = HistoryTotal();
for (int i=0; i < cnt; i++) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
//Îïöèîíàëüíî
if (OrderSymbol() != Symbol()) continue;
//Îïöèîíàëüíî
if (OrderMagicNumber() != Magic) continue;
if (type != -1 && OrderType() != type) continue;
if (OrderCloseTime() > dt) {
dt = OrderCloseTime();
ticket = OrderTicket();
}
}
return (ticket);
}
// ======================= Ïðîâåðêà êîððåêòíîñòè ïîëüçîâàòåëüñêèõ óñòàíîâîê =============================================
void Proverka()
{
if(Tr_Stop<MinLevel && Tr_Stop!=0) {Comment("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel);
Print("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel);
Alert("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel);
return(0);}
if(Tr_Step>=MinLevel && Tr_Step==0) {Comment("Îøèáêà! Øàã òðåéëèíãà ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1");
Print("Îøèáêà! Øàã òðåéëèíãà ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1");
Alert("Îøèáêà! Øàã òðåéëèíãà ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1");
return(0);}
if(TP<MinLevel && TP!=0) {Comment("Îøèáêà! TP íå ìîæåò áûòü ìåíåå ",MinLevel);
Print("Îøèáêà! TP íå ìîæåò áûòü ìåíåå ",MinLevel);
Alert("Îøèáêà! TP íå ìîæåò áûòü ìåíåå ",MinLevel);
return(0);}
if(SL<MinLevel && SL!=0) {Comment("Îøèáêà! SL íå ìîæåò áûòü ìåíåå ",MinLevel);
Print("Îøèáêà! SL íå ìîæåò áûòü ìåíåå ",MinLevel);
Alert("Îøèáêà! SL íå ìîæåò áûòü ìåíåå ",MinLevel);
return(0);}
if(DistSet<MinLevel && DistSet!=0) {Comment("Îøèáêà! DistSet íå ìîæåò áûòü ìåíåå ",MinLevel);
Print("Îøèáêà! DistSet íå ìîæåò áûòü ìåíåå ",MinLevel);
Alert("Îøèáêà! DistSet íå ìîæåò áûòü ìåíåå ",MinLevel);
return(0);}
if(TrailingStop<MinLevel && TrailingStop!=0) {Comment("Îøèáêà! ÒðåéëèíãÑòîï ñòîïîâûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel);
Print("Îøèáêà! ÒðåéëèíãÑòîï ñòîïîâûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel);
Alert("Îøèáêà! ÒðåéëèíãÑòîï ñòîïîâûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel);
return(0);}
if(TrailingStep>=MinLevel && TrailingStep==0) {Comment("Îøèáêà! øàã òàðàëà ñòîïîâûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1");
Print("Îøèáêà! ÒðåéëèíãÑòîï ñòîïîâûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1");
Alert("Îøèáêà! ÒðåéëèíãÑòîï ñòîïîâûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1");
return(0);}
}
// ============================================================================================================================
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
---