Ich verstehe. Danke. Hat sonst noch jemand einen Tipp?
Ich habe auch bei Ihnen gelernt.
//+------------------------------------------------------------------+//| 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);
}
//+------------------------------------------------------------------+
Jungs, wer ist nicht beschäftigt und kann einen Blick zu nehmen. skizziert eine EA auf gestrigen Indikator, aber etwas ist nicht richtig funktioniert. Es scheint, als würde es Geschäfte eröffnen, die nicht auf Signalen basieren. Ich habe versucht, Abschlussaufträge auf das entgegengesetzte Signal hinzuzufügen, aber die Geschäfte werden dann nicht geschlossen. Ich habe eine Ahnung, ob es einen Fehler in der Bedingung gibt.
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: Leute, wer ist nicht beschäftigt und kann schauen. skizziert eine EA auf den gestrigen Indikator, aber etwas funktioniert nicht richtig. Es scheint, als würde es Geschäfte eröffnen, die nicht auf Signalen basieren. Ich habe versucht, Abschlussaufträge auf das entgegengesetzte Signal hinzuzufügen, aber die Geschäfte werden dann nicht geschlossen. Ich glaube, ich vermisse es.
Höchstwahrscheinlich zeichnet der Indikator ... und suchen Sie nach Fehlern im Protokoll
Aus welchem Grund? Warum schreibst du nicht, was los ist?
Weil die Entwickler geschrieben haben, dass OnInit() für die Initialisierung gedacht ist und nicht für etwas anderes
Was wird passieren - Sie haben eine Pause gemacht, um die Indikatorwerte in OnInit() zu erhalten - was wird passieren, wenn der Benutzer die TF zur gleichen Zeit wechselt?
SZZY: Und wie würde sich Ihr Code verhalten, wenn Sie einen EA ausführen, dann das Terminal schließen und das Terminal mit einem laufenden EA wieder öffnen?
Ich verstehe. Danke. Hat sonst noch jemand einen Tipp?
Ich habe auch bei Ihnen gelernt.
Seien Sie nur nicht überrascht, wenn es nicht mehroder nur noch sporadisch funktioniert.
Aus welchem Grund? Warum sagst du uns nicht, was los ist?
Aus welchem Grund? Warum sagst du nicht, was los ist?
Was soll die ganze Schikane?
Was hat es mit der Fahrerflucht auf sich?
Ich verstehe.
Kann mir noch jemand sagen, was damit nicht stimmt und warum es nicht mehr funktioniert, wenn tatsächlich etwas nicht stimmt?
Ich verstehe.
Vielleicht kann mir jemand anderes sagen, was da nicht stimmt, und aus welchem Grund es nicht mehr funktioniert, wenn wirklich etwas nicht stimmt?
Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests
Alle Fragen von Neulingen zu MQL4 und MQL5, Hilfe und Diskussion von Algorithmen und Codes
Igor Makanu, 2021.07.05 14:16.
weil der Indikator noch nicht berechnet ist.
https://www.mql5.com/ru/docs/series/barscalculated
der OnInit()-Abschnitt ist nicht der beste Ort, um die Terminalumgebung zu erhalten, ich denke, es funktioniert logisch und korrektHier ist die Antwort.
Ich danke Ihnen.
Ich möchte, dass die Verlaufsberechnungen sofort beim Start durchgeführt werden. Ich tue es vor Ort, weil ich es so brauche.
Ich habe eine Pause vor den Berechnungen eingefügt. Wenn ja, gibt es immer noch einige Fallstricke?
Es ist notwendig, bei der Inbetriebnahme Berechnungen zur Historie durchzuführen. Ich mache es im Haus, weil ich es so brauche.
Ich habe in der Einleitung eine Pause eingefügt, bevor ich rechne. Wenn ja, gibt es noch einige Fallstricke?
Es ist einfacher und zuverlässiger, das erste Startflag in OnTick() zu setzen
Leute, wer ist nicht beschäftigt und kann schauen. skizziert eine EA auf den gestrigen Indikator, aber etwas funktioniert nicht richtig. Es scheint, als würde es Geschäfte eröffnen, die nicht auf Signalen basieren. Ich habe versucht, Abschlussaufträge auf das entgegengesetzte Signal hinzuzufügen, aber die Geschäfte werden dann nicht geschlossen. Ich glaube, ich vermisse es.
Aus welchem Grund? Warum schreibst du nicht, was los ist?
Weil die Entwickler geschrieben haben, dass OnInit() für die Initialisierung gedacht ist und nicht für etwas anderes
Was wird passieren - Sie haben eine Pause gemacht, um die Indikatorwerte in OnInit() zu erhalten - was wird passieren, wenn der Benutzer die TF zur gleichen Zeit wechselt?
SZZY: Und wie würde sich Ihr Code verhalten, wenn Sie einen EA ausführen, dann das Terminal schließen und das Terminal mit einem laufenden EA wieder öffnen?