Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 829

 
En mt5, cuando se prueba en ticks reales, ¿la comisión cuenta ahí, o sólo el spread?
 

El experto en multidivisas del bucle pide los datos por símbolo. Hay un fragmento de este tipo:

      int gtc1 = GetTickCount();
      res_copy_buf = CopyBuffer(handle, 0, 0, bars_calc, Buf_01); 
      int gtc2 = GetTickCount();

Todos los símbolos pasan normalmente. Durante la primera pasada el tiempo es de unos 120ms, porque los buffers de los indicadores se están llenando. A partir de la segunda pasada el tiempo de cálculo en la barra actual es inferior a 1 ms.

La peculiaridad es que un conocido broker tiene el símbolo EURRUR, del que no hay datos ("Wait for update"). Por lo tanto, el cálculo se atasca en esta línea durante 51 segundos. Error 4806. 51 segundos es inaceptable incluso para una (primera) vez, por no hablar de un ciclo.

Pregunta. ¿Cómo puedo averiguar rápidamente que no hay datos para un determinado personaje? Luego lo memorizaba y en las siguientes iteraciones lo superaba y seguía sin perder el ritmo.

 

Colegas, por favor, aconsejen cómo convertir un array de tipo double a string. Necesito escribirlo en un archivo. Este es un código de formación general.

void OnStart()
{

double ar[];               // Массив
ArrayResize(ar,2);         // Подготовка массива
int i, Size=ArraySize(ar); // стартовое количество элементов

ar[0]=1;                   // Установка значений 2-х элементов массива
ar[1]=2; 

ArrayResize(ar,3); // Увеличение размера массива
ar[2]=3;           // Установка значения новому элементу массива
ArrayResize(ar,4); // Увеличение размера массива
ar[3]=4;           // Установка значения новому элементу массива
ArrayResize(ar,5); // Увеличение размера массива
ar[4]=5;           // Установка значения новому элементу массива
ArrayResize(ar,6); // Увеличение размера массива
ar[5]=6;           // Установка значения новому элементу массив
ArrayResize(ar,7); // Увеличение размера массива
ar[6]=7;           // Установка значения новому элементу массив
Size=ArraySize(ar);// новое количество элементов
ArraySetAsSeries(ar,true); // Смена направления индексации


//--- запись в файл


SaveArrayToFile ("s_ar", ar);
return;
}


bool SaveArrayToFile(string FileName, string  &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_TXT);
   if(h==-1){Alert(" ошибка открытия файла в ф-ии "); return(false);} // Ошибка открытия файла
   
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
 

Información extraída del artículo

Guardar y cargar matrices desde un archivo

Al guardar y cargar un array desde un archivo, debemos considerar la diferencia de la primera dimensión del tamaño del array y el número total de sus elementos. Cuando se guarda un array, se debe escribir primero el tamaño del array (el número total de elementos determinado por ArraySize()) en el archivo, y luego el array completo:

bool SaveArrayToFile(string FileName,string &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_TXT|FILE_WRITE);
   if(h==-1) return(false); // Ошибка открытия файла
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
  }
 

Hola, me encuentro con el siguiente problema.

Tengo dos EAs para el mismo instrumento con diferentes magias respectivamente. Yo configuro mi magik a través de CTrade y abro una posición a través de CTrade también. Cuando tengo una posición abierta del primer EA, su magik se asigna al segundo EA (lo comprobé después de abrir una posición, ver más abajo), por lo que la comprobación de posiciones abiertas no ve mi magik y abro muchas posiciones en una dirección. La cuenta está en una demo, esto no se puede detectar en el probador. Si el valor del magik se guarda en la clase, tal vez habría que ponerlo a cero, pero no sé cómo.

int OnInit()
  {    
  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
}
открываю позицию соответственно тоже через CTrade:
 if(SellCount()>0 || BuyCount()>0)
           {
            Print("Уже есть позиция на продажу !!!");
            return; // не добавлять к открытой позиции на покупку
           }
         SL=NormalizeDouble(latest_price.bid + STP*_Point,_Digits);
         TP=NormalizeDouble(latest_price.bid - TKP*_Point,_Digits);
         
         m_trade.Sell(lots1,_Symbol,0,SL,TP,"LaquerreOSC_MA_2.5.6.7 + 2");
         m_position.Select(_Symbol);
           {
            ulong myMagic=m_position.Magic();
            Print(" Открыта поза Селл с магиком № ",myMagic,", И спредом ",SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
           }
//+------------------------------------------------------------------+
int SellCount()//проверка рыночных ордеров на продажу
  {
   int count=0;
   for(int i=PositionsTotal()-1; i>=0;i--)
     {
      if(PositionSelect(_Symbol)==true)
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

 
Pavel Nikiforov:

Hola, me encuentro con el siguiente problema.

Tengo dos EAs para el mismo instrumento con diferentes magias respectivamente. Yo configuro mi magik a través de CTrade y abro una posición a través de CTrade también. Cuando tengo una posición abierta del primer EA, su magik se asigna al segundo EA (lo comprobé después de abrir una posición, ver más abajo), por lo que la comprobación de posiciones abiertas no ve mi magik y abro muchas posiciones en una dirección. La cuenta está en una demo, esto no se puede detectar en el probador. Si el valor del magik se guarda en la clase, quizás haya que ponerlo a cero, pero no sé cómo.

Por favor,pegue el código correctamente, no como una hoja de texto.


En cuanto al código: establecer los parámetros de entrada a cada EA con su propio magik. Digamos que se pone el primero en 10001 y el segundo en 10002.

 
Vladimir Karputov:

Por favor,inserte el código correctamente, no como una hoja de texto.


En cuanto al código: establecer los parámetros de entrada a cada EA con su propia magia. Supongamos que se fija el primero en 10001 y el segundo en 10002.

Gracias por una respuesta tan breve. Pero esa es la cuestión, las magias son diferentes. Así, he determinado que el segundo robot abre posiciones con el primer mago. No sé cómo ocurre y dónde guarda el primer número mágico de EA pero me gustaría averiguarlo.

 
Pavel Nikiforov:

Gracias por la rápida respuesta. Pero esa es la cuestión, los magos son diferentes. Entonces descubrí que el segundo robot está abriendo posiciones con el número mágico del primero. No sé cómo ocurre y dónde guarda el primer número mágico de EA pero me gustaría averiguarlo.

En este caso, es mejor establecer el magik

  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
antes de cada apertura de posición/orden en lugar de en OnInit.
 
Alexey Viktorov:

En este caso, es mejor especificar un magik

antes de cada apertura de posición, no en OnInit.

En este caso, no es "mejor", es exactamente lo que necesita: es una clase envolvente para las funciones comerciales estándar. No almacena múltiples magias. Por eso hay que poner un magik cada vez antes y cuando se quiere abrir una posición con un nuevo magik.

Por lo general, la secuencia es la siguiente:

  • las posiciones deben abrirse con la magia 1 - establecemos la magia 1 y las posiciones posteriores tendrán la magia 1,
  • es necesario abrir posiciones con un Mago 2 - establecemos el Mago 2 y todas las posiciones siguientes tendrán un Mago 2,
  • es necesario abrir posiciones con magic 3 - estableceremos magic 3 y cada posición siguiente tendrá magic 3,

etc...

 
Alexey Viktorov:

En este caso, es mejor establecer un magik

Antes de cada apertura de una posición/orden, y no en OnInit.

Originalmente era así, no ayuda. Pero en los ejemplos suele estar en OnInit por lo que se ha movido. Durante mucho tiempo he estado trasteando con esto, los búhos en la prueba parecen funcionar sin problemas, y de repente abro el servidor y hay 20 posiciones en una dirección. ¿Puede el hecho de que la comprobación de los puestos vacantes no sea a través de las clases?

 
Pavel Nikiforov:

Gracias por la rápida respuesta. Pero esa es la cuestión, los magos son diferentes. Entonces descubrí que el segundo robot está abriendo posiciones con el número mágico del primero. No sé cómo sucede y dónde guarda el primer número mágico de EA, pero quiero averiguarlo.

Dado que no hay un métodoGetExpertMagicNumber en la clase CTrade, por favor imprima este código después de la operación de comercio:

Print("Expert name: ",__FILE__,", magic: ",IntegerToString(m_trade.RequestMagic());

De esta manera puedes comprobar si ambos EAs tienen magias diferentes.