MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 659

 
Roman Sharanov :

Ayrıca ciddi bir kusur buldum, çok sayıda CopyClose () çağrısı

Bir döngüdeki bir dizi döviz çiftinden alıntılarını nasıl kopyalayacağımı söyleyebilir misiniz?

Çift dizi olması gerektiği ortaya çıktı, ancak MQL bunu desteklemiyor, % gibi

MQL4, iki boyutlu dinamik dizilerle çalışıyor gibi görünüyor, ilk dizi boyutunu ArayResize() ile kendiniz değiştirin ve ikincisini CopyClose() 'a iletin.

ya da geliştiricilerden evrensel bir çözüm, çünkü 2 boyutlu dinamik diziler MQL5'te çalışmaz, tek boyutlu bir diziyi bir yapıya sarın ve bu tür yapıların bir dizisini oluşturun... veri ve özelliklerinde (alanlarında) depolar sınıf
 
Igor Makanu :

MQL4, iki boyutlu dinamik dizilerle çalışıyor gibi görünüyor, ilk dizi boyutunu ArayResize() ile kendiniz değiştirin ve ikincisini CopyClose() 'a iletin.

ya da geliştiricilerden evrensel bir çözüm, çünkü 2 boyutlu dinamik diziler MQL5'te çalışmaz, tek boyutlu bir diziyi bir yapıya sarın ve bu tür yapıların bir dizisini oluşturun... veri ve özelliklerinde (alanlarında) depolar sınıf

Teşekkürler, deneyeceğim

 

Göstergeyle ilgili başka bir soru, burada başka ne yapacağımı bilmiyorum

Girilen çiftlerin kapanışları ile onlar için hareketli ortalama arasındaki farkı görüntülemek gerekir.

Sonuç olarak, MA olmadan sadece fark görüntülenir, sorun nedir?

 #property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_style1 STYLE_SOLID
#property indicator_type2 DRAW_LINE
#property indicator_style2 STYLE_SOLID
#property indicator_width1 1
#include <MovingAverages.mqh>

input string active_1 = "EURUSD" ;
input string active_2 = "USDJPY" ;
input ENUM_TIMEFRAMES timeframe = PERIOD_H1 ;
input int ma_period = 30 ;

double firstBuffer[], secondBuffer[], dataBuffer[], maBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , dataBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 , maBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 2 , firstBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 3 , secondBuffer, INDICATOR_CALCULATIONS );
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {
//---

   CopyClose (active_1,timeframe, 0 ,rates_total,firstBuffer);
   CopyClose (active_2,timeframe, 0 ,rates_total,secondBuffer);

   int first, bar;
   if (prev_calculated == 0 ) first = begin; else first = prev_calculated - 1 ;

   for (bar = first; bar<rates_total; bar++){
      dataBuffer[bar] = firstBuffer[bar]-secondBuffer[bar];
   }

   ExponentialMAOnBuffer(rates_total,prev_calculated,begin,ma_period,dataBuffer,maBuffer);
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu :

siparişleri bir döngü içinde sıralamanız gerekir. daha kesin olmak gerekirse, bir onay işareti geldi ve tüm siparişleri bir döngüde saydı: for(j=0;j<OrderTotal;j++)

OrdersTotal() kaç siparişin açık olduğunu gösterir ( bekleyen siparişler dahil , tüm enstrümanlar için siparişler dahil ... genel olarak ... terminalde gördüğünüz açık sipariş sayısı budur, bu kadar))))

0'dan OrdersTotal()-1'e kadar dizilerde olduğu gibi siparişlerin numaralandırılması - bu son sipariştir ve muhtemelen her tikte günlüğe var olmayan bir bilet # [OrdersTotal()] veya zor olan başka bir bilgi verirsiniz tahmin etmek

Evet, yapıyorum - ve onun tüm emirleri yerine getirmesini istiyorum. İlk başta, işlev biraz farklıydı, ancak nedenini bulmayı ve düzeltmeyi umarak mümkün olduğunca basitleştirdim. Tam sıralı numaralandırma, yalnızca kenelerin nadiren meydana geldiği durumlarda veya danışmanı grafikten çıkardıktan sonra ve yeni keneler gelmediğinde gerçekleşir.

Her zaman EA bir fonksiyonun gövdesine girdiyse, o zaman döngüden çıkana kadar diğer tiklere yanıt vermemesi gerektiğini düşündüm, ancak durum böyle görünmüyor. Bu durum nasıl aşılır?

inttest()
{
int toplam;
toplam = SiparişlerToplam();
log("toplam = " + toplam +"; ");

for (int j = 0; j < toplam; j++)
{
log("j = " + j +"; ");
}
dönüş(0);
}

 
Андрей :
Neden her siparişte tüm siparişler hakkında bilgiye ihtiyacınız var? Örneğin, her yeni dakika, beş dakika, ..., saat gibi görüntüleme emirlerine kısıtlamalar getirmek daha iyi olmaz mıydı?

Sorun, her tik için bilgiye ihtiyaç duymam bile değil, ama eğer doğru anlarsam, yeni bir tik gelmeden ve yeni tik bir şekilde sayımı bozana kadar döngünün bitmesi için zaman yok. Bir öncekini aramanıza gerek kalmaması için tekrar bir ekran görüntüsü ekleyeceğim. EA'nın 52'ye kadar sayıldığını ve ardından 93'e atladığını gösteriyor. Nadir bir kene oluşumu ile, danışman grafikten çıkarıldıktan sonra hesap normal olarak ve son döngüde sona erer.

Kod zaten mümkün olduğunca basitleştirildi:

inttest()
{
int toplam;
toplam = SiparişlerToplam();
log("toplam = " + toplam +"; ");

for (int j = 0; j < toplam; j++)
{
log("j = " + j +"; ");
}
dönüş(0);
}

Dosyalar:
test.jpg  82 kb
 
Artyom Trishkin :

Bunu nasıl biliyorsun? Bu doğru değil.

Bir onay işaretinin gelmesiyle başlayan tüm hesaplamalar tamamlanana kadar, sonraki tüm onay işaretleri atlanır .

Biraz daha yukarıda yazdığım gibi, aynı duruma sahibim, ancak bunu zaten sınıra kadar basitleştirdim ve sadece normal olarak bir tür hesaplama yapamayacağım, aynı zamanda siparişleri sırayla sıralayabileceğim sonucuna vardım. günlükte numaralarını görüntüler.

Ayrıca her zaman "Bir kene gelmesiyle başlayan tüm hesaplamalar tamamlanana kadar, sonraki tüm keneler atlanır" diye inandım. Öyle olmasını isterdim ama yeni keneler dışında başka bir sebep bulamıyorum.

 
Artyom Trishkin :

Kod olmadan kimse bir şey söyleyemez.

İşte aynı soruna sahip son derece basitleştirilmiş bir kod - yeni onay işaretleri, sipariş numaralarının sıralı görüntüsünü bozar.

inttest()
{
int toplam;
toplam = SiparişlerToplam() ;
log("toplam = " + toplam +"; ");

for (int j = 0; j < toplam; j++)
{
log("j = " + j +"; ");
}
dönüş(0);
}

 
Algotrader18 :

İşte aynı soruna sahip son derece basitleştirilmiş bir kod - yeni onay işaretleri, sipariş numaralarının sıralı çıktısını bozar.

inttest()
{
int toplam;
toplam = SiparişlerToplam();
log("toplam = " + toplam +"; ");

for (int j = 0; j < toplam; j++)
{
log("j = " + j +"; ");
}
dönüş(0);
}

Bu kod hatasız derleniyor mu? İnanmıyorum...
 
Roman Sharanov :

Göstergeyle ilgili başka bir soru, burada başka ne yapacağımı bilmiyorum

Girilen çiftlerin kapanışları ile onlar için hareketli ortalama arasındaki farkı görüntülemek gerekir.

Sonuç olarak, MA olmadan sadece fark görüntülenir, sorun nedir?

Bu harika!

Roman!

Örneğin, 20 yıllık deneyime sahip başarılı bir tüccarım.

"Girilen çiftlerin kapanışları ile onlar için hareketli ortalama arasındaki farka" neden ihtiyacınız olduğunu anlamıyorum.

Ayrıca, bu farklılıklara dayalı olarak hareketli bir ortalama oluşturabilir misiniz? - Fantezi!

Alıntılara dayalı hareketli bir ortalamanın nasıl oluşturulacağını biliyor musunuz? - Ayrıca hayır?

Sorun nedir?

 
Algotrader18 :

İşte aynı soruna sahip son derece basitleştirilmiş bir kod - yeni onay işaretleri, sipariş numaralarının sıralı görüntüsünü bozar.

inttest()
{
int toplam;
toplam = SiparişlerToplam();
log("toplam = " + toplam +"; ");

for (int j = 0; j < toplam; j++)
{
log("j = " + j +"; ");
}
dönüş(0);
}

bu kod çalışır, benzetme ile yapın:

 int NumberOfOrders( int magic_)
  {
   int i,res= 0 ,k= OrdersTotal (); string sy= Symbol ();
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if (( OrderMagicNumber ()==magic_) && ( OrderSymbol ()==sy)) res++;
        }
     }
   return (res);
  }