"Çok Sayıda Enstrüman Üzerinde Alım Satım Yapan bir Expert Advisor Oluşturma" makalesi için tartışma - sayfa 5

 
Interesting:
Tnew[1] tarafından Geçersiz dizi aralığı - bir aralık aşımı gibi görünüyor. Dizi elemanlarının numaralandırılmasının dizi aralığının başlangıcıyla başladığını unutmayın.

2010.07.16 22:41 'den itibaren mesaj düzenleme erişimi yok2010.07.16 22:41:25 2010.07.16 22:41:25 #

Değiştir:8.Exp_TEMA.mq5, test ederken neden bir çubuğun içinde işlem açıyor? tarafından

8.Exp_TEMA.mq5, test ederken neden bir çubukta birden fazla işlem açıyor?

 
ias:
2010.07.16 22:41 'den itibaren mesaj düzenleme erişimi yok2010.07.16 22:41:25 2010.07.16 22:41:25 #

Gönderiler yalnızca gönderildikten sonraki 3 gün içinde düzenlenebilir.

[Silindi]  

ias:

8.Exp_TEMA.mq5, test ederken neden bir çubukta birden fazla işlem açıyor?

Daha önce açılmış pozisyonların varlığının kontrol edilmediğini varsaymak ve emirleri ayarlamak mantıklı olacaktır....
 

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...

İlginç:
Daha önce açılmış pozisyonların kontrol edilmediğini ve bekleyen emirlerin ayarlanmadığını varsaymak mantıklı olacaktır....

Bekleyen emirler Exp_TEMA.mq5'te kullanılmaz. Önceden açılmış pozisyonlar kontrol edilir:

//+X================================================================X+
bool BuyPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool SellPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

Belki de yanlış bir şey vardır, in:

//+X================================================================X+
bool IsNewBar(int Number, string symbol, ENUM_TIMEFRAMES timeframe)
  {
//----+
   static datetime Told[];
   datetime Tnew[1];
   
   //----+ Değişken dizilerinin boyutlarını saklamak için değişken bildirimi
   static int Size_ = 0;
   
   //----+ Değişken dizilerini yeniden boyutlandırma
   if (Number + 1 > Size_)
    {
     uint size = Number + 1;
     //----
     if (ArrayResize(Told, size) == -1)
      {
       string word = "";
       StringConcatenate(word, "IsNewBar( ", Number,
                    " ): Hata!!! Değişken dizileri yeniden boyutlandırılamadı!!!"); 
       Print(word); 
       //---- 
       int error = GetLastError();
       ResetLastError();
       if (error > 4000)
        {
         StringConcatenate(word, "IsNewBar( ", Number, " ): Hata kodu ", error);
         Print(word); 
        }  
       //---- 
       Size_ = -2;
       return(false);
      }
    }
   
   CopyTime(symbol, timeframe, 0, 1, Tnew); 
   if (Tnew[0] != Told[Number])
    {
     Told[Number] = Tnew[0];
     return(true);
    }
//----+
   return(false);
  }

veya içinde:

//+X================================================================X+
bool TradeSignalCounter
                      (
                       int Number,
                       string Symbol_,
                       bool Trade,
                       int period,
                       ENUM_APPLIED_PRICE ApPrice,
                       bool& UpSignal[],
                       bool& DnSignal[],
                       bool& UpStop[],
                       bool& DnStop[]
                      )
  
  {
//----+
   //----+ Ticaret yasağı kontrolü
   if (!Trade)return(true);
   
   //----+ Değişken dizilerinin toplam boyutunu saklamak için bir değişken bildirme
   static int Size_ = 0;
   
   //----+ Gösterge tanıtıcılarını statik değişken olarak saklamak için bir dizi bildirme
   static int Handle[];
   
   static int Recount[], MinBars[];
   double TEMA[4], dtema1, dtema2;
   
   //----+ Başlatma 
   if (Number + 1 > Size_) // Yalnızca ilk başlangıçta başlatma bloğuna giriş
    {
     Size_ = Number + 1; // Bu numara için bloğa giriş kapatılmıştır
     
     //---- Değişken dizilerini yeniden boyutlandırma
     ArrayResize(Handle,   Size_);
     ArrayResize(Recount,  Size_);
     ArrayResize(MinBars,  Size_);
     
     //---- Hesaplama için yeterli minimum çubuk sayısının belirlenmesi 
     MinBars[Number] = 3 * period;
     
     //---- Dizi hücrelerinin ön sıfırlaması
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //---- Diziyi zaman serisi olarak kullanma
     ArraySetAsSeries(TEMA, true);
     
     //----+ Gösterge tutamacının alınması
     Handle[Number] = iTEMA(Symbol_, PERIOD_CURRENT, period, 0, ApPrice);
    }
     
   //----+ Hesaplama için yeterlilik açısından çubuk sayısının kontrol edilmesi 
   if (Bars(Symbol_, 0) < MinBars[Number])return(true);

   //----+ Alım satım sinyalleri alma 
   if (IsNewBar(Number, Symbol_, PERIOD_CURRENT) || Recount[Number]) // Çubuk değişiminde veya başarısız veri kopyalamada bloğa giriş
    {
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //----+ Gösterge tutamaçlarını kullanarak, göstergenin değerlerini kopyalayın
                   // tamponları özel olarak hazırlanmış statik bir diziye yerleştirir
     if (CopyBuffer(Handle[Number], 0, 0, 4, TEMA) < 0)
      {
       Recount[Number] = true; // veri alınmadığı için, geri dönmelisiniz 
                                 // bir sonraki adımda alım satım sinyalleri alma bloğuna!
       return(false); // TradeSignalCounter() işlevinden işlem sinyalleri almadan çıkın
      }
      
     //---- Gösterge tamponundan tüm kopyalama işlemleri başarıyla tamamlandı
     Recount[Number] = false; // bir sonraki çubuk değişimine kadar bu bloğa dönmemek mümkündür
     
     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dtema2 = NormalizeDouble(TEMA[2] - TEMA[3], Digits_);
     dtema1 = NormalizeDouble(TEMA[1] - TEMA[2], Digits_);
     
     //---- Giriş sinyallerinin tanımı
     if (dtema2 > 0 && dtema1 < 0) DnSignal[Number] = true;
     if (dtema2 < 0 && dtema1 > 0) UpSignal[Number] = true;
     
     //---- Çıkış sinyallerinin tanımı
     if (dtema1 > 0) DnStop[Number] = true;
     if (dtema1 < 0) UpStop[Number] = true;
    }
//----+
   return(true);
  } 

EURUSD üzerinde Exp_TEMA.mq5'i test ederken bir çubukta birden fazla işlem, D1 dönemi

[Silindi]  
ias, bu makalenin yazarına gitmeniz daha iyi olur....
 
ias:

Exp_TEMA.mq5, test ederken neden çubuk içinde işlem açıyor? açık

Exp_TEMA.mq5 test edilirken neden bir çubukta birden fazla işlem açıyor?

Mesele şu ki, bu makale bağlamında görev, ana fikri özü anlamayı engelleyen küçük ayrıntılarla karıştırmadan basit bir çoklu para birimi Uzman Danışmanı uygulamaktı. Ve herkesin ayrıntıları doldurmak için kendi yolu vardır. Sizin durumunuzda, her şey temel olarak çözülür. Alım satım sinyallerinin değişkenleri, alım satım işlevleri için girdi olarak yapılır ve bağlantı ile bağlanır ve bu değişkenler, alım satım işlevleri içindeki işlemden sonra sıfırlanır.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
GODZILLA:
Mesele şu ki, bu makale bağlamında amaç, ana fikri özü anlamayı engelleyen küçük ayrıntılarla karıştırmadan basit bir çoklu para birimi Uzman Danışmanı uygulamaktı. Ve herkesin ayrıntıları doldurmak için kendi yolu vardır. Sizin durumunuzda, her şey temel olarak çözülür. Alım satım sinyallerinin değişkenleri, alım satım işlevleri için girdi olarak yapılır ve bağlantı ile bağlanır ve bu değişkenler, alım satım işlevleri içinde bir işlem gerçekleştirildikten sonra sıfırlanır.
Lütfen bana Uzman Danışmanınız Exp_TEMA.mq5 örneğinde bunu nasıl yapacağımı gösterin.
 

ias:
Покажите, пожалустайста, на примере вышего эксперта Exp_TEMA.mq5, как это сделать.

Bana göre bir programlama dilini öğrenmek ve anlamak, bireyin kodu kendi ihtiyaçları için yeniden düzenleyen küçük görevleri çözmesinden ibarettir. Aksi takdirde, bu siteye ve programlama makalelerine neden ihtiyaç duyuyorsunuz? Makalelerin yazarlarının yeteneklerini göstermek için mi? Kendileri anlamak istemeyenler https://www.mql5.com/ru/job kaynağını kullanabilirler
Örneğin, MQL4'te bu yaklaşımı en basit haliyle şu şekilde uyguladım https://www.mql5.com/tr/articles/1516. MQL5 için hiçbir şey değişmiyor ve her şey aynı şekilde yapılıyor.

.

 
GODZILLA:

"Farklı enstrümanlarda işlem yapan bir Uzman Danışman oluşturma" makalesinin yazarına büyük saygı duyuyorum.
1. Makalede sunulan Exp_TEMA.mq5 Uzman Danışmanının kodu, test sırasında bir çubukta birden fazla işlem açar,
bu konuda daha önce bildirildiği gibi. Bu gerçek, Uzman Danışman'da birçok site ziyaretçisinin ortadan kaldırmakla ilgilendiği yanlış bir kodun veya bir hatanın varlığını doğrulamaktadır.
2. Roche'un "Uzman Danışmanlar:Çoklu Yayın" konusundaki cevabı: "Ayrıca, yeni bir çubuk belirleme işlevi, zaman kopyalama işlevi kullanılmadan uygulanabilir." - ayrıca, yeni bir çubuk belirleme işlevi, zaman kopyalama işlevi kullanılmadan uygulanabilir..Roche'un "Expert Advisors:Multicast" konusundaki cevabı: "Ayrıca, yeni bir çubuk belirleme işlevi, zaman kopyalama işlevi kullanılmadan uygulanabilir." - ayrıca Uzman Danışmandaki IsNewBar() işlevinin daha rasyonel bir şekilde yazılma olasılığını da doğrular.
Yazarın bu kusurları profesyonel olarak nasıl ortadan kaldıracağını görmek isterim, çünkü herkes hata yapabilir ve bunları yalnızca profesyoneller doğru şekilde düzeltebilir.
 
ias:

Makalede sunulan ticaret sistemlerine yakından bakarsanız, bunların devrilme sistemleri olduğu sonucuna varabilirsiniz. Bu tür sistemlerde stoploss ikincil bir rol oynar ve girişten çok iyi bir mesafeye yerleştirilir, en azından birkaç mumda sayılır. Materyalin sunumundaki profesyonellik, konuyu kendileri için düşünmek istemeyen halka dayanarak değil, ek hilelerle karıştırmadan mümkün olan en basit biçimde ortaya çıkarmaktan ibarettir. Herhangi bir ders kitabı ideal olan açısından her zaman kusurludur. Ve bu kabul edilebilir ve normal olarak görülür. Gelecekte, ticaret sistemleri oluşturmanın bu kadar ayrıntılı bir sunum düzeni olacak, uygulamanın ayrıntılı bir incelemesi olacak, ki bu da o kadar basit değil.
Zaman kopyalamaya gelince, kesinlikle söyleyebilirim ki, ölçmeme rağmen Uzman Danışman'daki IsNewBar() işlevinin daha rasyonel yazılmasından önemli bir fark görmedim! Hatta bu konuda bir makale bile yazdım. Kodun çalışmasında önemli bir bozulma olsaydı, o zaman anlaşılabilir olurdu.
Ve eğer istersem, örneğin bu sitedeki herhangi bir makaleyi sorunsuz bir şekilde parçalara ayırabilirim. Ancak ben bilgiye her şeyden önce mevcut olduğu için değer veririm, ideal hakkındaki fikirlerime uyduğu için değil.
Dolayısıyla, oldukça anlaşılabilir ve oldukça profesyonel nedenlerle, zorlama kusurları ortadan kaldırmayacağım ve aynı zamanda olduğu kadar basit olmayan kodu önemli ölçüde karıştırmayacağım.