[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 254

 
Desead:
Amigos, antes en el editor cuando pasabas por encima de una palabra reservada y pulsabas f1 se abría una ventana en la parte inferior con una descripción de la función, ahora no tengo esto. ¿Cuál podría ser el problema?
Anteriormente se pulsaba CTRL+F1.
 
¿Quién puede decirme cómo hacer que el resultado sea siempre positivo? (Lotes de compra - Lotes de venta)= -0,25, pero quiero que sea siempre positivo?
 
mikanit:
¿Quién puede decirme cómo hacer que el resultado sea siempre positivo? (Lotes de compra - Lotes de venta)= -0,25, pero debe ser siempre positivo?
MathAbs().
 

Lo hago así: if (profitbuy+profitsell > SymbProf_magBUY_magSELL* MathAbs((OrdersTotalMagicBuyLots(MagicBuy)-OrdersTotalMagicSellLots(MagicSell))/Lots)()

¿qué hay entre paréntesis?

 

if (profitbuy+profitsell > SymbProf_magBUY_magSELL* MathAbs((OrdersTotalMagicBuyLots(MagicBuy)-OrdersTotalMagicSellLots(MagicSell))/Lots)(??????))

¿Dónde ???? qué?

 
Gracias, ya está solucionado.
 

Abro una posición con un volumen = 0,05. Necesito un código - ¿cómo reducir el volumen de la posición en 0,01 cuando una pérdida alcanza 100 pips para 5 dígitos?

Gracias.

 

Cuantos EAs he escrito, todos ellos comprueban las condiciones del mercado (nivelación del stop, spread, etc.) cuando se opera con órdenes pendientes. He mirado cómo se escriben los gridders, pero no he visto que ninguno compruebe el valor de la misma nivelación de parada antes de enviar cualquier orden. ¿Cuál es la razón?

 
alsu:

En el foro hay muchos metarrelatos sobre el probador y por qué sus resultados difieren de los de la vida real. Mira en la sección de artículos, este tema se ha tocado más de una vez.

Gracias.
 

Encontré una alternativa.

alsu:

Significa que en la DLL la cadena se pasa exactamente como char*, pero no como MqlStr. Perono significa que en el programa ex4 la cadena no se almacene como MqlString. En general, la transferencia de parámetros de ex4 a dll (según los desarrolladores) es un proceso bastante complejo, acompañado de todo tipo de comprobaciones y transformaciones de parámetros.

Zhunko:

¿Has leído la Referencia MQL4? MQL4-string es lo mismo que c-string con terminador nulo.

La estructura está diseñada únicamente para organizar matrices de cadenas. Es puramente una invención de los Metaquotes para facilitar la creación de matrices de cadenas.

StrStrA de la biblioteca shlwapi.dll. Prueba:

#property indicator_chart_window
#import "stdlib.ex4"
string IntegerToHexString(int integer_number);//это для перевода десятичного формата в шестнадцатеричный, используем в print.
#import "StrAddress.dll"
int GetStrAddress(string szStr);//из самописной dll.
#import "shlwapi.dll"
int StrStrA(string pszFirst, string pszSrch);//из WinAPI.
#import

int addr1;//будет выходной переменной для функции из самописной dll.
int addr2;//то же самое для функции из WinAPI.

int init()
  {//тестовый прогон; в init(), это чтобы не повторялось
   string s; strAddress (s);
   s=""; strAddress (s);
   s=s+"something"; strAddress (s);
   s="MyStr"; strAddress (s);
   s="mystr"; strAddress (s);
   return(0);
  }

int start()
  {
   int    counted_bars=IndicatorCounted();//оставляем блок пустым
   
   return(0);
  }

void strAddress (string myStr)//тестовая функция
  {
   addr1=GetStrAddress(myStr);//эта из dll
   addr2=StrStrA(myStr,myStr);//эта из WinAPI
   Print(" строка ", CharToStr(34), myStr, CharToStr(34), " указатель 1: ", IntegerToHexString(addr1), ", указатель 2: ", IntegerToHexString(addr2));//в лог
  }

Registro:

строка "" указатель 1: 00000000, указатель 2: 00000000
строка "" указатель 1: 043 BE440, указатель 2: 00000000
строка "something" указатель 1: 043 C8970 указатель 2: 043 C8970
строка "MyStr" указатель 1: 043 BE450, указатель 2: 043 BE450
строка "mystr" указатель 1: 043 BE458, указатель 2: 043 BE458

строка "" указатель 1: 00000000, указатель 2: 00000000
строка "" указатель 1: 01 C980E0, указатель 2: 00000000
строка "something" указатель 1: 01 CDD050, указатель 2: 01 CDD050
строка "MyStr" указатель 1: 01 C980F0, указатель 2: 01 C980F0
строка "mystr" указатель 1: 01 C980F8, указатель 2: 01 C980F8

строка "" указатель 1: 00000000, указатель 2: 00000000
строка "" указатель 1: 01 CAFF20, указатель 2: 00000000
строка "something" указатель 1: 01 CA7100, указатель 2: 01 CA7100
строка "MyStr" указатель 1: 01 CAFF30, указатель 2: 01 CAFF30
строка "mystr" указатель 1: 01 CAFF38, указатель 2: 01 CAFF38

El mecanismo es el siguiente. Shlwapi.dll en /system32. StrStrA es un análogo WinAPI deStringSubstr. MQL4 es un lenguaje sin tipos, por lo que si ponemos un int en la salida, en lugar de una cadena, obtendremos un puntero a la misma, no una cadena. StrStrA busca la primera aparición de una subcadena en la cadena (distingue entre mayúsculas y minúsculas, pero como nuestras cadenas son iguales, no nos importa), y como nuestras cadenas son iguales, devuelve un puntero al primer carácter de la cadena, es decir, a la propia cadena.

Permítanme explicar para aquellos que van a utilizar este código. No hay ningún formato de cadena en la WinAPI. En su lugar, sólo existe el formato lpsz (un puntero al primer elemento de una matriz de caracteres que termina en 0x00, también conocido como /0). Es un puntero a una dirección de memoria. Dado que nuestras celdas de memoria son de 32 bits (es decir, 4 bytes) y que int también tiene un tamaño de 4 bytes, todo encaja perfectamente.

Conclusión: puedes empaquetar fácilmente cadenas en arrays int, emulando así estructuras (y no hay estructuras ni clases en MQL4) para pasarlas más adelante a la dll, si se necesita una estructura o clase. La dll autoescrita para la traducción de tipos de datos (es decir, construcciones como "int(const char*)" (traducción de tipo C) o similares en C++) no puede utilizarse ahora.