初学者的问题 MQL5 MT5 MetaTrader 5 - 页 573

 
Andrey Koldorkin:

我看看我能想出什么办法。谢谢。(笑)。

不客气。它只是把所有的高点保存到一个数组中,然后在一个循环中把数组中保存的所有数据打印到日志中。

这个脚本不一定能完全按照你的要求去做。它只是显示了数据是如何存储在数组中的。

 
Artyom Trishkin:

一点也不。它只是将所有的高点保存到一个数组中,然后在日志的一个循环中打印出保存在数组中的所有数据。

这个脚本不一定能完全满足你的需要。它只是显示了在数组中保存数据的原理。

这正是我在寻找的东西。我需要它以某种方式将我选择的时期的数据保存到一个数组中。这是我从你那里理解的部分。

现在我的问题是,我怎样才能访问和比较阵列中的记录数据?

在这里,它变成了迭代,一步一步地写入数组。这很好。但现在我们需要将这些元素相互比较。

是否有必要声明一个新的迭代计数,然后检索数据并以某种方式进行比较?但这又得把结果写在某个地方,而且......。一切最终都会重复。

粗略地说,如果比较期是5-7个烛台,那么第一个烛台应该与其他6个烛台进行比较,然后是第二个,依此类推....。如果两个或更多的烛台有相同的高点,那么首先,你应该计算这个高点,其次,你应该找到最低低点的烛台。即在最后调用具体烛台的功能,以获取其所有参数。

一般情况下,是否可以这样做?

 
Andrey Koldorkin:

这正是我在寻找的。我需要它以某种方式将我所选择的时期的数据存储在一个数组中。我理解这部分。

现在我的问题是,我怎样才能访问和比较阵列中的记录数据?

在这里,它变成了迭代,一步一步地写入数组。这很好。但现在我们需要将这些元素相互比较。

是否有必要声明一个新的迭代计数,然后检索数据并以某种方式进行比较?但这又得把结果写在某个地方,而且......。一切最终都会重复。

粗略地说,如果比较期是5-7个烛台,那么第一个烛台应该与其他6个烛台进行比较,然后是第二个,依此类推....。如果两个或更多的烛台有相同的高点,那么首先,你应该计算这个高点,其次,你应该找到最低低点的烛台。即在最后调用具体烛台的功能,以获取其所有参数。

但这有可能做到吗?

在这里,我们只是在询问保存的数组,并在日志中显示所有保存的数据。

for(int i=0; i<ArrayRange(mass_high,0); i++) {
   printf("Время: %s, High: %.5f",TimeToString((int)mass_high[i][1],TIME_DATE|TIME_MINUTES),mass_high[i][0]);
   }

让我们更具体地了解这项任务。

我们需要找到......保存的数组中的具体内容?

 
Artyom Trishkin:

这是对保存的阵列进行询问的地方,所有保存的数据都被记录下来。

让我们把任务具体化。

我们需要在保存的数组中找到......到底是什么?

我需要为所有已关闭的蜡烛(即当前的蜡烛不计算在内)记录一个数据数组--在设置中指定的期间的高点、低点、开盘、收盘蜡烛(4个参数)。- 它是。

接下来,我需要比较参数。假设搜索周期等于10个烛台。这里我们需要检查10个蜡烛图期间的所有高点。如果有两个或更多的匹配,我们应该返回。

1.标志 - "有一个匹配"。

1.烛台具有相同价值的高值。

2.这些蜡烛图的编号,所以我们可以参考它们,找出它们的低点、收盘、开盘参数。

总的来说,我很理解这个怎么做。

不清楚的是如何参考那些形成水平的蜡烛图。理想情况下,在重新计算时,我们可以记住迭代次数(i),但首先有一个重新计算,根据这个重新计算的日志被写入,它不能被应用。

而在该变体中,正如输出日志记录的那样--这也不是所需要的。

我的理解是,我需要先取一个蜡烛图1,与其他9个蜡烛图进行比较,如果有匹配的,就提取这些蜡烛图的编号和它们的参数,打开复选框。然后将蜡烛2与其他蜡烛一起检查,这样一直检查到样本的中间,因为那时将只从另一侧进行重复的比较。

如果烛台的数量是固定的,我就会这样写--大概是5个比较周期。但这就是问题所在--如何使这种重新计算在任何样本量下都成为可能。

 
Andrey Koldorkin:

我需要为所有已关闭的蜡烛(即当前的蜡烛不计算在内)写一个数据数组--在设置中指定的时期的高点、低点、开盘、收盘蜡烛(4个参数)。- 它是。

接下来,我需要比较参数。假设搜索周期等于10个烛台。这里我们需要检查10个蜡烛图期间的所有高点。如果有两个或更多的匹配,我们应该返回。

1.标志 - "有一个匹配"。

1.烛台具有相同价值的高值。

2.这些蜡烛图的编号,所以我们可以参考它们,找出它们的低点、收盘、开盘参数。

总的来说,我很理解这个怎么做。

不清楚的是如何参考那些形成水平的蜡烛图。理想情况下,当重新计算时,我们可以记住迭代次数(i),但首先我们有一个重新计算,根据这个重新计算,日志被写入,它不能被应用。

而在该变体中,正如输出日志记录的那样--这也不是所需要的。

我的理解是,我需要先取一个蜡烛图1,与其他9个蜡烛图进行比较,如果有匹配的,就提取这些蜡烛图的数字和它们的参数,打开复选框。然后将蜡烛2与其他蜡烛一起检查,以此类推,直到样本的中间,因为那时将只从另一侧进行重复的比较。

如果烛台的数量是固定的,我就会这样写--大概是5个比较周期。但这就是问题所在--如何使这种重新计算对任何样本量都是可能的。

顺便说一下,价格值的完全重合不太可能经常出现。我们需要设置一些delta,如果价格差异不超过这个值,就认为是巧合。

因此,如果我们需要为范围内的每个蜡烛图提供一个单独的匹配蜡烛图列表,我会尝试使用一个结构数组。我会考虑一下,然后告诉你。
 
Andrey Koldorkin:

我需要为所有已关闭的蜡烛(即当前的蜡烛不计算在内)写一个数据数组--在设置中指定的时期的高点、低点、开盘、收盘蜡烛(4个参数)。- 它是。

接下来,我需要比较参数。假设搜索周期等于10个烛台。这里我们需要检查10个蜡烛图期间的所有高点。如果有两个或更多的匹配,我们应该返回。

1.标志 - "有一个匹配"。

1.烛台具有相同价值的高值。

2.这些蜡烛图的编号,所以我们可以参考它们,找出它们的低点、收盘、开盘参数。

总的来说,我很理解这个怎么做。

不清楚的是如何参考那些形成水平的蜡烛图。理想情况下,在重新计算时,我们可以记住迭代次数(i),但首先有一个重新计算,根据这个重新计算的日志被写入,它不能被应用。

而在这个变体中,正如输出日志记录的那样--这里也不是所需的。

我的理解是,我需要先取一个蜡烛图1,与其他9个蜡烛图进行比较,如果有匹配的,就提取这些蜡烛图的编号及其参数,打开复选框。然后将蜡烛2与其他蜡烛一起检查,以此类推,直到样品的中间,因为那时将只从另一侧进行重复的比较。

如果烛台的数量是固定的,我就会这样写--大概是5个比较周期。但这就是问题所在--如何使这种重新计算对任何样本量都是可能的。

取而代之的是标志 "巧合 "设置的计数器,在数值高的地方计数器是最大的,有一个电平

高值可以四舍五入,例如1.23456改为1.2346

和1.23462四舍五入为1.2346

因为在10个蜡烛图中,不太可能有两个蜡烛图的高点是1.23456。

因此,从水平上看,舞蹈

而且烛台的数量是固定的,你将一定数量的数据写入结构中

即写在结构中的蜡烛图的数量与迭代的数量相同

 
Andrey Koldorkin:

我需要为所有已关闭的蜡烛(即当前的蜡烛不计算在内)写一个数据数组--在设置中指定的时期的高点、低点、开盘、收盘蜡烛(4个参数)。- 它是。

接下来,我需要比较参数。假设搜索周期等于10个烛台。这里我们需要检查10个蜡烛图期间的所有高点。如果有两个或更多的匹配,我们应该返回。

1.标志 - "有一个匹配"。

1.烛台具有相同价值的高值。

2.这些蜡烛图的编号,所以我们可以参考它们,找出它们的低点、收盘、开盘参数。

总的来说,我很理解这个怎么做。

不清楚的是如何参考那些形成水平的蜡烛图。理想情况下,当重新计算时,我们可以记住迭代次数(i),但首先我们有一个重新计算,根据这个重新计算,日志被写入,它不能被应用。

而在这个变体中,正如输出日志记录的那样--这里也不是所需的。

我的理解是,我需要先取一个蜡烛图1,与其他9个蜡烛图进行比较,如果有匹配的,就提取这些蜡烛图的编号及其参数,打开复选框。然后将蜡烛2与其他蜡烛一起检查,这样一直检查到样本的中间,因为那时将只从另一侧进行重复的比较。

如果烛台的数量是固定的,我就会这样写--大概是5个比较周期。但问题是:如何使这种重新计算对任何样本量都是可能的。

这是一个有趣的任务,但你对如何解决这个问题的理解并不正确,因为到目前为止,你并没有太多的编程知识。

你看:你有一些套路的报价。你的任务是只从这一组中选择那些符合某些条件的酒吧。例如,你想得到一个条形图的集合,其高点是相互重合的。事实上,选择的条件可以有很多,而且可以随着时间的推移增加。 一旦你有了一个酒吧的集合,你可以很容易地分析它们的任何其他参数。

因此,对于你的任务,你需要写一个函数,返回一个满足特定条件的条形数组(伪代码)。

массив_баров = ПолучитьНужныеБары(Символ(), Таймфрейм(), Период(), УсловиеОтбора);
也就是说,记忆和迭代一些数据和索引确实没有问题。你不需要条形图本身的索引,而是需要一个满足特定条件的特定集合。一旦你拥有它,你就能一举解决很多问题。
 
Artyom Trishkin:
因此,如果我们需要为范围内的每个烛台提供不同的匹配烛台列表,我会尝试使用结构数组。我会考虑一下,然后告诉你。

思想。我正在写一个测试脚本。

//+------------------------------------------------------------------+
//|                                                     TestCopy.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int Search_Period=10;   // Количество копируемых свечей
int searchPeriod=(Search_Period<1)?1:Search_Period;
input int Delta=2;            // Количество пунктов допуска
int delta=(Delta<0)?0:Delta;
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;    // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];    // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей
   int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);  // копируем данные
   if(copied>0) {                                                    // если скопировали
      ArrayResize(dataCandle,copied);                                // задаём размер структуры равным числу скопированных данных
      ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре
      //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
      for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"
         dataCandle[i].reference_candle.high=array[i].high;          // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;            // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;          // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size=0;                                                 // размер массива совпадающих свечей
         ArrayResize(dataCandle[i].matched_candles,size);            // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                          // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for(int j=i+1; j<copy_bars; j++) {                          // в цикле от i+1 до copy_bars
            //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину delta*Point)
            if(NormalizeDouble(delta*Point()-fabs(array[i].high-array[j].high),Digits())>=0) {
               size++;                                               
               ArrayResize(dataCandle[i].matched_candles,size);            // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                          // запишем количество совпадений
               dataCandle[i].matched_candles[size-1].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size-1].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size-1].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   for(int i=0; i<ArraySize(dataCandle)-1; i++) {
      string refs_txt="";
      string matched_txt="";
      refs_txt="Свеча "+IntegerToString(i,2,'0')+": время "+TimeToString(dataCandle[i].reference_candle.time)+", high: "+DoubleToString(dataCandle[i].reference_candle.high,Digits())+" имеет совпадений: "+(string)dataCandle[i].number_matched+" шт. ";
      if(dataCandle[i].number_matched>0) {
         for(int j=0; j<ArraySize(dataCandle[i].matched_candles); j++) {
            matched_txt="Совпадение "+IntegerToString(j+1)+": "+TimeToString(dataCandle[i].matched_candles[j].time)+", high: "+DoubleToString(dataCandle[i].matched_candles[j].high,Digits());
            }
         }
      Print(refs_txt,matched_txt);
      }
  }
//+------------------------------------------------------------------+

试图描述所有的步骤。

在循环中填入所有匹配的数据后,我们有一个包含所有烛台及其匹配烛台的数组。之后,你可以在其中寻找低位。而且你可以在循环中直接组织。这对你来说更方便。

 

那么,这里有另一种方法:为范围内的每个蜡烛写上火柴。在以前的版本中,只为一支蜡烛写了匹配--也就是说,没有为与这支蜡烛匹配的蜡烛写匹配。

//+------------------------------------------------------------------+
//|                                                     TestCopy.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int Search_Period=10;   // Количество копируемых свечей
int searchPeriod=(Search_Period<1)?1:Search_Period;
input int Delta=2;            // Количество пунктов допуска
int delta=(Delta<0)?0:Delta;
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;    // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];    // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей
   int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);  // копируем данные
   if(copied>0) {                                                    // если скопировали
      ArrayResize(dataCandle,copied);                                // задаём размер структуры равным числу скопированных данных
      ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре
      //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
      for(int i=0; i<copy_bars; i++) {                               // цикл по скопированным данным от начала до конца
         dataCandle[i].reference_candle.high=array[i].high;          // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;            // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;          // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size=0;                                                 // размер массива совпадающих свечей
         ArrayResize(dataCandle[i].matched_candles,size);            // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                          // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for(int j=0; j<copy_bars; j++) {                            // в цикле от 0 до copy_bars
            if(j==i) continue;                                       // пропустим свечу "саму себя"
            //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину Point)
            if(NormalizeDouble(delta*Point()-fabs(array[i].high-array[j].high),Digits())>=0) {
               size++;                                               
               ArrayResize(dataCandle[i].matched_candles,size);            // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                          // запишем количество совпадений
               dataCandle[i].matched_candles[size-1].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size-1].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size-1].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   for(int i=0; i<ArraySize(dataCandle)-1; i++) {
      string refs_txt="";
      string matched_txt="";
      refs_txt="Свеча "+IntegerToString(i,2,'0')+": время "+TimeToString(dataCandle[i].reference_candle.time)+", high: "+DoubleToString(dataCandle[i].reference_candle.high,Digits())+" имеет совпадений: "+(string)dataCandle[i].number_matched+" шт. ";
      if(dataCandle[i].number_matched>0) {
         for(int j=0; j<ArraySize(dataCandle[i].matched_candles); j++) {
            matched_txt+=" Совпадение "+IntegerToString(j+1)+": "+TimeToString(dataCandle[i].matched_candles[j].time)+", high: "+DoubleToString(dataCandle[i].matched_candles[j].high,Digits());
            }
         }
      Print(refs_txt,matched_txt);
      }
  }
//+------------------------------------------------------------------+
 
在买入或熊市握手信号时开仓的想法,如何让它只有一个买入/卖出交易和一个挂单 交易,我在交易的每一个刻度上都有一个开仓。帮助解决这个问题。
附加的文件:
ritfv.png  46 kb
ohs.txt  5 kb