Доброго дня! Хочу создать индикатор, который отображает канал на индикаторах типа МАСD, АО и подобных. Данный индикатор накладывается на окно базовых индикаторов (МАСD, АО и подобных) и рисуется в виде параллельных линий выше и ниже 0. Данные линии определяются как среднее значение пиков-максимумов (выше 0) и впадин-минимумов (ниже 0) за указанный период. На примере индикатора АО пытаюсь реализовать задуманное, но что-то не выходит. Алгоритм: записываем показания индикатора в массив, пробегаемся по этому массиву в поисках пиков/впадин, записываем их в определённые массивы, находим среднее значение пиков, затем впадин, присваиваем индикаторному буферу полученное значение. На данном этапе в коде определяется не совсем канал (прилипание к 0) на индикаторе, а среднее по максимумам пиков и среднее по минимумам впадин. Определение пиков и впадин можно убрать из кода и оформить в виде ф-ции, но пока оставила так-это сути не меняет. Проблемы: 1. подвисание терминала (значительное) 2. линии не отображается как среднее, получаются, как макс/мин за период. Долго разбиралась, но не могу понять причину проблем. Помогите, пожалуйста, исправить мой код или укажите ссылочку, где рассматриваются подобные вопросы или приводится базовый код, буду разбираться дальше. Заранее спасибо.
int start(){
int limit=Bars-IndicatorCounted();
for(int i=limit;i>=0;i--){
// if (IsNewBar()){int j=0;
for (int d=2;d<=period-1;d++){
ArrayResize(AO,j+1);
AO[j]=AO(d); // Запишем данные инд. в цикле в массивPrint("АО-",AO[j],"-",d,"-",i);
j++;
}
int k_up=0,k_dw=0; double SDw=0,SUp=0,P1=0,P2=0;
//собираем экстремумы выше 0for (int p=4;p<=period-1; p++){
if (AO[p]>AO[p+1] && AO[p]>AO[p-1]
&& AO[p+1]>AO[p+2]
&& AO[p+2]>AO[p+3]
&& AO[p+3]>0
&& AO[p-1]>AO[p-2]
&& AO[p-2]>AO[p-3]
&& AO[p-3]>0){ // Нашли максArrayResize(Up, k_up+1); // Размер массива донышек под кол-во найденных донышек
Up[k_up]=AO(p); // Заносим значение пика в массив Print("значение пика-",Up[k_up],"-",p);
SUp=SUp+Up[k_up];
P1=SUp/(k_up+1);
k_up++; // Увеличиваем индекс массива донышек
}
//собираем впадины ниже 0if (AO[p]<AO[p+1] && AO[p]<AO[p-1]
&& AO[p+1]<AO[p+2]
&& AO[p+2]<AO[p+3]
&& AO[p+3]<0
&& AO[p-1]<AO[p-2]
&& AO[p-2]<AO[p-3]
&& AO[p-3]<0){ // Нашли минArrayResize(Dw, k_dw+1); // Размер массива донышек под кол-во найденных донышек
Dw[k_dw]=AO[p]; // Заносим значение пика в массив Print("значение донышка-",Dw[k_dw],"-",p);
SDw=SDw+Dw[k_dw];
P2=SDw/(k_dw+1);
k_dw++;// Увеличиваем индекс массива донышек
}
}
level1[i]=P1;
level2[i]=P2;
}
return(0);
}
//+------------------------------------------------------------------+double AO(int a){double AO=iAO( NULL, 0, a);
return(AO);
}
first_may: Добрый день, подскажите пожалуйста, как написать условие, при котором если прибыль открытого ордера составила один пунгкт, то закрыть этот ордер?
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает суммарный профит открытых позиций в пунктах |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
double p;
int i, k=OrdersTotal(), pr=0;
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
p=MarketInfo(OrderSymbol(), MODE_POINT);
if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
if (OrderType()==OP_BUY) {
pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
}
if (OrderType()==OP_SELL) {
pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
}
}
}
}
}
return(pr);
}
Вот в чем моя задумка:
я открываю ордер, а дальше зависит от того в каком балансе он закрылся.
если баланс меньше нуля, то убыток фиксируем и запоминаем, если больше нуля то начинаем работать с начала.
если наш убыток меньше нуля, то мы зафиксировали его и присвоили переменной, например: Minus
Minus = OrderProfit (- 45 центов);
AccountAqviti + Minus + мое значение (моя совесть)
дальше по следующему ордеру:
если прибыль этого ордера больше AccountAqviti + Minus + мое значение (моя совесть), тоордер закрываем, если нет, го больше нуля, то фиксируем:
(AccountAqviti + OrderProfit) - (AccountAqviti + Minus + мое значение (моя совесть)) = Minus
если Minus >= 0, то Minus = 0;
Вот в чем моя задумка:
Доброго дня! Хочу создать индикатор, который отображает канал на индикаторах типа МАСD, АО и подобных. Данный индикатор накладывается на окно базовых индикаторов (МАСD, АО и подобных) и рисуется в виде параллельных линий выше и ниже 0. Данные линии определяются как среднее значение пиков-максимумов (выше 0) и впадин-минимумов (ниже 0) за указанный период.
На примере индикатора АО пытаюсь реализовать задуманное, но что-то не выходит.
Алгоритм:
записываем показания индикатора в массив,
пробегаемся по этому массиву в поисках пиков/впадин,
записываем их в определённые массивы,
находим среднее значение пиков, затем впадин,
присваиваем индикаторному буферу полученное значение.
На данном этапе в коде определяется не совсем канал (прилипание к 0) на индикаторе, а среднее по максимумам пиков и среднее по минимумам впадин.
Определение пиков и впадин можно убрать из кода и оформить в виде ф-ции, но пока оставила так-это сути не меняет.
Проблемы:
1. подвисание терминала (значительное)
2. линии не отображается как среднее, получаются, как макс/мин за период.
Долго разбиралась, но не могу понять причину проблем. Помогите, пожалуйста, исправить мой код или укажите ссылочку, где рассматриваются подобные вопросы или приводится базовый код, буду разбираться дальше. Заранее спасибо.
ExistInHistoryToDay().
Доброго дня!
Проблемы:
1. подвисание терминала (значительное)
В цикле увеличивать размер массива это жестоко, потому и висим. Один раз увеличивайте сразу под размер. Или пользуйтесь таймсериями сразу
P.S. посмотрите личные сообщения
как сделать цикл по переменной типа string?
Пример
Как эту конструкцию заменить на цикл?Добрый день, подскажите пожалуйста, как написать условие, при котором если прибыль открытого ордера составила один пунгкт, то закрыть этот ордер?
Используя функцию.
https://www.mql5.com/ru/forum/131859/page3#434225
как сделать цикл по переменной типа string?
Пример
Как эту конструкцию заменить на цикл?Спасибо