[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 247

 

sss2019, no hay tiempo para tratar el tema ahora, lo siento.

Zhunko:
No es así. Correcto, como se muestra arriba.

En cuanto me ponga a ello, lo arreglaré y editaré el código en el post de allí.

Pregunta. ¿Cómo puedo obtener un puntero a una cadena? La cadena MQL4 es C++ lpsz, por lo que he entendido. Pero, ¿cómo obtenemos la dirección de la cadena en sí?

 
Tengo una idea de cómo hacer que un mismo EA funcione con diferentes asistentes. El problema es que cuando hay un bloqueo, el robot manejará por separado esta situación sin interferir con otras órdenes. Por ejemplo, tenemos una posición abierta en Bay (magia 001) el mercado se fue en contra y en lugar de cerrar la operación se abre la operación contraria en Sell con magia 001 y el robot irá liquidando esta situación, pero para no esperar mucho tiempo en liquidar la situación quiero abrir de nuevo Bay pero ya con magia (002) y si la tendencia no es acertada el cierre con la magia (002) abrirá de nuevo Sell con (002), etc. ¿Algún consejo para que las operaciones funcionen como una capa con diferentes magias?
 
pasha5282:
Si tengo una idea de cómo hacer que un mismo EA funcione con diferentes asistentes. el robot debe manejar por separado esta situación cuando se produce un bloqueo y no interferir con otras órdenes. Es decir, tenemos una posición abierta en Bay (magia 001) el mercado se fue en contra y en vez de cerrar la operación se abre la opuesta en Sell con magia 001 y el robot se encargará de la situación y quiero abrir de nuevo Bay pero con magia (002) y si la tendencia no se corrige se abrirá de nuevo la opuesta Sell con magia (002) y así sucesivamente. Algún consejo de cómo hacer que las operaciones funcionen como una capa con diferentes magias? o cómo implementarlo?
int MagicNumber=001;
//---
if (OrdersTotal()>0) // проверяем, есть ли ордера
{  for (int i=OrdersTotal()-1; i>=0; i--) // перебор ордеров
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // выбирается ордер среди открытых и отложенных ордеров
      {  if (OrderSymbol()!=Symbol()) continue; // проверяем - ордер по текущему символу?
         if (OrderMagicNumber()!=MagicNumber) continue; // проверяем - ордер с нужным магиком?
         //---
         if (OrderType()==OP_BUY) // если это открытая позиция на покупку, то ...
           {  // ... какие-то действия
                 return(0);
           }
         //---
         else
         if (OrderType()==OP_SELL) // если это открытая позиция на продажу, то ...
           {  // ... какие-то действия
                 return(0);
           }
}  }  }

Ejemplo de contador de órdenes abiertas y pendientes por el símbolo y el mago requeridos

string _Symbol="AUDUSD";
int MagicNumber=555;
//---
int Opened_pos=0;
if (OrdersTotal()>0)
{  for (i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()==_Symbol)
         {  if (OrderMagicNumber()==MagicNumber)
            Opened_pos++;
}  }  }  }
 

Por alguna razón, el terminal falló durante las pruebas. Ahora cuando lo enciendes, empieza a usar unos 150 mb de memoria y se cuelga. Iba a reinstalar, pero moví todos mis archivos antes de hacerlo. Cuando abrí las carpetas descubrí que no estaban todos los archivos que había creado. ¿Dónde están los demás?


 
silhouette:

Por alguna razón, el terminal falló durante las pruebas. Ahora cuando lo enciendes, empieza a usar unos 150 mb de memoria y se cuelga. Iba a reinstalar, pero moví todos mis archivos antes de hacerlo. Cuando abrí las carpetas descubrí que no estaban todos los archivos que había creado. ¿Dónde están los demás?

La captura de pantalla de la izquierda es MQL5 y no 4.
 
gyfto:

sss2019, no hay tiempo para tratar el tema ahora, lo siento.


En cuanto me ponga a ello, lo arreglaré y editaré el código en el post de allí.

Pregunta. ¿Cómo puedo obtener un puntero a una cadena? La cadena MQL4 es C++ lpsz, por lo que he entendido. Pero, ¿cómo obtengo la dirección de la propia cadena?

No hay manera de hacerlo en MQL4. Puede pasar la cadena a la DLL y devolver la dirección como INT.
 
paladin80:
La captura de pantalla de la izquierda es MQL5, no 4.

No, es el cuarto. Es que al hacer clic en el cuarto archivo, se abre a través del quinto, por alguna razón
 
silhouette:
No, el cuarto. Es que los archivos de la cuarta, al hacer clic, se abren a través de la quinta, por alguna razón

Abrir MetaEditor para 5, en la ventana de la izquierda "Navegador" -> en una carpeta clic derecho del ratón -> "Abrir carpeta" y allí entre las carpetas tratar de buscar.



 
Zhunko:
No hay manera de hacerlo en MQL4. Puede pasar una cadena a una DLL y devolver la dirección como INT.

//C++
#include "stdafx.h"
#include <windows.h>
#define MT4_EXPFUNC __declspec(dllexport)
struct MqlStr {
   int               len;
   char             *string;
  };
BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}
MT4_EXPFUNC int __stdcall GetStrAddress(const char *str) {    
    MqlStr* s = (MqlStr*)str;
    return (int)s->string; 
}

//MQL4

#import "StrAddress.dll"
int GetStrAddress(string str);//на входе имя инициализированной строки, на выходе её адрес
#import
//объявляем:
string s="something";
int address;
//пример использования:
int start(){
   address=GetStrAddress(s);
   Print(" адрес s равен " s);
}

Para que otros no sufran lo mismo, he adjuntado todo el proyecto comprimido. Con fuentes, para que otros puedan ver que no es un virus. No he tenido tiempo de comprobar lo que se compila en VC++ 6.0 y lo que es basura. StrAddress.dll está en la carpeta Debug.

Archivos adjuntos:
straddress.zip  984 kb
 
paladin80:

Abrir MetaEditor para 5, en la ventana de la izquierda "Navegador" -> botón derecho del ratón sobre una carpeta -> "Abrir carpeta" y allí entre las carpetas tratar de buscar.



Gracias, pero nada de mt4 apareció allí. Usé la búsqueda y encontré todos los archivos en la siguiente dirección:

C:|Users\Qwer\AppData\Local\VirtualStore\Nde los archivos de programa\MetaTrader 4\\Ninclude

No tengo ni idea de cómo llegaron allí, para ser honesto, ya que fueron guardados correctamente antes.