"Mum formasyonlarını tespit etmek için MQL5 nasıl kullanılır?" makalesi için tartışma - sayfa 2

 
Mohamed Abdelmaaboud #:
Yorumunuz için teşekkür ederim. Öncelikle bunu istediğiniz şekilde yapabileceğinizi açıklığa kavuşturmam gerekiyor, bunları algılayıp gösterebilen bir gösterge veya isterseniz ticaret gibi gerekli eylemleri size verebilecek bir EA olabilir ve bunları gelişmiş bir EA'da birleştirebilirsiniz. hepsini doğru şekilde yürütüldüğünde elde etmek için, grafiğe tek bir EA olarak eklenecektir. burada gerçek ya da yalan yok, buradaki amaç sadece bu tür mum çubuğu kalıplarını nasıl kodlayabileceğimizi paylaşmak için eğitici, sonra bunları kendi

Ben de öyle yaptım, her şeyi tek bir EA'da birleştirdim. Ancak bunu bir Gösterge olarak yazmaya çalıştığımda, terminalde hala bir Uzman Danışman olarak yükleniyor. Kodda bir şeyin değiştirilmesi gerekiyor, ancak tam olarak ne olduğunu bilmiyorum, fazla bir şey bilmiyorum. Ayrıca, Zaman Çerçevesi başka bir çerçeveye değiştirildiğinde, sinyalin grafikte kalması ve yenisinde aynı yerdeki çubuğa karşılık gelmemesi anlamında iyileştirmeye ihtiyacı olduğunu fark ettim. İdeal olarak, değiştirirken yalnızca algılandığı Zaman Çerçevesinde silinmeli veya kaydedilmelidir. Her ihtimale karşı, toplanan Kodumu koyacağım, neleri değiştirebileceğinizi veya optimize edebileceğinizi görün, tüm Uzman Danışmanlardan bir tanesine kopyaladım, ancak Kodda birkaç kez tekrar etmemek için başlangıçta bazı değişkenleri beyan edebileceğinizi düşünüyorum.

//+------------------------------------------------------------------+
//|PATTERN-INDIK.mq5 |
//|Telif Hakkı 2023, VIKTOR |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023,VIKTOR"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+ createObj1 = Doji|
//+ createObj2 = Çekiç|
//+ createObj3 = Engulfing|
//+ createObj4 = Piercing|
//+ createObj5 = Yıldız|
//+ createObj6 = threeInside|
//+------------------------------------------------------------------+
void OnTick()
  {
   getDoji();
   getHammer(0.07,0.7);
   getEngulfing();
   getPiercing();
   getStar(0.5);
   getthreeInside();
  }
int getDoji()
  {
   datetime time  =iTime  (_Symbol,PERIOD_CURRENT,1);
   double   open  =iOpen  (_Symbol,PERIOD_CURRENT,1);
   double   high  =iHigh  (_Symbol,PERIOD_CURRENT,1);
   double   low   =iLow   (_Symbol,PERIOD_CURRENT,1);
   double   close =iClose (_Symbol,PERIOD_CURRENT,1);
   
//Doji
   if(open==close)
     {
      createObj1a(time,low,217, clrBlack,"Doji");
        {
         return 1;
        }
     }
   return 0;
  }
void createObj1a(datetime time, double price, int arrawCode, color clr, string txt)
  {
   string objName=" ";
   StringConcatenate(objName, "Signal at ",time, " at ",DoubleToString(price,_Digits)," (",arrawCode,")");
   if(ObjectCreate(0,objName,OBJ_ARROW,0,time,price))
     {
      ObjectSetInteger(0,objName,OBJPROP_ARROWCODE,arrawCode);
      ObjectSetInteger(0,objName,OBJPROP_COLOR,clr);
     }
   string candleName=objName+txt;
   if(ObjectCreate(0,candleName,OBJ_TEXT,0,time,price))
     {
      ObjectSetString(0,candleName,OBJPROP_TEXT," "+txt);
      ObjectSetInteger(0,candleName,OBJPROP_COLOR,clr);
     }
  }
//+------------------------------------------------------------------+
int getHammer(double smallShadowRatio, double longShadowRatio)
  {
//fiyat verileri için değişkenler oluşturma - açık, yüksek, düşük, kapalı
   datetime time=iTime(_Symbol,PERIOD_CURRENT,1);
   double open=iOpen(_Symbol,PERIOD_CURRENT,1);
   double high=iHigh(_Symbol,PERIOD_CURRENT,1);
   double low=iLow(_Symbol,PERIOD_CURRENT,1);
   double close=iClose(_Symbol,PERIOD_CURRENT,1);
   double candleSize=high-low;
//yeşil çekiç
   if(open<close)
     {
      if(high-close < candleSize*smallShadowRatio)
        {
         if(open-low>candleSize*longShadowRatio)
            createObj2(time,low,217, clrGreen,"Hammer");
           {
            return 1;
           }
        }
     }
//kırmızı çekiç
   if(open>close)
     {
      if(high-open<candleSize*smallShadowRatio)
        {
         if(close-low>candleSize*longShadowRatio)
            createObj2(time,high,218,clrRed,"Hammer");
           {
            return 1;
           }
        }
     }
//yeşil ters çekiç
   if(open<close)
     {
      if(open-low < candleSize*smallShadowRatio)
        {
         if(high-close>candleSize*longShadowRatio)
            createObj2(time,low,217, clrGreen,"Inverted Hammer");
           {
            return -1;
           }
        }
     }
//kırmızı ters çekiç
   if(open>close)
     {
      if(close-low < candleSize*smallShadowRatio)
        {
         if(high-open>candleSize*longShadowRatio)
            createObj2(time,high,218, clrRed,"Inverted Hammer");
           {
            return -1;
           }
        }
     }
   return 0;
  }
void createObj2(datetime time, double price, int arrawCode, color clr, string txt)
  {
   string objName=" ";
   StringConcatenate(objName, "Signal@",time, "at",DoubleToString(price,_Digits),"(",arrawCode,")");
   if(ObjectCreate(0,objName,OBJ_ARROW,0,time,price))
     {
      ObjectSetInteger(0,objName,OBJPROP_ARROWCODE,arrawCode);
      ObjectSetInteger(0,objName,OBJPROP_COLOR,clr);
      if(clr==clrGreen)
         ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_TOP);
      if(clr==clrRed)
         ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
     }
   string candleName=objName+txt;
   if(ObjectCreate(0,candleName,OBJ_TEXT,0,time,price))
     {
      ObjectSetString(0,candleName,OBJPROP_TEXT," "+txt);
      ObjectSetInteger(0,candleName,OBJPROP_COLOR,clr);
     }
  }
//+------------------------------------------------------------------+
int getEngulfing()
  {
   datetime time=iTime(_Symbol,PERIOD_CURRENT,1);
   double open=iOpen(_Symbol,PERIOD_CURRENT,1);
   double high=iHigh(_Symbol,PERIOD_CURRENT,1);
   double low=iLow(_Symbol,PERIOD_CURRENT,1);
   double close=iClose(_Symbol,PERIOD_CURRENT,1);
   double open2=iOpen(_Symbol,PERIOD_CURRENT,2);
   double high2=iHigh(_Symbol,PERIOD_CURRENT,2);
   double low2=iLow(_Symbol,PERIOD_CURRENT,2);
   double close2=iClose(_Symbol,PERIOD_CURRENT,2);
   if(open<close)
     {
      if(open2>close2)
        {
         if(high>high2&&low<low2)
           {
            if(close>open2&&open<close2)
              {
               createObj3(time,low,217, clrGreen,"Bullish Engulfing");
                 {
                  return 1;
                 }
              }
           }
        }
     }
   if(open>close)
     {
      if(open2<close2)
        {
         if(high>high2&&low<low2)
           {
            if(close<open2&&open>close2)
              {
               createObj3(time,high,218, clrRed,"Bearish Engulfing");
                 {
                  return -1;
                 }
              }
           }
        }
     }
   return 0;
  }
void createObj3(datetime time, double price, int arrawCode, color clr, string txt)
  {
   string objName=" ";
   StringConcatenate(objName, "Signal@",time, "at",DoubleToString(price,_Digits),"(",arrawCode,")");
   if(ObjectCreate(0,objName,OBJ_ARROW,0,time,price))
     {
      ObjectSetInteger(0,objName,OBJPROP_ARROWCODE,arrawCode);
      ObjectSetInteger(0,objName,OBJPROP_COLOR,clr);
      if(clr==clrGreen)
         ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_TOP);
      if(clr==clrRed)
         ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
     }
   string candleName=objName+txt;
   if(ObjectCreate(0,candleName,OBJ_TEXT,0,time,price))
     {
      ObjectSetString(0,candleName,OBJPROP_TEXT," "+txt);
      ObjectSetInteger(0,candleName,OBJPROP_COLOR,clr);
     }
  }
//+------------------------------------------------------------------+
int getPiercing()
  {
   datetime time=iTime(_Symbol,PERIOD_CURRENT,1);
   double open=iOpen(_Symbol,PERIOD_CURRENT,1);
   double high=iHigh(_Symbol,PERIOD_CURRENT,1);
   double low=iLow(_Symbol,PERIOD_CURRENT,1);
   double close=iClose(_Symbol,PERIOD_CURRENT,1);
   double open2=iOpen(_Symbol,PERIOD_CURRENT,2);
   double high2=iHigh(_Symbol,PERIOD_CURRENT,2);
   double low2=iLow(_Symbol,PERIOD_CURRENT,2);
   double close2=iClose(_Symbol,PERIOD_CURRENT,2);
   double candleSize2=high2-low2;
   double candleMidPoint2=high2-(candleSize2/2);
   if(open<close)
     {
      if(open2>close2)
        {
         if(open<low2)
           {
            if(close>candleMidPoint2&&close<high2)
              {
               createObj4(time,low,217, clrGreen,"Piercing");
                 {
                  return 1;
                 }
              }
           }
        }
     }
   if(open>close)
     {
      if(open2<close2)
        {
         if(open>high2)
           {
            if(close<candleMidPoint2&&close>low2)
              {
               createObj4(time,high,218, clrRed,"Dark Cloud");
                 {
                  return -1;
                 }
              }
           }
        }
     }
   return 0;
  }
void createObj4(datetime time, double price, int arrawCode, color clr, string txt)
  {
   string objName=" ";
   StringConcatenate(objName, "Signal@",time, "at",DoubleToString(price,_Digits),"(",arrawCode,")");
   if(ObjectCreate(0,objName,OBJ_ARROW,0,time,price))
     {
      ObjectSetInteger(0,objName,OBJPROP_ARROWCODE,arrawCode);
      ObjectSetInteger(0,objName,OBJPROP_COLOR,clr);
      if(clr==clrGreen)
         ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_TOP);
      if(clr==clrRed)
         ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
     }
   string candleName=objName+txt;
   if(ObjectCreate(0,candleName,OBJ_TEXT,0,time,price))
     {
      ObjectSetString(0,candleName,OBJPROP_TEXT," "+txt);
      ObjectSetInteger(0,candleName,OBJPROP_COLOR,clr);
     }
  }
//+------------------------------------------------------------------+
int getStar(double middleCandleRatio)
  {
   datetime time=iTime(_Symbol,PERIOD_CURRENT,1);
   double open=iOpen(_Symbol,PERIOD_CURRENT,1);
   double high=iHigh(_Symbol,PERIOD_CURRENT,1);
   double low=iLow(_Symbol,PERIOD_CURRENT,1);
   double close=iClose(_Symbol,PERIOD_CURRENT,1);
   double open2=iOpen(_Symbol,PERIOD_CURRENT,2);
   double high2=iHigh(_Symbol,PERIOD_CURRENT,2);
   double low2=iLow(_Symbol,PERIOD_CURRENT,2);
   double close2=iClose(_Symbol,PERIOD_CURRENT,2);
   double open3=iOpen(_Symbol,PERIOD_CURRENT,3);
   double high3=iHigh(_Symbol,PERIOD_CURRENT,3);
   double low3=iLow(_Symbol,PERIOD_CURRENT,3);
   double close3=iClose(_Symbol,PERIOD_CURRENT,3);
   double candleSize=high-low;
   double candleSize2=high2-low2;
   double candleSize3=high3-low3;
   if(open<close)
     {
      if(open3>close3)
        {
         if(candleSize2<candleSize*middleCandleRatio && candleSize2<candleSize3*middleCandleRatio)
           {
            createObj5(time,low,217, clrGreen,"Morning Star");
              {
               return 1;
              }
           }
        }
     }
   if(open>close)
     {
      if(open3<close3)
        {
         if(candleSize2<candleSize*middleCandleRatio && candleSize2<candleSize3*middleCandleRatio)
           {
            createObj5(time,high,218, clrRed,"Evening Star");
              {
               return -1;
              }
           }
        }
     }
   return 0;
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void createObj5(datetime time, double price, int arrawCode, color clr, string txt)
  {
   string objName=" ";
   StringConcatenate(objName, "Signal@",time, "at",DoubleToString(price,_Digits),"(",arrawCode,")");
   if(ObjectCreate(0,objName,OBJ_ARROW,0,time,price))
     {
      ObjectSetInteger(0,objName,OBJPROP_ARROWCODE,arrawCode);
      ObjectSetInteger(0,objName,OBJPROP_COLOR,clr);
      if(clr==clrGreen)
         ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_TOP);
      if(clr==clrRed)
         ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
     }
   string candleName=objName+txt;
   if(ObjectCreate(0,candleName,OBJ_TEXT,0,time,price))
     {
      ObjectSetString(0,candleName,OBJPROP_TEXT," "+txt);
      ObjectSetInteger(0,candleName,OBJPROP_COLOR,clr);
     }
  }
//+------------------------------------------------------------------+
int getthreeInside()
  {
   datetime time=iTime(_Symbol,PERIOD_CURRENT,1);
   double open=iOpen(_Symbol,PERIOD_CURRENT,1);
   double high=iHigh(_Symbol,PERIOD_CURRENT,1);
   double low=iLow(_Symbol,PERIOD_CURRENT,1);
   double close=iClose(_Symbol,PERIOD_CURRENT,1);
   double open2=iOpen(_Symbol,PERIOD_CURRENT,2);
   double high2=iHigh(_Symbol,PERIOD_CURRENT,2);
   double low2=iLow(_Symbol,PERIOD_CURRENT,2);
   double close2=iClose(_Symbol,PERIOD_CURRENT,2);
   double open3=iOpen(_Symbol,PERIOD_CURRENT,3);
   double high3=iHigh(_Symbol,PERIOD_CURRENT,3);
   double low3=iLow(_Symbol,PERIOD_CURRENT,3);
   double close3=iClose(_Symbol,PERIOD_CURRENT,3);
   if(open3>close3)
     {
      if(open2<close2)
        {
         if(open2>low3&&close2<high3)
           {
            if(open<close&&open>open2&&open<close2)
              {
               if(close>high3)
                 {
                  createObj6(time,low,217, clrGreen,"3 Inside Up");
                    {
                     return 1;
                    }
                 }
              }
           }
        }
     }
   if(open3<close3)
     {
      if(open2>close2)
        {
         if(open2<high3&&close2>low3)
           {
            if(open>close&&open<open2&&open>close2)
              {
               if(close<low3)
                 {
                  createObj6(time,high,218, clrRed,"3 Inside Down");
                    {
                     return -1;
                    }
                 }
              }
           }
        }
     }
   return 0;
  }
void createObj6(datetime time, double price, int arrawCode, color clr, string txt)
  {
   string objName=" ";
   StringConcatenate(objName, "Signal@",time, "at",DoubleToString(price,_Digits),"(",arrawCode,")");
   if(ObjectCreate(0,objName,OBJ_ARROW,0,time,price))
     {
      ObjectSetInteger(0,objName,OBJPROP_ARROWCODE,arrawCode);
      ObjectSetInteger(0,objName,OBJPROP_COLOR,clr);
      if(clr==clrGreen)
         ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_TOP);
      if(clr==clrRed)
         ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
     }
   string candleName=objName+txt;
   if(ObjectCreate(0,candleName,OBJ_TEXT,0,time,price))
     {
      ObjectSetString(0,candleName,OBJPROP_TEXT," "+txt);
      ObjectSetInteger(0,candleName,OBJPROP_COLOR,clr);
     }
  }
//+------------------------------------------------------------------+
 
FINANSE-BOND #:

Öyle yaptım, hepsini tek bir EA'da birleştirdim. Ancak bunu bir İndikatör olarak yazmaya çalıştığımda, terminalde hala bir Uzman Danışman olarak yükleniyor. Kodda bir şeyin değiştirilmesi gerekiyor, ancak ne olduğunu bilmiyorum, bu konuda fazla bilgim yok. Ayrıca, Zaman Çerçevesi başka bir çerçeveye değiştirildiğinde, sinyalin grafikte kalması ve yenisinde aynı yerdeki çubuğa karşılık gelmemesi anlamında iyileştirmeye ihtiyacı olduğunu fark ettim. İdeal olarak, değiştirirken yalnızca algılandığı Zaman Çerçevesinde silinmeli veya kaydedilmelidir. Her ihtimale karşı, topladığım Kodu koyacağım, neleri değiştirebileceğinizi veya optimize edebileceğinizi görün, tüm Uzman Danışmanlardan bir tanesine kopyaladım, ancak Kodda birkaç kez tekrar etmemek için başlangıçta bazı değişkenleri beyan edebileceğinizi düşünüyorum.

Uzman Danışman ve gösterge yalnızca biraz farklı olay işleyicilerine sahip olmaları ve göstergenin mum çubuğu kalıpları söz konusu olduğunda grafiğin kendisinde veya ayrı bir pencerede çizgi çizme yeteneğine sahip olması bakımından farklılık gösterir, bu tür bir kod diğer durumlarda tamamen gereksizdir ve bu adımlarla yalnızca kodunuzun olanaklarını sınırlayacaksınız. Burada doğru gösterge oluşturma paradigmasına ihtiyacınız var, bunu uzun zaman önce fark ettim ve neredeyse hiç gösterge yazmadım, her şeyi bir Uzman Danışman şeklinde yürüttüm. Ayrıca, bu kodun gelecekte ticarete uyarlanması çok kolaydır, koda dikkatlice bakarsanız nesnelerle çalışma olduğunu göreceksiniz, öyleyse neden kendinizi göstergenin işlevselliğiyle sınırlandırmalısınız? Bir erkeğin zihnini kazıyor olmanız doğru.

 

Konuya girmedim, Kodda güçlü olmadığımı yazdım, bu yüzden bir kullanıcı olarak sonuçlarımı paylaştım ve ayrıca Kodda tekrarlanan bazı değişkenleri nerede ve nasıl bildireceğimi bilmediğim küçük bir şeyi kesmemi istedim. Ayrıca yakın zamanda harici bir gösterge üzerine Uzman Danışman yazdıkları bir video izledim. Bu yüzden bir gösterge yaparsanız, Uzman Danışman'da ona başvurabilir ve ondan veri alabilirsiniz dedim. Belki yapabilirseniz bir şeyi düzeltebilirsiniz?

 
Birisi üşenmeyecekse, lütfen bir Uzman Danışman olduğu için koda Alış ve Satış emirleri ekleyin.
 
Çok yardımcı oldu
 
Cyril Bassey #:
Çok yardımcı oldu

Yorumunuz için teşekkürler.

 
Anlayışınız için teşekkürler, Çok iyi bir yazı.
Yutan mum çubuklarını tespit etmekle ilgili merak ediyordum,
koşulunu kullandınız
if(close>open2&&open<close2)
Bullish Engulfing ve koşul için
if(close<open2&&open>close2)
Yutan Ayı için. Bu durum yalnızca bir boşluk olduğunda geçerlidir. Yani boşluk ne sıklıkla oluşuyor? Bu şekilde kodlamayı bekliyordum
if(close>open2&&open<=close2)
Bullish Engulfing ve koşul için
if(close<open2&&open>=close2)
Yutan Ayı için. Çünkü normal şartlar altında 1. Barın açılış fiyatı ile 2. Barın kapanış fiyatı tamamen aynıdır. Kodunuz Engulfing formasyonunu yalnızca bir piyasa fiyatı boşluğu olduğunda tespit edecektir.
Bu yüzden sorum şu ki, Bar 2 ve Bar 1'in kapanış ve açılış fiyatları aynı olmadığında formasyonun geçersiz hale geldiğini düşünüyor musunuz?
 
Güzel makale. Mql5'te nesne modelinin nasıl oluşturulacağını anlamak için çok yararlı.
 

İyi malzeme. Çok teşekkürler.

Hem yükseliş hem de düşüş Marubozu için koşul nedir

 
Sylvanus Phillips #:
Hem yükseliş hem de düşüş Marubozu için koşul nedir?

Bunun gibi bir şey: