Un po' di aiuto necessario

 

Sto cercando di codificare un EA basato sulla mia strategia, con l'aiuto del codice di alcuni altri EAs e indis. ma ora sono bloccato in una cosa.

(user defined lot sizes for each trade)

extern string LotsProgression="0.1;0.1;0.2;0.3;0.4;0.6;0.8;1.1;1.5;2.0;2.7;3.6;4.7;6.2;8.0;10.2;13.0;16.5;20.8;26.3;33.1;41.6;52.2;65.5;82.5;103.9;130.9;165;207.9;262;330.1;416;524.7;661.1";

extern bool RestartNewCycle = true;

(and the code)

int init()

{

int i,j,k;

string ls;

while (true) {

        j=StringFind(LotsProgression,";",i);

        if (j>0) {

                ls=StringSubstr(LotsProgression,i,j-i);

                i=j+1;

                k++;

                ArrayResize(lots,k);

                lots[k-1]=StrToDouble(ls);

        } else {

                ls=StringSubstr(LotsProgression,i);

                k++;

                ArrayResize(lots,k);

                lots[k-1]=StrToDouble(ls);

                break;

        }

}



plen=ArraySize(lots);

}

Non riesco a capire questa logica o cosa sia in realtà.

PS: A un amico è piaciuta la mia strategia e ha creato questo EA. Ma ho perso entrambi (l'EA e il contatto dell'amico codificatore) quindi ora sto cercando di mettere alla prova le mie conoscenze di base di codifica, perché voglio davvero che questa strategia sia codificata di nuovo.

 
qgmql:

Sto cercando di codificare un EA basato sulla mia strategia, con l'aiuto di codice da alcuni altri EA e indis. ma ora bloccato in una cosa.

<rimosso>


Si prega di utilizzare ilpulsante SRC per inviare il codice. . .
 
qgmql: Non riesco a capire questa logica o cosa sia in realtà.

extern string LotsProgression="0.1;0.1;0.2;0.3 ...

double lots[];     // [0]=0.1 [1]=0.1 [2]=0.2 [3]=0.3 [34]=661.1
int    plen;       // 35
int init(){ ... }

Divide la stringa al punto e virgola, converte le sottostringhe in doppie e memorizza i valori nell'array dinamico.
 

La cosa che hai menzionato è ok. Il problema è nel resto del codice. Ottengo due errori (solo nel nuovo metaeditor).

'init' - function can be declared only in the global scope

and

'init' - function already defined and has body
 
qgmql:

La cosa che hai menzionato è ok. Il problema è nel resto del codice. Ottengo due errori (solo nel nuovo metaeditor).

Sembra che tu abbia dichiarato init() all'interno di un'altra funzione e poi l'abbia definita una seconda volta.
 

Sì, l'ho capito e l'ho corretto. Ora ottengo un errore nel codice timeframe.

   //--- EA PARAMETERS
extern int      EA_TF=240;
extern bool     Forced_TF=True;


bool   TF;

     if(Forced_TF != True) TF = EA_TF;     //These two lines i think, have error.
     else TF = Period();                   //New metaeditor is not accepting "TF = EA_TF;" from above line.

Se Forced_TF è vero, allora l'EA dovrebbe fare trading e ricevere segnali solo dal timeframe menzionato, anche se il grafico attivo (su cui posiziono l'EA) è aperto in un timeframe diverso. Se il valore è false, allora dovrebbe funzionare su qualsiasi timeframe.

 
qgmql:

Sì, l'ho capito e l'ho corretto. Ora ottengo un errore nel codice timeframe.

Se Forced_TF è vero, allora l'EA dovrebbe fare trading e ricevere segnali solo dal timeframe menzionato, anche se il grafico attivo (su cui posiziono l'EA) è aperto in un timeframe diverso. Se il valore è false, allora dovrebbe funzionare su qualsiasi timeframe.

Hai TF come bool. .. ma stai cercando di impostarlo su un int... prova questo...

   //--- EA PARAMETERS
extern int      EA_TF=240;
extern bool     Forced_TF=True;


int   TF;

     if(!Forced_TF) TF = EA_TF;     //These two lines i think, have error. 
     else TF = Period();            //New metaeditor is not accepting "TF = EA_TF;" from above line.
 
Pubblica TUTTO il codice o almeno indica il troncamento. Questo IF/ELSE deve essere all'interno di una funzione.
 

@RaptorUK Ti ho preso. e di nuovo tutto ok con il vecchio editor, ma il nuovo editor dà ancora un avvertimento, citato nel codice dopo la linea di errore,

//+------------------------------------------------------------------+
//|                                                   01Multi_EA.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
#property version   "1.00"
#property strict

//--- input parameters
input int      EA_TF=60;
input bool     Forced_TF=True;
input int      MagicNumber=12345;
input int      FastMA_Period=5;
input int      FastMA_Shift=0;
input int      FastMA_Method=1;
input int      FastMA_Price=0;
input int      SlowMA_Period=34;
input int      SlowMA_Shift=0;
input int      SlowMA_Method=1;
input int      SlowMA_Price=0;
input string   LotsProgression="0.01;0.02;0.03;0.04;0.05;0.06;0.07;0.08;0.09;0.10;0.11;0.12;0.13;0.14;0.15;0.16;0.17;0.18;0.19;0.20";
input bool     NewCycle=True;
input int      Limit_TP=50;
input bool     Use_TP=False;
input int      Limit_SL=50;
input bool     Use_SL=False;
input int      MaxSlippage=3;
input int      OrderTries=10;

int      TF, Plen;
double   TP, SL, pips2dbl, pips2point, pipValue, Slippage, Lots[];
         
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//----
 if(Forced_TF != True) TF = EA_TF;
      else TF = Period();
   int i,j,k;
   string ls;
   while (true) {
        j=StringFind(LotsProgression,";",i);
        if(j>0) {
                ls=StringSubstr(LotsProgression,i,j-i);    // <<<<<"possible use of uninitialized variable 'i'	01Multi_EA.mq4	46	38">>>>>

                i=j+1;
                k++;
                ArrayResize(Lots,k);
                Lots[k-1]=StrToDouble(ls);
        } else {
                ls=StringSubstr(LotsProgression,i);
                k++;
                ArrayResize(Lots,k);
                Lots[k-1]=StrToDouble(ls);
                break;
        }
   }


   Comment("Copyright © 2004, MetaQuotes Software Corp.");
   
   if (Digits == 5 || Digits == 3)
   {            
      pips2dbl = Point*10; pips2point = 10; pipValue = (MarketInfo(Symbol(),MODE_TICKVALUE))*10;
   } 
   else 
   {    
      pips2dbl = Point;   pips2point = 1; pipValue = (MarketInfo(Symbol(),MODE_TICKVALUE))*1;
   }
   
   Slippage = pips2dbl*MaxSlippage;
   TP = pips2dbl*Limit_TP;
   SL = pips2dbl*Limit_SL;
   
//----
   return(INIT_SUCCEEDED);
  }

@WHRoeder Ho incollato l'intero codice.

 
qgmql:

@RaptorUK Ti ho preso. e di nuovo tutto ok con il vecchio editor, ma il nuovo editor dà ancora un avvertimento, citato nel codice dopo la linea di errore,

@WHRoeder Ho incollato l'intero codice.

Non è un errore, è un avvertimento... per sbarazzarsi dell'avvertimento inizializzare la variabile piuttosto che dichiararla e basta. In mql4 quando dichiaravi una variabile veniva anche inizializzata, ora con mql4.5 devi inizializzare esplicitamente la variabile se vuoi . . .

int i = 0, j, k;   //  i initialised to 0
 
pipValue = (MarketInfo(Symbol(),MODE_TICKVALUE))*10;
Non usare tickvalue da solo https://www.mql5.com/en/forum/133792/page3#512466