Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 738

 
novichok2018:

El mensaje sigue apareciendo en el minuto 12.

Insertar la impresión, al principio de la función donde se rellena el array

Print("Range = ", ArrayRange(NewsArr,1));

y mostrar el número de valores en la segunda dimensión

 
Ilya Prozumentov:

Puedo decir de todo que NomNews entra en el bucle While ya en un estado mayor que 999. Entonces tienes que averiguar por qué ocurre y restablecer esta variable en algún lugar.

Para comprobarlo, escríbalo al principio del bucle:

Sí, en el minuto 11 la impresión es de 1000.

 
Alekseu Fedotov:

Insertar la impresión, al principio de la función donde se rellena el array

y mostrar el número de valores en la segunda dimensión

Lo inserté al principiodel bucle While y obtuveRango infinito= 1000. ¿Lo inserté en el lugar equivocado?

¿Qué es este número (o función?): datetime TimeNewsFunck(int nomf)

{

string s=NewsArr[0][nomf];

string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4));

return((datetime)(StringToTime(time) + GMTplus*3600))

}

¿Y de dónde saca el valor de int nomf? No pude encontrarlo.

 
novichok2018:

Lo inserté al principiodel bucle While y obtuveRango infinito= 1000. ¿Lo puse en el lugar equivocado?

¿Y qué es este número (o función): datetime TimeNewsFunck(int nomf)

{

string s=NewsArr[0][nomf];

string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4));

return((datetime)(StringToTime(time) + GMTplus*3600))

}

¿Y de dónde saca el valor de int nomf? No lo he encontrado.

Y luego está la función que he intentado pero no he conseguido averiguar. ¿Puede ser el origen del problema?

bool CheckInvestingNews(int &pwr,datetime &mintime)
  {

   bool CheckNews=false; pwr=0; int maxPower=0;
   if(MidleNews || HighNews)
     {
      if(TimeCurrent()-LastUpd>=Upd){Print("Investing.com News Loading...");UpdateNews();LastUpd=TimeCurrent();Comment("");}
      WindowRedraw();
      //---Draw a line on the chart news--------------------------------------------
      if(DrawNewsLines)
        {
         for(int i=0;i<NomNews;i++)
           {
            string Name=StringSubstr("NS_"+TimeToStr(TimeNewsFunck(i),TIME_MINUTES)+"_"+NewsArr[1][i]+"_"+NewsArr[3][i],0,63);
            if(NewsArr[3][i]!="")if(ObjectFind(Name)==0)continue;
            if(OnlySymbolNews && StringFind(ValStr,NewsArr[1][i])<0)continue;
            if(TimeNewsFunck(i)<TimeCurrent() && Next)continue;

            color clrf=clrNONE;
            if(HighNews && StringFind(NewsArr[2][i],"High")>=0)clrf=HighColor;
            if(MidleNews && StringFind(NewsArr[2][i],"Moderate")>=0)clrf=MidleColor;
   //         if(LowNews && StringFind(NewsArr[2][i],"Low")>=0)clrf=LowColor;

            if(clrf==clrNONE)continue;

            if(NewsArr[3][i]!="")
              {
               ObjectCreate(0,Name,OBJ_VLINE,0,TimeNewsFunck(i),0);
               ObjectSet(Name,OBJPROP_COLOR,clrf);
               ObjectSet(Name,OBJPROP_STYLE,LineStyle);
               ObjectSetInteger(0,Name,OBJPROP_WIDTH,LineWidth);
               ObjectSetInteger(0,Name,OBJPROP_BACK,true);
              }
           }
        }
      //---------------event Processing------------------------------------
      int ii;
      for(ii=0;ii<NomNews;ii++)
        {
         int power=0;
         if(HighNews && StringFind(NewsArr[2][ii],"High")>=0){ power=3; MinBefore=HighIndentBefore; MinAfter=HighIndentAfter; }
         if(MidleNews && StringFind(NewsArr[2][ii],"Moderate")>=0){ power=2; MinBefore=MidleIndentBefore; MinAfter=MidleIndentAfter; }
 //        if(LowNews && StringFind(NewsArr[2][ii],"Low")>=0){ power=1; MinBefore=LowIndentBefore; MinAfter=LowIndentAfter; }
         if(NFPNews && StringFind(NewsArr[3][ii],"Nonfarm Payrolls")>=0){ power=4; MinBefore=NFPIndentBefore; MinAfter=NFPIndentAfter; }
         if(power==0)continue;

         if(TimeCurrent()+MinBefore*60>TimeNewsFunck(ii) && TimeCurrent()-MinAfter*60<TimeNewsFunck(ii) && (!OnlySymbolNews || (OnlySymbolNews && StringFind(ValStr,NewsArr[1][ii])>=0)))
           {
            if(power>maxPower){   maxPower=power; mintime=TimeNewsFunck(ii); }
              }else{
            CheckNews=false;
           }
        }
      if(maxPower>0){ CheckNews=true; oppoz=true; }
     }
   pwr=maxPower; 
   return(CheckNews);
  }
 
novichok2018:

Y luego hay una función que no he podido descifrar, por más que lo he intentado. ¿Quizá ahí radica el problema?

Sólo el autor lo descubrirá por sí mismo. Será mejor que envíes el código de OnTick()

 
novichok2018:

Sí, en el minuto 11 dio la impresión 1000.

Intenta sustituir

while(!IsStopped())

con esta línea.

while(NomNews<300 && !IsStopped())
 
Ilya Prozumentov:

Exceso((2*psd*usd)*((2*psd*usd)-C))/(C-1)) en la fórmula.

Exponenciación: ^0,5 no es *0,5

Si no hay una sola operación en el símbolo buscado y majik, o no hay una sola ganancia o pérdida, o sólo hay un par (C=1), obtendremos la división por 0.

Antes de la fórmula propiamente dicha, debe comprobar que psd y usd son > 0, y que C !=1

Los pares rentables se calculan con beneficio > 1, pérdida < 1, con beneficio=1 no se analizan, es decir, el 1 también tiene que incluirse en algún lugar de este o aquel grupo.

En su función, sería mejor seleccionar primero los números de transacción que coincidan con el símbolo y el número mágico y luego comprobar si su número ha cambiado, si es así - recalcular zn, si no - devolver zn (zn en este caso no se pone a cero y comprobar != 0 no será necesario al imprimir)

El búho deja de funcionar, porque depende de las variables ww y nn, y cuando su función funciona, cambian y rompen el algoritmo del búho.

No se habría compilado nada si hubiera habido un error de diseño del código.

Sólo puedo decir gracias. Este es el único lugar de Runet donde me ayudaron.

Ahora la impresora genera lo siguiente "Stop_Ma_v_5.1 EURUSD,M15: == Z-count equals = -nan(ind)" . ¿Podría indicar qué significa y el código que debe devolver el número?

Código :

//+------------------------------------------------------------------+
//| Подсчёт z-вероятности. @axe44 Алексей Корольков                  |
//+------------------------------------------------------------------+
  
double Z()
  {
    zn=0;          // z-число
    psd=0;         // кол. положительных сделок
    usd=0;         // количество отрицательных сделок 
    www=0;         // боол переменная 
    nnn=0;         // боол переменная
    kolichestvo=0; // подсчёт закрытых ордеров открытых роботом
    C=0;          // C = количество чередований между отрицательными и положительными сделками
    index=OrdersHistoryTotal(); 
      if(OrdersHistoryTotal()>302) index=301; // берём не более 301 сделки
    //if(index<30) return(0);                 // берём не менее 30
    count=OrdersHistoryTotal();             // считаем от скольки 
    prom=count-index;                       // выделяем только последние сделки
    if (prom<0) prom=0;                     // исключаем ошибки
  
   for( i=prom;i<=count;i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {// далее магия
           pribul=OrderProfit(); 
           if (ww==0&&pribul>1){C++;www=1;nnn=0;}// подсчитываем смену тенденции
           if (nn==0&&pribul<1){C++;www=0;nnn=1;}// подсчитываем смену тенденции 
           if (pribul>1){psd++;}//прибыльные сделки
           if (pribul<1){usd++;}// убыточные сделки
           kolichestvo++;
           }
        }
     }
    /*
Величина Z = (A * (C — 0.5) — B)/   ((B*(B — C))/(C -1))^(1/2), где:
A = количество анализируемых сделок;
B = 2*количество прибыльных сделок * количество убыточных сделок;
C = количество чередований в выборке (чередованием считается каждая пара сделок, 
когда прибыльная сделка сменяет убыточную либо наоборот).
          */ 
            
            if(kolichestvo>30&&psd>0&&usd>0&&C!=1)
            zn=(index*(C-0.5)-2*psd*usd)  /  pow(((2*psd*usd*(2*psd*usd-C))/(C-1)),0.5);
      
     
     
   return(zn);
  }
Gracias
 
aleksandr bebishev:

Chicos de Mql5, ¿podéis ayudarme a hacer una solicitud para cerrar una posición en una cuenta de cobertura? Situación: abierta la posición de COMPRA, necesitamos cerrarla con Límite de Venta. Pregunta: ¿Cómo puedo escribir correctamente una solicitud, para cerrar exactamente la posición elegida, y no para abrir nuevas VENTAS bloqueando las COMPRAS? Por favor, escriba un código con comentarios. Gracias de antemano.

Cierre por una orden abierta de otra orden abierta para el mismo símbolo pero en sentido contrario.

OrdenarCerrarPor(
intticket,// número de orden a cerrar
intopposite,// número de la orden opuesta
colorarrow_color// color
);

Parámetros

billete

[in] Número de orden único de la orden que se va a cerrar.

frente a

[Un número de secuencia único de la orden opuesta.

color_flecha

[El color de la flecha de cierre en el gráfico. Si este parámetro no está presente o su valor es CLR_NONE, la flecha no se muestra en el gráfico.

Valor devuelto

Devuelve true si la función tuvo éxito o false si hubo un error. Para obtener la información del error, llame a GetLastError().

Ejemplo:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderCloseBy(order_id,opposite_id;)
return(0);
}

P.D. Este hilo sólo analiza MQL4

 
Aliaksei Karalkou:

Sólo puedo decir gracias. Este es el único lugar en Runet, donde ayudaron.

Ahora la impresora genera lo siguiente "Stop_Ma_v_5.1 EURUSD,M15: == Z-Account Equals = -nan(ind)". ¿Podría indicar qué significa y el código que debe devolver el número?

Código :

Gracias
Nan - NaN - Not a Number - No es un número. Intenta normalizar los números en el cálculo Z
 
Aliaksei Karalkou:

El cierre de una orden abierta por otra orden abierta para el mismo instrumento, pero en sentido contrario.

boolOrdenarCerrarPor(
intticket,// número de orden a cerrar
intopposite,// número de la orden opuesta
colorarrow_color// color
);

Parámetros

billete

[Un número secuencial único de la orden que se está cerrando.

frente a

[Un número de secuencia único de la orden opuesta.

color_flecha

[El color de la flecha de cierre en el gráfico. Si falta este parámetro o su valor es CLR_NONE, la flecha no se muestra en el gráfico.

Valor devuelto

Devuelve true si la función tuvo éxito o false si hubo un error. Para obtener la información del error, llame a GetLastError().

Ejemplo:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderCloseBy(order_id,opposite_id;)
return(0);
}

P.D. Este hilo sólo analiza MQL4

No. Cualquier pregunta sobre mql4 así como sobre mal5 se maneja aquí en este hilo, porque el propósito principal era ayudar no sólo con algoritmos y códigos sino también facilitar la migración de mql4 a mql5.