Einen guten Tag an alle. Es besteht die Notwendigkeit, Informationen aus einem älteren Zeitrahmen zu analysieren.
Das System hat eine Bedingung, um einen Kanal zu bauen. Es geht darum, die Höchst- und Mindestpreise für eine bestimmte Anzahl von Bars zu ermitteln. Ich habe es nach der folgenden Methode implementiert:
externENUM_TIMEFRAMES TimeFrameRZ = PERIOD_M15; //Период разворотной зоныexternENUM_TIMEFRAMES TimeFrameIn = PERIOD_M5; //Период точки входаexternint ATR_period = 14;
externint UpLineSell = 7;
externint DownLineSell = 7;
externint UpLineBuy = 7;
externint DownLineBuy = 7;
// Параметры разворотных свечейexternstring Comment2 = "---------------------------------Параметры разворотных свечей------------------------------------------";
externint Volotilnost = 20; // Диапазон цен для трех разворотных свечей (в пунктах)externint MaxLineSell = 3;
externint MaxLineBuy = 3;
bool SellPattern = false;
bool BuyPattern = false;
bool New_Bar = false;
double UpLine_Sell = 0;
double DownLine_Sell = 0;
double UpLine_Buy = 0;
double DownLine_Buy = 0;
int i = 0, j = 0;
int ULs = 0;
int DLs = 0;
int ULb = 0;
int DLb = 0;
double MassZone[2][10];
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
if(Digits == 3 || Digits ==5 )
{
Volotilnost *=10;
UpLineSell *= 10;
DownLineSell *= 10;
UpLineBuy*= 10;
DownLineBuy*= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
RazvorotZona();
if(SellPattern == true)
{
if(ObjectCreate(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJ_HLINE,0,TimeCurrent(),UpLine_Sell))
{
ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_COLOR,clrOrange);//--- установим цвет прямоугольника ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
}
if(ObjectCreate(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJ_HLINE,0,TimeCurrent(),DownLine_Sell))
{
ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_COLOR,clrMagenta);//--- установим цвет прямоугольника ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
}
ULs++;
DLs++;
if(DLs >= MaxLineSell && ULs >= MaxLineSell)
{
ObjectDelete(ChartID(),"UpLine_Sell"+IntegerToString(ULs - MaxLineSell));
ObjectDelete(ChartID(),"DownLine_Sell"+IntegerToString(DLs - MaxLineSell));
}
}
if(BuyPattern == true)
{
if(ObjectCreate(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJ_HLINE,0,TimeCurrent(),UpLine_Buy))
{
ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_COLOR,clrDeepSkyBlue);//--- установим цвет прямоугольника ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
}
if(ObjectCreate(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJ_HLINE,0,TimeCurrent(),DownLine_Buy))
{
ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_COLOR,clrBrown);//--- установим цвет прямоугольника ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
}
ULb++;
DLb++;
if(ULb >= MaxLineBuy && DLb >= MaxLineBuy)
{
ObjectDelete(ChartID(),"UpLine_Buy"+IntegerToString(ULb - MaxLineBuy));
ObjectDelete(ChartID(),"DownLine_Buy"+IntegerToString(DLb - MaxLineBuy));
}
}
}
//+------------------------------------------------------------------+// Функция определения нового бара |//+------------------------------------------------------------------+void Find_New_Bar()
{
datetime TimeBar0 = iTime(Symbol(),TimeFrameRZ,0);
staticdatetime New_Time=0; // Время текущего бара
New_Bar=false; // Нового бара нет if(New_Time != TimeBar0) // Сравниваем время
{
New_Time = TimeBar0; // Теперь время такое
New_Bar = true; // Поймался новый бар
}
}
//+------------------------------------------------------------------+// Функция определения разворотной зоны |//+------------------------------------------------------------------+void RazvorotZona()
{
Find_New_Bar();
double Open3= NormalizeDouble (iOpen(Symbol(), TimeFrameRZ,4),Digits);
double Close3 = NormalizeDouble (iClose(Symbol(), TimeFrameRZ,4),Digits);
double High3 = NormalizeDouble (iHigh(Symbol(), TimeFrameRZ,4),Digits);
double Low3 = NormalizeDouble (iLow(Symbol(), TimeFrameRZ,4),Digits);
//Параметры индикатора волотильности ATR для нахожденя относительно большой свечи перед перевернутым Молотомdouble ATR = iATR(Symbol(),TimeFrameRZ,ATR_period,1);
SellPattern = false;
BuyPattern = false;
int bar1 = 1;
int bar2 = 3;
double Max, Min;
Max = High[iHighest(NULL, TimeFrameRZ, MODE_HIGH, bar2, bar1)]; //1. Ищем High и Low на отрезке [bar1, bar2].
Min = Low[iLowest(NULL, TimeFrameRZ, MODE_LOW, bar2, bar1)];
if(NormalizeDouble((Max - Min) / Point, Digits) < Volotilnost &&
MathAbs(Close3-Open3) > 1.5*ATR)
{
if((Close3 > Open3) && New_Bar == true)
{
UpLine_Sell = Max;
DownLine_Sell = Min;
SellPattern = true;
Print ("Идентифицирован паттерн");
Print ("Максимальная цена "+DoubleToStr(Max));
Print ("Минимальная цена "+DoubleToStr(Min));
}
else {SellPattern = false;}
if((Close3 < Open3) && New_Bar == true)
{
UpLine_Buy = Max;
DownLine_Buy = Min;
BuyPattern = true;
Print ("Идентифицирован паттерн");
}
else {BuyPattern = false;}
}
}
Dieser Ansatz führt jedoch zu einer Analyse von Balken aus dem aktuellen Arbeitszeitraum M5. Die Parameter bar1 und bar2 müssen von M15 übernommen werden.
Ich habe das Gefühl, dass das Problem irgendwo hier liegt.
Max = High[iHighest(NULL, TimeFrameRZ, MODE_HIGH, bar2, bar1)]; //1. Ищем High и Low на отрезке [bar1, bar2].
Min = Low[iLowest(NULL, TimeFrameRZ, MODE_LOW, bar2, bar1)];
Können Sie mir sagen, wie ich die Werte des ZigZag-Indikators in einem EA ausgeben kann? Die anderen werden durch Schreiben von iMA, iStochastic, iWPR ... ausgegeben. Wie kann ich ZigZag manuell berechnen?
ZZuretc: Bitte beraten Sie, wie man die Werte des ZigZag-Indikators in den EA ausgeben? Die anderen werden von iMA, iStochastic, iWPR ... gedruckt. Wie kann ich ZigZag manuell berechnen?
Entschieden zu verwenden? Die Werte des ZigZag-Indikators sind überall Null. Nur in den Tops ist der Zickzackwert gleich dem Preis am Top.
Sie müssen in einer Schleife durch die Gitterstäbe gehen. Siehe Beispiel
Bei mir funktioniert es - es verfolgt die Mausbewegung
Ich meine surolling).Einen guten Tag an alle. Es besteht die Notwendigkeit, Informationen aus einem älteren Zeitrahmen zu analysieren.
Das System hat eine Bedingung, um einen Kanal zu bauen. Es geht darum, die Höchst- und Mindestpreise für eine bestimmte Anzahl von Bars zu ermitteln. Ich habe es nach der folgenden Methode implementiert:
Dieser Ansatz führt jedoch zu einer Analyse von Balken aus dem aktuellen Arbeitszeitraum M5. Die Parameter bar1 und bar2 müssen von M15 übernommen werden.
Wie kann man das umsetzen?
Ich habe das Gefühl, dass das Problem irgendwo hier liegt.
Wer hat was zu sagen?
Ich habe das Gefühl, dass das Problem irgendwo hier liegt.
Wer hat was zu sagen?
Nun, ja, geben Sie den richtigen Zeitrahmen an.
Ja, geben Sie den richtigen Zeitrahmen an
Also sagte ich...
TimeFrameRZ = PERIOD_M15Es ist eine externe Variable.Ich deklariere ein Array und trage die Elemente ein.
Warum erhalte ich in der zweiten Zeile eine Deklaration ohne Typfehler?
Ich deklariere ein Array und trage die Elemente ein.
Warum erhalte ich in der zweiten Zeile eine Deklaration ohne Typfehler?
Schreiben Sie Code in void OnTick() und alles wird funktionieren.
Oder schreiben Siearray[0]=0.1; in void OnTick()
Ich deklariere ein Array und trage die Elemente ein.
Warum erhalte ich in der zweiten Zeile eine Deklaration ohne Typfehler?
Deklarieren Sie das Array im Bereich der globalen Variablen?
Dann deklarieren Sie sie auf einmal mit Werten (da Sie sie selbst im Code füllen, sind sie also vordefiniert), zum Beispiel:
... Oder füllen Sie das Array mit Werten in OnInit() oder in der Funktion, mit der es gefüllt werden soll.
Bitte beraten Sie, wie man die Werte des ZigZag-Indikators in den EA ausgeben? Die anderen werden von iMA, iStochastic, iWPR ... gedruckt. Wie kann ich ZigZag manuell berechnen?
Entschieden zu verwenden? Die Werte des ZigZag-Indikators sind überall Null. Nur in den Tops ist der Zickzackwert gleich dem Preis am Top.
Sie müssen in einer Schleife durch die Gitterstäbe gehen. Siehe Beispiel