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

 
Vitaly Muzichenko :

Bir sonraki çubuğu karşılaştırın ve sıra bozulursa, bayrağı sıfırlayın ve kaçının doğru olduğunu yazın ve döngüde daha ileri gidin.

Çubuğun yükseliş olduğunu ve bir sonrakinin düşüş olduğunu, bir sonrakinin öncekiyle aynı olduğunu bulmak yeterlidir - değeri yazın ve bayrağı sıfırlayın. Peki, sonuna kadar

ama ilki nasıl olursa olsun boğa olmayabilir.

   for(int i=limit-1; i>0; i--)

     {


      if(open[i]<close[i]&&open[i+1]>close[i+1]&&open[i+3]<close[i+3])

        {

         up++;

        }

      else up=0;

    
    
if(max_c<up)max_c=up;

Comment(max_c);
}

//--- return value of prev_calculated for next call

   return(rates_total);

  }

 
PolarSeaman :

ama ilki nasıl olursa olsun boğa olmayabilir.

İşte bir seçenek, tamamen doğru olmasa da, geri sayım her zaman düşüş mumundan

Dosyalar:
aCandle.mq4  8 kb
 
Vitaly Muzichenko :

İşte bir seçenek, tamamen doğru olmasa da, geri sayım her zaman düşüş mumundan

Teşekkür ederim. Ortaya çıkan sayının karesi alınır ve bir eklenirse sonuç doğrudur.

if(i%2==0) kontrol ettiğimiz şey bu mu?
 
PolarSeaman :

ama ilki nasıl olursa olsun boğa olmayabilir.


İşte aynı mumlar için yaklaşık bir arama ve zincirin yönündeki bir değişiklik:

 //+------------------------------------------------------------------+
//|                                              CandlesSequence.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots    1
//--- plot Sequence
#property indicator_label1    "Sequence"
#property indicator_type1    DRAW_COLOR_HISTOGRAM
#property indicator_color1    clrGreen , clrRed , clrGray
#property indicator_style1    STYLE_SOLID
#property indicator_width1    2
//--- enums
enum ENUM_CANDLE_TYPE
  {
   CANDLE_TYPE_BULL  =   0 ,       // Bullish candle
   CANDLE_TYPE_BEAR  =   1 ,       // Bearish candle
   CANDLE_TYPE_DOJI  = - 1          // Doji candle
  };
//--- indicator buffers
double          BufferSeq[];
double          BufferSeqColors[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,BufferSeq, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,BufferSeqColors, INDICATOR_COLOR_INDEX );
//--- setting indicator parameters
   IndicatorSetString ( INDICATOR_SHORTNAME , "Candles sequence" );
   IndicatorSetInteger ( INDICATOR_DIGITS , Digits ());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries (BufferSeq, true );
   ArraySetAsSeries (BufferSeqColors, true );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//--- Проверка на минимальное колиество баров для расчёта
   if (rates_total< 2 ) return 0 ;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries (open, true );
   ArraySetAsSeries (high, true );
   ArraySetAsSeries (low, true );
   ArraySetAsSeries (close, true );
   ENUM_CANDLE_TYPE type_refs=CANDLE_TYPE_DOJI;
   ENUM_CANDLE_TYPE type_curr=CANDLE_TYPE_DOJI;
//--- Проверка и расчёт количества просчитываемых баров    
   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     {
      limit=rates_total- 2 ;
       ArrayInitialize (BufferSeq, EMPTY_VALUE );
      BufferSeq[rates_total- 1 ]=open[rates_total- 1 ];
     }
//--- Расчёт индикатора
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
      type_refs=GetTypeCandle(i+ 1 ,open,close);
      type_curr=GetTypeCandle(i,open,close);
   //--- смена направления цепочки свечей
       if (!CheckCandle(type_refs,type_curr))
        {
         BufferSeq[i]=(type_curr==CANDLE_TYPE_BULL ? low[i]: type_curr==CANDLE_TYPE_BEAR ? high[i]: open[i]);
        }
   //--- свечи одного типа
       else
        {
         BufferSeq[i]=BufferSeq[i+ 1 ];
        }
      BufferSeqColors[i]=(type_curr==CANDLE_TYPE_BULL ? 0 : type_curr==CANDLE_TYPE_BEAR ? 1 : 2 );
     }

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Возвращает тип свечи                                             |
//+------------------------------------------------------------------+
ENUM_CANDLE_TYPE GetTypeCandle( const int shift, const double &open[], const double &close[])
  {
   return (close[shift]>open[shift] ? CANDLE_TYPE_BULL : close[shift]<open[shift] ? CANDLE_TYPE_BEAR : CANDLE_TYPE_DOJI);
  }
//+------------------------------------------------------------------+
//| Сравнивает два типа свечей                                       |
//+------------------------------------------------------------------+
bool CheckCandle( const ENUM_CANDLE_TYPE reference_candle_type, const ENUM_CANDLE_TYPE checked_candle_type)
  {
   return (reference_candle_type==checked_candle_type ? true : false );
  }
//+------------------------------------------------------------------+

Artık zincirin devam ettiği yerde zincirdeki mum sayısını sayarak listeye kaydedebilir, zincirin yenisine dönüştüğü yerde yeni bir sayıma başlayabilirsiniz.

Her zincirdeki mum sayısı sıralı bir listede saklanabilir. Ayrıca listeyi sıralayarakmaksimum ve minimum dizileri bulabilirsiniz .

 
PolarSeaman :

Teşekkür ederim. Ortaya çıkan sayının karesi alınır ve bir eklenirse sonuç doğrudur.

if(i%2==0) kontrol ettiğimiz şey bu mu?

Eğer i ikinin katıysa.

i'nin 2'ye bölümünden kalan bu

 
Juer :

Derleme sırasında yerel değişkenlerin boyutu çok büyük (512kb'den fazla) çıkıyor.

Nereye bakmalı ve ne yapmalı? İşlevin bir dizi CArrayString dizisi var, bununla bir hatanın ilişkili olabileceğinden şüpheleniyorum.

Add() yöntemiyle dolduruyorum, sonra Clear() ve ardındanShutdown() yapıyorum. Ardından Add() yöntemini kullanarak tekrar yeni verilerle dolduruyorum. Bu durumda dizi tekrar sıfır elemanından mı doldurulacak?

Derleme aşamasında zaten hafızayı işgal eden sınıflardan bu tür üyeleri çıkarmak gerekir. Bu veriler, her zaman çok küçük olan yığın belleğine yerleştirilecektir. Sorunun çözümü, dinamik olarak çok fazla bellek kaplayan sınıf üyeleri için bellek ayırmaktır.

Örneğin, bir sınıf üyesi varsa:

 class A
{
   double m_arrfArray[ 9999999 ];
};

o zaman şununla değiştirilmelidir:

 class A
{
   double m_arrfMyArray[];
};

bool A::Init()
{
   if ( ArrayResize (m_arrfMyArray, 9999999 ) != 9999999 )
       return false ;
   ....
}
 
Ihor Herasko :

Derleme aşamasında zaten hafızayı işgal eden sınıflardan bu tür üyeleri çıkarmak gerekir. Bu veriler, her zaman çok küçük olan yığın belleğine yerleştirilecektir. Sorunun çözümü, dinamik olarak çok fazla bellek kaplayan sınıf üyeleri için bellek ayırmaktır.

Örneğin, bir sınıf üyesi varsa:

o zaman şununla değiştirilmelidir:

Teşekkür ederim. Her bir işlevdeki parametrelerden sınıfı kaldırarak bu sorundan bir şekilde kurtuldum. Genel olarak, tüm yöntemler için bu nesneyi bir kez başlatmak mümkündü.

CArray sınıfı veya daha doğrusu CArrayObj hakkında başka bir sorum var. Bir Delete() yöntemi var, ancak dizideki öğeyi kaydırmıyor mu? Yani, Sil(18) i silerim, bu konumdaki eleman silinir ve sonra, örneğin, bu dizinde bir eleman talep ederseniz, geçersiz bir işaretçi alırsınız. Elemanları kaldıran ve değiştiren bir yöntem var mı, böylece bu durumda 19. eleman, kaldırma işleminden sonra 18.'de biter?

 
Juer :

Teşekkür ederim. Her bir işlevdeki parametrelerden sınıfı kaldırarak bu sorundan bir şekilde kurtuldum. Genel olarak, bu nesneyi tüm yöntemler için bir kez başlatmak mümkündü.

CArray sınıfı veya daha doğrusu CArrayObj hakkında başka bir sorum var. İşte Delete() yöntemi, ancak dizideki öğeyi kaydırmıyor mu? Yani, Sil(18) i silerim, bu konumdaki eleman silinir ve sonra, örneğin, bu dizinde bir eleman talep ederseniz, geçersiz bir işaretçi alırsınız. Elemanları kaldıran ve değiştiren bir yöntem var mı, böylece bu durumda 19. eleman, kaldırma işleminden sonra 18.'de biter?

Standart kitaplıkla çalışmadı, ancak yardıma göre, Delete() yöntemi diziyi yeniden boyutlandırarak öğeyi fiziksel olarak kaldırmalıdır. İstisna: bellek yönetim mekanizması devre dışıysa. Bu mekanizma varsayılan olarak etkindir. Bellek yönetimi bayrağının durumunu kontrol etmek için FreeMode yöntemi kullanılır.

Benim açımdan, MQL'de kendi dizilerinizi kullanmanızı (C++'da vektörler ve listeler kullanmama rağmen) ve belleği kendim yönetmenizi tavsiye ederim, çünkü CArray sınıfında herhangi bir özel kolaylık veya avantaj görmüyorum. Kendi dizilerimde, bu yöntemi kullanarak bir dizi öğesini yeterince hızlı siliyorum:

 template < typename Array>
bool DeleteArrayElement(Array &array[], int nIndex)
{
   int nArraySize = ArraySize (array);
   if (nIndex < 0 || nIndex >= nArraySize)
       return true ;
   
   array[nIndex] = array[nArraySize - 1 ];
   return ( ArrayResize (array, nArraySize - 1 , ARRAY_RESERVE_SIZE) == nArraySize - 1 );
}

Tek dezavantajı, dizi öğelerinin sırasını korumamasıdır. Yani sıralı (sıralı) dışındaki tüm dizilere uygulanabilir.

 

Merhaba, lütfen bana MT4'te bir kerede mevcut fiyattan belirli sayıda puan için bekleyen alım ve satım emirleri vermenizi sağlayan bir komut dosyasını nerede bulabileceğinizi / indirebileceğinizi söyleyin, yani. manuel olarak saymamak ve hatta sipariş penceresine bile girmemek için? Teşekkür ederim.

Not: Belki yanlış bir şey soruyorum, hiç script kullanmadım.

 

Lütfen bana şu noktayı açıklayın - " StopLoss veya TakeProfit değerleri FreezeLevel parametresi gereksinimlerini ihlal ederse kapanış piyasa emirleri gerçekleştirilmez."

Bu tam anlamıyla, TakeProfit veya StopLoss donma seviyesiyle eşleşmeyen bir piyasa emrinin kapatılamayacağı anlamına mı geliyor? Açık bir piyasa emrinin StopLevel veya FreezeLevel kurallarını ihlal eden stoplara nasıl sahip olabileceğini tam olarak anlamıyorum? Sonuçta, yanlış durakları ayarlarken, sunucu sadece bir hata verecek ve hiçbir durak ayarlanmayacaktır.

Ayrıca, komisyoncu FreezeLevel kullandığında bir piyasa emrini kapatırken bilmeniz gereken başka ne varsa lütfen söyleyin?

Требования и ограничения при проведении торговых операций - Приложения - Учебник по MQL4
Требования и ограничения при проведении торговых операций - Приложения - Учебник по MQL4
  • book.mql4.com
В таблицах указаны расчётные значения, ограничивающие проведение торговых операций при открытии, закрытии, установке, удалении и модификации ордеров. Для получения значения минимальной дистанции StopLevel и дистанции заморозки FreezeLevel необходимо вызвать функцию MarketInfo(). Требования. Правильные цены, используемые при осуществлении...