In MQL5 c'è sempre spazio per un exploit! ;)

 

Suggerisco di postare e analizzare tutti i tipi di "impossibilità" di mql5, come questa: Conditional Compilation.

È possibile mostrare la possibilità all'inizio(senza rivelare la realizzazione) per torturare le persone curiose e stimolare la creatività del lettore.

Ma alla fine, è necessario (obbligatorio!) rivelare il segreto e fornire un esempio di implementazione.

Naturalmente, una tale forma "a due fasi" è piena di bufale, ma mi affiderò alle dichiarazioni oneste dei miracolati, che sono pronti a "fare marcia indietro". :)

--

So........ ANDIAMO!

 
Итак........ НАЧАЛИ !

Ecco, prima io. :)

Anche se i luoghi più "magici" rallentano molto - ma... Forse uno dei maghi di mql5 troverà un modo per velocizzarlo?

// Puoi vedere da solo quanto sono lenti, il test è dedicato a misurare la loro velocità.

Questo codice funziona secondo la solita sintassi dell'uso degli array bidimensionali.

void OnStart()
  {
   float  FA[5][3];
   long st=GetTickCount();
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<5;i++)
        {
         for(int j=0;j<3;j++)
           {
            FA[i][j] = (i+1.5)*(j+1.3);
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");
   
   st=GetTickCount();
   C2DMagicArray  MA(5,3);   
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<MA.SizeL();i++)
        {
         for(long j=0;j<MA.MaxR();j++)
           {
            MA[i][j] = (i+1.5)*(j+1.3);  
            // ^  ^  Как это сделано ??? Можете повторить ? :))
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");
   st=GetTickCount();
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<MA.SizeL();i++)
        {
         for(long j=0;j<MA.MaxR();j++)
           {
            MA.Set(i,j,float((i+1.5)*(j+1.3)));
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");

   for(int i=0;i<MA.SizeL();i++)
     {
      for(int j=0;j<MA.MaxR();j++)
        {
         Print( MA[i][j] );  
         //        ^  ^    Как это сделано???  :))  Жду Вашу версию!
        }
     }
  }

Non potrai ancora compilare il codice: gli iniettori saranno disponibili più tardi... - altrimenti non sarà così interessante. :)

Quindi, chi può ripetere l'impresa?

 

Mentre Vladimir aspetta una risposta da noi, ho una domanda degna di un'impresa ;)


Come possiamo fare in modo che un ex5 importi funzioni da DLL 32 e 64?
Diciamo per fare un ex5 per due terminali (32/64).


Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 
sergeev:

Mentre Vladimir aspetta una risposta da noi, ho una domanda degna di un'impresa ;)


Come possiamo fare in modo che un ex5 importi funzioni da DLL 32 e 64?
Diciamo, per fare un ex5 per due terminali (32/64).

Stai chiedendo di nuovo delle eccezioni?
 
Urain:
Stai chiedendo di nuovo delle eccezioni?

No, non ho mai chiesto un'eccezione prima d'ora. Probabilmente non si tratta di questo, ma piuttosto di #ifdef

Speravo che se Vladimir fosse stato in grado di sovraccaricare le operazioni usando il suo codice, il suo metodo avrebbe potuto funzionare per abilitare automaticamente la DLL richiesta o_O

Una specie di #import dentro #define

 
MetaDriver:

Ecco, prima io. :)

Quindi, chi può ripetere l'impresa?

Ci vuole molto tempo per ripetere la tua impresa :) Anche se c'è un esempio simile nella documentazione.

//--- перебираем строки для сложения
   for(int i=0;i<rows;i++)
     {
      //--- запишем результаты сложений строк матриц в массив
      for(int k=0;k<cols;k++)
        {
         arr[k]=this[i][k]+m[i][k];
        }
      //--- поместим массив в строку матрицы
      res[i]=arr;
     }
 
Yurich:

Ci vuole molto tempo per ripetere la tua impresa :) Anche se c'è un esempio simile nella documentazione.

Perciò, fatevi bastare questa analogia... niente di che!... :-))

E darò un'occhiata. ;)

 
sergeev:

Come posso importare funzioni da DLL 32 e 64 in un ex5?
Diciamo per fare un ex5 per due terminali (32/64).

Le funzioni hanno nomi diversi. E nel codice, mettete delle chiamate condizionali, a seconda del bit rate del terminale, a diverse funzioni di riferimento.

Mi sembra che il terminale carichi la DLL alla prima chiamata. Nessuna chiamata - nessun tentativo di carico e nessun aborto critico.

Non vedo altri modi. Il bitness del terminale è restituito da TerminalInfoInteger().

bool x64 = TerminalInfoInteger(TERMINAL_X64);

Tutto questo può essere fatto direttamente nella libreria MyLib.ex5.



void MyLibMultibitFunc()  // библиотечная универсальная обёртка для DLL-функции
{
  if(x64) { MyDll64Func(); }
  else { MyDll32Func(); }
}
 
MetaDriver:

Le funzioni hanno nomi diversi. E nel codice, mettete delle chiamate condizionali, a seconda del bit rate del terminale, a funzioni diverse.

Mi sembra che il terminale carichi la DLL alla prima chiamata. Nessuna chiamata - nessun tentativo di carico e nessun aborto critico.

Non vedo altri modi. Il bitness del terminale è restituito da TerminalInfoInteger().

Tutto questo può essere fatto direttamente nella libreria MyLib.ex5.

Sì, stessa opinione, che il terminale crea l'oggetto dll-funzione solo alla prima chiamata.

E a proposito di bitness sembra che ci siano state alcune menzioni sulla diversa rappresentazione dei numeri sul forum, se il campo di bit della variabile dà un risultato ma sarà 32, se l'altro, sarà 64. Può essere determinato dall'esperienza.

 
MetaDriver:

Le funzioni hanno nomi diversi. E nel codice, mettete delle chiamate condizionali, a seconda del bit rate del terminale, a funzioni diverse.

Mi sembra che il terminale carichi la DLL alla prima chiamata. Nessuna chiamata - nessun tentativo di carico e aborto critico.

No, signori, non capite il problema. Le possibilità con TERMINAL_X64 o _Is64 sono note.

Ma purtroppo il terminale fa diversamente.

- Quando si accede al grafico, esso controlla l'elenco delle DLL utilizzate e visualizza l'elenco delle funzioni importate nella finestra Dependencies
Su quelle DLL che non corrispondono al bitness scrive un avviso MQL5\Libraries\somedll64.dll'non è la versione a 32 bit

- Ma quando premete OK e l'Expert Advisor si avvia, siete davvero nei guai.

Il terminale genera l'errore 193 e scarica EX5

Impossibile aprire 'MQL5\Libraries\somedll64.dll' (193)
Caricamento EX5 fallito

E voglio attirare la vostra attenzione sul fatto che questo codice contiene solo la dichiarazione della DLL e nessuna funzione è importata da essa

#importare "somedll64.dll"
#importare
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 

E così c'è la domanda numero uno.

Come si importano funzioni da dll a 32 bit come user32.dll ecc. in un'applicazione a 64? O ci sono copie per loro nel sistema con quel nome e viene creato uno spazio OOP?

Motivazione: