[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 259

 
paladin80:
Deve chiudere su uno stop loss. Il Forex apre alle 00:00 GMT.

Ma chiuderà non al prezzo di stopLoss, ma al primo prezzo, che può essere molto più basso dello stopLoss! E TakeProfit chiuderà di sicuro. Quindi è meglio non partire con StopLoss, e ancora meglio non lasciare posizioni per il fine settimana!
 

Come posso scoprire l'indirizzo della mia funzione utente? Cioè, se il mio annuncio dice

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

allora come posso ottenere l'indirizzo di myFunc? Ne ho bisogno per scoprire come trovare l'indirizzo di WndProc (che descrivo con una funzione personalizzata) per passare ulteriormente al parametro della classe.

 
paladin80:
Deve chiudere su uno stop loss. Il Forex apre alle 00:00 GMT.

È tutt'altro che certo, potrebbe anche chiudersi alla prima citazione. Bisogna leggere i documenti, e le società di intermediazione scrivono quello che vogliono.
 
gyfto:

Come posso scoprire l'indirizzo della mia funzione utente? Cioè, se il mio annuncio dice

allora come posso ottenere l'indirizzo di myFunc? Ne ho bisogno per scoprire come trovare l'indirizzo di WndProc (che descrivo con una funzione personalizzata) per passare ulteriormente al parametro della classe.


Chi dice che ha anche un indirizzo? È una funzione MQL4: non è nemmeno compilata nel senso letterale della parola, ma passa attraverso l'interprete a runtime.
 

Perché l'esperto non modifica gli ordini?

Ecco la funzione:

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

Chiamato all'inizio in questo modo:

 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:

Grazie per il vostro aiuto.
 
alsu:

Chi dice che ha anche un indirizzo? È una funzione MQL4: non è nemmeno compilata nel senso letterale della parola, ma passa attraverso un interprete a runtime.


È lì che il cane è sepolto. Mi dispiace solo per 2 o 3 settimane di perdita di tempo, perché ho scelto un'interfaccia a finestre indipendente per il mio robot all'interno di MQL4+WinAPI senza alcuna dll auto-scritta. Mi dispiace di non essermene reso conto prima, mi dispiace per il mio codice e i miei sviluppi.

Per riassumere. Non potete creare una finestra sovrapposta (cioè non figlia) senza copiare il codice nella vostra dll, perché quando si descrive 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;

linee indicate dalla freccia quando si impacchetta la struttura in un array 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]);

viene passato l'indirizzo della procedura della finestra, cioè il gestore del mouse e della tastiera per questa finestra. La procedura finestra in MQL4 può essere implementata come una funzione definita dall'utente, ma è impossibile ottenere il suo indirizzo nell'interprete, quindi non c'è niente da passare. Il massimo che è possibile in MQL4 è usare le classi di finestre standard, ma saranno usate solo come finestre figlie. Per dirla semplicemente, una finestra creata dall'indicatore non può essere afferrata con il mouse e posta sopra il bordo del terminale (poiché sarà una finestra figlia), mentre una finestra sovrapposta può essere posta sopra il bordo del terminale. La finestra figlia sulle classi di finestre standard è già implementata in mt4gui.dll, se qualcuno ne ha bisogno. Ma la finestra sovrapposta con il proprio gestore di mouse e tastiera è impossibile.

Chiedo ai moderatori di postare questo dialogo e tutti i messaggi correlati in un argomento separato come "come creare una finestra in MQL4", in modo che altri non facciano gli stessi errori e siano in grado di trovarlo in un motore di ricerca.

 
Ciao, ho scaricato metatreider4. la scheda di trading non appare come nella versione demo((((. dimmi cosa c'è che non va??????
 

Buona giornata!

Il broker legge l'indirizzo ip del computer del trader solo in modalità online o è tecnicamente possibile scaricare la cronologia da qualche cartella in MT4?

 

Ho deciso di implementare i "tasti di scelta rapida" (senza usare i tasti di controllo come Ctrl, Alt, Shift). Ma il codice non funziona.

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

Perché non dovrebbe funzionare? In teoria, lo smiley dovrebbe cambiare. Io ho impostato 81 (codice chiave Q), ma si può impostare qualsiasi cosa lì. Ecco i codici chiave:

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

Aggiunto: non può chiamare PeekMessage - errore di sistema 127 "procedura specificata non trovata". RegisterHotKey restituisce 1 (vero). Ho provato a guardare chiamando RtlGetLastWin32Error() con NativeAPI dopo PeekMessage, non ci arriva nemmeno. E per indicare

PM=PeekMessage(lpMsg[],...

- apparirà l'errore di compilazione.

Motivazione: