//+------------------------------------------------------------------+//| 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 parametersinputint Search_Period=10; // Количество копируемых свечейint searchPeriod=(Search_Period<1)?1:Search_Period;
inputint Delta=2; // Количество пунктов допускаint delta=(Delta<0)?0:Delta;
MqlRates array[]; // Массив структур для копирования Open, High, Low, Close, Timestruct DataCandle // Структура для хранения всех совпадений
{
int number_matched; // Количество совпаденийMqlRates reference_candle; // Данные эталонной свечиMqlRates matched_candles[]; // Массив свечей, совпадающих с эталонной по нужному критерию
};
DataCandle dataCandle[]; // Массив структур данных свечей и их совпадений//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---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 для вывода в журнал//--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла iint size=0; // размер массива совпадающих свечейArrayResize(dataCandle[i].matched_candles,size); // Размер массива совпадений в ноль
dataCandle[i].number_matched=size; // Инициализируем количество совпадений нулём//--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом ifor(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 parametersinputint Search_Period=10; // Количество копируемых свечейint searchPeriod=(Search_Period<1)?1:Search_Period;
inputint Delta=2; // Количество пунктов допускаint delta=(Delta<0)?0:Delta;
MqlRates array[]; // Массив структур для копирования Open, High, Low, Close, Timestruct DataCandle // Структура для хранения всех совпадений
{
int number_matched; // Количество совпаденийMqlRates reference_candle; // Данные эталонной свечиMqlRates matched_candles[]; // Массив свечей, совпадающих с эталонной по нужному критерию
};
DataCandle dataCandle[]; // Массив структур данных свечей и их совпадений//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---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 для вывода в журнал//--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла iint size=0; // размер массива совпадающих свечейArrayResize(dataCandle[i].matched_candles,size); // Размер массива совпадений в ноль
dataCandle[i].number_matched=size; // Инициализируем количество совпадений нулём//--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом ifor(int j=0; j<copy_bars; j++) { // в цикле от 0 до copy_barsif(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);
}
}
//+------------------------------------------------------------------+
我看看我能想出什么办法。谢谢。(笑)。
不客气。它只是把所有的高点保存到一个数组中,然后在一个循环中把数组中保存的所有数据打印到日志中。
这个脚本不一定能完全按照你的要求去做。它只是显示了数据是如何存储在数组中的。
一点也不。它只是将所有的高点保存到一个数组中,然后在日志的一个循环中打印出保存在数组中的所有数据。
这个脚本不一定能完全满足你的需要。它只是显示了在数组中保存数据的原理。
这正是我在寻找的东西。我需要它以某种方式将我选择的时期的数据保存到一个数组中。这是我从你那里理解的部分。
现在我的问题是,我怎样才能访问和比较阵列中的记录数据?
在这里,它变成了迭代,一步一步地写入数组。这很好。但现在我们需要将这些元素相互比较。
是否有必要声明一个新的迭代计数,然后检索数据并以某种方式进行比较?但这又得把结果写在某个地方,而且......。一切最终都会重复。
粗略地说,如果比较期是5-7个烛台,那么第一个烛台应该与其他6个烛台进行比较,然后是第二个,依此类推....。如果两个或更多的烛台有相同的高点,那么首先,你应该计算这个高点,其次,你应该找到最低低点的烛台。即在最后调用具体烛台的功能,以获取其所有参数。
一般情况下,是否可以这样做?
这正是我在寻找的。我需要它以某种方式将我所选择的时期的数据存储在一个数组中。我理解这部分。
现在我的问题是,我怎样才能访问和比较阵列中的记录数据?
在这里,它变成了迭代,一步一步地写入数组。这很好。但现在我们需要将这些元素相互比较。
是否有必要声明一个新的迭代计数,然后检索数据并以某种方式进行比较?但这又得把结果写在某个地方,而且......。一切最终都会重复。
粗略地说,如果比较期是5-7个烛台,那么第一个烛台应该与其他6个烛台进行比较,然后是第二个,依此类推....。如果两个或更多的烛台有相同的高点,那么首先,你应该计算这个高点,其次,你应该找到最低低点的烛台。即在最后调用具体烛台的功能,以获取其所有参数。
但这有可能做到吗?
在这里,我们只是在询问保存的数组,并在日志中显示所有保存的数据。
让我们更具体地了解这项任务。
我们需要找到......保存的数组中的具体内容?
这是对保存的阵列进行询问的地方,所有保存的数据都被记录下来。
让我们把任务具体化。
我们需要在保存的数组中找到......到底是什么?
我需要为所有已关闭的蜡烛(即当前的蜡烛不计算在内)记录一个数据数组--在设置中指定的期间的高点、低点、开盘、收盘蜡烛(4个参数)。- 它是。
接下来,我需要比较参数。假设搜索周期等于10个烛台。这里我们需要检查10个蜡烛图期间的所有高点。如果有两个或更多的匹配,我们应该返回。
1.标志 - "有一个匹配"。
1.烛台具有相同价值的高值。
2.这些蜡烛图的编号,所以我们可以参考它们,找出它们的低点、收盘、开盘参数。
总的来说,我很理解这个怎么做。
不清楚的是如何参考那些形成水平的蜡烛图。理想情况下,在重新计算时,我们可以记住迭代次数(i),但首先有一个重新计算,根据这个重新计算的日志被写入,它不能被应用。
而在该变体中,正如输出日志记录的那样--这也不是所需要的。
我的理解是,我需要先取一个蜡烛图1,与其他9个蜡烛图进行比较,如果有匹配的,就提取这些蜡烛图的编号和它们的参数,打开复选框。然后将蜡烛2与其他蜡烛一起检查,这样一直检查到样本的中间,因为那时将只从另一侧进行重复的比较。
如果烛台的数量是固定的,我就会这样写--大概是5个比较周期。但这就是问题所在--如何使这种重新计算在任何样本量下都成为可能。
我需要为所有已关闭的蜡烛(即当前的蜡烛不计算在内)写一个数据数组--在设置中指定的时期的高点、低点、开盘、收盘蜡烛(4个参数)。- 它是。
接下来,我需要比较参数。假设搜索周期等于10个烛台。这里我们需要检查10个蜡烛图期间的所有高点。如果有两个或更多的匹配,我们应该返回。
1.标志 - "有一个匹配"。
1.烛台具有相同价值的高值。
2.这些蜡烛图的编号,所以我们可以参考它们,找出它们的低点、收盘、开盘参数。
总的来说,我很理解这个怎么做。
不清楚的是如何参考那些形成水平的蜡烛图。理想情况下,当重新计算时,我们可以记住迭代次数(i),但首先我们有一个重新计算,根据这个重新计算,日志被写入,它不能被应用。
而在该变体中,正如输出日志记录的那样--这也不是所需要的。
我的理解是,我需要先取一个蜡烛图1,与其他9个蜡烛图进行比较,如果有匹配的,就提取这些蜡烛图的数字和它们的参数,打开复选框。然后将蜡烛2与其他蜡烛一起检查,以此类推,直到样本的中间,因为那时将只从另一侧进行重复的比较。
如果烛台的数量是固定的,我就会这样写--大概是5个比较周期。但这就是问题所在--如何使这种重新计算对任何样本量都是可能的。
顺便说一下,价格值的完全重合不太可能经常出现。我们需要设置一些delta,如果价格差异不超过这个值,就认为是巧合。
我需要为所有已关闭的蜡烛(即当前的蜡烛不计算在内)写一个数据数组--在设置中指定的时期的高点、低点、开盘、收盘蜡烛(4个参数)。- 它是。
接下来,我需要比较参数。假设搜索周期等于10个烛台。这里我们需要检查10个蜡烛图期间的所有高点。如果有两个或更多的匹配,我们应该返回。
1.标志 - "有一个匹配"。
1.烛台具有相同价值的高值。
2.这些蜡烛图的编号,所以我们可以参考它们,找出它们的低点、收盘、开盘参数。
总的来说,我很理解这个怎么做。
不清楚的是如何参考那些形成水平的蜡烛图。理想情况下,在重新计算时,我们可以记住迭代次数(i),但首先有一个重新计算,根据这个重新计算的日志被写入,它不能被应用。
而在这个变体中,正如输出日志记录的那样--这里也不是所需的。
我的理解是,我需要先取一个蜡烛图1,与其他9个蜡烛图进行比较,如果有匹配的,就提取这些蜡烛图的编号及其参数,打开复选框。然后将蜡烛2与其他蜡烛一起检查,以此类推,直到样品的中间,因为那时将只从另一侧进行重复的比较。
如果烛台的数量是固定的,我就会这样写--大概是5个比较周期。但这就是问题所在--如何使这种重新计算对任何样本量都是可能的。
取而代之的是标志 "巧合 "设置的计数器,在数值高的地方计数器是最大的,有一个电平
高值可以四舍五入,例如1.23456改为1.2346
和1.23462四舍五入为1.2346
因为在10个蜡烛图中,不太可能有两个蜡烛图的高点是1.23456。
因此,从水平上看,舞蹈
而且烛台的数量是固定的,你将一定数量的数据写入结构中
即写在结构中的蜡烛图的数量与迭代的数量相同
我需要为所有已关闭的蜡烛(即当前的蜡烛不计算在内)写一个数据数组--在设置中指定的时期的高点、低点、开盘、收盘蜡烛(4个参数)。- 它是。
接下来,我需要比较参数。假设搜索周期等于10个烛台。这里我们需要检查10个蜡烛图期间的所有高点。如果有两个或更多的匹配,我们应该返回。
1.标志 - "有一个匹配"。
1.烛台具有相同价值的高值。
2.这些蜡烛图的编号,所以我们可以参考它们,找出它们的低点、收盘、开盘参数。
总的来说,我很理解这个怎么做。
不清楚的是如何参考那些形成水平的蜡烛图。理想情况下,当重新计算时,我们可以记住迭代次数(i),但首先我们有一个重新计算,根据这个重新计算,日志被写入,它不能被应用。
而在这个变体中,正如输出日志记录的那样--这里也不是所需的。
我的理解是,我需要先取一个蜡烛图1,与其他9个蜡烛图进行比较,如果有匹配的,就提取这些蜡烛图的编号及其参数,打开复选框。然后将蜡烛2与其他蜡烛一起检查,这样一直检查到样本的中间,因为那时将只从另一侧进行重复的比较。
如果烛台的数量是固定的,我就会这样写--大概是5个比较周期。但问题是:如何使这种重新计算对任何样本量都是可能的。
这是一个有趣的任务,但你对如何解决这个问题的理解并不正确,因为到目前为止,你并没有太多的编程知识。
你看:你有一些套路的报价。你的任务是只从这一组中选择那些符合某些条件的酒吧。例如,你想得到一个条形图的集合,其高点是相互重合的。事实上,选择的条件可以有很多,而且可以随着时间的推移增加。 一旦你有了一个酒吧的集合,你可以很容易地分析它们的任何其他参数。
因此,对于你的任务,你需要写一个函数,返回一个满足特定条件的条形数组(伪代码)。
也就是说,记忆和迭代一些数据和索引确实没有问题。你不需要条形图本身的索引,而是需要一个满足特定条件的特定集合。一旦你拥有它,你就能一举解决很多问题。因此,如果我们需要为范围内的每个烛台提供不同的匹配烛台列表,我会尝试使用结构数组。我会考虑一下,然后告诉你。
思想。我正在写一个测试脚本。
试图描述所有的步骤。
在循环中填入所有匹配的数据后,我们有一个包含所有烛台及其匹配烛台的数组。之后,你可以在其中寻找低位。而且你可以在循环中直接组织。这对你来说更方便。
那么,这里有另一种方法:为范围内的每个蜡烛写上火柴。在以前的版本中,只为一支蜡烛写了匹配--也就是说,没有为与这支蜡烛匹配的蜡烛写匹配。