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

 

In questo thread voglio iniziare ad aiutare coloro che vogliono veramente capire e imparare la programmazione nel nuovo MQL4 e vogliono passare facilmente a MQL5 - i linguaggi sono molto simili.

Questo blog sarà un buon posto per discutere di problemi, algoritmi della loro soluzione e qualsiasi altra domanda riguardante la programmazione MT in un modo o nell'altro.

Spero che altri membri esperti del nostro forum si uniscano a noi e che questo thread sia interessante per tutti.

 

Salve.

È possibile rendere il numero di barre di costruzione nell'indicatore standard Fractals personalizzabile, cioè diverso da 5?

Se sì, come si può fare?

 
mila.com:

È possibile rendere il numero di barre di costruzione nell'indicatore standard Fractals personalizzabile, cioè diverso da 5?

Se sì, come si può fare?

Non si può fare questo nella versione standard (terminale)
 
mila.com:

Salve.

È possibile rendere il numero di barre di costruzione nell'indicatore standard Fractals personalizzabile, cioè diverso da 5?

Se sì, come si può fare?

Come Andrey ti ha già detto, quello standard non può essere usato, ma cosa ti impedisce di farne uno tuo?
 

Grazie. Ne ho bisogno solo per mq4https://www.mql5.com/en/code/1381

L'ho compilato nell'editor MT4, funziona, ma carica la cpu, cosa devo cambiare per non caricarla?

//--- indicator buffers
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpFractals
#property indicator_label1  "Up Fractals"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot DnFractals
#property indicator_label2  "Down Fractals"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrTomato
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int      InpLeftSide = 3;          // Кол-во баров слева от фрактала
input int      InpRightSide = 3;         // Кол-во баров справа от фрактала
//--- indicator buffers
double         UpFractalsBuffer[];
double         DnFractalsBuffer[];
//--- global variables
int            minRequiredBars;
int            leftSide, rightSide;
int            maxSide;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//---
   if ( InpLeftSide < 1 ) {
      leftSide = 2;
      printf("Неккоретно указан параметр \"Кол-во баров слева от фрактала\": %d. Будет использовано значение: %d.",
         InpLeftSide, leftSide);
   } else {
      leftSide = InpLeftSide;
   }
   if ( InpRightSide < 1 ) {
      rightSide = 2;
      printf("Неккоретно указан параметр \"Кол-во баров справа от фрактала\": %d. Будет использовано значение: %d.",
         InpRightSide, rightSide);
   } else {
      rightSide = InpRightSide;
   }
//---
   minRequiredBars = leftSide + rightSide + 1;
   maxSide = int(MathMax(leftSide, rightSide));
//---
   SetIndexBuffer(0, UpFractalsBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, DnFractalsBuffer, INDICATOR_DATA);
//---
   PlotIndexSetInteger(0, PLOT_ARROW, 217);
   PlotIndexSetInteger(1, PLOT_ARROW, 218);
//---
   PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, -10);  
   PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, 10);
//---
   for ( int i = 0; i < 2; i++ ) {
      PlotIndexSetInteger(i, PLOT_DRAW_BEGIN, minRequiredBars);
      PlotIndexSetDouble(i, PLOT_EMPTY_VALUE, 0.0);
   }
//---
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
//---
   IndicatorSetString(INDICATOR_SHORTNAME, "ffra ("+(string)leftSide+", "+(string)rightSide+")");
//---
   return(0);
}
//+------------------------------------------------------------------+
//| Check if is Up Fractal function                                  |
//+------------------------------------------------------------------+
bool isUpFractal(int bar, int max, const double &High[]) {
//---
   for ( int i = 1; i <= max; i++ ) {
      if ( i <= leftSide && High[bar] < High[bar-i] ) {
         return(false);
      }
      if ( i <= rightSide && High[bar] <= High[bar+i] ) {
         return(false);
      }
   }
//---
   return(true);  
}
//+------------------------------------------------------------------+
//| Check if is Down Fractal function                                |
//+------------------------------------------------------------------+
bool isDnFractal(int bar, int max, const double &Low[]) {
//---
   for ( int i = 1; i <= max; i++ ) {
      if ( i <= leftSide && Low[bar] > Low[bar-i] ) {
         return(false);
      }
      if ( i <= rightSide && Low[bar] >= Low[bar+i] ) {
         return(false);
      }
   }
//---
   return(true);  
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 startBar, lastBar;
//---
   if ( rates_total < minRequiredBars ) {
      Print("Недостаточно данных для расчёта");
      return(0);
   }
//---
   if (prev_calculated < minRequiredBars) {
      startBar = leftSide;
      ArrayInitialize(UpFractalsBuffer, 0.0);
      ArrayInitialize(DnFractalsBuffer, 0.0);
   }        
   else {
      startBar = rates_total - minRequiredBars;
   }
//---
   lastBar = rates_total - rightSide;
   for ( int bar = startBar; bar < lastBar && !IsStopped(); bar++ ) {
      //---
      if ( isUpFractal(bar, maxSide, high) ) {
         UpFractalsBuffer[bar] = high[bar];
      } else {
         UpFractalsBuffer[bar] = 0.0;
      }
      //---
      if ( isDnFractal(bar, maxSide, low) ) {
         DnFractalsBuffer[bar] = low[bar];
      } else {
         DnFractalsBuffer[bar] = 0.0;
      }
   }  
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
 
mila.com:

Grazie. Ne serve uno solo su mq4https://www.mql5.com/en/code/1381

Le correzioni sono minime:

//+------------------------------------------------------------------+
//|                                              iXBarsFractals.mq4  |
//|               Copyright 2011, Rone. redaction 2016 by artmedia70 |
//|                                            rone.sergey@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, Rone."
#property link      "rone.sergey@gmail.com"
#property version   "1.00"
#property description "Индикатор позволяет отдельно указывать кол-во баров слева и справа от фрактала. Хорошо подходит "
#property description "для определения как локальных, так и глобальных экстремумов."
#property strict
//--- indicator buffers
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpFractals
#property indicator_label1  "Up Fractals"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot DnFractals
#property indicator_label2  "Down Fractals"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrTomato
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int      InpLeftSide = 3;          // Кол-во баров слева от фрактала
input int      InpRightSide = 3;         // Кол-во баров справа от фрактала
//--- indicator buffers
double         UpFractalsBuffer[];
double         DnFractalsBuffer[];
//--- global variables
int            minRequiredBars;
int            leftSide,rightSide;
int            maxSide;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   leftSide=(InpLeftSide<2?2:InpLeftSide);
   rightSide=(InpRightSide<2?2:InpRightSide);
//---
   minRequiredBars=leftSide+rightSide+1;
   maxSide=int(fmax(leftSide,rightSide));
//---
   SetIndexBuffer(0,UpFractalsBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,DnFractalsBuffer,INDICATOR_DATA);
//---
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
   //PlotIndexSetInteger(0,PLOT_ARROW,217);
   //PlotIndexSetInteger(1,PLOT_ARROW,218);
//---
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-10);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,10);
//---
   for(int i=0; i<2; i++) {
      PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,minRequiredBars);
      PlotIndexSetDouble(i,PLOT_EMPTY_VALUE,0.0);
      }
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
   IndicatorSetString(INDICATOR_SHORTNAME,"XBarsFractals("+(string)leftSide+", "+(string)rightSide+")");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Check if is Up Fractal function                                  |
//+------------------------------------------------------------------+
bool isUpFractal(int bar,int max,const double &high[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && high[bar]<high[bar-i])     return(false);
      if(i<=rightSide && high[bar]<=high[bar+i])   return(false);
      }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Check if is Down Fractal function                                |
//+------------------------------------------------------------------+
bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 startBar,lastBar;
//---
   if(rates_total<minRequiredBars) return(0);
//---
   if(prev_calculated<minRequiredBars) {
      startBar=leftSide;
      ArrayInitialize(UpFractalsBuffer, 0.0);
      ArrayInitialize(DnFractalsBuffer, 0.0);
      }
   else startBar=rates_total-minRequiredBars;
//---
   lastBar=rates_total-rightSide;
   for(int bar=startBar; bar<lastBar && !IsStopped(); bar++) {
      //---
      if(isUpFractal(bar,maxSide,high))   UpFractalsBuffer[bar]=high[bar];
      else                                UpFractalsBuffer[bar]=0.0;
      //---
      if(isDnFractal(bar,maxSide,low))    DnFractalsBuffer[bar]=low[bar];
      else                                DnFractalsBuffer[bar]=0.0;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

È vero, io lo farei un po' diversamente, ma è la forza dell'abitudine...

Si potrebbe anche fare così:

   leftSide=(InpLeftSide<1?1:InpLeftSide);
   rightSide=(InpRightSide<1?1:InpRightSide);

Allora otterrai dei frattali piuttosto divertenti...

 
Artyom Trishkin:

Le correzioni sono minime:


Anche se l'avrei fatto un po' diversamente, ma è la forza dell'abitudine...

Si potrebbe anche fare così:

   leftSide=(InpLeftSide<1?1:InpLeftSide);
   rightSide=(InpRightSide<1?1:InpRightSide);

In questo caso mostrerà frattali assolutamente ridicoli...

Grazie, così.

PLOT_ARROW_SHIFT

Non si trova anche in MT4 Help, con cosa sostituirlo?

 
mila.com:

Grazie, ce n'è uno simile.

PLOT_ARROW_SHIFT

Nemmeno nell'aiuto di MT4, con cosa sostituirlo?

È "Vertical Arrow Offset for DRAW_ARROW Style".

Nessuno di quelli standard.

Sipuò semplicemente impostare l'offset o nelle impostazioni, o dal valore di ATR

E fare queste linee in questo modo:

//---
   for(int i=0; i<2; i++) {
      SetIndexDrawBegin(i,minRequiredBars);
      SetIndexEmptyValue(i,0);
      //PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,minRequiredBars);
      //PlotIndexSetDouble(i,PLOT_EMPTY_VALUE,0.0);
      }
//---
Cancellate quello che è commentato qui e mettete quello che è commentato qui.


 
Artyom Trishkin:

Questo è "Vertical Arrow Offset for DRAW_ARROW Style".

Cancellate quello che è commentato qui e mettete quello che è scritto qui.


Si sta ancora caricando.

Chiamando da un altro indicatore, si blocca anche il terminale per un momento.

Cos'altro posso fare?

 
mila.com:

Si sta ancora caricando.

Chiamando da un altro indicatore, si blocca anche il terminale per un momento.

Cos'altro posso fare?

Non chiamare da un altro indicatore :)

O mostra come lo fai tu.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953
Motivazione: