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

 
Vitaly Muzichenko :

Döngülerde öyle görünüyor ve bir işlev olmadan yapabilirsiniz

Teşekkür ederim.

Ancak, işlevi kaldırdım - frenler kaldı .... kahretsin.

 
Aleksey Vyazmikin :

Teşekkür ederim.

Ancak, işlevi kaldırdım - frenler kaldı .... kahretsin.

Programı bir şekilde 4=>5'ten yeniden yazmaya başladım, sonra 4-ke'de Low[1], Time[0] ve diğerleri gibi tüm yapıları modern olanlarla, yani CopyLow , CopyTime ile değiştirdim, program 4'te bile -ke daha hızlı iş oldu. Artık eski tasarımları kullanmıyorum, sadece yenilerini kullanıyorum. Böylece kod 5. platforma kolayca aktarılabilir, sadece ticaret fonksiyonlarını değiştirmeniz yeterlidir.

 
Vitaly Muzichenko :

Programı bir şekilde 4=>5'ten yeniden yazmaya başladım, sonra 4-ke'de Low[1], Time[0] ve diğerleri gibi tüm yapıları modern olanlarla, yani CopyLow , CopyTime ile değiştirdim, program 4'te bile -ke daha hızlı iş oldu. Artık eski tasarımları kullanmıyorum, sadece yenilerini kullanıyorum. Böylece kod 5. platforma kolayca aktarılabilir, sadece ticaret fonksiyonlarını değiştirmeniz yeterlidir.

Diziyi her hapşırma ile doldurmak kaynakları tüketmiyor mu?

Belki bar açıldığında bilgiyi bir diziye kopyalamak ve ardından oradan koda götürmek mantıklı olabilir mi? Bir bar açıldığında ticaret yaparım.

 
Aleksey Vyazmikin :

Diziyi her hapşırma ile doldurmak kaynakları tüketmiyor mu?

Belki bar açıldığında bilgiyi bir diziye kopyalamak ve ardından oradan koda götürmek mantıklı olabilir mi? Bir bar açıldığında ticaret yaparım.

Dizi yeni bir çubukta doldurulabilir, böylece daha az kaynak harcanacaktır. Örneğin, birkaç yerde iLow[1] ile çalışıyorsanız, onu bir kez bir değişkene koymanız ve diziyi değil değişkeni okumanız istenir.

öyle varsayalım

 // Инициализация TIME[0] TIME[1]
   ArraySetAsSeries (TM, true );
   if ( CopyTime (dSymbol, Period (), 0 , 2 ,TM)< 0 ) return ;
  TIME_0=TM[ 0 ];
  TIME_1=TM[ 1 ];
Ardından, TM[ 0 ] ve TM[ 1 ] ile değil, TIME_0 ve TIME_1 değişkeniyle çalışıyoruz.
 
Vitaly Muzichenko :

Dizi yeni bir çubukta doldurulabilir, böylece daha az kaynak harcanacaktır. Örneğin, birkaç yerde iLow[1] ile çalışıyorsanız, onu bir kez bir değişkene koymanız ve diziyi değil değişkeni okumanız istenir.

öyle varsayalım

Ve yine de, MT4 bir büyüklük sırası daha hızlı - hayal kırıklığına uğradım.

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

Aleksey Vyazmikin , 2017.07.21 15:07

Neden hayal kuruyorsun? Fikrinizi anladım ve işe yaradığını onayladım ve istek bir kez gerçekleşirse ve danışmanın çalışması için kaç çubuk gerektiği biliniyorsa etkili olacaktır.

Ya da başka bir yapıyı kullanmayı önerdiğiniz gibi mi? O zaman lütfen açıklayın ve gücenmeyin!


Fantezi yok. Bir mumun 2 veya daha fazla parametresini almanız gerekiyorsa, mesajlarınızdan/sorularınızdan gelen fonksiyonları kullanarak, bu fonksiyonları her mum parametresi için ayrı ayrı çağırmanız gerekecektir. Yani, Copy***() gerçekleştirmek için 2 veya daha fazla kez, ancak CopyRates() kullanıldığında yalnızca bir kopya çağrısı gerekir.

Kopyalanacak miktara gelince, bu tamamen farklı bir konu. Belki de önce hangi çubukta istenen gösterge değerinin olduğunu hesaplamanız ve ardından kopyalamanız gerekir? Yanlış hatırlamıyorsam kopyalanacak bir meblağdan bahsediliyordu. Hangi fantezilerden bahsediyoruz?

Ve aşırı durumlarda, örneğin 10 çubuğu kopyalayabilir ve aralarında arama yapabilir, bulamadıysanız 10 tane daha kopyalayabilirsiniz. Kopyalama maliyetli bir işlemdir, diziyi sıralamak daha ucuzdur.

Genel olarak, birçok seçenek var. Bütün bunları belgelere yazmak imkansız ve artık belge olmayacak. Bu programlama derslerinde öğretilir. Ancak ne yazık ki, tüm öğretmenler bunu nasıl yapacağını bilmiyor ve tüm öğrenciler bunu sınıfta anlamak istemiyor. Ve çok, çok başlangıç, öğretmenin sorunun ayrıntılı bir açıklamasını gerektirdiğinde, 2-5. sınıflardaki aritmetik derslerinde atılır. Ama burada da aynı sorunlar var.

 
Alexey Viktorov :

Fantezi yok. Bir mumun 2 veya daha fazla parametresini almanız gerekiyorsa, mesajlarınızdan/sorularınızdan gelen fonksiyonları kullanarak, bu fonksiyonları her mum parametresi için ayrı ayrı çağırmanız gerekecektir. Yani, Copy***() gerçekleştirmek için 2 veya daha fazla kez, ancak CopyRates() kullanıldığında yalnızca bir kopya çağrısı gerekir.

Kopyalanacak miktara gelince, bu tamamen farklı bir konu. Belki de önce hangi çubukta istenen gösterge değerinin olduğunu hesaplamanız ve ardından kopyalamanız gerekir? Yanlış hatırlamıyorsam kopyalanacak bir meblağdan bahsediliyordu. Hangi fantezilerden bahsediyoruz?

Ve aşırı durumlarda, örneğin 10 çubuğu kopyalayabilir ve aralarında arama yapabilir, bulamadıysanız 10 tane daha kopyalayabilirsiniz. Kopyalama maliyetli bir işlemdir, diziyi sıralamak daha ucuzdur.

Genel olarak, birçok seçenek var. Bütün bunları belgelere yazmak imkansız ve artık belge olmayacak. Bu programlama derslerinde öğretilir. Ancak ne yazık ki, tüm öğretmenler bunu nasıl yapacağını bilmiyor ve tüm öğrenciler bunu sınıfta anlamak istemiyor. Ve çok, çok başlangıç, öğretmenin sorunun ayrıntılı bir açıklamasını gerektirdiğinde, 2-5. sınıflardaki aritmetik derslerinde atılır. Ama burada da aynı sorunlar var.

Fantezi hakkında - "Söylenenleri anlamaya çalışmak, ne olduğunu anlamaya çalışmak yerine, bazı inanılmaz itirazlar ortaya çıkıyor." ifadenize bir yanıt verildi ve önerdiğiniz seçeneğin fantezi alanından olduğu gerçeğine değil. .

Konseptinizi çok iyi anlıyorum ve bu size verilen cevapta belirtildi.

Ancak, bilinmeyen miktarda veri ile nasıl çalışmayı önerdiğinizi tam olarak anlamadım - kod şeklinde bir örnek verebilir misiniz?

 

Bu bağlantıyı kullanarak göstergeyi denetleme ve optimize etme konusunda yardım istiyorum https://www.mql5.com/en/code/16805 - sorun şu ki, çok sayıda çubuk göründüğünde gösterge çok yavaşlamaya başlar - bu test sırasında kendini gösterir.

Ve her kene için değil, sadece çubuğun açılışında nasıl hesaplanır? Danışmanın yöntemi uymuyordu - ilk onay işaretinden sonra tüm değerler kayboluyor ve yalnızca bir sonraki çubukta görünüyor...

Donchian Channel MTF
Donchian Channel MTF
  • oylar: 13
  • 2016.12.13
  • Mladen Rakic
  • www.mql5.com
Мультитаймфреймовая версия канала Дончиана.
 
Aleksey Vyazmikin :

Fantezi hakkında - "Söylenenleri anlamaya çalışmak, ne olduğunu anlamaya çalışmak yerine, bazı inanılmaz itirazlar ortaya çıkıyor." ifadenize bir yanıt verildi ve önerdiğiniz seçeneğin fantezi alanından olduğu gerçeğine değil. .

Konseptinizi çok iyi anlıyorum ve bu size verilen cevapta belirtildi.

Ancak, bilinmeyen miktarda veri ile nasıl çalışmayı önerdiğinizi tam olarak anlamadım - kod şeklinde bir örnek verebilir misiniz?


Daha önce cevaplandı...

Alexey Viktorov :

Ve aşırı durumlarda, örneğin 10 çubuğu kopyalayabilir ve aralarında arama yapabilir, bulamadıysanız 10 tane daha kopyalayabilirsiniz. Kopyalama maliyetli bir işlemdir, diziyi sıralamak daha ucuzdur.

Ancak, bir el feneri miktarına sahip olmamak daha iyidir, ancak bir kopya ile idare etmeye çalışmak için yaklaşık olarak maksimumdur.

Örnek kod yazmayacağım. Normal bir programcının sadece bir ipucuna ihtiyacı vardır. İşte örnek bir algoritma:

  1. Kanalın geçtiği mesafedeki yaklaşık çubuk sayısını belirleyin. 15 olsun.
  2. Her iki gösterge arabelleğini kopyalayın.
  3. CopyRates() kullanarak çubuk değerleri kopyalama
  4. Döngüde, düşük çubukları kanalın alt sınırı ile karşılaştırırken aynı anda kanalın üst kenarlığı ve yüksek çubukların değerini karşılaştırmaya başlıyoruz. Kavşaklardan biri bulunursa, çubuk indeksini bir değişkende saklarız ve ikinci kesişimi aramaya devam ederiz. Çapraz çubuk indekslerinin her iki değişkeni de değere sahip olduğunda döngüden çıkarız.

Böylece, bir kopya ve bir döngüde, gerekirse iki kesişme bulunabilir. ArraySetAsSeries()'e bile gerek yoktur, çünkü kavşağı bulmak mümkündür ve bence çubuk numarasını değil, zamanını hatırlamak daha iyidir. Çubuğun zamanı bilinmesine rağmen, sayısını belirlemekte zorluk yoktur.

Soruya dikkat: Ne daha hızlı çalışacak, gösterge arabelleğini 1 değer kopyalayıp yüksek çubuğu 1 kopyalayıp bu değerleri karşılaştıran bir döngü veya bir kerelik belirli bir miktarı kopyalayıp iki dizinin değerlerini karşılaştıran bir döngü herbiri?

 

Daha dün yazdı:

Görev:

her onayda açık, yüksek, düşük, yakın ve zaman öğelerinin "InpCountCopy"sini alın.

Uygulama:

  1. "0"dan "InpCountCopy-1"e döngü - döngüde her seferinde bir açık, yüksek, düşük, kapalı ve zaman alırız.
  2. bir seferde öğeleri MqlRates "InpCountCopy" yapısına alırız ve ardından yapı boyunca döngü yaparız.

Fırsatlar:

nasıl kontrol edeceğinizi seçebilirsiniz: OnTick'te veya OnTimer'da (1 saniye).

 //+------------------------------------------------------------------+
//|                                      Copy OHLC vc Copy Rates.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.001"
//--- input parameter
input int InpCountCopy= 1000 ;
input bool OnTickOnTimer= false ; // OnTickOnTimer: false -> OnTick, true -> OnTimer 1 second
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   if (OnTickOnTimer)
       EventSetTimer ( 1 );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   if (OnTickOnTimer)
       return ;
   Testing();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   if (!OnTickOnTimer)
       return ;
   Testing();
  }
//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
void Testing()
  {
//--- for once one element
   ulong start= GetMicrosecondCount ();
   for ( int i= 0 ;i<InpCountCopy;i++) // in one operation we get one element.
     {
       double open= iOpen (i);
       double high= iHigh (i);
       double low= iLow (i);
       double close= iClose (i);
       datetime time= iTime (i);
     }
   ulong end= GetMicrosecondCount ()-start;
   string text=(OnTickOnTimer)? "OnTimer" : "OnTick" ;
   text=text+ "\n" + "OHLC: " + IntegerToString (end);

//--- for one operation we get "InpCountCopy" elements.
   start= GetMicrosecondCount ();
   MqlRates Rates[];
   if (!iRates(Rates, 0 ,InpCountCopy))
       return ;
   for ( int i= 0 ;i<InpCountCopy;i++)
     {
       double open=Rates[i].open;
       double high=Rates[i].high;
       double low=Rates[i].low;
       double close=Rates[i].close;
       datetime time=Rates[i].time;
     }
   end= GetMicrosecondCount ()-start;
   text=text+ "\n" + "Rates: " + IntegerToString (end);

   Comment (text);
  }
//+------------------------------------------------------------------+ 
//| Get Open for specified bar index                                 | 
//+------------------------------------------------------------------+ 
double iOpen ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   double Open [ 1 ];
   double open= 0 ;
   int copied= CopyOpen (symbol,timeframe,index, 1 , Open );
   if (copied== 1 )
      open= Open [ 0 ];
   return (open);
  }
//+------------------------------------------------------------------+ 
//| Get the High for specified bar index                             | 
//+------------------------------------------------------------------+ 
double iHigh ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   double High [ 1 ];
   double high= 0 ;
   int copied= CopyHigh (symbol,timeframe,index, 1 , High );
   if (copied== 1 )
      high= High [ 0 ];
   return (high);
  }
//+------------------------------------------------------------------+ 
//| Get Low for specified bar index                                  | 
//+------------------------------------------------------------------+ 
double iLow ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   double Low [ 1 ];
   double low= 0 ;
   int copied= CopyLow (symbol,timeframe,index, 1 , Low );
   if (copied== 1 )
      low= Low [ 0 ];
   return (low);
  }
//+------------------------------------------------------------------+ 
//| Get Close for specified bar index                                | 
//+------------------------------------------------------------------+ 
double iClose ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   double Close [ 1 ];
   double close= 0 ;
   int copied= CopyClose (symbol,timeframe,index, 1 , Close );
   if (copied== 1 )
      close= Close [ 0 ];
   return (close);
  }
//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   datetime Time [ 1 ];
   datetime time= 0 ;
   int copied= CopyTime (symbol,timeframe,index, 1 , Time );
   if (copied== 1 )
      time= Time [ 0 ];
   return (time);
  }
//+------------------------------------------------------------------+ 
//| Get Rates for specified bar index                                | 
//+------------------------------------------------------------------+ 
bool iRates( MqlRates   &Rates[], const int index, int count, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   int copied= CopyRates (symbol,timeframe,index,count,Rates);
   if (copied!=count)
       return ( false );
//---
   return ( true );
  }
//+------------------------------------------------------------------+


Dosyalar: