Ce n'est pas pratique, surtout avec un grand nombre de paramètres...
C'est une solution intéressante via un tableau. Particulièrement intéressant : comment trouver la valeur de variable la plus proche en faisant la moyenne du nombre total de valeurs.
//--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---
} //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { 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 NN=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 NN=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); //Восстанавливаем размер массива
for(int i=0;i<5;i++) { if(TargetMassiv[i]<MAT && TargetMassiv[i]!=0) //Записываем значение в новый массив по условию { TargetMassivOk[i]=TargetMassiv[i]; N++; }
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[MaxSell],"MinBuy=",TargetMassivOk[MinSell]); Print("Среднее значение массива TargetMassivOk= ",sr_Target); Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X); Print("Target= ",Target); }
J'ai acquis de l'expérience en travaillant avec des tableaux. Ai-je tout fait correctement ou ai-je rendu les choses plus compliquées ? Peut-être des contrôles supplémentaires sont-ils nécessaires ?
Je ne comprends pas pourquoi les données sont perdues dans le tableau TargetMassivOk si Sell==1, mais quand Buy==1 tout fonctionne ?
for(int i=0;i<5;i++) { if(TargetMassiv[i]<MAT && TargetMassiv[i]!=0) //Записываем значение в новый массив по условию { TargetMassivOk[i]=TargetMassiv[i]; N++; }
Je ne comprends pas pourquoi les données sont perdues dans le tableau TargetMassivOk si Sell==1, mais quand Buy==1 tout fonctionne ?
for(int i=0;i<5;i++) { if(TargetMassiv[i]<MAT && TargetMassiv[i]!=0) //Записываем значение в новый массив по условию { TargetMassivOk[i]=TargetMassiv[i]; N++; }
}
Faire l'attaque par force brute à partir de la fin (comme dans l'attaque par force brute, les données peuvent être perdues en premier si la liste est modifiée).
Commencez l'attaque par force brute à la fin de la liste (parce que l'attaque par force brute peut d'abord perdre des données si la liste est modifiée).
for(int i=5 ; i>0 ; i--)
Artyom Trishkin: Pas vraiment. De 4 à >=0
Faux - l'énumération fonctionne de toute façon, si la valeur de l'index dépasse la taille du tableau, j'aurais des jurons, mais il n'y en a pas. Il existe une valeur avec des zéros, et N peut ne pas être égal à zéro ! Il s'avère que la vérification se produit également, puis il s'avère que le tableau n'écrit pas de données.
Tout commence à mieux fonctionner, mais il arrive que le zéro soit encore présent !
J'ai trouvé la solution - quand je vérifiais si le travail avec les nombres négatifs était adéquat, j'ai mis un tri inverse du tableau - je ne pense pas que ce soit pertinent maintenant.
Ce n'est pas pratique, surtout avec un grand nombre de paramètres...
C'est une solution intéressante via un tableau. Particulièrement intéressant : comment trouver la valeur de variable la plus proche en faisant la moyenne du nombre total de valeurs.
C'est le genre de code que j'ai obtenu.
//+------------------------------------------------------------------+
//| 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
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
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 NN=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 NN=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++)
{
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,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],"MaxBuy=",TargetMassivOk[MaxSell],"MinBuy=",TargetMassivOk[MinSell]);
Print("Среднее значение массива TargetMassivOk= ",sr_Target);
Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X);
Print("Target= ",Target);
}
}
}
//+------------------------------------------------------------------+
Je ne comprends pas pourquoi les données sont perdues dans le tableau TargetMassivOk si Sell==1, mais quand Buy==1 tout fonctionne ?
for(int i=0;i<5;i++)
{
if(TargetMassiv[i]<MAT && TargetMassiv[i]!=0) //Записываем значение в новый массив по условию
{
TargetMassivOk[i]=TargetMassiv[i];
N++;
}
}
Je ne comprends pas pourquoi les données sont perdues dans le tableau TargetMassivOk si Sell==1, mais quand Buy==1 tout fonctionne ?
for(int i=0;i<5;i++)
{
if(TargetMassiv[i]<MAT && TargetMassiv[i]!=0) //Записываем значение в новый массив по условию
{
TargetMassivOk[i]=TargetMassiv[i];
N++;
}
}
Faire l'attaque par force brute à partir de la fin (comme dans l'attaque par force brute, les données peuvent être perdues en premier si la liste est modifiée).
for(int i=5 ; i>0 ; i--)
Effectuer l'attaque par force brute à partir de la fin (car l'attaque par force brute peut d'abord perdre des données si la liste est modifiée).
for(int i=5 ; i>0 ; i--)
Pas comme ça. De 4 à >=0.
Je trouvais aussi que son nombre total était bizarre, alors j'ai mis le même...
Je l'ai eu un peu plus haut.
Commencez l'attaque par force brute à la fin de la liste (parce que l'attaque par force brute peut d'abord perdre des données si la liste est modifiée).
for(int i=5 ; i>0 ; i--)
Pas vraiment. De 4 à >=0
Si le code est corrigé comme ceci
TargetMassiv[0]=0.1;//NormalizeDouble (iMA(Symbol(),0,100,0,0,0,100),Digits);
TargetMassiv[1]=0.2;//NormalizeDouble (iMA(Symbol(),0,100,0,1,0,0),Digits);
TargetMassiv[2]=0.3;//NormalizeDouble (iMA(Symbol(),0,55,0,2,0,0),Digits);
TargetMassiv[3]=2.4;//NormalizeDouble (iMA(Symbol(),0,88,0,3,0,0),Digits);
TargetMassiv[4]=0.5;//NormalizeDouble (iMA(Symbol(),0,12,0,0,0,0),Digits);
Si le code est corrigé de la manière suivante
TargetMassiv[0]=0.1;//NormalizeDouble (iMA(Symbol(),0,100,0,0,0,100),Digits);
TargetMassiv[1]=0.2;//NormalizeDouble (iMA(Symbol(),0,100,0,1,0,0),Digits);
TargetMassiv[2]=0.3;//NormalizeDouble (iMA(Symbol(),0,55,0,2,0,0),Digits);
TargetMassiv[3]=2.4;//NormalizeDouble (iMA(Symbol(),0,88,0,3,0,0),Digits);
TargetMassiv[4]=0.5;//NormalizeDouble (iMA(Symbol(),0,12,0,0,0,0),Digits);
J'ai trouvé la solution - quand je vérifiais si le travail avec les nombres négatifs était adéquat, j'ai mis un tri inverse du tableau - je ne pense pas que ce soit pertinent maintenant.
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);