Sí. No hay razón para traducir el tiempo en cadena, ya que el tiempo es un número de segundos. Este número es mucho más fácil y rápido de trabajar que las cadenas.
Has corregido una cosa y has estropeado otra).
En la segunda parte en lugar de:
volver:
Tenías esa línea correcta en tu anterior intento.
Gracias por las respuestas. He probado ambas opciones.
No veo cuál es la pega: sigue entrando a saco al cerrar en un tope:
lil_lil:
Di tu condición en voz alta y verás lo que pasa)
if ( TimeSeconds(TimeCurrent()) - TimeSeconds(OrderCloseTime()) > TimeSeconds(30*60) )
if ( TimeCurrent() -OrderCloseTime() > 30*60 )
De hecho, hay != condición en todas partes, es decir, lo contrario > debe estar allí, si he entendido bien lo que quieres decir. Pero todas las variantes corrieron - todavía funciona.
Necesito que dibuje fractales con un punto, con un tipo de "zigzag", para que los fractales inferiores superiores vayan en secuencia y así sucesivamente.
Pero como resultado, los fractales repetidos aparecen en el gráfico de todos modos
La base está tomada del indicador fractal estándar. Captura de pantalla de abajo con el fractal repetido en el periodo 5
//+------------------------------------------------------------------+//| Fractals.mq5 |//| Copyright 2009-2017, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"2009-2017, MetaQuotes Software Corp."#property link"http://www.mql5.com"//---- indicator settings#property indicator_chart_window#property indicator_buffers2#property indicator_plots2#property indicator_type1DRAW_ARROW#property indicator_type2DRAW_ARROW#property indicator_color1 Gray
#property indicator_color2 Gray
#property indicator_label1"Fractal Up"#property indicator_label2"Fractal Down"bool high_f, low_f, lastIsUpper = true, lastIsLower = true;
int lastLowerIndex, lastUpperIndex;
//---- input datainputint period = 5;
int per = period;
//---- indicator buffersdouble ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high priceint ExtArrowShift=-10;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
if(per % 2 == 0) per++; //период фракталов только нечетный//---- indicator buffers mappingSetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawnPlotIndexSetInteger(0,PLOT_ARROW,217);
PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawingPlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
}
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
//---if(rates_total < per)
return(0);
//---if(prev_calculated < per + (per - 1) / 2)
{
limit = (per - 1) / 2;
//--- clean up arraysArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
}
else limit = rates_total - per;
for(i = limit; i < rates_total - (per + 1) / 2 && !IsStopped(); i++)
{
high_f = true; low_f = true;//с самого начала считаем что есть фрактал в i свечеfor(int g = 1; g < (per+1)/2; g++){//проверка на наличие фрактала (одновременной справа и слева от свечи с возможным фракталом)//---- Upper Fractalif(high[i-g] >= high[i] || high[i+g] > high[i]){//если одно из условий выполнено (high какой либо свечи справа или слева выше чем исследуемый), то фрактала сверху нет
ExtUpperBuffer[i] = EMPTY_VALUE;
high_f = false;
}
//---- Lower Fractalif(low[i-g] <= low[i] || low[i+g] < low[i]){ //если одно из условий выполнено, то фрактала снизу нет
ExtLowerBuffer[i] = EMPTY_VALUE;
low_f = false;
}
}
//устанавливаем верхнийif(high_f){//если фрактал все таки есть (из цикла-проверки выше)if(lastIsLower){//еси последний фрактал был нижний
ExtUpperBuffer[i] = high[i];//устанавливаем сверху
lastUpperIndex = i;//записываем индекс в буффере установленного
lastIsLower = false;//говорим что последний - не нижний
lastIsUpper = true;//а верхний
}else{
if(lastIsUpper){//если последний верхний (а мы пытаемся установить верхний)if(high[i] > ExtUpperBuffer[lastUpperIndex]){//если устанавливаем выше предыдущего
ExtUpperBuffer[lastUpperIndex] = EMPTY_VALUE;//удаляем предыдущий
ExtUpperBuffer[i] = high[i];//устанавливаем новый
lastUpperIndex = i;//записываем индекс нового
}
}
}
}
//аналогично для фрактала снизуif(low_f){
if(lastIsUpper){
ExtLowerBuffer[i] = low[i];
lastLowerIndex = i;
lastIsLower = true;
lastIsUpper = false;
}else{
if(lastIsLower){
if(low[i] < ExtLowerBuffer[lastLowerIndex]){
ExtLowerBuffer[lastLowerIndex] = EMPTY_VALUE;
ExtLowerBuffer[i] = low[i];
lastLowerIndex = i;
}
}
}
}
}
//--- OnCalculate done. Return new prev_calculated.return(rates_total);
}
//+------------------------------------------------------------------+
kotaries: ¿Pueden aconsejar cómo obtener el volumen de posiciones abiertas en MQL4, si SYMBOL_SESSION_INTEREST no es compatible? Gracias.
Recorrer todas las posiciones y calcular su volumen total:OrderLots()
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает сумму лотов открытых позиций |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - торговая операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
l+=OrderLots();
}
}
}
}
}
}
return(l);
}
No puedo entender por qué se devuelve un determinado valor de prev_calculated?
¿Cómo se calcula?
Es el valor devuelto por OnCalculate() en la última iteración. Esto se indica explícitamente en la documentación:
Hay que tener en cuenta la relación entre el valor devuelto por OnCalculate() y el segundo parámetro de entrada prev_calculado. El parámetro prev_calculado, cuando se llama a la función, contiene el valordevuelto por OnCalculate() en la llamadaanterior. Esto permite economizar los algoritmos de cálculo del indicador personalizado para evitar cálculos repetidos para aquellas barras que no han cambiado desde la anterior llamada a esta función.
¡Hola!
Sí. No hay razón para traducir el tiempo en cadena, ya que el tiempo es un número de segundos. Este número es mucho más fácil y rápido de trabajar que las cadenas.
Has corregido una cosa y has estropeado otra).
En la segunda parte en lugar de:
volver:
Tenías esa línea correcta en tu anterior intento.
Gracias por las respuestas. He probado ambas opciones.
No veo cuál es la pega: sigue entrando a saco al cerrar en un tope:
Di tu condición en voz alta y verás lo que pasa)
De hecho, hay != condición en todas partes, es decir, lo contrario > debe estar allí, si he entendido bien lo que quieres decir. Pero todas las variantes corrieron - todavía funciona.
Ayudar a entender la lógica, encontrar el error
Comentado el código en detalle.
Necesito que dibuje fractales con un punto, con un tipo de "zigzag", para que los fractales inferiores superiores vayan en secuencia y así sucesivamente.
Pero como resultado, los fractales repetidos aparecen en el gráfico de todos modos
La base está tomada del indicador fractal estándar. Captura de pantalla de abajo con el fractal repetido en el periodo 5
¿Pueden aconsejar cómo obtener el volumen de posiciones abiertas en MQL4, si SYMBOL_SESSION_INTEREST no es compatible? Gracias.
Recorrer todas las posiciones y calcular su volumen total:OrderLots()
No puedo entender por qué se devuelve un determinado valor de prev_calculated?
¿Cómo se calcula en primer lugar?
No puedo entender por qué se devuelve un determinado valor de prev_calculated?
¿Cómo se calcula en primer lugar?
No puedo entender por qué se devuelve un determinado valor de prev_calculated?
¿Cómo se calcula?
Es el valor devuelto por OnCalculate() en la última iteración. Esto se indica explícitamente en la documentación:
Hay que tener en cuenta la relación entre el valor devuelto por OnCalculate() y el segundo parámetro de entrada prev_calculado. El parámetro prev_calculado, cuando se llama a la función, contiene el valordevuelto por OnCalculate() en la llamadaanterior. Esto permite economizar los algoritmos de cálculo del indicador personalizado para evitar cálculos repetidos para aquellas barras que no han cambiado desde la anterior llamada a esta función.
La tarea consiste en encontrar la barra con el mínimo cierre
for(int x=0; x<=xBars -1; x++)
{
contra++;
// Print(Close[x],",",counter);
int h = ArrayMinimum(Close[x]);
if(contador > 20) break;
}
El compilador jura en Close