Boa tarde! Quero criar um indicador que exiba um canal em indicadores como MASD, AO e similares. Este indicador é sobreposto à janela dos indicadores básicos (MASD, AO e similares) e é desenhado como linhas paralelas acima e abaixo de 0. Estas linhas são definidas como uma média de picos máximos (acima de 0) e mínimos (abaixo de 0) para o período especificado. Estou tentando usar o indicador AO como um exemplo, mas ele não funciona. Algoritmo: escrevemos as leituras dos indicadores em um array, corremos através deste array em busca de picos / troughs, escrevemos em certos arrays, encontramos o valor médio dos picos, depois troughs, atribuímos o valor obtido ao buffer do indicador. Nesta etapa, não é o canal (aderindo a 0) no indicador que é definido no código, mas o valor médio dos picos máximos e o valor médio das calhas mínimas. A definição de picos e canais pode ser removida do código e executada como uma função, mas por enquanto eu a deixei dessa maneira - não muda a questão. Problemas: 1. O terminal fica pendurado (consideravelmente) 2. As linhas não são exibidas como uma média; elas aparecem como max/min durante um período. Demorei muito tempo para descobrir isso, mas não consigo descobrir a causa dos problemas. Você pode me ajudar a corrigir meu código ou me dar um link para o código fonte de questões similares e eu tentarei corrigi-lo ainda mais. Obrigado de antemão.
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);
}
for (int d=2;d<=period-1;d++){
ArrayResize(AO,j+1);
Aumentar o tamanho de uma matriz em um loop é cruel, é por isso que ela fica pendurada. Aumentar o tamanho de uma vez por vez. Ou usar séries de tempo de uma só vez
first_may: Boa tarde, você poderia me dizer como escrever uma condição pela qual, se o lucro de uma ordem aberta for um pungente, então feche essa ordem?
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
É disso que se trata a minha idéia:
Boa tarde! Quero criar um indicador que exiba um canal em indicadores como MASD, AO e similares. Este indicador é sobreposto à janela dos indicadores básicos (MASD, AO e similares) e é desenhado como linhas paralelas acima e abaixo de 0. Estas linhas são definidas como uma média de picos máximos (acima de 0) e mínimos (abaixo de 0) para o período especificado.
Estou tentando usar o indicador AO como um exemplo, mas ele não funciona.
Algoritmo:
escrevemos as leituras dos indicadores em um array,
corremos através deste array em busca de picos / troughs,
escrevemos em certos arrays,
encontramos o valor médio dos picos, depois troughs,
atribuímos o valor obtido ao buffer do indicador.
Nesta etapa, não é o canal (aderindo a 0) no indicador que é definido no código, mas o valor médio dos picos máximos e o valor médio das calhas mínimas.
A definição de picos e canais pode ser removida do código e executada como uma função, mas por enquanto eu a deixei dessa maneira - não muda a questão.
Problemas:
1. O terminal fica pendurado (consideravelmente)
2. As linhas não são exibidas como uma média; elas aparecem como max/min durante um período.
Demorei muito tempo para descobrir isso, mas não consigo descobrir a causa dos problemas. Você pode me ajudar a corrigir meu código ou me dar um link para o código fonte de questões similares e eu tentarei corrigi-lo ainda mais. Obrigado de antemão.
ExistInHistoryToDay().
Boa tarde!
Problemas:
1. terminal está pendurado (significativamente)
Aumentar o tamanho de uma matriz em um loop é cruel, é por isso que ela fica pendurada. Aumentar o tamanho de uma vez por vez. Ou usar séries de tempo de uma só vez
P.S. ver mensagens pessoais
Como faço um loop através de uma variável do tipo string?
Exemplo
Como substituir esta construção por um loop?Boa tarde, você poderia me dizer como escrever uma condição pela qual, se o lucro de uma ordem aberta for um pungente, então feche essa ordem?
Usando a função.
https://www.mql5.com/ru/forum/131859/page3#434225
Como faço um loop através de uma variável do tipo string?
Exemplo
Como substituir esta construção por um loop?Obrigado