"MetaTrader 5'te Çoklu Para Birimi Modunun Uygulanması" makalesi için tartışma - sayfa 5

 
Lazarev:

Söyle bana,

1. Diğer para birimlerinden sadece Alış ve Satış'a ihtiyacım varsa, "casus" kullanmak adil midir?

2. Bu sadece bir fikir, onChartEvent işlevinde yalnızca mevcut para biriminden değil, diğer para birimlerinden gelen olayları kontrol etme imkanı yok mu?

3. onTimer olayında zamanlayıcı değerini birden daha az ayarlamak mümkün mü, böylece kotasyon değerini çok daha sık indirecek ve buna bağlı olarak son tik zamanının minimum süre kadar gerisinde kalacak mı?

4. veya benim durumumda, diğer grafiklerdeki karışımların geçişini kontrol etmek için "CHARTEVENT_CUSTOM+n" kullanmak mümkün mü?

1. Kullanmak.

2. Bir seçenek var. Başka bir para biriminden gelen olay, OnChartEvent () ile EA'nın ayarlandığı grafiğe gönderilmelidir.

3. Hayır. Bir minimumdur.

4. Can.

 

Yeni bir fiyat teklifi geldiğinde bir olay gönderen basit bir "casus gösterge" SendEvent.mq5 oluşturdum:

#property indicator_chart_window
#property indicator_plots 0
int OnInit()
  {
   return(0);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   EventChartCustom(0,1,0,0,_Symbol);
   return(rates_total);
  }

Bu göstergeden olayları alan ve bir ticaret işlemi yapmaya çalışan basit bir Uzman Danışman oluşturdum (işte bir kısmı, tam metin ekli dosyada):

void OnChartEvent(const int id, // ChartEvent olay işleyicisi
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)            // sparam enstrümanın adını içerir
  {
      // olayın gerçekleştiği enstrüman için Rakam,Puan,Satış,Alış talep edin
      if(!SymbolInfoInteger(sparam,SYMBOL_DIGITS,dig)) Print("SymbolInfoInteger(SYMBOL_DIGITS) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_POINT,p)) Print("SymbolInfoDouble(SYMBOL_POINT) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_BID,Bid)) Print("SymbolInfoDouble(SYMBOL_BID) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_ASK,Ask)) Print("SymbolInfoDouble(SYMBOL_ASK) ERROR!");
      d=(int)dig;
      if(1>0) // her zaman satın alırız
        {
         q.action=TRADE_ACTION_DEAL; // MqlTradeRequest yapısını doldurun ve bir işlem yapmaya çalışın
         q.symbol=sparam; // sparam aracın adını içerir
         q.volume=Lot;
         q.price=NormalizeDouble(Ask,d);
         q.sl=NormalizeDouble(Ask-p*StopLoss,d);
         q.tp=NormalizeDouble(Ask+p*TakeProfit,d);
         q.deviation=0;
         q.type=ORDER_TYPE_BUY;
         q.type_filling=ORDER_FILLING_FOK;
         // geçerli araç özelliklerini kontrol et
         Print("Bid=",DoubleToString(Bid,8),", Ask=",DoubleToString(Ask,8),", Digits=",d,", Points=",DoubleToString(p,8));
         // göndereceğimiz işlem talebinin yapısını kontrol edin
         Print("q.action=",q.action,", q.symbol=",q.symbol,", q.volume=",q.volume,", q.price=",DoubleToString(q.price,d),", q.sl=",DoubleToString(q.sl,d),", q.tp=",DoubleToString(q.tp,d),", q.deviation=",q.deviation,", q.type=",q.type,", q.type_filling=",q.type_filling);
         Print(OrderCheck(q,ch));                                  // bir ticaret işleminin gerçekleştirilip gerçekleştirilemeyeceğini kontrol edin
         Print("ch.retcode=",ch.retcode,", ch.comment=",ch.comment); // sonuç
         Print("OrderSend:",OrderSend(q,s));                        // bir ticaret işlemi gerçekleştirme girişimi
         Print("s.retcode=",s.retcode,", s.comment=",s.comment);     // sonuç
        }
      if(0>0) // durum düzeltilirse, satacağız
        {
         // аналогично для продажи
        }
     }
  }

Uzman Danışman göstergeden olayları alır, ancak test cihazında (hem görselleştirme ile hem de görselleştirme olmadan) bir ticaret işlemi gerçekleştiremez - "Geçersiz İstek" hatası döndürülür, dönüş kodu 10013. Gerçek zamanlı olarak normal çalışır. Uzman Danışman'daki ticaret işlemi OnChartEvent () yerine OnTick () 'den gerçekleştirilirse - aynı zamanda iyi çalışır.

CodeBase'deki makalenin yazarı tarafından sunulan Uzman Danışman şablonuna ticaret talebinin gönderilmesini ekledim - ayrıca ticaret işlemleri de çalışmıyor (aynı hata).

Biri bana sebebinin ne olduğunu söyleyebilir mi? Bu başlıkta OnChartEvent ()'in test cihazında işlenmediğini okudum, ancak bu durumda gösterge tarafından gönderilen olaylar test cihazında işleniyor, ancak test cihazında OnChartEvent ()' den bir ticaret işlemi yürütmek imkansız.

Dosyalar:
ea.mq5  4 kb
SendEvent.mq5  1 kb
 
zdd:

Yeni bir fiyat teklifi geldiğinde bir olay gönderen basit bir "gösterge-casus" SendEvent.mq5 oluşturdum:

Bu göstergeden olayları alan ve bir ticaret işlemi yapmaya çalışan basit bir Uzman Danışman oluşturdum (bir kısmını veriyorum, tam metin ekli dosyada):

Uzman Danışman, göstergeden olayları alır, ancak test cihazında (hem görselleştirme ile hem de görselleştirme olmadan) bir ticaret işlemi gerçekleştiremez - "Geçersiz İstek" hatası döndürülür, dönüş kodu 10013. Gerçek zamanlı olarak normal çalışır. Uzman Danışman'da bir ticaret işlemi OnChartEvent () yerine OnTick () 'den gerçekleştirilirse - aynı zamanda iyi çalışır.

CodeBase'deki makalenin yazarı tarafından sunulan Uzman Danışman şablonuna ticaret talebinin gönderilmesini ekledim - ticaret işlemleri de çalışmıyor (aynı hata).

Birisi bana nedeninin ne olduğunu söyleyebilir mi? Bu konuda OnChartEvent ()'in test cihazında işlenmediğini okudum, ancak bu durumda gösterge tarafından gönderilen olaylar test cihazında işleniyor, ancak test cihazında OnChartEvent ()'den bir ticaret işlemi yürütmek imkansız.

Balığımı aklıma getirmeye çalışın. Tabii ki, mantık tam değil ve çok aptalca, ama ihtiyacınız olana çok benziyor gibi görünüyor.

En azından piyasadaki pozisyonlar hem test cihazında hem de demoda açılıyor.

Nedenini bilmiyorum (anlamaya çok tembelim), ama örneğiniz bana her durumda 10013 verdi.

PS

Standart nesnelere (CAccountInfo ve CTrade gibi) bağlanmak daha iyidir. Ancak her şeyi kendiniz yazacak sabrınız varsa, bundan sadece memnuniyet duyarım.

Bu arada, casusun uygulamasını makaleden almak veya değiştirilebilir bir kopyasını yapmak daha iyidir (örneğin, bu yılı "(long)_Period" yerine olayı gönderme tarihi veya diğer yararlı bilgilerle değiştirmenizi öneririm). Sizin varyantınız bir şekilde oldukça "ham".

Dosyalar:
DemoEA.mq5  20 kb
 
Interesting:

Bakalım benim balığımı çalıştırabilecek misin? Mantık eksik ve çok karmaşık, ancak ihtiyacınız olan şeye çok benziyor gibi görünüyor.

Teşekkürler, anladım. MqlTradeRequest ve MqlTradeResult yapılarını global düzeyde bildirirseniz, çalışır!
 
Makale için çok teşekkür ederim!
 

EURUSD, EURGBP, GBPUSD olmak üzere üç çift için fiyat almaya çalışıyorum. Strateji test cihazında "Tüm keneler" veya "Yalnızca açık fiyatlar" seçildiğinde her şey yolunda gidiyor. Ancak "Gerçek tiklere dayalı her tik" i seçersem, bazı nedenlerden dolayı bir enstrüman için bir dakika içinde birkaç "Yeni Çubuk" olayı meydana gelebilir.

Tekrarlamak için, örneğin 2016.07.15 ile 2016.07.19 arasında bir aralık seçebilirsiniz. İşte örnek bir günlük, 7. dakikayı, 9. dakikayı izleyin:

2016.07.15 00:05:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333

2016.07.15 00:05:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119

2016.07.15 00:05:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33399

2016.07.15 00:06:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8334

2016.07.15 00:06:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119

2016.07.15 00:06:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33382

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33381

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33384

2016.07.15 00:08:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83329

2016.07.15 00:08:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11167

2016.07.15 00:08:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394

2016.07.15 00:09:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327

2016.07.15 00:09:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166

2016.07.15 00:09:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33396

2016.07.15 00:09:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327

2016.07.15 00:09:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166

"Gerçek tiklere dayalı tüm tikler" modunu seçerken bu davranışın nedeni nedir?
 
ooparadise:

EURUSD, EURGBP, GBPUSD olmak üzere üç çift için fiyat almaya çalışıyorum. Strateji test cihazında "Tüm keneler" veya "Yalnızca açık fiyatlar" seçildiğinde her şey yolunda gidiyor. Ancak "Gerçek tiklere dayalı her tik" i seçersem, bazı nedenlerden dolayı bir enstrüman için bir dakika içinde birkaç "Yeni Çubuk" olayı meydana gelebilir.

Tekrarlamak için, örneğin 2016.07.15'ten 2016.07.19'a kadar bir aralık seçebilirsiniz. İşte örnek bir günlük, 7. dakikayı, 9. dakikayı izleyin:

"Gerçek tiklere dayalı tüm tikler" modunu seçerken bu davranışın nedeni nedir?

"Yeni çubuk" olayını nasıl yakalıyorsunuz? Yapı 1375 'te tik varışının doğruluğu milisaniye olarak iyileştirildi:

Test Cihazı: Milisaniye hassasiyetinde zaman desteği eklendi. Daha önce strateji test cihazında zaman kuantumu bir saniyeydi.

  • EventSetMillisecondTimer ve Sleep işlevleri artık strateji test cihazında daha doğru çalışıyor.
  • Çok para birimli Uzman Danışmanların test edilmesinde tik gönderiminin doğruluğu artmıştır. Önceden, bir saniyede birkaç tik yerleştirilirse (bir dakikalık çubuğun tik hacmi 60'tan fazla ise), hepsine aynı zaman atanırdı. Tek para birimli Uzman Danışmanları test ederken, keneler Uzman Danışmana sırayla iletildiği için bu çok önemli değildir. Ancak, birkaç çift üzerinde test yaparken, hangi çift tikinin önce geldiğini bilmek önemlidir. Önceden, her sembol için keneler sırayla Uzman Danışmana iletiliyordu: önce bir sembol için bir saniyeliğine tüm keneler, sonra başka bir sembol için tüm keneler. Artık milisaniyeler dikkate alınarak iletilirler.

    Gerçek keneler üzerinde test yaparken, milisaniyeler orijinal kene verilerinden alınır. Tik oluştururken, milisaniyeler tik hacmine göre yazılır. Örneğin, bir saniyede 3 tik varsa, bunlara 000, 333 ve 666 milisaniye zaman atanacaktır.
 

Yeni birçubuğu makalede yazıldığı şekilde yakalıyorum. Yani indikatör "New Bar" olayını bu şekilde (önceki zaman dakika, saat, gün, aylara göre) gönderiyor:

   double price_current=price[rates_total-1];

   TimeCurrent(time);

   if(prev_calculated==0)

     {

      EventCustom(CHARTEVENT_INIT,price_current);

      prev_time=time; 

      return(rates_total);

     }

//--- new tick

   if((flag_event & CHARTEVENT_TICK)!=0) EventCustom(CHARTEVENT_TICK,price_current);       


//--- check change time

   if(time.min==prev_time.min && 

      time.hour==prev_time.hour && 

      time.day==prev_time.day &&

      time.mon==prev_time.mon) return(rates_total);


//--- new minute

   if((flag_event & CHARTEVENT_NEWBAR_M1)!=0) EventCustom(CHARTEVENT_NEWBAR_M1,price_current); 

GÜNCELLEME: Yapı 1375 yüklendiğinde sorun ortadan kalktı.

 

Bu büyük makale için teşekkürler. EventChartCustom'ı şimdiye kadar duymamıştım. Diğer grafik olaylarını deniyordum ama onlar sadece insan eyleminden kaynaklanan olayları dikkate alıyordu. Bu birçok şeyi çözüyor.

Bu arada, MQL4 üzerinde çalışıyorum, %98 oranında aynı şey oldu.

Şerefe

 

Bunun için çok teşekkür ederim, çok faydalı. Harika bir iş çıkardınız!