Buenos días a todos. Es necesario analizar la información desde un punto de vista temporal superior.
El sistema tiene una condición para construir un canal. Es encontrar los precios máximos y mínimos para un determinado número de bares. Lo he implementado utilizando el siguiente método:
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;}
}
}
Pero este enfoque lleva a analizar las barras del actual marco temporal de trabajo M5. Necesito que los parámetros bar1 y bar2 se tomen de M15
Tengo la sensación de que el problema está en algún lugar de aquí.
Max = High[iHighest(NULL, TimeFrameRZ, MODE_HIGH, bar2, bar1)]; //1. Ищем High и Low на отрезке [bar1, bar2].
Min = Low[iLowest(NULL, TimeFrameRZ, MODE_LOW, bar2, bar1)];
¿Me pueden decir cómo dar salida a los valores del indicador ZigZag en un EA? Los demás salen escribiendo iMA, iStochastic, iWPR ... ¿Cómo puedo calcular manualmente el ZigZag?
ZZuretc: Por favor, aconsejar cómo la salida de los valores del indicador ZigZag en el EA? Las otras son impresas por iMA, iStochastic, iWPR ... ¿Cómo puedo calcular manualmente el ZigZag?
¿Decidido a usar? Los valores del indicador ZigZag son cero en todas partes. Sólo en las cimas el valor del zigzag es igual al precio de la cima.
Tienes que pasar por las barras en un bucle. Ver ejemplo
a mí me funciona - sigue el movimiento del ratón
Quiero decir surolling).Buenos días a todos. Es necesario analizar la información desde un punto de vista temporal superior.
El sistema tiene una condición para construir un canal. Es encontrar los precios máximos y mínimos para un determinado número de bares. Lo he implementado utilizando el siguiente método:
Pero este enfoque lleva a analizar las barras del actual marco temporal de trabajo M5. Necesito que los parámetros bar1 y bar2 se tomen de M15
¿Cómo ponerlo en práctica?
Tengo la sensación de que el problema está en algún lugar de aquí.
¿Quién va a decir qué?
Tengo la sensación de que el problema está en algún lugar de aquí.
¿Quién va a decir qué?
Bueno, sí, especifica el marco temporal adecuado.
Sí, especifique el plazo correcto
Así que dije...
TimeFrameRZ = PERIOD_M15Es una variable externa.Declaro un array y relleno los elementos.
¿Por qué me sale un error de declaración sin tipo en la segunda línea?
Declaro un array y relleno los elementos.
¿Por qué me sale un error de declaración sin tipo en la segunda línea?
Escribe el código en el void OnTick() y todo funcionará.
O escribearray[0]=0.1; en void OnTick()
Declaro un array y relleno los elementos.
¿Por qué me sale un error de declaración sin tipo en la segunda línea?
¿Declara el array en el área de variables globales?
Entonces, declare de una vez los valores (ya que los rellena usted mismo en el código, por lo que están predefinidos), por ejemplo:
... O llenar el array con valores en OnInit() o en la función, donde se llenará.
Por favor, aconsejar cómo la salida de los valores del indicador ZigZag en el EA? Las otras son impresas por iMA, iStochastic, iWPR ... ¿Cómo puedo calcular manualmente el ZigZag?
¿Decidido a usar? Los valores del indicador ZigZag son cero en todas partes. Sólo en las cimas el valor del zigzag es igual al precio de la cima.
Tienes que pasar por las barras en un bucle. Ver ejemplo