Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1941

 
Aleksandr Kononov #:
Beh, c'è un modo per controllare la memoria? Come si consuma o qualcosa del genere?

diciamo che potete influenzare la memoria e calcolerà 200 indicatori, ma dopo una settimana vi chiederete perché 1000 indicatori non sono caricati... ecc. circolo vizioso... Impostare compiti corretti...

 
Nikolay Ivanov #:

il codice appeso non può essere applicato da nessuna parte... Devi fissare i compiti che possono essere fatti... Ed è più facile sbagliare il codice... Gli indicatori devono lavorare velocemente e non c'è tempo per calcoli super lunghi.

Vorrei conoscere i limiti entro i quali si può creare qualcosa. Tanto più che non sono affatto un programmatore, non saprei come gestirlo. Beh, cercherò qualcosa da leggere

 
Aleksandr Kononov #:

Vorrei conoscere il quadro in cui potrei creare qualcosa. È difficile da capire per un principiante, soprattutto perché non sono affatto un programmatore. OK, vedrò cosa posso leggere.

Di solito hai bisogno solo di una CCI, massimo 3 :) E hai 200... Sono d'accordo che è difficile non oltrepassare i limiti, ci vuole esperienza, per impostare il compito corretto e fattibile che sarà completato con successo in un tempo ragionevole - è difficile. Quindi se hai bisogno di consigli su dove scavare, dovresti concentrarti sull'ottimizzazione e la minimizzazione delle idee... Per esempio CCI con periodo 20 e CCI con periodo 21... quasi la stessa cosa e non ha senso calcolarli entrambi. Più alto è il periodo meno effetto, devi trovare un numero ragionevole. Una bella soluzione funziona sempre velocemente.

 
Nikolay Ivanov #:

Beh, un CCI di solito è sufficiente, 3 al massimo :) e hai 200... Sono d'accordo con te sulla difficoltà di rimanere nei limiti... ci vuole esperienza, è difficile impostare il compito giusto, realizzabile, che sarà completato con successo in un tempo ragionevole. Quindi se hai bisogno di consigli su dove scavare, dovresti concentrarti sull'ottimizzazione e la minimizzazione delle idee... Per esempio CCI con periodo 20 e CCI con periodo 21... quasi la stessa cosa e non ha senso calcolarli entrambi. Più alto è il periodo meno effetto, devi trovare un numero ragionevole. Una bella soluzione funziona sempre velocemente.

Ho capito che il profiler aiuterà a misurare il consumo di memoria. Quindi lo ottimizzeremo). In ogni caso, se qualcuno sa dove leggerlo, per favore mi mandi il link...

 

ciao a tutti!

Per favore consigliate cosa si dovrebbe aggiungere al codice per spostare il MA non solo in avanti (valore positivo) ma anche all'indietro (valore negativo)

Ecco il codice dell'Expert Advisor:

// Параметры советника
input string  sParametersEA = "";     // Параметры советника
input double  Lot           = 0.01;   // Количество лотов
input int     StopLoss      = 30;     // Стоп (SL)
input int     TakeProfit    = 30;     // Тейк (TP)
input int     Slippage      = 3;      // Проскальзование (в пунктах)
input int     Magic         = 1;      // Индентификатор советника
input double  K_Martin1     = 0.01;    // Множитель мартин 1
input double  K_Martin2     = 1.9;    // Множитель мартин 2
input double  K_Martin3     = 1.4;    // Множитель мартин 3
input int     OrdersClose   = 3;      // Ограничение лотности мартин1
input int     OrdersClose2  = 5;      // Ограничение лотности мартин2
input int     DigitsLot     = 2;      // Точность лотности
// Параметры индикатора
input string  sParametersMA = "";     // Параметры индикатора
input int     PeriodMA      = 14;     // Период мувинга
input int     MovingShift   = 1;      // Сдвиг мувинга
// Глобальные переменные
datetime Start,newbar;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
//+-----------------------------------------------------------------------------------------------+
int OnInit()
  {
Start          = TimeCurrent();
MaxMartinLot   = Lot*MathPow(1.4,OrdersClose);
MaxMartinLot2  = Lot*MathPow(K_Martin2,OrdersClose2);
int Y          = 15;
DrawLABEL("nextlot",1,5,Y,clrLime,""); 
Y += 20;
DrawLABEL("currentlot",1,5,Y,clrLime,"");
Y += 30;
return(INIT_SUCCEEDED);
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL("nextlot",1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
      DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
 
   }
 
законопослушный гражданин #:

ciao a tutti!

Per favore consigliate cosa si dovrebbe aggiungere al codice per spostare il MA non solo in avanti (valore positivo) ma anche all'indietro (valore negativo)

Ecco il codice dell'Expert Advisor:

Aggiungete allo spostamento il valore negativo desiderato, ma il valore + lo spostamento non deve essere inferiore a zero.

 
ALEKSANDR SOKOLOV #:

Aggiungete il valore negativo desiderato allo spostamento, ma assicuratevi che il valore + lo spostamento sia almeno zero.

Grazie, farò una prova.

 

Buon pomeriggio.

Aiuto con il codice, forse ci sono degli esempi.
Compito:

Ci sono diversi ordini aperti, con diversi lotti, in diverse direzioni. Uno di loro è sepolto con profitto, supponiamo 20. Tuttavia, c'è un ordine aperto con un profitto negativo, supponiamo -55 con 0,05 lotti. Voglio chiudere una parte di un ordine negativo dell'importo del profitto di un ordine chiuso positivamente per diminuire il drawdown.

Ho provato a scrivere questo usando l'operatore while, ma non è andata bene.

Grazie in anticipo.

 

Ciao, questo codice è tratto dal libro di Fedoseev. Perché l'indicatore non viene disegnato nella finestra, il log dice che è in esecuzione, durante la compilazione nessun errore, si apre una finestra aggiuntiva (vuota), questo codice è dal libro, con il mio esattamente lo stesso risultato. Cosa c'è che non va?

//+------------------------------------------------------------------+

//| 015 Symbol.mq5 |

//+------------------------------------------------------------------+

#proprietà copyright "Dmitry Fedoseev"

#proprietà link "mailto:for-good-letter@yandex.ru"

#proprietà versione "1.00"

#proprietà indicator_separate_window

#proprietà indicator_buffers 4

#proprietà indicator_plots 1

//--- plot bar

#property indicator_label1 "bar"

#proprietà indicator_type1 DRAW_CANDLES

#property indicator_color1 clrGray,clrBlue,clrRed

#proprietà indicator_style1 STYLE_SOLID

#proprietà indicator_width1 1

//--- parametri di ingresso


stringa di input symbol="";

input bool drawBars=false;


stringa sym;


//--- buffer di indicatori

doppio barBuffer1[];

doppio barBuffer2[];

doppio barBuffer3[];

doppio barBuffer4[];

//+------------------------------------------------------------------+

//| funzione di inizializzazione dell'indicatore personalizzato

//+------------------------------------------------------------------+

int OnInit()

{

sym=simbolo;

StringTrimLeft(sym);

StringTrimRight(sym);

se(sym==""){

sym=Symbol();

}

if(!SymbolSelect(sym,true)){

Alert("Simbolo sconosciuto ",sym);

return(INIT_FAILED);

}

se(drawBars){

PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_BARS);

}

else{

PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_CANDLES);

}

//--- mappatura dei buffer degli indicatori

SetIndexBuffer(0,barBuffer1,INDICATOR_DATA);

SetIndexBuffer(1,barBuffer2,INDICATOR_DATA);

SetIndexBuffer(2,barBuffer3,INDICATOR_DATA);

SetIndexBuffer(3,barBuffer4,INDICATOR_DATA);

//---

return(INIT_SUCCEED);

}


void OnDeinit(const int r){

Commento(");

EventKillTimer();

}

//+------------------------------------------------------------------+

//| funzione di iterazione dell'indicatore personalizzata

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

const int prev_calculated,

const datetime &time[],

const double &open[],

const double &high[],

const double &low[],

const double &close[],

const long &tick_volume[],

const long &volume[],

const int &spread[])

{

int bars=Bars(sym,Period());

se(barre==0){

Comment("Forming timeframe ",sym,"...");

EventSetTimer(1);

ritorno(0);

}

int start;

se(prev_calcolato==0){

Commento(");

EventKillTimer();

datetime tm[1];

se(CopyTime(sym,Period(),bars-1,1,tm)==-1){

ritorno(0);

}

inizio=0;

for(;start<rates_total;start++){

if(time[start]>=tm[0]){

pausa;

}

}

}

else{

start=prev_calculato-1;

}

MqlRates r[1];

for(int i=start;i<rates_total;i++){

se(CopyRates(sym,Period(),time[i],1,r)==-1){

ritorno(0);

}

barBuffer1[i]=r[0].open;

barBuffer2[i]=r[0].high;

barBuffer3[i]=r[0].low;

barBuffer4[i]=r[0].close;

}

return(rates_total);

}


void OnTimer()

{

ChartSetSymbolPeriod(0,Symbol(),Period());

}


//+------------------------------------------------------------------+

File:
 
MatveySt #:

Ciao, questo codice è tratto dal libro di Fedoseev. Perché l'indicatore non viene disegnato nella finestra, il log dice che è in esecuzione, durante la compilazione nessun errore, si apre una finestra aggiuntiva (vuota), questo codice è dal libro, con il mio esattamente lo stesso risultato. Cosa c'è che non va?


Alt s incolla il codice.

E quando si fonde l'induttore si inserisce lo strumento?