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

 
paladin80:
Debe cerrar con un stop loss. El mercado de divisas abre a las 00:00 GMT.

Pero no se cerrará al precio del stopLoss, sino al primer precio, que puede ser mucho más bajo que el stopLoss. Y TakeProfit cerrará seguro. Por lo tanto, es mejor no salir con StopLoss, ¡y aún mejor no dejar posiciones para el fin de semana!
 

¿Cómo puedo averiguar la dirección de mi función de usuario? Es decir, si mi listado dice

int start()
...
   int num=myFunc()//вызов функции
...
int myFunc()//описание моей функции
 {
    ...
 }

entonces, ¿cómo obtengo la dirección de myFunc? Lo necesito para saber cómo averiguar la dirección de WndProc (lo describo con la función personalizada) para pasar más allá al parámetro de la clase.

 
paladin80:
Debe cerrar con un stop loss. El mercado de divisas abre a las 00:00 GMT.

No es ni mucho menos seguro, puede que se cierre a la primera cita. Hay que leer los documentos, y las empresas de corretaje escriben lo que quieren.
 
gyfto:

¿Cómo puedo averiguar la dirección de mi función de usuario? Es decir, si mi listado dice

entonces, ¿cómo obtengo la dirección de myFunc? Lo necesito para saber cómo averiguar la dirección de WndProc (lo describo con la función personalizada) para pasar más allá al parámetro de la clase.


¿Quién dice que tiene una dirección? Es una función MQL4: ni siquiera está compilada en el sentido literal de la palabra, sino que se ejecuta a través del intérprete en tiempo de ejecución.
 

¿Por qué el experto no modifica las órdenes?

Esta es la función:

//+-------------------------------------------------------------------------------------+
//| Первоначальная установка TP и SL                                                    |
//+-------------------------------------------------------------------------------------+
void OrdersModifyer(int ticket)
{ 
   double SL, TP;
    
   if (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP)
   { 
       SL = ND(OrderOpenPrice() + i_sl * pt);
       TP = ND(OrderOpenPrice() - i_tp * pt); 
       
       if (SL - Ask <= g_stopLevel)
           SL = Ask + g_stopLevel;
       if (Ask - TP <= g_stopLevel)
           TP = Ask - g_stopLevel;
       
       if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Red))
       {
          Print ("Ошибка модификации ордера ", OrderType(), " - ", GetLastError());
          return(false);
       }
   }
       
   if (OrderType() == OP_BUY || OrderType() == OP_BUYSTOP)
   { 
       SL = ND(OrderOpenPrice() - i_sl * pt);
       TP = ND(OrderOpenPrice() + i_tp * pt);
       
       if (Bid - SL <= g_stopLevel)
           SL = Bid - g_stopLevel;
       if (TP - Bid <= g_stopLevel)
           TP = Bid + g_stopLevel;
       
       if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Red))
       {
          Print ("Ошибка модификации ордера ", OrderType(), " - ", GetLastError());
          return(false);
       }
   }
}

Llamado al principio así:

 for (g = OrdersTotal() - 1; g >= 0; g--)
   {
       if (!OrderSelect(g,SELECT_BY_POS)) continue;
       if (i_magic != -1) if (OrderMagicNumber() != (i_magic)) continue;
       if (OrderSymbol() != Symbol()) continue;
       
       ticket = OrderTicket();
       type = OrderType();
       
       if (i_sl != 0 || i_tp != 0)
       {
          if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
          {
             OrdersModifyer(ticket);
          }
       }
   }
 
TarasBY:

Gracias por su ayuda.
 
alsu:

¿Quién dice que tiene una dirección? Es una función MQL4: ni siquiera se compila en el sentido literal de la palabra, sino que se ejecuta a través del intérprete en tiempo de ejecución.


Ahí es donde está enterrado el perro. Solo lamento haber perdido 2 o 3 semanas de tiempo, porque he optado por una interfaz de ventanas independiente para mi robot dentro de MQL4+WinAPI sin dlls autoescritos. Siento no haberme dado cuenta antes, perdón por mi código y por los desarrollos.

Para resumir. No puede crear una ventana superpuesta (es decir, no hija) sin copiar el código en su dll, porque al describir WNDCLASS (o WNDCLASSEX)

typedef struct tagWNDCLASSEX {//    это с MSDN
  UINT      cbSize;
  UINT      style;
  WNDPROC   lpfnWndProc;//<-
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    hbrBackground;
  LPCTSTR   lpszMenuName;
  LPCTSTR   lpszClassName;
  HICON     hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;

líneas indicadas por la flecha al empaquetar la estructura en una matriz int

lpwcx[0]=0x30;//cbSize//    это на MQL4
lpwcx[1]=0x0A23;//style
//lpwcx[2]=lpfnWndProc;<-
lpwcx[3]=0;//cbClsExtra
lpwcx[4]=0;//cbWndExtra
lpwcx[5]=GetModuleHandleA(lpModuleName);//hInstance
lpwcx[6]=LoadIconA(hInstance,IDI[0]);//hIcon
lpwcx[7]=LoadCursorA(hInstance,IDC[0]);//hCursor
lpwcx[8]=GetStockObject(WHITE_BRUSH);//hbrBackground
lpwcx[9]=StrStrA(lpszMenuName,lpszMenuName);
lpwcx[10]=StrStrA(lpszClassName,lpszClassName);
lpwcx[11]=0;//hIconSm
//передаём структуру в упакованном интовом массиве и регистрируем класс
atom=RegisterClassExA(lpwcx[12]);

se pasa la dirección del procedimiento de la ventana, es decir, el manejador del ratón y del teclado para esta ventana. Un procedimiento de ventana en MQL4 puede ser implementado como una función definida por el usuario, pero es imposible obtener su dirección dentro del intérprete, por lo que no hay nada que pasar. Lo máximo que se puede hacer en MQL4 es utilizar las clases de ventanas estándar, pero sólo se utilizarán como ventanas hijas. En pocas palabras, una ventana creada por el indicador no puede ser agarrada con el ratón y colocada sobre el borde de la terminal (ya que será una ventana hija), mientras que una ventana superpuesta puede ser colocada sobre el borde de la terminal. La ventana hija en las clases de ventana estándar ya está implementada en mt4gui.dll, si alguien lo necesita. Pero la ventana superpuesta con su propio manejador de ratón y teclado es imposible.

Pido a los moderadores que publiquen este diálogo y todos los mensajes relacionados en un tema aparte como "cómo crear una ventana en MQL4", para que otros no cometan los mismos errores y puedan encontrarlo en un buscador.

 
Hola, he descargado metatreider4. la pestaña de trading no aparece como en la versión demo(((. dime que pasa??????
 

¡Buenos días!

¿El broker lee la dirección ip del ordenador del trader sólo en modo online o es técnicamente posible cargar el historial desde alguna carpeta en MT4?

 

Decidí implementar "hotkeys" (sin usar las teclas de control como Ctrl, Alt, Shift). Pero el código no funciona.

#property indicator_chart_window
#import "user32.dll"
bool RegisterHotKey(int hWnd, int id, int fsModifiers, int vk);
bool PeekMessage (int& lpMsg[7], int hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg);
bool UnregisterHotKey (int hWnd, int id);
#import

extern string s0="идентификатор горячей клавиши";
extern int id;
extern string s1="код клавиши (список см. winuser.h)";
extern int vk;
extern string s2="номер окна (от нуля до WindowsTotal()-1)";
extern int aWindowNumber;
bool PM;

int init()
  {
   ObjectCreate("Smile",OBJ_LABEL,aWindowNumber,0,0);
   ObjectSet("Smile",OBJPROP_XDISTANCE,0);
   ObjectSet("Smile",OBJPROP_YDISTANCE,0);
   ObjectSetText("Smile", StringSetChar("", 0, 75), 50, "WingDings", Red);
   return(RegisterHotKey(WindowHandle(Symbol(), Period()), id, 0, vk));
  }

int deinit()
  {
   ObjectDelete("Smile");
   WindowRedraw();
   return(UnregisterHotKey(WindowHandle(Symbol(), Period()), id));
  }

int start()
  {
   int lpMsg[7];
   /*
   Структура lpMsg для WM_HOTKEY:
   0 - хэндл окна//HWND(MSDN)//int(MQL4)
   1 - WM_HOTKEY (0x0312)//UINT(MSDN)//int(MQL4)
   2 - заданный id//WPARAM(MSDN)//int(MQL4)
   3 - млардшее слово - ноль (модификатор, - не задаём), старшее - код виртуальной клавиши//LPARAM(MSDN)//int(MQL4)
   4 - время//DWORD(MSDN)//int(MQL4)
   5 - координата х мышки//структура POINT. LONG(MSDN)//int(MQL4)
   6- координата у мышки//LONG(MSDN)//int(MQL4)
   */
   PM=PeekMessage(lpMsg, WindowHandle(Symbol(), Period()), 0, 0, 1);//1 = PM_REMOVE
   if (lpMsg[1]==0x0312){
      if(lpMsg[2]==id){
         switch(StringGetChar(ObjectDescription("Smile"),0)){
            case 74 : ObjectSetText("Smile", StringSetChar("", 0, 75), 50, "WingDings", Red);
            case 75 : ObjectSetText("Smile", StringSetChar("", 0, 74), 50, "WingDings", Red);
            }
      }
   }
   return(0);
  }

¿Por qué no iba a funcionar? En teoría, el smiley debe cambiar. Yo puse 81 (código de la tecla Q), pero puedes poner cualquier cosa ahí. Aquí están los códigos clave:

1  2  3  4  5  6  7  8
49 50 51 52 53 54 55 56
Q  W  E  R  T  Y  U  I
81 87 69 82 84 89 85 73
A  S  D  F  G  H  J  K
65 83 68 70 71 72 74 75
Z  X  C  V  B  N  M  ,
90 88 67 86 66 78 77 188

Añadido: no se puede llamar a PeekMessage - error del sistema 127 "procedimiento especificado no encontrado". RegisterHotKey devuelve 1 (verdadero). He intentado buscar llamando a RtlGetLastWin32Error() con NativeAPI después de PeekMessage, ni siquiera llega a ello. Y para señalar

PM=PeekMessage(lpMsg[],...

- aparecerá el error de compilación.