[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 259

 

Comment puis-je trouver l'adresse de ma fonction utilisateur ? C'est-à-dire que si ma liste dit

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

alors comment puis-je obtenir l'adresse de myFunc ? J'en ai besoin pour trouver comment trouver l'adresse de WndProc (que je décris avec une fonction personnalisée) pour la passer au paramètre de la classe.

 
paladin80:
Doit fermer sur un stop loss. Le marché du Forex s'ouvre à 00:00 GMT.

C'est loin d'être certain, il pourrait bien se fermer à la première citation. Vous devez lire les documents, et les sociétés de courtage écrivent ce qu'elles veulent.
 
gyfto:

Comment puis-je trouver l'adresse de ma fonction utilisateur ? C'est-à-dire que si ma liste dit

alors comment puis-je obtenir l'adresse de myFunc ? J'en ai besoin pour trouver comment trouver l'adresse de WndProc (que je décris avec une fonction personnalisée) pour la passer au paramètre de la classe.


Il s'agit d'une fonction MQL4 : elle n'est même pas compilée au sens littéral du terme, mais elle est exécutée par l'interpréteur au moment de l'exécution.
 

Pourquoi l'expert ne modifie-t-il pas les ordres ?

Voici la fonction :

//+-------------------------------------------------------------------------------------+
//| Первоначальная установка 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);
       }
   }
}

Appelé au début comme ceci :

 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:

Merci pour votre aide.
 
alsu:

Il s'agit d'une fonction MQL4 : elle n'est même pas compilée au sens littéral du terme, mais elle est exécutée par l'interpréteur au moment de l'exécution.


C'est là que le chien est enterré. Je suis juste désolé d'avoir perdu mon temps pendant 2 ou 3 semaines, car j'ai choisi une interface de fenêtrage indépendante pour mon robot dans MQL4+WinAPI sans aucune dll auto-écrite. Je suis désolé de ne pas l'avoir réalisé plus tôt, je suis désolé pour mon propre code et mes développements.

Pour résumer. Vous ne pouvez pas créer une fenêtre superposée (c'est-à-dire non enfant) sans copier le code dans votre dll, car lors de la description de WNDCLASS (ou 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;

lignes indiquées par la flèche lors de l'empaquetage de la structure dans un tableau d'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]);

l'adresse de la procédure de la fenêtre, c'est-à-dire le gestionnaire de la souris et du clavier pour cette fenêtre, est passée. La procédure de fenêtre dans MQL4 peut être implémentée comme une fonction définie par l'utilisateur, mais il est impossible d'obtenir son adresse dans l'interpréteur, il n'y a donc rien à passer. Le maximum qui est possible dans MQL4 est d'utiliser les classes de fenêtres standard, mais elles ne seront utilisées que comme fenêtres enfants. Pour simplifier, une fenêtre créée par l'indicateur ne peut pas être saisie avec la souris et placée sur le bord du terminal (puisqu'il s'agira d'une fenêtre enfant), alors qu'une fenêtre superposée peut être placée sur le bord du terminal. La fenêtre enfant sur les classes de fenêtres standard est déjà implémentée dans mt4gui.dll, si quelqu'un en a besoin. Mais la fenêtre superposée avec son propre gestionnaire de souris et de clavier est impossible.

Je demande aux modérateurs de poster ce dialogue et tous les messages connexes dans un sujet séparé comme "comment créer une fenêtre dans MQL4", afin que d'autres ne fassent pas les mêmes erreurs et puissent le trouver dans un moteur de recherche.

 
Bonjour, j'ai téléchargé metatreider4. L'onglet de trading ne s'affiche pas comme dans la version de démonstration(((. Dites-moi ce qui ne va pas ??????.
 

Bonne journée !

Le courtier lit-il l'adresse IP de l'ordinateur du trader uniquement en mode en ligne ou est-il techniquement possible de décharger l'historique à partir d'un dossier dans MT4 ?

 

J'ai décidé d'implémenter des "hotkeys" (sans utiliser les touches de contrôle comme Ctrl, Alt, Shift). Mais le code ne fonctionne pas.

#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);
  }

Pourquoi ça ne marcherait pas ? En théorie, le smiley est censé changer. J'ai mis 81 (code clé Q), mais vous pouvez mettre n'importe quoi à cet endroit. Voici les codes clés :

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

Ajouté: impossible d'appeler PeekMessage - erreur système 127 "specified procedure not found". RegisterHotKey renvoie 1 (vrai). J'ai essayé de regarder en appelant RtlGetLastWin32Error() avec NativeAPI après PeekMessage, cela ne vient même pas. Et de souligner

PM=PeekMessage(lpMsg[],...

- l'erreur de compilation apparaîtra.

 
Pouvez-vous me dire où télécharger la version non-distro de MetaTrader 4 ?