Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1941

 
Aleksandr Kononov #:
Y a-t-il un moyen de vérifier la mémoire ? Comment est-il consommé ou autre ?

disons que vous pouvez influencer la mémoire et qu'il calculera 200 indicateurs, mais après une semaine vous demanderez pourquoi 1000 indicateurs ne sont pas chargés... etc.... cycle vicieux... Définir des tâches correctes...

 
Nikolay Ivanov #:

le code du pendu ne peut être appliqué nulle part... Vous devez définir les tâches qui peuvent être faites... Et c'est plus facile de bousiller le code... Les indicateurs doivent fonctionner rapidement et il n'y a pas de temps pour des calculs super longs.

J'aimerais connaître les limites dans lesquelles quelque chose peut être créé. D'autant plus que je ne suis pas du tout un programmeur, je ne saurais pas comment m'y prendre. Eh bien, je vais chercher quelque chose à lire

 
Aleksandr Kononov #:

J'aimerais connaître le cadre dans lequel je pourrais créer quelque chose. C'est difficile à comprendre pour un débutant, d'autant plus que je ne suis pas du tout un programmeur. OK, je vais voir ce que je peux lire.

Vous n'avez généralement besoin que d'un seul CCI, maximum 3 :) Et vous avez 200... Je suis d'accord pour dire qu'il est difficile de ne pas dépasser les limites, il faut de l'expérience, pour fixer une tâche correcte et réalisable qui sera menée à bien dans un délai raisonnable - c'est difficile. Donc si vous avez besoin de conseils pour savoir où creuser, vous devriez vous concentrer sur l'optimisation et la minimisation des idées... Par exemple CCI avec période 20 et CCI avec période 21... presque la même chose et il n'y a aucun sens à calculer les deux. Plus la période est élevée, moins l'effet est important, vous devez trouver un nombre raisonnable. Une belle solution fonctionne toujours rapidement.

 
Nikolay Ivanov #:

Eh bien, un CCI est généralement suffisant, 3 au maximum :) et vous avez 200... Je suis d'accord avec vous sur la difficulté de rester dans les limites... il faut de l'expérience, il est difficile de fixer la bonne tâche, réalisable, qui sera menée à bien dans un temps raisonnable. Donc si vous avez besoin de conseils pour savoir où creuser, vous devriez vous concentrer sur l'optimisation et la minimisation des idées... Par exemple CCI avec période 20 et CCI avec période 21... presque la même chose et il n'y a aucun sens à calculer les deux. Plus la période est élevée, moins l'effet est important, vous devez trouver un nombre raisonnable. Une belle solution fonctionne toujours rapidement.

Je comprends que le profileur aidera à mesurer la consommation de mémoire. Nous allons donc l'optimiser). Tout de même, si quelqu'un sait où lire à ce sujet, envoyez-moi le lien...

 

Bonjour à tous !

Veuillez me conseiller sur ce qui devrait être ajouté au code pour décaler la MA non seulement vers l'avant (valeur positive) mais aussi vers l'arrière (valeur négative).

Voici le code de l'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))); 
 
   }
 
законопослушный гражданин #:

Bonjour à tous !

Veuillez me conseiller sur ce qui devrait être ajouté au code pour décaler la MA non seulement vers l'avant (valeur positive) mais aussi vers l'arrière (valeur négative).

Voici le code de l'Expert Advisor :

Ajoutez au décalage la valeur négative souhaitée, mais la valeur + décalage ne doit pas être inférieure à zéro.

 
ALEKSANDR SOKOLOV #:

Ajoutez la valeur négative souhaitée au décalage, mais assurez-vous que la valeur + décalage est au moins égale à zéro.

Merci, je vais essayer.

 

Bon après-midi.

Aidez-nous avec le code, il y a peut-être des exemples.
Tâche :

Il y a plusieurs ordres ouverts, avec différents lots, dans différentes directions. L'un d'eux est enterré avec un bénéfice, supposons 20. Cependant, il y a un ordre ouvert avec un profit négatif, supposons -55 avec 0.05 lots. Je veux fermer une partie d'un ordre négatif du montant du profit d'un ordre fermé positivement pour diminuer le drawdown.

J'ai essayé d'écrire ceci en utilisant l'opérateur while, mais cela n'a pas bien fonctionné.

Merci d'avance.

 

Bonjour, ce code est tiré du livre de Fedoseev. Pourquoi l'indicateur n'est pas dessiné dans la fenêtre, le log indique qu'il fonctionne, lors de la compilation aucune erreur, une fenêtre supplémentaire s'ouvre (vide), ce code est tiré du livre, avec le mien exactement le même résultat. Qu'est-ce qui ne va pas ?

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

//| 015 Symbol.mq5 |

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

#property copyright "Dmitry Fedoseev"

#lien de propriété "mailto:for-good-letter@yandex.ru"

#propriété version "1.00"

#propriété indicator_separate_window

#property indicator_buffers 4

#property indicator_plots 1

//--- tracer la barre

#property indicator_label1 "bar"

#property indicator_type1 DRAW_CANDLES

#property indicator_color1 clrGray,clrBlue,clrRed

#propriété indicator_style1 STYLE_SOLID

#property indicator_width1 1

//--- paramètres d'entrée


chaîne de caractères d'entrée symbol="" ;

entrée bool drawBars=false ;


chaîne de caractères sym ;


//--- tampons indicateurs

double barBuffer1[] ;

double barBuffer2[] ;

double barBuffer3[] ;

double barBuffer4[] ;

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

//| Fonction d'initialisation de l'indicateur personnalisé |

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

int OnInit()

{

sym=symbole ;

StringTrimLeft(sym) ;

StringTrimRight(sym) ;

if(sym==""){

sym=Symbole() ;

}

if(!SymbolSelect(sym,true)){

Alert("Unknown symbol ",sym) ;

return(INIT_FAILED) ;

}

if(drawBars){

PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_BARS) ;

}

else{

PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_CANDLES) ;

}

//--- cartographie des tampons indicateurs

SetIndexBuffer(0,barBuffer1,INDICATOR_DATA) ;

SetIndexBuffer(1,barBuffer2,INDICATOR_DATA) ;

SetIndexBuffer(2,barBuffer3,INDICATOR_DATA) ;

SetIndexBuffer(3,barBuffer4,INDICATOR_DATA) ;

//---

return(INIT_SUCCEEDED) ;

}


void OnDeinit(const int r){

Commentaire (") ;

EventKillTimer() ;

}

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

//| Fonction d'itération de l'indicateur personnalisé |

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

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()) ;

si(bars==0){

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

EventSetTimer(1) ;

retour(0) ;

}

int start ;

si(prev_calculé==0){

Commentaire (") ;

EventKillTimer() ;

datetime tm[1] ;

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

retour(0) ;

}

start=0 ;

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

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

pause ;

}

}

}

else{

start=prev_calculated-1 ;

}

MqlRates r[1] ;

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

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

retour(0) ;

}

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

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

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

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

}

retour(taux_total) ;

}


void OnTimer()

{

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

}


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

Dossiers :
 
MatveySt #:

Bonjour, ce code est tiré du livre de Fedoseev. Pourquoi l'indicateur n'est pas dessiné dans la fenêtre, le log indique qu'il fonctionne, lors de la compilation aucune erreur, une fenêtre supplémentaire s'ouvre (vide), ce code est tiré du livre, avec le mien exactement le même résultat. Qu'est-ce qui ne va pas ?


Alt s coller le code.

Et quand vous fondez l'inducteur, entrez-vous dans l'outil ?