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

 

¡Hola a todos y feliz año nuevo! ¿Pueden decirme: cómo puedo hacer para que mi script utilice un indicador del mercado?

Más concretamente:
hay un indicador "Automatic Trendline" en el mercado. Quiero hacer un robot basado en él, que abriría o cerraría una posición en el momento en que el precio cruce estas líneas en el indicador (bien, y bajo condiciones adicionales especificadas).

 
Rad89 #:

¡Hola a todos y feliz año nuevo! Me puede decir: ¿cómo puedo darme cuenta de que mi script utilizaría un indicador del mercado?

Más concretamente:
hay un indicador "Automatic Trendline" en el mercado. Quiero hacer un robot basado en él, que abriría o cerraría una posición en el momento en que el precio cruce estas líneas en el indicador (bien, y bajo condiciones adicionales especificadas).

No hay problema para mí. Para el mercado o CodeBase no se puede utilizar la artesanía de otra persona del mercado ...

 
Alexey Viktorov #:

Para ti, no hay problema. No puedes utilizar las manualidades de otra persona del mercado o de CodeBase...

Para ti mismo. No sé cómo hacerlo. No puedo encontrar el código en código abierto. O cómo atornillar en mi código que captaría la posición de las líneas.

 

Hola, @Rad89

Necesitas las funciones iCustom() y CopyBuffer().

Aquí tienes un ejemplo de cómo añadir un indicador descargado del Mercado a un Asesor Experto

// Глобальная переменная для хендла индикатора
int tlHandle;

int OnInit() {
   // Создаем хендл индикатора
   tlHandle = iCustom(Symbol(), PERIOD_CURRENT, "Market\\Automatic Trendlines", false, 5, 15, clrRed, clrBlue, 2, "My Support", "My Resistance");
   
   // Можем добавить индикатор на график, если хотим. 
   // Для использования в расчетах это необязательно
   ChartIndicatorAdd(ChartID(), 0, tlHandle);

   // Вызовем один раз OnTick(), чтобы на выходных у нас что-то в логе отобразилось
   OnTick(); 
   
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason) {}

void OnTick() {
   // Объявляем массивы для буферов индикатора
   double tlBuffer0[], tlBuffer1[]; // ,tlBuffer1, ...
   
   int res;
   
   // Копируем нужное количество значений из индикаторных буферов в массивы
   res = CopyBuffer(tlHandle, 0, 0, 100, tlBuffer0);
   res = CopyBuffer(tlHandle, 1, 0, 100, tlBuffer1);
   
   // У разных индикаторов различное количество индикаторных буферов, 
   // числа из которых используются для построения линий, значков, цветовых меток на графике
   // Сколько их у данного индикатора и как используются их числа исследуйте самостоятельно
   
   // res = CopyBuffer(tlHandle, 2, 0, 100, tlBuffer2);
   
   // Пользуемся полученными значениями
   ArrayPrint(tlBuffer0);
   ArrayPrint(tlBuffer1);
}
Документация по MQL5: Технические индикаторы / iCustom
Документация по MQL5: Технические индикаторы / iCustom
  • www.mql5.com
iCustom - Технические индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Hola. Existe un Enum.
enum ENUM_NAME
  {
   ENUM_1,
   ENUM_jsdf
   ....
   ENUM_FEF;   
  };
¿Cómo asignar memoria a la matriz E_NAME[] para que haya memoria suficiente para todos los valores posibles de ENUM_NAME (sin repeticiones)?
ENUM_NAME     E_NAME[];

¿ E inicializar E_NAME [] con todos los valores posibles ?

 

Hola, @pivomoe

Si no vas a forzar la asignación de valores numéricos a los elementos de la enumeración (a juzgar por el ejemplo, no lo harás), puedes hacerlo así:

// Объявляем перечисление
enum ENUM_NAME {
   ENAME_1,
   ENAME_JSDF,
   ENAME_ERT,
   ENAME_QWERTY,
   ENAME_FEF
};

// Обявляем константу, хранящую количество элементов перечисления
#define  ENUM_NAME_SIZE 5

// Массив для хранения элементов перечисления
ENUM_NAME     E_NAME[ENUM_NAME_SIZE];

int OnInit() {
   // Заполняем массив значениями, преобразуя к типу ENUM_NAME
   for(int i = 0; i < ENUM_NAME_SIZE; i++) {
      E_NAME[i] = (ENUM_NAME) i;
   }

   // Пользуемся массивом
   ArrayPrint(E_NAME);
   
   for(int i = 0; i < ENUM_NAME_SIZE; i++) {
      Print(EnumToString(E_NAME[i]));
   }
   
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason) {}

En este caso, tendrás que cambiar también la constante que almacena el número de elementos al añadir elementos a la enumeración.

Además, es mejor utilizar el prefijo ENUM_ sólo para el nombre de la enumeración en sí, y utilizar algún otro prefijo para sus elementos. Esta convención se utiliza en todas las enumeraciones MQL estándar.

 
Yuriy Bykov #:

Hola, @pivomoe

Si no vas a forzar la asignación de valores numéricos a los elementos de la enumeración (a juzgar por el ejemplo - no lo harás), puedes hacerlo así:

En este caso, tendrás que cambiar también la constante que almacena el número de elementos al añadir elementos a la enumeración.

Además, es mejor utilizar el prefijo ENUM_ sólo para el nombre de la enumeración en sí, y utilizar algún otro prefijo para sus elementos. Esta convención se utiliza en todas las enumeraciones MQL estándar.

Gracias por su ayuda. He estado usando ENUM durante tantos años que ni siquiera se me ocurrió leer la ayuda.

 
jeremy10p100 # :
Hola y gracias por su respuesta. He podido hacer un script que cumple con mis expectativas, pero desafortunadamente todavía hay dos errores que no puedo entender o corregir. ¿Sabría con quién contactar para un poco de ayuda? Son sólo dos líneas de código que se registran como errores después de la compilación...

Puedes crear un trabajo freelance y elegir entre los desarrolladores que soliciten tu trabajo

https://www.mql5.com/fr/job

Applications de trading pour MetaTrader 5 à commander
Applications de trading pour MetaTrader 5 à commander
  • 2023.01.08
  • www.mql5.com
Le plus grand service de freelance avec des développeurs d'applications MQL5
 
#include <JAson.mqh>
CJAVal jv;

jv["type"] = "BTCUSD";
jv["title"] = "test";

int result;
char res_data[],post[];
ArrayResize(post,StringToCharArray(jv.Serialize(),post,0,WHOLE_ARRAY)-1);
string headers="Content-Type: application/json\r\nAccept: text/plain";
result=WebRequest("POST",url,headers,3000,post,res_data,res_headers);

Intentando enviar json mediante WebRequest, el servidor devuelve:"\u0022BTCUSD\u0022 no es un tipo de paquete válido para la desnormalización".

Es decir, no le gusta la codificación de comillas \u0022 .
He probado a especificar todas las variantes de codificación en cabeceras y
StringToCharArray, nada ayuda.

Desde python todo sale sin problemas:
response = requests.post(url, data=json.dumps(data), headers=headers)
es decir, todo va bien con el servidor.

¿Cómo solucionar el problema?

 

Permítanme reformular la pregunta de otra manera. ¿Es posible dar al optimizador una orden en el bloque OnInit para omitir la variante de prueba/optimización en determinadas condiciones?

input group "Входные настройки Стохастик"
input bool Stoch = false; // Стохастик включен/выключен
input int in_StochK = 14; // период основной линии K
input int in_StochD = 3; // период первичного сглаживания D
input int in_StochSlow = 3; // период окончательного сглаживания

int OnInit() {
if ((Stoch = false) && ((StochK != 0) || (StochK != 0) || (StochSlow != 0)))
   {
   // Некая команда, которая говорит, что такой вариант даже не стоит пробовать оптимизировать  
   }
}

He intentado hacerlo, pero da lugar a variantes de optimización incorrectas.

if ((Stoch = false) && ((StochK != 0) || (StochK != 0) || (StochSlow != 0))) 
   {
   
Print("Такой вариант тестирования не имеет смысла");
   return(INIT_FAILED);
   }

El objetivo es que pueda habilitar la enumeración de variantes de 4 parámetros esto cásticos (Stoch, in_StochK, int in_StochD, int in_StochSlow) al optimizar.

  • Cuando estocástico está habilitado (Stoch = true), el optimizador enumera las variables in_StochK, in_StochD, in_StochSlow. Todo funciona correctamente en esta parte.
  • Cuando el estocástico está desactivado (Stoch = false), el optimizador sigue buscando las variables in_StochK, in_StochD, in_StochSlow. Y necesito hacer algún tipo de tope en el código para que no las busque si Stoch = false.
Razón de la queja: