Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 421
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Сделал расчет только при смене бара - свой метод :) Если есть идеи по оптимизации - прислушаюсь!
//+------------------------------------------------------------------+
//| 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 может равняться не нулю! Выходит, что проверка так же происходит, тогда получается, что массив не записывает данные.
Я не угадывал, а указал на неверность предложенного цикла. Сами подумайте от-куда и до-куда при размере массива, равном пяти, нужно делать цикл...
И в моем и в вашем варианте пять значений, в чем разница - поясните, пожалуйста.
Размер массива равен пяти. Если индексировать массив от 4 до 0, включая ноль, то цикл пройдёт по всем значениям массива. Если же пытаться индексировать от пяти, то будет выход за пределы массива. Если же индексировать от 4 до нуля, не включая ноль, то цикл пройдёт не по всему массиву - нулевая ячейка массива не будет прочитана.
Т.е., верно так:
for(int i=4; i>=0; i--) {}
или
for(int i=0; i<5; i++) {}
Размер массива равен пяти. Если индексировать массив от 4 до 0, включая ноль, то цикл пройдёт по всем значениям массива. Если же пытаться индексировать от пяти, то будет выход за пределы массива. Если же индексировать от 4 до нуля, не включая ноль, то цикл пройдёт не по всему массиву - нулевая ячейка массива не будет прочитана.
Т.е., верно так:
for(int i=4; i>=0; i--) {}
или
for(int i=0; i<5; i++) {}
осуществяйте переборку с конца ( так как при переборке сначала могут теряться данные при изменение списка )
Leanid Aladzyeu:
Leanid Aladzyeu:
осуществяйте переборку с конца ( так как при переборке сначала могут теряться данные при изменение списка )
Не перестаю удивляться... Почему люди вместо того чтобы научиться пользоваться зеркалами заднего вида, просто выучили один пункт правил дорожного движения и не глядя включают поворотку и прут напролом???
Почему однажды прочитав, что при закрывании нескольких ордеров из списка открытых надо перебирать ордера от большего к меньшему индексу применяют и ДАЖЕ советуют другим везде и всюду применять именно такое направление перебора...
Не перестаю удивляться... Почему люди вместо того чтобы научиться пользоваться зеркалами заднего вида, просто выучили один пункт правил дорожного движения и не глядя включают поворотку и прут напролом???
Почему однажды прочитав, что при закрывании нескольких ордеров из списка открытых надо перебирать ордера от большего к меньшему индексу применяют и ДАЖЕ советуют другим везде и всюду применять именно такое направление перебора...
Не перестаю удивляться... Почему люди вместо того чтобы научиться пользоваться зеркалами заднего вида, просто выучили один пункт правил дорожного движения и не глядя включают поворотку и прут напролом???
Почему однажды прочитав, что при закрывании нескольких ордеров из списка открытых надо перебирать ордера от большего к меньшему индексу применяют и ДАЖЕ советуют другим везде и всюду применять именно такое направление перебора...
Дак возможности перебора как угодно, меня когда то напрягло что закрытие от последнего к первому, надо было наоборот. И сделал, только там есть нюансы, не только счетчик повернуть.
Это справедливо для всего, что при переборе в цикле удаляется (ордера, граф. объекты и т.д.) т.к. при удалении идет заполнение предыдущих ячеек "массива объектов" последующими "объектами". А вообще, конечно, нужно отталкиваться от ситуации. Например, при написании индикаторов начинать отрисовку с последнего элемента (rates_total-1), мягко говоря, глупо.
Это, типа вы мне разъясняете как правильно делать? Или я что-то не понял?
Вообще-то если я еду на пустынной дороге и не вижу вокруг ни одной машины или трактора, то поворотку не включаю.