Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 421
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Fez o cálculo apenas na mudança de bar - o meu método :) Se tem alguma ideia para optimização - eu vou ouvir!
//+------------------------------------------------------------------+
//| 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);
}
}
}
}
//+------------------------------------------------------------------+
Errado - a enumeração funciona como está, se o valor do índice excedesse o tamanho da matriz, receberia maldições, e não há nenhuma. Há um valor com zeros, e N pode ser não-zero! Acontece que a verificação também acontece, e depois acontece que a matriz não escreve dados.
Eu não estava a adivinhar, estava a apontar a incorrecção do laço proposto. Pense de onde e para onde, com um tamanho de matriz igual a cinco, precisa de fazer um loop...
Tanto o meu como o seu têm cinco valores, qual é a diferença - por favor explique.
O tamanho da matriz é cinco. Se se indexar a matriz de 4 a 0, incluindo zero, o laço passará por todos os valores da matriz. Se tentar indexar a partir de cinco, a matriz está fora de alcance. Se indexar de 4 a zero, não incluindo zero, o laço não passará por todo o conjunto - a célula zero do conjunto não será lida.
Isto é, isto é, está correcto:
for(int i=4; i>=0; i--) {} {}
ou
for(int i=0; i<5; i++) {} {}
O tamanho da matriz é cinco. Se se indexar a matriz de 4 a 0, incluindo zero, o laço passará por todos os valores da matriz. Se tentar indexar a partir de cinco, a matriz está fora de alcance. Se indexar de 4 a zero, não incluindo zero, o laço não passará por todo o conjunto - a célula zero do conjunto não será lida.
Isto é, isto é, está correcto:
for(int i=4; i>=0; i--) {} {}
ou
for(int i=0; i<5; i++) {} {}
fazer um ataque por força bruta a partir do fim (pois o ataque por força bruta pode primeiro perder dados se a lista for alterada)
Leanid Aladzyeu:
Leanid Aladzyeu:
Fazer a reconstrução a partir do fim (uma vez que a reconstrução pode perder dados primeiro ao alterar a lista)
Nunca deixa de me surpreender... Porque é que, em vez de aprenderem a utilizar os espelhos retrovisores, as pessoas aprendem apenas uma regra de trânsito e viram a esquina sem olhar e vão em frente...?
Porque é que, depois de ter lido que ao fechar várias encomendas de uma lista de encomendas abertas, tem de ir do maior para o mais pequeno índice e até aconselhar outros a irem nesta direcção em todo o lado...
Nunca deixa de me surpreender... Porque é que em vez de aprenderem a usar espelhos retrovisores, as pessoas aprendem apenas um ponto das regras de trânsito e viram a esquina sem olhar e seguem em frente??
Porquê ler uma vez que se fecharmos várias encomendas a partir de uma lista de encomendas abertas devemos tentar mudar uma encomenda de um índice maior para um índice menor, e aconselhar os outros a usarem sempre esta direcção...?
Nunca deixa de me surpreender... Porque é que em vez de aprenderem a usar espelhos retrovisores, as pessoas aprendem apenas um ponto das regras de trânsito e viram a esquina sem olhar e seguem em frente??
Porquê ler uma vez que se fechar várias encomendas a partir de uma lista de encomendas abertas deve passar de um índice maior para um índice menor e aconselhar os outros a irem sempre nessa direcção...?
Duck, podes fazê-lo da maneira que quiseres, eu estava a esforçar-me para fechar de último para primeiro, devia tê-lo feito ao contrário. E fi-lo, só que há nuances, não só o contador a virar.
Isto é verdade para tudo o que é eliminado no laço (ordens, objectos gráficos, etc.) porque a eliminação preenche as células anteriores da "matriz de objectos" com "objectos" subsequentes. Em geral, é claro, temos de considerar a situação. Por exemplo, quando se escreve indicadores, é uma parvoíce, para o dizer de forma suave, começar a desenhar a partir do último elemento (rates_total-1).
Está a tentar explicar-me como o fazer correctamente? Ou talvez eu tenha entendido mal alguma coisa?
Na verdade, se estou a conduzir numa estrada deserta e não vejo um único carro ou tractor por perto, não viro.