Je vois. Merci. Quelqu'un d'autre a des conseils ?
J'ai appris avec toi, aussi.
//+------------------------------------------------------------------+//| 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);
}
//+------------------------------------------------------------------+
Les gars, qui n'est pas occupé et peut regarder. esquissé un EA sur l'indicateur d'hier, mais quelque chose ne fonctionne pas bien. Il semble ouvrir des transactions qui ne sont pas basées sur des signaux. J'ai essayé d'ajouter des ordres de fermeture sur le signal opposé mais les transactions sont fermées puis non. Je ne sais pas s'il y a une erreur dans la condition.
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);
}
Peut-être que quelqu'un d'autre peut me dire ce qui ne va pas ici, et quelle est la raison pour laquelle il s'arrête de fonctionner s'il y a vraiment un problème ?
jarikn: Les gars, qui n'est pas occupé et peut regarder. esquissé un EA sur l'indicateur d'hier, mais quelque chose ne fonctionne pas bien. Il semble ouvrir des transactions qui ne sont pas basées sur des signaux. J'ai essayé d'ajouter des ordres de fermeture sur le signal opposé mais les transactions sont fermées puis non. Je crois que ça me manque.
Très probablement, l'indicateur tire ... et cherche des erreurs dans le journal
Pour quelle raison ? Pourquoi n'écrivez-vous pas ce qui ne va pas ?
Parce que les développeurs ont écrit que OnInit() est destiné à l'initialisation, pas à autre chose
Que se passera-t-il - vous avez fait une pause pour obtenir les valeurs des indicateurs dans OnInit() - que se passera-t-il si l'utilisateur change de TF en même temps ?
SZZY : Et comment se comporterait votre code si vous exécutez une EA, puis fermez le terminal et rouvrez le terminal avec une EA en cours d'exécution ?
Je vois. Merci. Quelqu'un d'autre a des conseils ?
J'ai appris avec toi, aussi.
Ne soyez pas surpris lorsqu'il cesse de fonctionnerou fonctionnepar intermittence.
Pour quelle raison ? Pourquoi n'écrivez-vous pas ce qui ne va pas ?
Pour quelle raison ? Pourquoi ne dites-vous pas ce qui ne va pas ?
C'est quoi ce harcèlement ?
C'est quoi ce délit de fuite ?
Je vois.
Quelqu'un d'autre peut-il me dire ce qui ne va pas ici, et pour quelle raison il s'arrêtera de fonctionner s'il y a vraiment un problème ?
Je vois.
Peut-être que quelqu'un d'autre peut me dire ce qui ne va pas ici, et quelle est la raison pour laquelle il s'arrête de fonctionner s'il y a vraiment un problème ?
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie
Toutes questions des débutants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes.
Igor Makanu, 2021.07.05 14:16.
car l'indicateur n'est pas encore calculé.
https://www.mql5.com/ru/docs/series/barscalculated
la section OnInit() n'est pas le meilleur endroit pour obtenir l'environnement du terminal, je pense que cela fonctionne logiquement et correctementVoici la réponse.
Merci.
J'ai besoin qu'il effectue les calculs de l'historique immédiatement au démarrage. Je le fais dans l'inite parce que j'en ai besoin comme ça.
J'ai ajouté une pause dans l'init, avant les calculs. Si c'est le cas, y a-t-il encore des écueils ?
Il est nécessaire de faire des calculs sur l'historique au démarrage. Je le fais dans l'inite parce que j'en ai besoin comme ça.
J'ai ajouté une pause dans l'inite, avant les calculs. Si c'est le cas, il y a encore des pièges ?
Il est plus facile et plus fiable de mettre le premier drapeau de démarrage dans OnTick()
Les gars, qui n'est pas occupé et peut regarder. esquissé un EA sur l'indicateur d'hier, mais quelque chose ne fonctionne pas bien. Il semble ouvrir des transactions qui ne sont pas basées sur des signaux. J'ai essayé d'ajouter des ordres de fermeture sur le signal opposé mais les transactions sont fermées puis non. Je crois que ça me manque.
Pour quelle raison ? Pourquoi n'écrivez-vous pas ce qui ne va pas ?
Parce que les développeurs ont écrit que OnInit() est destiné à l'initialisation, pas à autre chose
Que se passera-t-il - vous avez fait une pause pour obtenir les valeurs des indicateurs dans OnInit() - que se passera-t-il si l'utilisateur change de TF en même temps ?
SZZY : Et comment se comporterait votre code si vous exécutez une EA, puis fermez le terminal et rouvrez le terminal avec une EA en cours d'exécution ?