Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 412

 
Imminence :

Merhaba, yeni başlayanlar için bir problemim var ...

Sistemi belirli bir süre için son çubuğun kapanış değerini yüksek ve düşük değerlerle karşılaştırmaya zorlayamam, örneğin

son 20 bar. Neyi yanlış yapıyorum?


Alert üzerinden kontrol ettim ve anlamadığım nedenlerden dolayı test cihazı en son tikten itibaren hesaplamadan maksimum değeri veriyor ama bu değeri veriyor

keneler olduğu kadar, sipariş açılmaz.


Ve ikinci sorun, EA'nın bir sonraki bar açılana kadar (30m periyodu) nasıl bekletileceğidir? Kontrol noktalarıyla test ederken her şey yolundadır, ancak keneler varsa,

daha sonra danışman, stop loss ile kapandığı yerde hemen aynı çubukta açılır, örneğin...


Bir kene olup olmadığına bakılmaksızın bir ticareti nasıl kapatabilirsiniz? örneğin, 30m'lik bir periyotta, çubuğun bitiminden 5 saniye önce siparişi kapatmak istiyorum (29.55, 59.55)

o andaki tüm verilere dayanarak. Bu aşamada sorun şu ki, 5 saniye içinde bir kene oluşmazsa, bu nedenle oluşmaz.

mantıksal işlem yok, sinyal alınmadı ve bir sonraki sinyale kadar an kaçırıldı :( teoride, çöp, ama gerçekte test cihazında bir sonraki sinyal olabilir

nedense birkaç mumdan sonra bile ortaya çıkıyor.


Şimdiden teşekkürler!

1. Kodda son 20 bar ile ilgili bir şey göremedim, biraz daha yakından bakalım.

2. Yeni bir çubuğun ilk işareti nasıl belirlenir

3. Bir kene olup olmadığına bakmaksızın bir anlaşmayı nasıl kapatabilirsiniz?

OnTick ile çalışmaktan uzaklaşmak ve OnTimer ile çalışmak, zamanlayıcıyı 1 saniye aralıklarla ayarlamak ve içindeki zamanı kontrol etmek gerekiyor. Zamanlayıcı, kenelerin gelişine bağlı değildir.

 /// Определяет начало нового бара
bool NewBar()
{
     static datetime lastbar = 0 ;
     datetime curbar = iTime( Symbol (), PERIOD_M30 , 0 );
     if (lastbar!=curbar)
    {
        lastbar=curbar;
         return ( true );
    }
     return ( false );
}
 
Leanid Aladzyeu :

O_o ATP başka ne olduğunu bilmiyordu ve terminal hatanın nerede olduğunu dürttü, ilk defa kritik bir hatayla karşılaştım.

ona tükürmek.

Elbette tükürecektir, dizinin 3. elemanına 2 - mas [ 2 ]++ boyutunda erişiyorsunuz.

 void Oher( int Mag, string Symb, int &mas[ 2 ])
..............
...........

case 1 :mas[ 1 ]++; mas [ 2 ]++; break ; // 1 продажа
 

Alexey Volchanskiy :
Так у тебя в комменте стоит управляющий символ "\n " - это символ перевода строки. Если его убрать, многострочия не будет.

Bu bir şaka. Şimdi satırın sonuna bir yorum ekler... ve metin sağa kaçar. ;-)

 

İyi akşamlar. Tenkan ve kinjun'un kesiştiği noktada basit bir Uzman Danışman yazmaya çalışıyorum. İşte kod:

geçersiz OnTick()

geçersiz OnTick()

{

TradeSignal_20();

}


int TradeSignal_20()

{

int işaret=0;


if(h_ich==INVALID_HANDLE)

{

h_ich=iIchimoku(Symbol(),Period(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb);

dönüş(0);

}

başka

{

if (CopyBuffer(h_ich,0,0,3,ich1_buffer)<2) return(0); // TENKANSEN_LINE

if (CopyBuffer(h_ich,1,0,3,ich2_buffer)<2) return(0); // KIJUNSEN_LINE

if (!ArraySetAsSeries(ich1_buffer,true)) return(0);

if (!ArraySetAsSeries(ich2_buffer,true)) return(0);

}

//--- koşulu kontrol edin ve sig için değeri ayarlayın

if (ich1_buffer[1]>ich2_buffer[1]) sig=1;

else if(ich1_buffer[1]<ich2_buffer[1]) sig=-1;

başka işaret=0;

if (ich1_buffer[1]>ich2_buffer[1])

if (ich1_buffer[2]<ich2_buffer[2])

Alert(Symbol()+": satın al");

if (ich1_buffer[1]<ich2_buffer[1])

if (ich1_buffer[2]>ich2_buffer[2])

Alert(Symbol()+": satış");

//--- ticaret sinyalini döndür

dönüş(sig);

}

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

Uyarının sürekli değil, yalnızca bir kez çağrılması için nasıl yapılır?

 
Alexey Volchanskiy :

1. Kodda son 20 bar ile ilgili bir şey göremedim, biraz daha yakından bakalım.

2. Yeni bir çubuğun ilk işareti nasıl belirlenir

3. Bir kene olup olmadığına bakmaksızın bir anlaşmayı nasıl kapatabilirsiniz?

OnTick ile çalışmaktan uzaklaşmak ve OnTimer ile çalışmak, zamanlayıcıyı 1 saniye aralıklarla ayarlamak ve içindeki zamanı kontrol etmek gerekiyor. Zamanlayıcı, kenelerin gelişine bağlı değildir.

Peki, kapanış fiyatını son 20 barın en yüksekleri ile nasıl karşılaştırabilirim? Ve eğer son fiyat, 20 barlık maksimum değere eşit veya bundan büyükse, o zaman açılma sinyali vardır.
  

double HIGHEST              = High[iHighest( Symbol (), 0 ,MODE_HIGH, 20 , 0 )];


   
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[ 0 ] >= HIGHEST )

  {
   TICKET = OrderSend ( Symbol (),OP_BUY,LOT,Ask, 0 ,Ask-StopLoss* Point ,Ask+TakeProfit* Point , NULL ,MAGIC, 0 ,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
 
first_may :

İyi akşamlar. Tenkan ve kinjun'un kesiştiği noktada basit bir Uzman Danışman yazmaya çalışıyorum. İşte kod:

geçersiz OnTick()

geçersiz OnTick()

{

TradeSignal_20();

Uyarının sürekli değil, yalnızca bir kez çağrılması için nasıl yapılır?
Din, SRC düğmesine basmanıza izin vermiyor mu?
 
Imminence :
Peki, kapanış fiyatını son 20 barın en yüksekleri ile nasıl karşılaştırabilirim? Ve eğer son fiyat, 20 barlık maksimum değere eşit veya bundan büyükse, o zaman açılma sinyali vardır.
koda bakıyoruz
 double HIGHEST              = High[iHighest( Symbol (), 0 ,MODE_HIGH, 20 , 0 )];

  if (Close[ 0 ] > SMMA && Close[ 0 ] > BB_UP && Close[ 0 ] >= HIGHEST)

  {
***********

Bence sorun sıfır çubuğa, yani mevcut olana erişmekte. Bir önceki cevapta verdiğim yeni bir çubuğun başlangıcını belirlemek ve tüm karşılaştırmaları sadece yeni çubuğun ilk tikinde yapmak gerekiyor. Ve indekslemeyi değiştirin. Son kapatılan çubuğun iHighest'e düşmemesi gerekir. Ve şimdi her tikte ortaya çıkan mevcut çubuğa erişiyorsunuz, sonuçlar en garip olacak.

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20, 2 )];

  if(Close[1] > SMMA && Close[1] > BB_UP && Close[1] >= HIGHEST)

  {
***********

 
Alexey Volchanskiy :
koda bakıyoruz

Bence sorun sıfır çubuğa, yani mevcut olana erişmekte. Bir önceki cevapta verdiğim yeni bir çubuğun başlangıcını belirlemek ve tüm karşılaştırmaları sadece yeni çubuğun ilk tikinde yapmak gerekiyor. Ve indekslemeyi değiştirin. Son kapatılan çubuğun iHighest'e düşmemesi gerekir. Ve şimdi her tikte ortaya çıkan mevcut çubuğa erişiyorsunuz, sonuçlar en garip olacak.

Teşekkür ederim, yardımcı oldu gibi görünüyor :) ama ben de aynısını yaptığımı ve işe yaramadığıma yemin etmeye hazırım...

OnTimer()'ı önerdin ama nedense benimle işbirliği yapmak istemiyor. Tüm yardımları inceledikten ve daha anlaşılır açıklamalar veya örnekler bulamayınca çıkmaza girdim.

Yani, bu banal kod da yürütülmüyor, her şey referans kitabında belirtilmiş olmasına rağmen ... Bu programı araştırırken, OnTimer () testte çalışmıyor dediklerine rastladım.

modu. Her ne kadar bu an mql5'in piyasaya sürülmesiyle ortadan kaldırılmış gibi görünse de. Anlamama yardım et :) Teşekkürler!

 int OnInit ()
  {
//---
   bool   Timer = EventSetTimer ( 1 );
   if (Timer != TRUE)
   Print ( GetLastError ()); 
//---
   return ( INIT_SUCCEEDED );
  }

void OnDeinit ( const int reason)
  {
   EventKillTimer ();   
  }
  
void OnTimer ()
{
Print ( "It works" );
}  
  
 

Imminence :

Bu programı aratınca OnTimer() test modunda çalışmaz dedikleri gerçeğiyle karşılaştım. Her ne kadar bu an mql5'in piyasaya sürülmesiyle ortadan kaldırılmış gibi görünse de. Anlamama yardım et :) Teşekkürler!

Bu doğru, test cihazındaki MT4'te zamanlayıcı pulluk yapmıyor ve bu belgelenmedi! Servise yazdım böyle bir şey yapmayacaklarını söylediler. OnTick'te OnTimer'a yapılan aramadan çıktım. Zamanlayıcım bir saniyeye ayarlı.

 // Возвращает true, если работает под тестером
bool IsRunOnTester()
{
     if ( MQLInfoInteger ( MQL_TESTER ) || MQLInfoInteger ( MQL_VISUAL_MODE ) || MQLInfoInteger ( MQL_OPTIMIZATION ))
         return true ;
     return false ;    
}

MqlDateTime      TimeCurrStruct;

void OnTick ()
{
     if (IsRunOnTester())
    {
         static datetime dt1 = 0 , dt2 = 0 ;
         static bool tfirst = true ;
         if (tfirst)
        {
            tfirst = false ;
            dt1 = dt2 = TimeCurrent ();
             return ;
        }
    
        dt2 = TimeCurrent ();
         for ( datetime TimeTesterCurrent = dt1+ 1 ; TimeTesterCurrent <= dt2; TimeTesterCurrent++)
        {
             TimeToStruct (TimeTesterCurrent, TimeCurrStruct);
             OnTimer ();
        }    
        dt1 = dt2;
    }
}

Yani, test cihazındaki keneler saniyede 1 defadan daha sık gelirse, fazla olanlar atlanır, daha az sıklıkta ise 1 saniyenin katları olan bir seri oluşturulur. Bu zaman TimeCurrStruct yapısındadır ve herhangi bir moddaki ana sınıfım sadece bu yapıdan zaman alır. Bence bu hatayı yenmenin tek yolu bu. İşte fonksiyon, fazlalığı çıkardım, sadece et))

 void OnTimer ()
{
     string msg;
     if (!IsRunOnTester())
    {
         TimeToStruct ( TimeCurrent (), TimeCurrStruct);
        SmartDsp.ReceiveTick(TimeCurrStruct);     // основной метод робота, в него передается структура со временем
    }
     else
    {
        SmartDsp.ReceiveTick(TimeCurrStruct);    
    }
}
 
Alexey Volchanskiy :
Din, SRC düğmesine basmanıza izin vermiyor mu?
Ne demek istedikleri belli değil mi?