Mum Açmayı Kontrol Etme

 

Merhaba millet,

mql4'te kodlama konusunda oldukça yeniyim ve gerçekten ilk EA'mı çalıştırmaya çalışıyorum. Aşağıdakilerle ilgili yardımları içtenlikle takdir ediyorum. Sözde sadece basit bir çapraz geçiş, ancak hareketli ortalamaların geçişi yerine, sadece hareketli bir ortalamanın üzerinden fiyat geçişi.

Şu durumlarda Mum Açılışında tetiklenecek bir emire ihtiyacım var: (Mevcut mum açılış fiyatı hareketli ortalamadan > ise) ve eğer (önceki mum hareketli ortalamanın altında kapandı).

Şimdiye kadar, ana alanda aşağıdaki koda sahibim:


//+------------------------------------------- -------------------+

int başlangıç()

{

//---

double ÖncekiYavaş = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);

double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);

double ÖncekiFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1);

double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0);

double PreviousPriceClose= iClose(NULL, 0, 1);

double CurrentCandleOpen= iOpen(NULL,0,0);

//----------------------Ana hesaplama burada başlar


if(ÖncekiFiyatKapat<ÖncekiYavaş && (MevcutMum Açık>(MevcutYavaş)))

if(Sipariş Toplamı () == 0)

BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Ana Giriş EA", 0,0,clrLimeGreen);

//--------------

dönüş(0);

dönüş(0);

}

//+------------------------------------------- -------------------+

Ne yaparsam yapayım, çalışmıyor gibiyim ve burada bir şey yaptığımı düşünmüyorum. Yine, yardımın için gerçekten minnettar olurum!

 
    

   double CurrentSlow = iMA ( NULL , 0 ,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo, 0 );   

Mum akarken bu değer değişiyor

 double CurrentCandleOpen= iOpen( NULL , 0 , 0 );

Bu değil

BuyTicket = OrderSend ( Symbol (),OP_BUY, LotSize, CurrentCandleOpen , Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA" , 0 , 0 , clrLimeGreen );

CurrentCandleOpen'ın birçok kene için geçerli bir giriş fiyatı olması pek olası değildir

Bu mantığı kullanmanız gerekiyorsa, yalnızca yeni bir çubuk açıldığında bir kez hesaplayın.

OrderSend başarısız olursa dönüş değerlerini kontrol edin

 
GumRai :

Mum akarken bu değer değişiyor

Bu değil

CurrentCandleOpen'ın birçok kene için geçerli bir giriş fiyatı olması pek olası değildir

Bu mantığı kullanmanız gerekiyorsa, yalnızca yeni bir çubuk açıldığında bir kez hesaplayın.

OrderSend başarısız olursa dönüş değerlerini kontrol edin


Hızlı cevabınız için teşekkür ederim! Bakalım doğru anlamış mıyım:

  1. CurrentSlow gerçekten çalışmayacak çünkü hala şekilleniyor. Tamam, sorun değil, önceki mum için oluşan hareketli ortalamanın değerini kullanabilirim. Bu bir sorun olmamalı.
  2. CurrentCandleOpen hareketli bir değer olmadığından... o zaman kodun bu kısmının doğru olduğunu varsayıyorum?
  3. CandleOpen'a yeterince yakın olacak şekilde bunu nasıl çalıştırabilirim?--Yeni bir çubuk açıldığında sadece bir kez hesaplamaktan bahsetmişsiniz. Lütfen bunu genişletebilir misiniz? bunu nasıl yapacağımı pek bilmiyorum
Tekrar teşekkürler GumRai.

 
   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       //Code to process the signal
     }

   
Kıvrımlı parantez içindeki kod, yalnızca yeni bir çubuğun ilk işaretinde yürütülür
 
GumRai :
Kıvrımlı parantez içindeki kod, yalnızca yeni bir çubuğun ilk işaretinde yürütülür

Kod için teşekkürler! Aşağıdakileri daha önce tartışıldığı gibi güncelledim:

  1. MA'nın mevcut yavaşlatması Önceki Yavaş olarak değiştirildi.
  2. Ask ile CurrentCandleOpen kaldırıldı . Sor yerine CurrentCandleOpen'ı ne zaman kullansam, herhangi bir işlem yapmıyordu. Bununla birlikte, bunu Ask ile değiştirdiğimde işe yaradı, ancak tabii ki Ask MA'yı geçtiğinde ve Mum açılışında değil, işlem görüyor.

Fakat bundan sonra aşağıdaki gibi kodunuza koyduğumda bir daha hiç alım satım almıyor. Bunu doğru yerleştirmiş miyim?

int start()
  {
//---
    
  double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);     //1 at the end signifies that we want it on candle close
  double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);     //1 at the end signifies that we want it on candle close

  double PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1);     //1 at the end signifies that we want it on candle close
  double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0);     //1 at the end signifies that we want it on candle close
   
  double PreviousPriceClose= iClose(NULL, 0, 1);
  double CurrentPriceClose= iOpen(NULL, 0, 0);
  
//----------------------Main calculation starts here

 static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
   if(PreviousPriceClose<PreviousSlow && Ask>PreviousSlow)
      if(OrdersTotal () == 0)
         BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,Ask, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);
   }
//--------------
   return(0);
   return(0);
  }
 

iMA aramalarını neden yeni barkodun dışına yerleştirmelisiniz? Bu, ihtiyaç duyulmadığında her onay işareti olarak adlandırıldığı anlamına gelir - verimsiz.

   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow = iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo, 1 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );   // You can just use Close[1]
       if (PreviousPriceClose<PreviousSlow && Bid >PreviousSlow)
         if ( OrdersTotal ()== 0 )
            {
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" , 0 , 0 , clrLimeGreen );
             if (BuyTicket==- 1 )
               {
               //Error checking code
               }
     }

MT4 grafiğindeki değerleri karşılaştırmak için Sor'u kullanmayın, bunlar Teklif fiyatına dayalıdır

OrderSend başarısız olursa hataları kontrol edin.

Yeni bir çubuğun ilk işaretinin, önceki çubuğun son işaretinin altındayken MA'nın üzerinde olduğu pek çok örnek alamayabilirsiniz.

 

Çok teşekkür ederim GumRai. ben gerçekten   yardım için teşekkür ederiz.

Kodunuz bir cazibe gibi çalışır. Hala buradaki ipleri öğrenmeye çalışıyorum ve iMA'nın kendi başına ayrı ayrı konulduğunu gördüm. Bunun yerine yönteminizi takip edecek.

***kendi kafasına vurur***

Kodumu yeniden çalışacağım. Son satırınız, istediğim ve aslında kodladığım şeydeki kusura işaret etti.

Aslında yapmam gereken şu:

  • Adım 1 mum MA'nın altında kapanır,
  • Adım 2: Mum MA üzerinde kesişir ve kapanır
  • Adım 3: Yeni mum açılışında ticarete girin.

Son soru ve sanırım anladım...

yukarıdaki Adım 1 için, iMA, SlowMaShift 2 doğru olur mu? 2 bar geride olduğu için mi? ve iClose şöyle olur: iClose(NULL,0,2) bu karşılaştırma için doğru mu?

 

Fikriniz varmış gibi görünüyor.

Kodunuzu değiştirin ve yayınlayın, ben veya başka biri bunun hakkında yorum yapacak

 
GumRai :

Fikriniz varmış gibi görünüyor.

Kodunuzu değiştirin ve yayınlayın, ben veya başka biri bunun hakkında yorum yapacak

Çalıştırmayı başardım! Teşekkürler GumRai.
Şimdi ben de aynısını yapıyorum ama kısa olanı almak için zıt kuralları kullanıyorum. Bağımsız olarak bu iyi çalışıyor, ancak OrderCloseBy işlevini nasıl kullanacağımı bilmiyorum, böylece uzun açıksa ve kısa tetikleyiciler, öncelikle uzun olanı kapatır çünkü sipariş biletini nasıl bulacağım hakkında hiçbir fikrim yok ... Aşağıdakileri yaparak OrderCloseBy'yi atlamayı denedim:

 int start()
  {
//---
 static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow = iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo, 1 );
       double PreviousSlow2 = iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo, 2 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );   //You can just use Close[1]
       double PreviousPriceClose2=iClose( NULL , 0 , 2 );
       if (PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
         if ( OrdersTotal ()== 0 )
            {
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" , 0 , 0 , clrLimeGreen );
       if (PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
         if ( OrdersTotal ()== 1 )
         {
            OrderClose(BuyTicket,LotSize,Ask,Slippage, clrPink ) && OrderSend ( Symbol (), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Sell EA" , 0 , 0 , clrAliceBlue );
                  }
         if ( OrdersTotal ()== 0 )
         {
             OrderSend ( Symbol (), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Sell EA" , 0 , 0 , clrAliceBlue );
            }
     }
//--------------
   return ( 0 );
   return ( 0 );
  }
   return ( 0 );
  }
 
       if (PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
         if ( OrdersTotal ()== 1 )

koşul bloğunun içinde olduğu için karşılanamaz

         if ( OrdersTotal ()== 0 )

   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 1 );
       double PreviousSlow2= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 2 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );   //You can just use Close[1]
       double PreviousPriceClose2=iClose( NULL , 0 , 2 );
       if (PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
        {
         if ( OrdersTotal ()== 0 )
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" , 0 , 0 , clrLimeGreen );
        }
       else
       if (PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
        {
         if ( OrdersTotal ()== 1 )
           {
            OrderClose(BuyTicket,LotSize,Ask,Slippage, clrPink );
             OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Sell EA" , 0 , 0 , clrAliceBlue );
           }
         else
         if ( OrdersTotal ()== 0 )
           {
             OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Sell EA" , 0 , 0 , clrAliceBlue );
           }
        }
     }

Bence yukarıdakiler daha çok istediğin gibi

Hata dönüş kodlarını kontrol etmelisiniz

 
GumRai :

Bence yukarıdakiler daha çok istediğin gibi

Hata dönüş kodlarını kontrol etmelisiniz

Kod için teşekkürler... Ne yazık ki, gerçekten işe yaramadı, çünkü şimdi birden fazla kez kısa giriyor. Bunun yerine yapmaya çalıştığım şey şu - ayrı ayrı bölüyorum - uzun giriş ve çıkış ve sonra kısa giriş ve çıkış için tersini yaratacağım. Benim için daha kolay yönetilebilir ve ince ayar yapmak biraz daha kolay olacak. Önce uzun giriş ve çıkış kısmını aşağı indirmeye çalışıyorum. Ancak bir şekilde, mum kısa vadeli Hareketli Ortalama'nın altında kapandığında bu, işlemleri kapatmıyor. Neyi yanlış yaptığım hakkında bir fikrin var mı? Hata veriyor: 'OrderClose' dönüş değeri kontrol edilmelidir. Bütün sabah Google'da bir çözüm aradım ama işe yaramış gibi görünmüyor.

   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 1 );
       double PreviousSlow2= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 2 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );   //You can just use Close[1]
       double PreviousPriceClose2=iClose( NULL , 0 , 2 );
       if (PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
        {
         if ( OrdersTotal ()== 0 )
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" , 0 , 0 , clrLimeGreen );
        }
       else
       if (PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow && Bid<PreviousSlow)
        {
          OrderClose(BuyTicket,LotSize,Ask,Slippage, clrPink );
          
        }
     

Güncelleme: Hata kodundan kurtuldum ancak kapanış bileti hala çalışmıyor gibi görünüyor. Tek istediğim, mum MA'nın üzerinden geçip kapandığında satın almayı kapatması.