EA'da Çubukları geriye doğru analiz etme - sayfa 2

 
FMIC :

EA'larda OnStart() yok ama ne demek istediğinizi anladım. Ancak, OP, yorumlarınıza yanıt olarak bile şunları söyledi ve alıntı yapıyorum:

Evet, OnTick() demek istedim. "EA çalışırken" hala çok fazla anlam yüklüyorsunuz. Bu, "EA bir çizelgeye bağlıyken, yani tüm kullanım ömrü boyunca" yerine "EA OnTick()'i yürütürken" anlamına gelmez, hatta en makul şekilde anlamına gelmez.

ParanoyakX'ten daha fazla bilgiye ihtiyacımız var.

 
jjc :

Evet, OnTick() demek istedim. "EA çalışırken" hala çok fazla anlam yüklüyorsunuz. Bu, "EA bir çizelgeye bağlıyken, yani tüm kullanım ömrü boyunca" yerine "EA OnTick()'i yürütürken" anlamına gelmez, hatta en makul şekilde anlamına gelmez.

ParanoyakX'ten daha fazla bilgiye ihtiyacımız var.

Merhaba millet,

şuna bir açıklık getireyim. Kodum, önceki çubuklarda çok temel bir kalıp arıyor ve bir siparişin açılıp açılmayacağına karar verecek, ancak yeni bir siparişin açılması yalnızca yeni bir çubuk geldiğinde kontrol edilecek. ne demek son çubuğun kapanmasını bekliyorum, sonra deseni kontrol et tamam mı siparişi açacağım. yani yeni bar açılışında sipariş açmak oluyor. @jjc'nin dediği gibi, kalıbımın ne zaman başlayıp bittiği, en yüksek ve en düşük değerin ne olduğu vb. gibi küresel değişkenlerde temel kalıp bilgilerini tutuyorum.

Bir şekilde EA'yı yeniden çalıştırmam gerekirse, bu temel bilgileri (kalıp başlangıç ve bitiş çubuğu, en yüksek, en düşük fiyatlar vb.) yeniden bulmak ve global değişkenlerimi yeniden doldurmak istiyorum, bu yüzden buna ihtiyacım var. Siparişimi ne zaman kapatacağıma karar vermek için başlangıç ve bitiş bilgilerini kullanacağım. yani EA çalışırken OnInit'te yeni bir bar açılmaması yeterlidir, sorun değil.

 
jjc :

Evet, OnTick() demek istedim. "EA çalışırken" hala çok fazla anlam yüklüyorsunuz. Bu, "EA bir çizelgeye bağlıyken, yani tüm kullanım ömrü boyunca" yerine "EA OnTick()'i yürütürken" anlamına gelmez, hatta en makul şekilde anlamına gelmez.

ParanoyakX'ten daha fazla bilgiye ihtiyacımız var.

Evet! Haklısın! OP'den alınan en son bilgilere göre, kesinlikle her şeyi OnTick() üzerinde değil OnInit() içinde çalıştırıyor. OP'nin işleri biraz daha doğru yaptığını yanlış varsaydım. Tüm mantığının OnInit() içinde olduğu hiç aklıma gelmedi.
 
paranoyakX :

Merhaba millet,

şuna bir açıklık getireyim. Kodum, önceki çubuklarda çok temel bir kalıp arıyor ve bir siparişin açılıp açılmayacağına karar verecek, ancak yeni bir siparişin açılması yalnızca yeni bir çubuk geldiğinde kontrol edilecek. ne demek son çubuğun kapanmasını bekliyorum, sonra deseni kontrol et tamam mı siparişi açacağım. yani yeni bar açılışında sipariş açmak oluyor. @jjc'nin dediği gibi, kalıbımın ne zaman başlayıp bittiği, en yüksek ve en düşük değerin ne olduğu vb. gibi küresel değişkenlerde temel kalıp bilgilerini tutuyorum.

Bir şekilde EA'yı yeniden çalıştırmam gerekirse, bu temel bilgileri (kalıp başlangıç ve bitiş çubuğu, en yüksek, en düşük fiyatlar vb.) tekrar bulmak ve global değişkenlerimi tekrar doldurmak istiyorum, bu yüzden buna ihtiyacım var. Siparişimi ne zaman kapatacağıma karar vermek için başlangıç ve bitiş bilgilerini kullanacağım. yani EA çalışırken OnInit'te yeni bir bar açılmaması yeterlidir, sorun değil.

Bunların hepsini OnInit() içinde YAPMAMALISINIZ. OnTick() içinde tüm bu mantığı (kurtarma dahil) yapıyor olmalısınız. Bu önemli ! OnInit() 'te yapmak, öngörmediğiniz başka sorunlara neden olacak ve tüm bu mantığı yaparken EA'nızı "başlangıç" durumunda bırakacaktır. Öyleyse, doğru yap! OnInit() içinde yalnızca başlatma işleminizi (değişkenler, harici parametre kontrolleri vb.) ve OnTick() içindeki diğer her şeyi yapın.
 
FMIC :
Bunların hepsini OnInit() içinde YAPMAMALISINIZ. OnTick() içinde tüm bu mantığı (kurtarma dahil) yapıyor olmalısınız. Bu önemli! OnInit() 'te yapmak, öngörmediğiniz başka sorunlara neden olacak ve tüm bu mantığı yaparken EA'nızı "başlangıç" durumunda bırakacaktır. Öyleyse, doğru yap! OnInit() içinde yalnızca başlatma işleminizi (değişkenler, harici parametre kontrolleri vb.) ve OnTick() içindeki diğer her şeyi yapın.

Hayır hayır hayır! Özür dilerim açıklayamadım, her şeyi OnTick'te çalıştırıyorum. ama sadece bu kenenin yeni bir bara ait olup olmadığını kontrol ettim ve personelimi yaptım. OnInit'te çalıştırdığım şey, daha önce hesapladığım siparişleri ve kalıbı yeniden bul, yeniden hesapla. Bunun OnInit'te çalıştığını söyledim, şu anda açılan siparişin ait olduğu kalıbımı bul.

Umarım açıklayabilirim.

 
paranoyakX :

Hayır hayır hayır! Özür dilerim açıklayamadım, her şeyi OnTick'te çalıştırıyorum. ama sadece bu kenenin yeni bir bara ait olup olmadığını kontrol ettim ve personelimi yaptım. OnInit'te çalıştırdığım şey, daha önce hesapladığım siparişleri ve kalıbı yeniden bul, yeniden hesapla. Bunun OnInit'te çalıştığını söyledim, şu anda açılan siparişin ait olduğu kalıbımı bul.

Umarım açıklayabilirim.

Evet, bunu yazınızdan anladım! Söylediğim şey, bunu OnInit() içinde YAPMAYIN. Siparişlerinizi, kalıplarınızı ve tüm bu hesaplamaları OnTick()'te bulmalısınız.

Sadece OnTick()'te yerel bir statik değişken tanımlayın ve tüm kontrollerinizi ve kalıp tanımlamanızı yapın ve ardından değişkeni false olarak ayarlayın.

 void OnTick ()
{
   static bool FirstOnTick = true ;

   if ( FirstOnTick )
   {
       // Check Orders, Patterns, whatever

      FirstOnTick = false ;
   }

   // Here you do your normal OnTick handling
}
 
FMIC :

Evet, bunu yazınızdan anladım! Söylediğim şey, bunu OnInit() içinde YAPMAYIN. Siparişlerinizi, kalıplarınızı ve tüm bu hesaplamaları OnTick()'te bulmalısınız.

Sadece OnTick()'te yerel bir statik değişken tanımlayın ve tüm kontrollerinizi ve kalıp tanımlamanızı yapın ve ardından değişkeni false olarak ayarlayın.

Üzgünüm o zaman, seni daha önce yanlış anladım. Neden bunu OnInit yapmıyorum? daha uygun değil mi? Bunu yaptığımda, ilkinden sonraki her tik için, koşuyor olacağım ve bu ifade her doğru olmayacaksa. Kod üzerinde gereksiz yük olduğunu düşündüm.

OnInit'in var olmasının nedeni, global değişkenlerim gibi bir şeyi başlatmak değil mi?

 
paranoyakX :

Umarım açıklayabilirim.

Sanırım neden bahsettiğinizden emin olmak için bir kod görmemiz gerekiyor. Örneğin, (a) size açık ticareti nasıl yöneteceğinizi, nerede/ne zaman kapatacağınızı vb. söylediği için veya (b) tam olarak sırayla, mevcut bir açık ticareti oluşturan tarihi modeli mi arıyorsunuz açık değil. mevcut ticaretin neden açıldığını kendinize açıklayan bazı işaretler çizin.

Genel olarak OnTick()'te mümkün olduğunca çok şey yapmaya çalışmanız ve global değişkenlerde mümkün olduğunca az durum tutmanız gerektiği konusunda FMIC ile aynı fikirdeyim.

 
paranoyakX :

Üzgünüm o zaman, seni daha önce yanlış anladım. Neden bunu OnInit yapmıyorum? daha uygun değil mi? Bunu yaptığımda, ilkinden sonraki her tik için, koşuyor olacağım ve bu ifade her doğru olmayacaksa. Kod üzerinde gereksiz yük olduğunu düşündüm.

OnInit'in var olmasının nedeni, global değişkenlerim gibi bir şeyi başlatmak değil mi?

Hayır, bunu OnInit() 'te yapmak doğru değil çünkü Başlatma yürütmesini durduracaksınız ve hayır, statik değişkenler durumunu koruyacak, böylece kontrolleri her OnTick'te değil, yalnızca "bir kez" yapacaksınız( ) . "if( FirstOnTick )" çok hızlıdır ve özellikle OnTick() içinde çalışan diğer tüm kodlarınızla karşılaştırıldığında çok az yüke sahiptir.
 

tavsiye için teşekkürler, işte kodumun çok basit bir versiyonu, bu benim gerçek kodum değil ama umarım bu daha açık olur.

dediğim gibi bu gerçek kod değil, kalıp bulma vb. sadece bir örnek. bu konuyu açmamın nedeni DetectExistingPattern() işlevidir .

 //+------------------------------------------------------------------+
//|                                                          Mustafa |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mustafa"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int MagicNumber= 100 ;


int OnInit ()
  {
//---
   DetectExistingPattern();
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


int LastBar= 0 ;
double HighestValue, LowestValue;

void OnTick ()
  {
//---
    MyStart();

  }


void MyStart(){
    
    CloseOpenedOrders();

     if (LastBar == Bars ) return ;
    LastBar = Bars ;

     if (!CheckForExistedOrders()) {       
       
       if (CheckTrendPattern()){
           PlaceOrders();
       };
    };
};

bool CheckForExistedOrders(){
   for ( int TradeNumber = OrdersTotal (); TradeNumber >= 0 ; TradeNumber--){
     if ( ( OrderSelect (TradeNumber, SELECT_BY_POS, MODE_TRADES)) && (OrderMagicNumber() == MagicNumber )) return true ;
  };
   return false ;

};


bool CheckTrendPattern(){
 
   for ( int i= 10 ; i>= 1 ; i--) {
     if (High[i]>High[i- 1 ])
       return false ;
  };
  HighestValue = High[ 10 ];
  LowestValue  = Low[ 1 ];
  
   return true ;
};



void PlaceOrders(){  
     int OrderResult = OrderSend ( Symbol (), OP_BUY, 1 , Ask, 5 , 0 , 0 , "" , MagicNumber);
}
//+------------------------------------------------------------------+

void CloseOpenedOrders(){
   // I will use HighestValue and LowestValue here, so I need to re calculate them.
};

void DetectExistingPattern() {
   // Find HighestValue and LowestValue again, this part is the reason why I opened the thread!!! I want to run this in OnInıt()
   // I will find opened order and find the previos pattern that cause me to open that order.
};
Neden: