OOP, modelli e macro in mql5, sottigliezze e usi - pagina 15

 
Vict:

Ho complicato troppo le cose )).

Quindi, lasciate che si usi il primo, è probabilmente il modo migliore.

Non è un problema scrivere TEST più volte.

Si può anche fare così, ma solo nell'ordine inverso in cui tutto sarà chiamato.

#define  LINE(dId) EA.AddDealsSettings(InDealType_##dId,InVolType_##dId,InVolume_##dId,InPrice_##dId,InVolCoeff_##dId,InClosePips_##dId,Mirror)

#define  BLOCK1 LINE(01)
#define  BLOCK2 LINE(02); BLOCK1
#define  BLOCK3 LINE(03); BLOCK2
#define  BLOCK4 LINE(04); BLOCK3
#define  BLOCK5 LINE(05); BLOCK4
#define  BLOCK6 LINE(06); BLOCK5
#define  BLOCK7 LINE(07); BLOCK6
#define  BLOCK8 LINE(08); BLOCK7
#define  BLOCK9 LINE(09); BLOCK8
#define  BLOCK10 LINE(10); BLOCK9

#define  SEND(dCount) do {BLOCK##dCount;} while(false)

void OnStart()
  {
   SEND(10);
  }
 

Hmm, ho pensato di facilitarmi il compito di sbattere meno sulla tastiera, ma ora dovrò occuparmi di tutti gli esempi

@Vladimir Simakov figo!

@Vict grazie!

ZS: Per essere onesti, capisco solo il primo esempio di macro, il resto non sono nemmeno vicino a capire (((

 
Igor Makanu:

Hmm, ho pensato di facilitarmi il compito di sbattere meno sulla tastiera, ma ora dovrò occuparmi di tutti gli esempi

@Vladimir Simakov figo!

@Vict grazie!

ZS: Per essere onesti, capisco solo il primo esempio di macro, il resto non sono nemmeno vicino a capire (((

La magia del preprocessore è chiamata)))

 
Vladimir Simakov:

La magia del preprocessore è chiamata)))

Lo so, non ho mai fatto pratica, per questo è difficile da imparare (((

Posso trasformare questo codice in una macro?


//--- input parameters
input ENUM_DEALTYPE        InDealType_01=BUY;            //1.------------------------------ Order ------------------------------
input int                  InPrice_01        =  000;     //Start price
input double               InVolume_01       =  0.01;    //Start Volume
input ENUM_VOLUMERATIO     InVolType_01=MultiplyAlways;  //Next operation with volume coefficient
input double               InVolCoeff_01     =  1.5;     //Volume coefficient
input ENUM_DISTANCERATIO   InDistType_01     =  NotMove; //Next price type
input double               InDistCoeff_01    =  1.23;    //Coefficient next open price
input int                  InDistShift_01    =  150;     //Shift next open price
input int                  InClosePips_01    =  200;     //TakeProfit>0 or StopLoss<0

input ENUM_DEALTYPE        InDealType_02=BUY;            //2.------------------------------ Order ------------------------------
input int                  InPrice_02        =  000;     //Start price
input double               InVolume_02       =  0.01;    //Start Volume
input ENUM_VOLUMERATIO     InVolType_02=MultiplyAlways;  //Next operation with volume coefficient
input double               InVolCoeff_02     =  1.5;     //Volume coefficient
input ENUM_DISTANCERATIO   InDistType_02     =  NotMove; //Next price type
input double               InDistCoeff_02    =  1.23;    //Coefficient next open price
input int                  InDistShift_02    =  150;     //Shift next open price
input int                  InClosePips_02    =  200;     //TakeProfit>0 or StopLoss<0

E quindi 10 volte?

Voglio dire, ci sono ancora 8 volte... ma non so, quando lo eseguirò nell'ottimizzatore forse aggiungerò o toglierò dei parametri, non ho ancora finalizzato il codice (i commenti sono gli stessi, ma una cifra è diversa - prima linea)

 
Igor Makanu:

Lo so, non ho mai fatto pratica, per questo è difficile da imparare (((

Questo codice può essere avvolto in una macro?


E quindi 10 volte? E i commenti sono gli stessi, ma una cifra è diversa

Sì, nessun problema, ma solo nessun commento. Sì, e sostituirli con /* ... */ non funzionerà, il compilatore, in questo caso, smette di accettarlo nel contesto della descrizione testuale delle variabili esterne per la tabella delle impostazioni. Controllato.

 
Vladimir Simakov:

Sì, nessun problema, ma solo nessun commento. Sì, e sostituirli con /* ... */ non funzionerà, il compilatore, in questo caso, smette di accettarlo nel contesto della descrizione testuale delle variabili esterne per la tabella delle impostazioni. Controllato.

allora è un problema, i commenti dovranno essere corretti da hand.... Va bene per i test, è più veloce comunque, sto lavorando sul mio codice, ci vuole molto tempo per modificarlo, non posso arrivare al tester...

se non ti dispiace, fai un esempio senza commenti



PS: forse l'idea è una schifezza, ma è da stamattina che penso nella mia testa a cosa mi piacerebbe vedere.... Per ora una griglia di ordini nell'ottimizzatore, ma l'obiettivo finale è diverso (invece di alcuni passi fissi della griglia, voglio allegare un polinomio per far eseguire all'ottimizzatore i coefficienti, poi forse lo stesso, ma vorrei vedere le righe di Taylor ;) ), ma la griglia prima ho bisogno di vedere cosa mostra l'ottimizzatore, un poligono di prova in generale mi preparo )))

 
Igor Makanu:

Lo so, non ho mai fatto pratica, per questo è difficile da imparare (((

Posso trasformare questo codice in una macro?


E quindi 10 volte?

Voglio dire, ci sono ancora 8 volte... ma non so, quando lo eseguirò nell'ottimizzatore forse aggiungerò o toglierò parametri, non ho ancora scritto il codice (i commenti sono gli stessi, ma una cifra è diversa - la prima riga)

Potete scrivere una piccola funzione che genererà questo codice (e lo salverà in un file o negli appunti).

 
Andrey Khatimlianskii:

Si potrebbe scrivere una piccola funzione che generi questo codice (e lo salvi in un file o negli appunti).

Beh, ecco che distruggi tutto lo spirito poetico, in prosa non è difficile, così:

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#include <Files\FileTxt.mqh>
CFileTxt FOut;

#define   COUNT 10


const string code0[]=
  {
   "input ENUM_DEALTYPE        InDealType_","=BUY;            //",".------------------------------ Order ------------------------------"
  };

const string code1[]=
  {
   "input int                  InPrice_","        =  000;     //Start price",
   "input double               InVolume_","       =  0.01;    //Start Volume",
   "input ENUM_VOLUMERATIO     InVolType_","=MultiplyAlways;  //Next operation with volume coefficient",
   "input double               InVolCoeff_","     =  1.5;     //Volume coefficient",
   "input ENUM_DISTANCERATIO   InDistType_","     =  NotMove; //Next price type",
   "input double               InDistCoeff_","    =  1.23;    //Coefficient next open price",
   "input int                  InDistShift_","    =  150;     //Shift next open price",
   "input int                  InClosePips_","    =  200;     //TakeProfit>0 or StopLoss<0"
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   if(FOut.Open(__FILE__+".txt",FILE_WRITE|FILE_COMMON)!=INVALID_HANDLE)
     {
      for(int i=0;i<COUNT;i++)
        {
         string N=IntegerToString(i,2,'0');
         FOut.WriteString(code0[0]+N+code0[1]+IntegerToString(i)+code0[2]+"\n");
         for(int j=0;j<8;j++)
           {
            FOut.WriteString(code1[j*2]+N+code1[j*2+1]+"\n");
           }
        }
      printf("Write to file %s",FOut.FileName());
     }
   else printf("Open file error № %i",GetLastError());
  }
//+------------------------------------------------------------------+

))))

Ma grazie comunque per il consiglio!

 
Vladimir Simakov:

Sì, nessun problema, ma solo nessun commento. Sì, e sostituirli con /* ... */ non funzionerà, il compilatore, in questo caso, smette di accettarlo nel contesto della descrizione testuale delle variabili esterne per la tabella delle impostazioni. Controllato.

Forse hai fatto qualcosa di sbagliato? O le macro si comportano diversamente?

input double d1=1.02,/*Первая переменная double*/ d2=3;/*Вторая переменная double*/
input double d3=3.07;/*Третья переменная double*/
input int i1=5,/*Первая переменная int*/ i2=7;/*Вторая переменная int*/
 
Alexey Viktorov:

Hai fatto qualcosa di sbagliato? O le macro si comportano diversamente?

Sì, è diverso. Ha a che fare con il fatto che il preprocessore inizia prima del parser e stupidamente raccoglie il testo, con i commenti all'interno della macro che vengono scartati nella fase del preprocessore. Allo stesso tempo, se lasciate // in una macro, potreste ottenere un bug feroce per vostra colpa.