[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 259

 
paladin80:
Muss mit einem Stop-Loss schließen. Der Devisenmarkt öffnet um 00:00 GMT.

Er schließt aber nicht zum StopLoss-Kurs, sondern zum ersten Kurs, der viel niedriger sein kann als der StopLoss! Und TakeProfit wird mit Sicherheit schließen. Daher ist es besser, nicht mit StopLoss zu gehen, und noch besser, Positionen nicht für das Wochenende zu verlassen!
 

Wie kann ich die Adresse meiner Benutzerfunktion herausfinden? Das heißt, wenn in meinem Eintrag steht

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

wie erhalte ich dann die Adresse von myFunc? Ich brauche es, um herauszufinden, wie man herausfinden, Adresse von WndProc (ich beschreibe mit benutzerdefinierten Funktion) für die Weitergabe an Klasse Parameter.

 
paladin80:
Muss mit einem Stop-Loss schließen. Der Devisenmarkt öffnet um 00:00 GMT.

Das ist alles andere als sicher, es kann durchaus sein, dass es bei der ersten Notierung endet. Man muss die Dokumente lesen, und die Maklerfirmen schreiben, was sie wollen.
 
gyfto:

Wie kann ich die Adresse meiner Benutzerfunktion herausfinden? Das heißt, wenn in meinem Eintrag steht

wie erhalte ich dann die Adresse von myFunc? Ich brauche es, um herauszufinden, wie man herausfinden, Adresse von WndProc (ich beschreibe mit benutzerdefinierten Funktion) für die Weitergabe an Klasse Parameter.


Wer sagt, dass es überhaupt eine Adresse hat? Es ist eine MQL4-Funktion: Sie wird nicht einmal im wörtlichen Sinne kompiliert, sondern läuft zur Laufzeit durch den Interpreter.
 

Warum ändert der Experte die Aufträge nicht?

Hier ist die Funktion:

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

So wird er am Anfang aufgerufen:

 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:

Ich danke Ihnen für Ihre Hilfe.
 
alsu:

Wer sagt, dass sie überhaupt eine Adresse hat? Es handelt sich um eine MQL4-Funktion: Sie wird nicht einmal im wörtlichen Sinne kompiliert, sondern läuft zur Laufzeit durch einen Interpreter.


Dort ist der Hund begraben. Es tut mir nur leid, dass ich 2 oder 3 Wochen lang meine Zeit verschwendet habe, weil ich mich für eine unabhängige Fensterschnittstelle für meinen Roboter entschieden habe, die nur aus MQL4+WinAPI besteht, ohne selbst geschriebene DLLs. Es tut mir leid, dass ich es nicht früher bemerkt habe, und ich entschuldige mich für meinen Code und meine Entwicklungen.

Zusammengefasst. Sie können kein überlappendes (d. h. kein untergeordnetes) Fenster erstellen, ohne den Code in Ihre DLL zu kopieren, denn bei der Beschreibung von WNDCLASS (oder 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;

die durch den Pfeil gekennzeichneten Zeilen beim Packen der Struktur in ein int-Array

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]);

Array wird die Adresse der Fensterprozedur, d.h. des Maus- und Tastaturhandlers für dieses Fenster, übergeben. Eine Fensterprozedur in MQL4 kann als benutzerdefinierte Funktion implementiert werden, aber es ist unmöglich, ihre Adresse innerhalb des Interpreters zu erhalten, also gibt es nichts zu übergeben. Das Maximum, das in MQL4 möglich ist, ist die Verwendung der Standard-Fensterklassen, aber sie werden nur als Kindfenster verwendet. Vereinfacht gesagt, kann ein vom Indikator erzeugtes Fenster nicht mit der Maus angefasst und außerhalb des Terminals angezeigt werden (da es sich um ein untergeordnetes Fenster handelt), während ein überlappendes Fenster außerhalb des Terminals angezeigt werden kann. Das Child-Fenster auf Standard-Fensterklassen ist bereits in mt4gui.dll implementiert, falls jemand es braucht. Aber das überlappende Fenster mit eigenem Maus- und Tastaturhandler ist unmöglich.

Ich bitte die Moderatoren, diesen Dialog und alle damit zusammenhängenden Nachrichten in einem separaten Thema wie "Wie erstelle ich ein Fenster in MQL4" zu posten, damit andere nicht die gleichen Fehler machen und es in einer Suchmaschine finden können.

 
Hallo, ich habe metatreider4 heruntergeladen. Die Registerkarte "Handel" erscheint nicht mehr wie in der Demoversion(((. Sagen Sie mir, was los ist??????
 

Guten Tag!

Liest der Broker die IP-Adresse des Computers des Händlers nur im Online-Modus aus oder ist es technisch möglich, den Verlauf aus einem Ordner in MT4 hochzuladen?

 

Es wurde beschlossen, "Hotkeys" zu implementieren (ohne Verwendung der Steuerungstasten wie Strg, Alt, Shift). Aber der Code funktioniert nicht.

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

Warum sollte es nicht funktionieren? Theoretisch sollte sich der Smiley ändern. Ich habe 81 (Q-Schlüsselcode) eingestellt, aber Sie können dort alles einstellen. Hier sind die wichtigsten Codes:

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

Hinzugefügt: PeekMessage kann nicht aufgerufen werden - Systemfehler 127 "specified procedure not found". RegisterHotKey gibt 1 (wahr) zurück. Ich habe versucht, RtlGetLastWin32Error() mit NativeAPI nach PeekMessage aufzurufen, es kommt nicht einmal dazu. Und zu zeigen

PM=PeekMessage(lpMsg[],...

- wird der Kompilierungsfehler angezeigt.