Estou vendo. Obrigado. Alguém mais tem alguma dica?
Eu também aprendi com você.
//+------------------------------------------------------------------+//| Demo_iBands.mq5 |//| Copyright 2021, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2021, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"//--- входные параметрыinputint bands_period=20; // период скользящей среднейinputint bands_shift=0; // сдвигinputdouble deviation=2.0; // кол-во стандартных отклоненийinputENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // тип цены//--- переменная для хранения хэндла индикатора iBandsint handle;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- создадим хэндл индикатора
handle=iBands(_Symbol,_Period,bands_period,bands_shift,deviation,applied_price);
//--- если не удалось создать хэндлif(handle==INVALID_HANDLE)
{
//--- сообщим о неудаче и выведем номер ошибкиPrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d",
_Symbol,
EnumToString(_Period),
GetLastError());
//--- работа индикатора завершается досрочноreturn(INIT_FAILED);
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- почистим график при удалении индикатораComment("");
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//--- индикаторные буферыdouble UpperBuffer[];
double LowerBuffer[];
double MiddleBuffer[];
//--- количество копируемых значений из индикатора iBandsint values_to_copy=2;
//--- если FillArraysFromBuffer вернула false, значит данные не готовы - завершаем работуif(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy))
return;
//--- сформируем сообщениеPrint("MiddleBuffer =",MiddleBuffer[0], "UpperBuffer =",UpperBuffer[0], "LowerBuffer =",LowerBuffer[0], "values_to_copy =",values_to_copy);
}
//+------------------------------------------------------------------+//| Заполняем индикаторные буферы из индикатора iBands |//+------------------------------------------------------------------+bool FillArraysFromBuffers(double &base_values[], // индикаторный буфер средней линии Bollinger Bandsdouble &upper_values[], // индикаторный буфер верхней границыdouble &lower_values[], // индикаторный буфер нижней границыint shift, // смещениеint ind_handle, // хэндл индикатора iBandsint amount // количество копируемых значений
)
{
//--- сбросим код ошибкиResetLastError();
//--- заполняем часть массива MiddleBuffer значениями из индикаторного буфера под индексом 0if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- заполняем часть массива UpperBuffer значениями из индикаторного буфера под индексом 1if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- заполняем часть массива LowerBuffer значениями из индикаторного буфера под индексом 2if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- все получилосьreturn(true);
}
//+------------------------------------------------------------------+
Gente, que não está ocupada e pode olhar. esboçou um EA no indicador de ontem, mas algo não está funcionando bem. Parece abrir negócios que não se baseiam em sinais. Eu tentei adicionar ordens de fechamento no sinal oposto, mas os negócios são fechados e não. Eu tenho uma pista se houver um erro na condição.
inputint Magic = 000;
inputdouble Lots = 0.1;
inputint TakeProfit = 100;
inputint StopLoss = 50;
inputint Slippage = 5;
double vverh,vnuz,SL,TP;
int tiket;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---/* if (Digits == 3 || Digits == 5)
{
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}*///---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
vverh = iCustom(NULL,0,"777",0,1); // стрелка вверх
vnuz = iCustom(NULL,0,"777",1,1); // стрелка вниз//-----------------------------------------------------------if (CountSell() == 0 && vnuz >0)
{
tiket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0, Red);
if (tiket>0)
{
SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
if (OrderSelect(tiket, SELECT_BY_TICKET))
if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
Print("Ошибка модификации ордера на продажу");
} elsePrint("Ошибка открытия ордера на продажу");
}
////////////////////////////////////////////////////////////////if (CountBuy() == 0 && vverh >0)
{
tiket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
if (tiket>0)
{
TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
if (OrderSelect(tiket, SELECT_BY_TICKET))
if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
Print("Ошибка модификации ордера на покупку");
} elsePrint("Ошибка открытия ордера на покупку");
}
}
//+------------------------------------------------------------------+int CountSell()
{
int count =0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+int CountBuy()
{
int count =0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
count++;
}
}
return(count);
}
jarikn: Gente, que não está ocupada e pode olhar. esboçou um EA no indicador de ontem, mas algo não está funcionando bem. Parece abrir negócios que não se baseiam em sinais. Eu tentei adicionar ordens de fechamento no sinal oposto, mas os negócios são fechados e não. Acho que tenho um feedback muito bom.
O mais provável é que o indicador desenhe ... e procure por erros no registro
Estou vendo. Obrigado. Alguém mais tem alguma dica?
Eu também aprendi com você.
Só não se surpreenda quando ele parar de funcionarou funcionarintermitentemente.
Por que motivo? Por que você não nos diz o que está errado?
Por que motivo? Por que você não me diz o que está errado?
Para que serve todo esse assédio?
O que há com o atropelamento e fuga?
Estou vendo.
Alguém mais pode me dizer o que está errado lá, e por que razão deixará de funcionar se realmente houver algo errado?
Estou vendo.
Talvez outra pessoa possa me dizer o que está errado lá, e qual é a razão pela qual ele pára de funcionar se realmente há algo errado?
Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos
Qualquer pergunta de novatos sobre MQL4 e MQL5, ajuda e discussão de algoritmos e códigos
Igor Makanu, 2021.07.05 14:16.
porque o indicador ainda não foi calculado.
https://www.mql5.com/ru/docs/series/barscalculated
a seção OnInit() não é o melhor lugar para obter o ambiente do terminal, eu acho que funciona de forma lógica e corretaAqui está a resposta.
Obrigado.
Preciso dele para fazer os cálculos do histórico imediatamente ao iniciar a operação. Estou fazendo isso no inite porque preciso disso.
Eu acrescentei uma pausa no init, antes dos cálculos. Se sim, ainda existem algumas armadilhas?
É necessário fazer cálculos sobre a história na partida. Faço-o no inite porque preciso dele dessa maneira.
Acrescentei uma pausa no inite, antes dos cálculos. Em caso afirmativo, ainda há algumas armadilhas?
É mais fácil e mais confiável colocar a primeira bandeira de partida no OnTick()
Gente, que não está ocupada e pode olhar. esboçou um EA no indicador de ontem, mas algo não está funcionando bem. Parece abrir negócios que não se baseiam em sinais. Eu tentei adicionar ordens de fechamento no sinal oposto, mas os negócios são fechados e não. Acho que tenho um feedback muito bom.
Por que motivo? Por que você não escreve o que está errado?
Porque os desenvolvedores escreveram que o OnInit() se destina à inicialização, não a algo mais
O que acontecerá - você fez uma pausa para obter os valores indicadores no OnInit() - o que acontecerá se o usuário trocar o TF ao mesmo tempo?
SZZY: E como seu código se comportaria se você executasse um EA, então feche o terminal e reabra o terminal com um EA em execução?