double CC; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //---
//--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---
} //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if (Close[1]-CC!=0) { CC=Close[1];
double MAT=NormalizeDouble(iMA(Symbol(),0,100,0,0,0,0),Digits); double S=11*Point; double Target; int Buy=1; int Sell=1; if(Open[0]-MAT>S || MAT-Open[0]<S) //Условие убытка - надо искать новый TP { if(Buy==1) //Если условно ордеров на покупку больше, чем ордеров на продажу (проверять лучше по объему позиции) { double TargetMassiv[5]; //Создаем массив double TargetMassivOk[5]; //Создаем массив int N=0; //Переменная для изменения размера массива int X=0; //Переменная для получение информации о номере индекса массива, наиболее соответствующему усредненному значению массива
int Max=0; int Min=0; int MaxBuy=0; int MinBuy=0; double sr_Target=0;
ArrayFree (TargetMassiv); //Очищаем массив ArrayFree (TargetMassivOk); //Очищаем массив ArrayResize(TargetMassiv,5,0); //Восстанавливаем размер массива ArrayResize(TargetMassivOk,5,0); //Восстанавливаем размер массива
for(int i=0;i<5;i++) //Записываем значение в новый массив по условию { if(TargetMassiv[i]>MAT && TargetMassiv[i]!=0) { TargetMassivOk[i]=TargetMassiv[i]; N++;
{ for(int i=0;i<N-1;i++) { if(sr_Target<=TargetMassivOk[i] && sr_Target>TargetMassivOk[i+1]) X=i; //Берем большее значение т.к. для ордеров на покупку } }
Print("Покупка"); Print("Значения последних 5 элементов массива"); for(int i=0;i<5;i++) printf("TargetMassiv[%d] = %G",i,TargetMassiv[i]); for(int i=0;i<N;i++) printf("TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);
Print("MAT= ",MAT); Print("Max= ",TargetMassiv[Max],"Min=",TargetMassiv[Min],"MaxBuy=",TargetMassivOk[MaxBuy],"MinBuy=",TargetMassivOk[MinBuy]); Print("Среднее значение массива TargetMassivOk= ",sr_Target); Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X); Print("Target= ",Target); }
if(Sell==1) //Если условно ордеров на продажу больше, чем ордеров на продажу (проверять лучше по объему позиции) { double TargetMassiv[5]; //Создаем массив double TargetMassivOk[5]; //Создаем массив int N=0; //Переменная для изменения размера массива int X=0; //Переменная для получение информации о номере индекса массива, наиболее соответствующему усредненному значению массива
int Max=0; int Min=0; int MaxSell=0; int MinSell=0; double sr_Target=0;
ArrayFree (TargetMassiv); //Очищаем массив ArrayFree (TargetMassivOk); //Очищаем массив ArrayResize(TargetMassiv,5,0); //Восстанавливаем размер массива ArrayResize(TargetMassivOk,5,0); //Восстанавливаем размер массива
Print("Продажа"); Print("Значения последних 5 элементов массива"); for(int i=0;i<5;i++) printf("TargetMassiv[%d] = %G",i,TargetMassiv[i]); for(int i=0;i<N;i++) printf("TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);
Print("MAT=",MAT); Print("Max=",TargetMassiv[Max],"Min=",TargetMassiv[Min],"MaxSell=",TargetMassivOk[MaxSell],"MaxSell=",TargetMassivOk[MinSell]); Print("Среднее значение массива TargetMassivOk= ",sr_Target); Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X); Print("Target= ",Target); }
只在酒吧变化时进行计算 - 我的方法 :)如果你有任何优化的想法--我愿意倾听
//+------------------------------------------------------------------+
//| Target.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
double CC;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if (Close[1]-CC!=0)
{
CC=Close[1];
double MAT=NormalizeDouble(iMA(Symbol(),0,100,0,0,0,0),Digits);
double S=11*Point;
double Target;
int Buy=1;
int Sell=1;
if(Open[0]-MAT>S || MAT-Open[0]<S) //Условие убытка - надо искать новый TP
{
if(Buy==1) //Если условно ордеров на покупку больше, чем ордеров на продажу (проверять лучше по объему позиции)
{
double TargetMassiv[5]; //Создаем массив
double TargetMassivOk[5]; //Создаем массив
int N=0; //Переменная для изменения размера массива
int X=0; //Переменная для получение информации о номере индекса массива, наиболее соответствующему усредненному значению массива
int Max=0;
int Min=0;
int MaxBuy=0;
int MinBuy=0;
double sr_Target=0;
ArrayFree (TargetMassiv); //Очищаем массив
ArrayFree (TargetMassivOk); //Очищаем массив
ArrayResize(TargetMassiv,5,0); //Восстанавливаем размер массива
ArrayResize(TargetMassivOk,5,0); //Восстанавливаем размер массива
TargetMassiv[0]=NormalizeDouble (iMA(Symbol(),0,100,0,0,0,100),Digits);
TargetMassiv[1]=NormalizeDouble (iMA(Symbol(),0,100,0,1,0,0),Digits);
TargetMassiv[2]=NormalizeDouble (iMA(Symbol(),0,55,0,2,0,0),Digits);
TargetMassiv[3]=NormalizeDouble (iMA(Symbol(),0,88,0,3,0,0),Digits);
TargetMassiv[4]=NormalizeDouble (iMA(Symbol(),0,12,0,0,0,0),Digits);
for(int i=0;i<5;i++) //Записываем значение в новый массив по условию
{
if(TargetMassiv[i]>MAT && TargetMassiv[i]!=0)
{
TargetMassivOk[i]=TargetMassiv[i];
N++;
}
}
ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND); //Сортировка массива
if(N!=0)
{
ArrayResize(TargetMassivOk,N,0);
Max=ArrayMaximum(TargetMassiv,WHOLE_ARRAY,0);
Min=ArrayMinimum(TargetMassiv,WHOLE_ARRAY,0);
MaxBuy=ArrayMaximum(TargetMassivOk,WHOLE_ARRAY,0);
MinBuy=ArrayMinimum(TargetMassivOk,WHOLE_ARRAY,0);
sr_Target=NormalizeDouble(iMAOnArray(TargetMassivOk,0,N,0,0,0),Digits);
if(N==0)
{X=N;}
else
{
for(int i=0;i<N-1;i++)
{
if(sr_Target<=TargetMassivOk[i] && sr_Target>TargetMassivOk[i+1]) X=i; //Берем большее значение т.к. для ордеров на покупку
}
}
Target=TargetMassivOk[X];
}
else
{
Max=0;
Min=0;
MaxBuy=0;
MinBuy=0;
sr_Target=0;
Target=-1;
}
Print("Покупка");
Print("Значения последних 5 элементов массива");
for(int i=0;i<5;i++) printf("TargetMassiv[%d] = %G",i,TargetMassiv[i]);
for(int i=0;i<N;i++) printf("TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);
Print("MAT= ",MAT);
Print("Max= ",TargetMassiv[Max],"Min=",TargetMassiv[Min],"MaxBuy=",TargetMassivOk[MaxBuy],"MinBuy=",TargetMassivOk[MinBuy]);
Print("Среднее значение массива TargetMassivOk= ",sr_Target);
Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X);
Print("Target= ",Target);
}
/////////////////////////////////////////////////////////////////////////////
if(Sell==1) //Если условно ордеров на продажу больше, чем ордеров на продажу (проверять лучше по объему позиции)
{
double TargetMassiv[5]; //Создаем массив
double TargetMassivOk[5]; //Создаем массив
int N=0; //Переменная для изменения размера массива
int X=0; //Переменная для получение информации о номере индекса массива, наиболее соответствующему усредненному значению массива
int Max=0;
int Min=0;
int MaxSell=0;
int MinSell=0;
double sr_Target=0;
ArrayFree (TargetMassiv); //Очищаем массив
ArrayFree (TargetMassivOk); //Очищаем массив
ArrayResize(TargetMassiv,5,0); //Восстанавливаем размер массива
ArrayResize(TargetMassivOk,5,0); //Восстанавливаем размер массива
TargetMassiv[0]=NormalizeDouble (iMA(Symbol(),0,100,0,0,0,100),Digits);
TargetMassiv[1]=NormalizeDouble (iMA(Symbol(),0,100,0,1,0,0),Digits);
TargetMassiv[2]=NormalizeDouble (iMA(Symbol(),0,55,0,2,0,0),Digits);
TargetMassiv[3]=NormalizeDouble (iMA(Symbol(),0,88,0,3,0,0),Digits);
TargetMassiv[4]=NormalizeDouble (iMA(Symbol(),0,12,0,0,0,0),Digits);
// for(int i=0;i<5;i++)
for(int i=4; i>=0; i--)
{
if(TargetMassiv[i]<MAT && TargetMassiv[i]!=0) //Записываем значение в новый массив по условию
{
TargetMassivOk[i]=TargetMassiv[i];
N++;
}
}
Print("N=",N);
for(int i=0;i<N;i++) printf("До обработки TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);
ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND);
// ArraySort(TargetMassivOk,N,0,MODE_ASCEND); //Сортировка массива
if(N!=0)
{
ArrayResize(TargetMassivOk,N,0);
// ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND); //Дополнительная сортировка
Max=ArrayMaximum(TargetMassiv,WHOLE_ARRAY,0);
Min=ArrayMinimum(TargetMassiv,WHOLE_ARRAY,0);
MaxSell=ArrayMaximum(TargetMassivOk,WHOLE_ARRAY,0);
MinSell=ArrayMinimum(TargetMassivOk,WHOLE_ARRAY,0);
sr_Target=NormalizeDouble(iMAOnArray(TargetMassivOk,0,N,0,0,0),Digits);
for(int i=0;i<N-1;i++)
{
if(sr_Target<=TargetMassivOk[i] && sr_Target>TargetMassivOk[i+1]) X=i;
// if (X=!0) X=X-1;
}
Target=TargetMassivOk[X];
}
else
{
Max=0;
Min=0;
MaxSell=0;
MinSell=0;
sr_Target=0;
Target=-1;
}
Print("Продажа");
Print("Значения последних 5 элементов массива");
for(int i=0;i<5;i++) printf("TargetMassiv[%d] = %G",i,TargetMassiv[i]);
for(int i=0;i<N;i++) printf("TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);
Print("MAT=",MAT);
Print("Max=",TargetMassiv[Max],"Min=",TargetMassiv[Min],"MaxSell=",TargetMassivOk[MaxSell],"MaxSell=",TargetMassivOk[MinSell]);
Print("Среднее значение массива TargetMassivOk= ",sr_Target);
Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X);
Print("Target= ",Target);
}
}
}
}
//+------------------------------------------------------------------+
错了--枚举的工作原理是这样的,如果索引值超过了数组的大小,就会被诅咒,而它并没有。有一个带零的值,而N可以是非零的!事实证明,检查也发生了,那么事实证明,数组并没有写数据。
我不是在猜测,我是在指出提议的循环的不正确性。只要自己想一想,在数组大小等于5的情况下,从哪里和到哪里,你需要做一个循环......
我的和你的都有五个值,有什么区别--请解释。
阵列的大小为5。如果你将数组的索引 从4到0,包括0,那么循环将遍历所有的数组值。如果你试图从5开始索引,那么数组就超出了范围。如果你的索引从4到0,不包括0,那么循环就不会穿过整个数组--数组的零单元不会被读取。
即这是正确的。
for(int i=4; i>=0; i-){}。
或
for(int i=0; i<5; i++) {}。
阵列的大小为5。如果你将数组的索引 从4到0,包括0,那么循环将遍历所有的数组值。如果你试图从5开始索引,那么数组就超出了范围。如果你的索引从4到0,不包括0,那么循环就不会穿过整个数组--数组的零单元不会被读取。
即这是正确的。
for(int i=4; i>=0; i--){}。
或
for(int i=0; i<5; i++) {}。
从最后进行暴力攻击(因为如果列表被改变,暴力攻击可能会首先丢失数据)。
Leanid Aladzyeu:
利安尼德-阿拉德兹耶乌。
从末尾开始重建(因为如果列表被改变,重建可能首先丢失数据)。
它从来没有停止过让我感到惊讶...为什么人们不学习如何使用后视镜,而只是学习一条交通规则,不看就转弯,直接向前走...?
为什么一旦你读懂了,当从一个开放的订单列表中关闭几个订单时,你必须从最大的指数到最小的指数,甚至建议其他人在任何地方向这个方向走......
它从来没有停止过让我感到惊讶...为什么人们不学习如何使用后视镜,而只是学习一点交通规则,不看就转弯,直接往前走?
为什么有一次读到,如果我们从一个开放的订单列表中关闭几个订单,我们应该尝试从一个较大的指数到一个较小的指数,并建议其他人到处这样做...?
它从来没有停止过让我感到惊讶...为什么人们不学习如何使用后视镜,而只是学习一点交通规则,不看就转弯,直奔前方?
为什么曾经读到过,如果你从一个开放的订单列表中关闭几个订单,你必须从一个较大的指数到一个较小的指数,并建议其他人总是向这个方向走......?
鸭子,你想怎么做就怎么做,我在努力地从最后一名接近到第一名,我应该反过来做。而我做到了,只是有细微的差别,不仅仅是反转。
对于在循环中被删除的所有东西(订单、图形对象等)都是如此,因为删除后会用后续的 "对象 "填充 "对象阵列 "的前几个单元格。当然,在一般情况下,我们必须考虑情况。例如,当你写指标 时,从最后一个元素(rate_total-1)开始画图,说起来很傻。
你是想向我解释如何正确地做吗?或者,也许我误解了什么?
实际上,如果我在一条无人的道路上行驶,周围没有看到一辆汽车或拖拉机,我就不会转弯。