Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 120

 
Vitaly Muzichenko:
Ich würde es so machen:

Alexey Kozitsyn:
Auf den ersten Blick hätte ich es anders gemacht.

Danke für die vorgeschlagenen Varianten - ich werde das prüfen. Ich wollte nur nicht, um neue Arrays zu erstellen - ich verstehe nicht, warum ArrayCopy nicht korrekt in meinem Code funktioniert ?

 

Es stellte sich heraus, dass ich vergessen hatte, eine Variable in der Funktion ganz zum Schluss anzugeben - die Anzahl der zu kopierenden Elemente. Standardmäßig wird das gesamte Array kopiert (count=WHOLE_ARRAY).

ArrayCopy(summDelta,summDelta,i-CalcZrero,i,1);
 
-Aleks-:

Vielen Dank für die Vorschläge - ich werde mich darum kümmern. Ich wollte nur nicht, um neue Arrays zu erstellen - ich verstehe nicht, warum ArrayCopy nicht korrekt in meinem Code funktioniert ?

Ich weiß nicht, ich weiß nicht, welche Variante schneller funktionieren wird. Schließlich kopieren Sie ein Array umso häufiger in ein anderes, je öfter Sie Nullwerte in dem Array haben.
 
Alexey Kozitsyn:
Ich weiß nicht, ich weiß nicht, welche Variante schneller funktionieren wird. Schließlich kopieren Sie ein Array umso häufiger in ein anderes, je öfter Sie Nullwerte in dem Array haben.

Dort wird nur ein letzter Wert kopiert. Über die Geschwindigkeit - ich weiß nicht, ich habe nicht überprüft - für jetzt möchte ich nur den Code nicht zu groß sein - nur bewusst sein....

 
Здравствуйте уважаемые форумчане. Попытался совместить два индикатора в одном. Но рисует только одну линию. Подскажите пожалуйста где надо подправить код.


//---- номер версии индикатора
#property version   "1.00"
//---- отрисовка индикатора в главном окне
#property indicator_chart_window
#property indicator_chart_window

//---- количество индикаторных буферов
#property indicator_buffers 2
//---- использовано всего одно графическое построение
#property indicator_plots   2
//+-----------------------------------+
//|  объявление констант              |
//+-----------------------------------+
#define RESET 0 // Константа для возврата терминалу команды на пересчёт индикатора
//+-----------------------------------+
//|  Параметры отрисовки индикатора   |
//+-----------------------------------+
//---- отрисовка индикатора в виде линии
#property indicator_type1   DRAW_LINE
#property indicator_type2   DRAW_LINE
//---- в качестве цвета бычей линии индикатора использован красный цвет
#property indicator_color1 Red
#property indicator_color2 Yellow

//---- линия индикатора - непрерывная кривая
#property indicator_style1  STYLE_SOLID
#property indicator_style2  STYLE_SOLID
//---- толщина линии индикатора равна 3
#property indicator_width1  3
#property indicator_width2  3
//---- отображение лэйбы индикатора
#property indicator_label1  "Geo_ShowOpenMonthLevel"
#property indicator_label2  "Geo_ShowOpenWeekLevel"
//+-----------------------------------+
//|  ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА     |
//+-----------------------------------+
input int Shift=0; // сдвиг индикатора по горизонтали в барах
//+-----------------------------------+
//---- индикаторный буфер
double IndBuffer1[];
double IndBuffer2[];
//---- Объявление целых переменных начала отсчёта данных
int min_rates_total;
//+------------------------------------------------------------------+    
//| Geo_ShowOpenDayLevel indicator initialization function           |
//+------------------------------------------------------------------+  
void OnInit()
  {
//---- Инициализация переменных начала отсчёта данных
   min_rates_total=3;
//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(0,IndBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,IndBuffer2,INDICATOR_DATA);
//---- осуществление сдвига индикатора по горизонтали на Shift
   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчёта отрисовки индикатора
//   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,2);
//   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,2);
//---- установка значений индикатора, которые не будут видимы на графике
//   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries(IndBuffer1,true);
   ArraySetAsSeries(IndBuffer2,true);
//---- инициализации переменной для короткого имени индикатора
   string shortname;
   StringConcatenate(shortname,"Geo_ShowOpenDayLevel( Shift = ",Shift,")");
//--- создание имени для отображения в отдельном подокне и во всплывающей подсказке
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- определение точности отображения значений индикатора
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//---- завершение инициализации
  }
//+------------------------------------------------------------------+  
//| Geo_ShowOpenDayLevel 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<min_rates_total||Period()>PERIOD_D1) return(RESET);

//---- Объявление целых переменных
   int limit,bar;
//---- Объявление переменных с плавающей точкой  
   double DOpen[1];
   datetime DTime[1];
   static uint LastCountBar;

//---- расчёты необходимого количества копируемых данных и
//стартового номера limit для цикла пересчёта баров
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора
     {
      limit=rates_total-min_rates_total-1; // стартовый номер для расчёта всех баров
      LastCountBar=rates_total;
     }
   else limit=int(LastCountBar)+rates_total-prev_calculated; // стартовый номер для расчёта новых баров

//---- индексация элементов в массивах как в таймсериях  
   ArraySetAsSeries(time,true);

//---- Основной цикл расчёта индикатора
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      LastCountBar=bar;
      //---- обнулим содержимое индикаторных буферов до расчёта
      IndBuffer1[bar]=EMPTY_VALUE;
      IndBuffer2[bar]=EMPTY_VALUE;
      //---- копируем вновь появившиеся данные в массив
      if(CopyTime(Symbol(),PERIOD_MN1,time[bar],1,DTime)<=0) return(RESET);
      if(CopyTime(Symbol(),PERIOD_W1, time[bar],1,DTime)<=0) return(RESET);
      if(time[bar]>=DTime[0] && time[bar+1]<DTime[0])
        {
         //---- копируем вновь появившиеся данные в массив
         if(CopyOpen(Symbol(),PERIOD_MN1,time[bar],1,DOpen)<=0) return(RESET);
         if(CopyOpen(Symbol(),PERIOD_W1, time[bar],1,DOpen)<=0) return(RESET);
         //---- Загрузка полученных значений в индикаторные буферы
         IndBuffer1[bar]=DOpen[0];
         IndBuffer2[bar]=DOpen[0];
        }

      if(IndBuffer1[bar+1]!=EMPTY_VALUE && IndBuffer1[bar]==EMPTY_VALUE) IndBuffer1[bar]=IndBuffer1[bar+1];
      if(IndBuffer2[bar+1]!=EMPTY_VALUE && IndBuffer2[bar]==EMPTY_VALUE) IndBuffer2[bar]=IndBuffer2[bar+1];
     }
//----
  return(rates_total);
  }
 
Hallo. Bitte beraten Sie, wie man in den Code von MQL4 EA die Regel der Eröffnung einer Bestellung vorschreiben: es sollte eine Bestellung mit einer bestimmten magischen Zahl auf dem Markt sein, und wenn es keine solche Bestellung, wird der EA nicht öffnen etwas nach seinem Haupt-Algorithmus.
 
var58:
Hallo. Bitte beraten Sie, wie man in MQL4 EA-Code die Regel der Eröffnung einer Bestellung vorschreiben: es sollte eine Bestellung mit einer bestimmten magischen Zahl auf dem Markt sein; wenn es keine solche Bestellung, wird der EA nicht öffnen etwas nach seinem Haupt-Algorithmus.
Sie sollten alle Marktaufträge und ihren magischen Code in der Schleife überprüfen. Wenn der Orden mit einer solchen Magie existiert, dann ...
 
Artyom Trishkin:
Überprüfen Sie alle Marktaufträge und deren Assistenten in der Schleife. Wenn ein Orden mit einer solchen Magie existiert, dann ...

Können Sie mir sagen, wie diese Schleife im Code implementiert ist?

 
var58:

Können Sie mir sagen, wie ich diese Schleife in den Code schreiben soll?

Ein wenig später. Ich schreibe von meinem Handy aus.
 
Artyom Trishkin:
Ein wenig später. Ich schreibe von meinem Handy aus.
Ich danke Ihnen.
Grund der Beschwerde: