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

 

Hola, ¿podríais decirme por qué no funciona? No hay errores, pero los pedidos no se abren en el probador. Estoy tratando de escribir un EA para la ruptura de alta y baja de una vela diaria como una herramienta de entrenamiento.


extern int      TimeCandle   = 1440;      //таймфрейм свечи, которую пробиваем 
extern int      HourStart=10; // час начала торговли
extern double   Lots=0.1;     // лот торговли   
extern int      StopLoss=100; // стоплосс
extern int      TakeProfit=100; // тайкпрофит
extern int      znak=5;     // количество знаков котировки
extern int      magik=54321;     // магик 

double minprice; // минимальная цена
double maxprice;// максимальная цена


void OnTick()
  {
  double SL, TP;
  int ticket;
 
   minprice = iLow(Symbol(),TimeCandle,1);
   maxprice = iHigh(Symbol(),TimeCandle,1);   
   
   if (TimeHour(TimeCurrent()==HourStart))
   { 
    if (BuyLimitCount()==0 && BuyCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(maxprice - StopLoss*Point,znak);
    TP = NormalizeDouble(maxprice + TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_BUYLIMIT,Lots,maxprice, 10, SL,TP,"", magik,0,Blue);
    
    if (ticket <0)
    Print ("Не удалось открыть ордер на покупку");
    }
    
    
     if (SellLimitCount()==0 && SellCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(minprice + StopLoss*Point,znak);
    TP = NormalizeDouble(minprice - TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_SELLLIMIT,Lots,minprice,10, SL,TP,"", magik,0,Red);
        
    if (ticket <0)
    Print ("Не удалось открыть ордер на продажу");
    }
    
    }
    Comment ("Минимальная цена:" + DoubleToStr(minprice,znak) + "\n" + "Максимальная цена:"+ DoubleToStr(maxprice, znak)); 
  }
   
  // проверяем есть ли байлимит ордера с конца
  int BuyLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUYLIMIT )                        
        {
        count ++;
        }
    }
    return(count);  
    
  }
   // проверяем есть ли селллимит ордера с конца
  int SellLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELLLIMIT )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
   // проверяем есть ли бай ордера с конца
  int BuyCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUY )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
  // проверяем есть ли селл ордера с конца
  int SellCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&         
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELL )                        
        {
        count ++;
        }
    }
    return(count);      
  }
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
 
nelenaby:

Hola, ¿podríais decirme por qué no funciona? No hay errores, pero los pedidos no se abren en el probador. Estoy tratando de escribir un EA para la ruptura de alta y baja de una vela diaria como una herramienta de entrenamiento.


¿No se abre, es decir, no lo intenta o lo intenta pero falla? ¿Qué dicen en el registro?

 
nelenaby:

Hola, ¿podríais decirme por qué no funciona? No hay errores, pero los pedidos no se abren en el probador. Estoy tratando de escribir un EA para el desglose de alta y baja de una vela diaria como una herramienta de entrenamiento.


Analiza esta expresión tuya

if (TimeHour(TimeCurrent()==HourStart))
        {
          ........
        }

No entiendo el significado de esta expresión y quizá me equivoque, pero al menos deberías sustituir "(TimeCurrent()==HourStart)" por "(TimeCurrent() - HourStart)".

 

A continuación, si le he entendido bien, está intentando colocar una orden BuyLimit si no hay BuyLimitOrder y BuyPosition. Fíjate en el "Y" exacto. Es decir, la presencia de cualquiera de ellos por separado le conviene, así, en una posición deseada del precio actual obtendrá un número infinito de ByLimits, uno en cada tick, hasta que al menos uno de ellos se dispare y se abra la primera posición. Además, no le importa el precio actual. En cuanto se cumple la extraña condición sobre el tiempo (justo encima del puesto), creo que hay un error, pero no importa. De todos modos, si no tiene en cuenta esto, el EA comenzará a colocar órdenes erróneas en el primer tick, hasta que el precio alcance el máximo de ayer, porque está utilizando el máximo de ayer como precio para colocar la orden. El Límite de Compra se establece por debajo del precio actual, lo que significa que el precio actual debe estar por encima del máximo de ayer, pero hasta entonces la orden fallará.

Por lo tanto, la única situación que le conviene es cuando el precio se ha movido por encima del máximo de ayer, no hay límite de bye, y no hay operaciones abiertas. Se trata de una combinación poco frecuente. Además, no afectará a la ruptura, sino que rebotará después de la ruptura (porque hay un bylimit), y te lanzará muchos errores, empezando por el primer tick por encima del máximo de ayer (ese es otro error). La condición ya se cumple, el Asesor Experto lanza la orden, pero también hay un spread, la distancia mínima permitida del mercado, etc.

 
Sergey Voytsekhovsky:

Me cuesta entender el significado de esta expresión, quizá me equivoque, pero al menos sustituye "(TimeCurrent()==HourStart)" por "(TimeCurrent() - HourStart)".

Así es, aquí hay un error. Necesita si (TimeHour(TimeCurrent())==HourStart)

Ahora el pedido se abre a veces, pero genera más errores (OrderSend error 130).

El error aquí no es correcto sobre las órdenes limitadas.

 
nelenaby:

Así es, hay un error aquí. Necesita si (TimeHour(TimeCurrent())==HourStart)

Ahora abre las transacciones a veces, pero arroja más errores (OrderSend error 130).

No es correcto lo de las órdenes limitadas.

Aquí hay un script para trabajar con el tiempo.

Es antiguo pero funciona correctamente.

Archivos adjuntos:
 

Hola.

Por favor, ayúdenme a entender cómo trabajar con los archivos.

Cuando el programa está en marcha, guardo los datos recibidos en un archivo y leo el CSV.

El archivo aumenta, la velocidad disminuye. He intentado actualizar (sobrescribir) algunos de los elementos de las líneas. ¡No puede ser!

No se puede borrar una línea seleccionada. No puedo añadir un nuevo elemento a una línea antigua.

¡Esto es muy extraño! Puede eliminar fácilmente un archivo o un objeto gráfico, etc. Pero cuando se trata de trabajar con un archivo creado, ¡es un punto muerto absoluto!

En los foros sólo hay una recomendación: "Lea el archivo en la memoria, cambie o elimine la línea y guarde el nuevo archivo con el nombre anterior".

No me parece que esta sea la solución correcta. Debo haberme perdido algo. Por favor, ayúdenme a resolverlo.

 
im-zvv:

No me parece una decisión correcta. Probablemente se me escapa algo. Por favor, ayúdenme a resolverlo.

Debería ser contratado urgentemente por Microsoft para arreglar de una vez esta"solución errónea" para el manejo dearchivos.


El manejo de archivos no es como editar un archivo en un editor de archivos, es más bien como hacer una palabra con dados con letras individuales.
Si necesitas insertar una nueva letra, todos los cubos que la siguen deben moverse hacia la derecha.
Si quieres eliminar una letra antigua, todos los dados que la siguen deben moverse a la izquierda.
Por lo tanto, si el archivo no es grande y el trabajo no requiere acceso al archivo, es realmente más fácil escribir los datos en un nuevo archivo, borrar el antiguo y renombrar el nuevo archivo con el nombre del antiguo.

Si no me equivoco, lo único que falta en MQL al trabajar con archivos es la posibilidad de recortar la longitud del archivo al tamaño requerido.


 
Alekseu Fedotov:

Aquí hay un guión para trabajar con el tiempo.

Es antiguo, pero funciona correctamente.

Yo también utilizaba la función de Kim, luego encontré tiempo para escribir la mía:

//_______________________________________________________________________
class CWorkTime
  {
private:
   int               mday,mstarthour,mstophour,mstartmin,mstopmin;
   datetime          mstarttime,mstoptime;
   bool              UseThisSession;
   void inittime()
     {
      mday=Day();
      MqlDateTime dtstart,dtstop;
      TimeToStruct(TimeCurrent(),dtstart);
      dtstop=dtstart;
      dtstart.hour= mstarthour;
      dtstart.min = mstartmin;
      dtstop.hour = mstophour;
      dtstop.min = mstopmin;
      mstarttime = StructToTime(dtstart);
      mstoptime=StructToTime(dtstop);
     }
public:
   void              CWorkTime(void){};
   void              ~CWorkTime(void){};
   void              CWorkTime(int hstart,int mstart,int hstop,int mstop)
     {
      mstarthour=hstart;
      mstartmin = mstart;
      mstophour=hstop;
      mstopmin=mstop;
      UseThisSession=(mstarthour<0 || mstophour<0 || mstarthour>23 || mstophour>23) ? false : true;
      UseThisSession=(mstartmin<0 || mstopmin<0 || mstartmin>59 || mstopmin>59) ? false : true;
      if(UseThisSession) inittime(); else Print("Время работы советника не используется");
     };

   bool              Disable()
     {
      bool result=false;
      if(UseThisSession)
        {
         if(mday!=Day()) inittime();
         datetime t=TimeCurrent();
         result=t>=mstarttime && t<=mstoptime ? false : true;
        }
      return(result);
     };
  }
*Work;


.....

int OnInit()
{
   Work=new CWorkTime(StartHour,StartMinute,StopHour,StopMinute);
}

.....


void OnTick()
  {

if(Work.Disable())
{
 Comment("Не торговое время!!! Сопровождение открытых ордеров");
 }
else
{......
deshabilitar el tiempo de ejecución: hay que introducir datos no válidos al inicializar el constructor, por ejemplo, 25 horas o 70 minutos
 
Sergey Dzyublik:

Necesitas urgentemente ser contratado por Microsoft para que por fin arreglen esta"solución errónea" para el manejo de archivos.


Trabajar con archivos no es como editar un archivo en un editor de archivos, es más como hacer una palabra con dados con letras individuales.
Si necesitas insertar una nueva letra, todos los cubos que la siguen deben moverse hacia la derecha.
Si quieres eliminar una letra antigua, todos los dados que la siguen deben moverse a la izquierda.
Por lo tanto, si el archivo no es grande y el trabajo no requiere acceso al archivo, es realmente más fácil escribir los datos en un nuevo archivo, borrar el antiguo y renombrar el nuevo archivo con el nombre del antiguo.

Si no me equivoco, lo único que falta en MQL al trabajar con archivos es la posibilidad de recortar la longitud del archivo al tamaño requerido.


Gracias. Buena aclaración. Desgraciadamente mi archivo es muy grande y por lo tanto tendré que trabajar con "cubos".
Razón de la queja: