"Alım Satım Robotunun Prototipi" makalesi için tartışma - sayfa 2

 

Bu tasarımdan kaçınmanızı tavsiye ederim

//------------------------------------------------------------------ CheckNewBar
bool CExpertAdvisor::CheckNewBar()          // yeni bir çubuğun görünüp görünmediğini kontrol etme işlevi
  {
   MqlRates rt[2];
   if(CopyRates(m_smb,m_tf,0,2,rt)!=2)      // çubukları kopyala
     { Print("CopyRates of ",m_smb," failed, no history"); return(false); }
   if(rt[1].tick_volume>1) return(false);   // ses seviyesini kontrol edin 
   return(true);
  }

önceki tikin işlenmesi yeni çubuğun ilk tikinin gelişini kaçırmaya yetecek kadar zaman alabileceğinden.

Sırasıyla, açılışı kaçırmak mümkündür.

Çubuk açılış zamanına bağlanmak daha iyidir, ancak bunun için örneğin sıfır çubuğunun önceki zamanını kaydetmeniz ve bunu sıfır çubuğunun mevcut zamanıyla karşılaştırmanız gerekir.

Eğer aynıysa, yeni bir çubuk yoktur

Farklıysa, en azından yeni (bir sonraki) bir çubuk açılır, ardından sıfır çubuğunun saklanan zamanını sıfır çubuğunun geçerli zamanıyla başlatırız.

Bu yapı daha güvenilirdir.

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 

Bunu gelecekteki bir makalede ele alın:

  • *Sağlam* (sunucu tarafında olduğu gibi) işlem başına farklı seviyelerde zarar durdurma ve kar alma emirleri; bunlar ağ ve istemci programı kesintileriyle (uzun süreli ağ bağlantılarının kesilmesi, ağ gecikmesinin neden olduğu kayma (ve yeniden talepler), istemci programı veya işletim sisteminin bırakılması, yeniden başlatılması, çökmesi (istemci tarafı yazılımın uzun süreli yokluğu) vb. ile ilgili sorunları önlemek için *gereklidir*;) "sanal" olarak adlandırılan emirler ve OCO olmayan ikameler de bunu kesmez (hayır, pazarlık konusu değildir, eğer sağlamlık bir gereklilikse zararı durdur ve kar al emirleri * sunucu tarafında olmalıdır * ve biri vurulursa diğeri * sunucu tarafından * aynı anda kaldırılmalıdır *)
  • Çökme durumunda *güçlü* işlem başına durum kurtarma; başka bir deyişle, istemci/OS çökerse (ve otomatik olarak yeniden başlarsa) EA'nın bu arada bekleyen bireysel işlemlere ve emirlere tam olarak ne olduğunu bilmesini istiyorum: dolduruldu, kapatıldı, hala aktif, hangi ilişkili s/l ve t/p emirleri hangi işleme/emre ait vb. (hayır, durumu diske yazmak *kesmez* çünkü bir işlemin açılması ile durumun diske yazılması arasında bir yarış koşulu vardır ve istemci programı tam olarak uygunsuz zamanda çökebilir; sunucu tarafı emir yorumları *eğer değiştirilebilirlerse* bunu yapabilir)

Bildiğim kadarıyla MT5, enstrüman başına (işlem başına değil) yalnızca *1* (bir) sunucu tarafı s/l ve t/p emrini destekler ve OCO emirlerini desteklemez (OCO emirleri, işlem başına s/l ve t/p emirlerini simüle etmek için kullanılabilir, ancak burada da bir yarış koşulu vardır). Yukarıdakiler ele alınmadıkça, MT5 (basitleştirilmiş tek sipariş tek zaman dilimi tek yönlü MA çapraz tipi EA'lar) aracılığıyla ticaret yapmak için 100 $ 'dan fazla taahhütte bulunmam. Ve 100 dolardan bile emin değilim.

 
olyakish:

Bu tasarımdan kaçınmanızı tavsiye ederim

önceki tikin işlenmesi yeni çubuğun ilk tikinin gelişini kaçırmaya yetecek kadar zaman alabileceğinden.

Sırasıyla, açılışı kaçırmak mümkündür.

Çubuk açılış zamanına bağlanmak daha iyidir, ancak bunun için örneğin sıfır çubuğunun mevcut zamanıyla karşılaştırmak için sıfır çubuğunun önceki zamanını kaydetmeniz gerekir.

Eğer aynıysa, yeni bir çubuk yoktur

Eğer farklıysa, en azından yeni (bir sonraki) bir çubuk açılır, ardından sıfır çubuğunun saklanan zamanını sıfır çubuğunun geçerli zamanıyla başlatırız.

Bu tasarım daha güvenilirdir.

Ben bu şekilde yaptım:

bool CUniexp::checkNewBar(void)
{
   static datetime prevTime[1];
   datetime currentTime[0];
   CopyTime(_Symbol,_Period,0,1,currentTime);
   if (currentTime[0]==prevTime[0])
   {return (false);}
   else
   {
      prevTime[0] = currentTime[0];
      return (true);
   }
}
 
isNewBar
isNewBar
  • oylar: 7
  • 2010.05.07
  • Prival
  • www.mql5.com
Функция анализа появления нового бара на заданном таймфрейме.
 

Derleniyor ancak hata ayıklayıcı başarısız oluyor.

C:\Program Files\MetaTrader 5\MQL5\Experts\Examples\eMyEA.ex5 yüklemesi başarısız oldu

 
Rosh:

Yeni makale Ticaret Robotu Prototipi yayınlandı:

Yazar: Алексей Сергеев


Harika makale için teşekkürler! Ben acemiyim ama kodla ilgili bir sorum var.


void CExpertAdvisor::TrailingPosition(long dir,int TS) fonksiyonunda bir satır vardır:

sl=NormalSL(dir,apr,apr,TS,StopLvl); // Zararı Durdur'u hesapla


NormalSL'i çağırırken hem ikinci hem de üçüncü argüman için apr kullanmalı mıyız? Ben şöyle olması gerektiğini düşünmüştüm:

sl=NormalSL(dir,op,apr,TS,StopLvl);

çünkü ikinci argüman "ters" yön (yani apr değişkeni) yerine "belirtilen" yön (yani op değişkeni) için alış/satış fiyatı olmalıdır.


Teşekkürler!

 
echostate:


void CExpertAdvisor::TrailingPosition(long dir,int TS) fonksiyonunda bir satır vardır:

sl=NormalSL(dir,apr,apr,TS,StopLvl); // Zararı Durdur'u hesapla


NormalSL'i çağırırken hem ikinci hem de üçüncü argüman için apr kullanmalı mıyız? Ben şöyle olması gerektiğini düşünmüştüm:

sl=NormalSL(dir,op,apr,TS,StopLvl);

hayır.
ikinci ve üçüncü argüman apr olmalıdır.

çünkü tral hesaplaması pozisyonun kapatılacağı fiyattan türetilir. Alış için Bid ve Satış için Ask. fonksiyonu doğrudur.

çünkü ikinci argüman "ters" yön (yani apr değişkeni) yerine "belirtilen" yön (yani op değişkeni) için alış/satış fiyatı olmalıdır.

"ters" yönden hesaplanmalıdır . Bu durumda, apr.
 
sergeev:

hayır.
ikinci ve üçüncü argüman apr olmalıdır.

çünkü tral hesaplaması pozisyonun kapatılacağı fiyattan türetilir. Alış için Bid ve Satış için Ask. fonksiyonu doğrudur.

"ters" yönden hesaplanmalıdır . Bu durumda, apr.


Hızlı cevap için teşekkürler! Yanılıyor olmalıyım diye düşündüm.


Fonksiyonda da sorabilir miyim

double CExpertAdvisor::CountLotByRisk(int dist,double risk,double lot) // lotu risk büyüklüğüne göre hesapla
  {
   if(dist==0 || risk==0) return(lot);
   m_smbinf.Refresh();
   return(NormalLot(AccountInfoDouble(ACCOUNT_BALANCE)*risk/(dist*10*m_smbinf.TickValue())));
  }

dönüş değerinde "dist" ve "m_smbinf.TickValue()" arasında neden bir "10" var? Sanırım "dist" stop loss (pip cinsinden) ve "m_smbinf.TickValue()" döviz çifti için lot başına pip başına ABD doları değeridir. Bu yüzden neden aralarına bir "10" daha çarptığımızdan emin değilim.

Teşekkürler!

 
Çok teşekkürler.
 

Çok faydalı bir makale. Çok teşekkürler!