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

 
mwwm :

ve nasıl doğru yapılır?

Bunu nasıl yapıyorsun?
 
Artyom Trishkin :
Bunu nasıl yapıyorsun?
 int OnCalculate ( const int rates_total, 
                 const int prev_calculated, 
                 const datetime &time[], 
                 const double &Op[], 
                 const double &Hi[], 
                 const double &Lo[], 
                 const double &Cl[], 
                 const long &tick_volume[], 
                 const long &volume[], 
                 const int &spread[]) 
  { 
   ArraySetAsSeries (time, true ); 
   ArraySetAsSeries (Op, true ); 
   ArraySetAsSeries (Hi, true ); 
   ArraySetAsSeries (Lo, true ); 
   ArraySetAsSeries (Cl, true ); 
//--- 
double mas[];
   if (prev_calculated== 0 ) 
     { 
       int prices1= CopyOpen ( Symbol (), 0 , 0 , Bars ( _Symbol , _Period ),Op);
       int prices2= CopyHigh ( Symbol (), 0 , 0 , Bars ( _Symbol , _Period ),Hi); 
       int prices3= CopyLow ( Symbol (), 0 , 0 , Bars ( _Symbol , _Period ),Lo); 
       int prices4= CopyClose ( Symbol (), 0 , 0 , Bars ( _Symbol , _Period ),Cl); 
       int prices5= CopyTime ( Symbol (), 0 , 0 , Bars ( _Symbol , _Period ),time); 

     } 
   else 
     { 

       int prices1= CopyOpen ( Symbol (), 0 , 0 , 1 ,Op);
       int prices2= CopyHigh ( Symbol (), 0 , 0 , 1 ,Hi); 
       int prices3= CopyLow ( Symbol (), 0 , 0 , 1 ,Lo); 
       int prices4= CopyClose ( Symbol (), 0 , 0 , 1 ,Cl);     
       int prices5= CopyTime ( Symbol (), 0 , 0 , 1 ,time);     
       }   
       for ( int i=rates_total- 1 ;i>= 0 && ! IsStopped ();) {
      mas[i]=Op[i]/Cl[i];
      i--;
      }
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+-------------------------------

Bu şekilde basitleştirilmiş, CopyOpen, anladığım kadarıyla OnCalculate için gereksizdir, ancak bu nedenle yalnızca terminal penceresinden geçmişi mi görüyor?

 
mwwm :

Basitleştirilmiş, CopyOpen, anladığım kadarıyla OnCalculate için gereksiz, ancak yalnızca terminal penceresinden geçmişi mi görüyor?

Mas dizisi, her bir onay işaretinde sıfır boyutunda oluşturulur ve daha sonra boyutunu hiçbir yerde değiştirmez. Bu nedenle, ona herhangi bir erişim, bir dizinin sınırların dışına çıkmasına neden olur.

Sorunu çözmek için, ya boyutu geçmişin tüm çubuklarının okumalarına uyacak şekilde değiştirmeniz ya da gösterge arabelleğine bağlamanız gerekir (buna göre, bir global program değişkeni olarak bildirilmelidir). Sonuçta, doğru anlarsam, gösterge kullanılarak görüntülenmesi gereken bu değerlerdir.

 
mwwm :

Basitleştirilmiş, CopyOpen, anladığım kadarıyla OnCalculate için gereksiz, ancak yalnızca terminal penceresinden geçmişi mi görüyor?

Misal:

 //+------------------------------------------------------------------+
//|                                                         Test.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 1
#property indicator_plots    1
//--- plot OC
#property indicator_label1    "Open/Close"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- indicator buffers
double          BufferOC[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- Задаём массив BufferOC как буфер индикатора
   SetIndexBuffer ( 0 ,BufferOC, INDICATOR_DATA );
//--- Устанавливаем ему направление индексации как у таймсерии
   ArraySetAsSeries (BufferOC, 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< 1 ) return 0 ;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries (open, true );
   ArraySetAsSeries (close, true );
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if (limit> 1 ) // если это первый запуск, или изменение истории, или открытие нового бара
     {
      limit=rates_total- 1 ;                   // установим начало цикла на начало исторических данных
       ArrayInitialize (BufferOC, EMPTY_VALUE ); // инициализируем массив
     }
//--- Расчёт индикатора
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
       if (close[i]== 0 ) continue ;
      BufferOC[i]=open[i]/close[i];
     }

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Ihor Herasko :

Mas dizisi, her bir onay işaretinde sıfır boyutunda oluşturulur ve daha sonra boyutunu hiçbir yerde değiştirmez. Bu nedenle, ona herhangi bir erişim, bir dizinin sınırların dışına çıkmasına neden olur.

Sorunu çözmek için, ya boyutu geçmişin tüm çubuklarının okumalarına uyacak şekilde değiştirmeniz ya da gösterge arabelleğine bağlamanız gerekir (buna göre, bir global program değişkeni olarak bildirilmelidir). Sonuçta, doğru anlarsam, gösterge kullanılarak görüntülenmesi gereken bu değerlerdir.

Yanlışlığım, mas[] gerçekten küresel bir dizi olmalı, ancak gösterge arabelleği de uygun değil, bunun yerine çok boyutlu bir ara dizi olacak. Gösterge arabelleği aracılığıyla değil, M5 için en uygun dizi boyutunu belirlemenin en iyi yolu nedir?

 
mwwm :

Yanlışlığım, mas[] gerçekten küresel bir dizi olmalı, ancak gösterge arabelleği de uygun değil, bunun yerine çok boyutlu bir ara dizi olacak. Gösterge arabelleği aracılığıyla değil, M5 için en uygun dizi boyutunu belirlemenin en iyi yolu nedir?

Çok boyutlu hakkında - anlamadım. Sonuçta, tek boyutlu bir diziden bahsediyoruz. Ayrıca, MQL4'te maksimum dizi boyutları 4'tür.

Zaman serileriyle aynı boyutta bir dizi yapmak için, boyutunu, gerekli sembol ve periyodun grafiğinde bulunan çubukların sayısına göre değiştirmeniz gerekir:

 double fArray[];
int nBarsCnt = iBars (<символ>, <таймфрейм>);
if ( ArrayResize (fArray, nBarsCnt) != nBarsCnt)
{
   // Не удалось изменить размер массива
   return ;
}

ArraySetAsSeries (fArray, true );
 
mwwm :

Yanlışlığım, mas[] gerçekten küresel bir dizi olmalı, ancak gösterge arabelleği de uygun değil, bunun yerine çok boyutlu bir ara dizi olacak. Gösterge arabelleği aracılığıyla değil, M5 için en uygun dizi boyutunu belirlemenin en iyi yolu nedir?

Dizileri neden gösterge arabellekleri olarak kullanmak istemiyorsunuz? İşinizi kolaylaştıran bir alt sistem tarafından izlenirler.

Ve göstergenin ara dizi-tamponunun yapılması kolaydır:

 SetIndexBuffer ( 1 ,BufferMA, INDICATOR_CALCULATIONS );
 

Merhaba.

Platformda hacimler tıklanıyor, gerçek hacimler olacak mı?

 
Олег Литинский :

Merhaba.

Platformda hacimler tıklım tıklım, gerçek hacimler olacak mı?

olmaz. Bazı brokerlerin gerçek hacimler sağladığı MT5'i kullanın.

 

Tünaydın!

Lütfen aşağıdaki sorunla bana yardım edin:

1) Belirli koşullar yerine getirildikten sonra bekleyen bir emir açılır:

{
price= High [ 1 ]+OrderPoint* Point ;
stoploss= Low [ 1 ]- Point ;
takeprofit=price+price-stoploss;
OrderSend ( Symbol (), OP_BUYSTOP , 1 ,price, 3 ,stoploss,takeprofit);
}

Lütfen bana neyin ve nereye eklenmesi gerektiğini söyleyin, böylece fiyat zaten zararı durdurmayı geçmişse (bu açılmamış emrin) açılmamış bekleyen emrin silinmesi için.

Aptalca soru için özür dilerim, cevap ararken forumlarda kayboldum.

Şimdiden teşekkür ederim!