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

 
Alexandr Sokolov:

Grazie! E se per scopi commerciali?

Per Mercato nel senso di ?

allora devi costruire la tua libreria GUI nella tua immagine :-(

MQL non è inteso per una GUI complessa. È destinato al conteggio e al commercio.

Cioè, si può fare, ma è tremendamente stupido.

 

Deciso di studiare la libreria CCanvas


Non riesco a capirlo - nessun errore (o meglio, il compilatore non ne dà), e nemmeno niente sullo schermo. Voglio disegnare un triangolo rosso ...

#include <Canvas\Canvas.mqh>

#property copyright "Alexandr Sokolov"
#property link      "https://www.mql5.com/en/users/asokolov7"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
CCanvas canvas;
//-------------------------------------------------------------------------------------------------
int OnInit()
  {
   bool a = canvas.Create("a",600,400,0);
   canvas.FillTriangle(100,100,80,120,120,120,clrRed);
   canvas.Update(true); Alert(a);
   return(INIT_SUCCEEDED);
  }
//-------------------------------------------------------------------------------------------------
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[])
  {
   
   return(rates_total);
  }


Ed ecco il risultato


 
Alexandr Sokolov:

Ho deciso di esplorare la libreria CCanvas

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

#include <Canvas\Canvas.mqh>

CCanvas canvas;
int xtr[3] = {2, 100, 198};
int ytr[3] = {198, 2, 198};
const uint clrtr = ColorToARGB(clrRed);

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   if(!canvas.CreateBitmapLabel(0, 0, "canvasname", 10, 10, 200, 200)) return(INIT_FAILED);
   canvas.Erase();
   canvas.FillTriangle(xtr[0], ytr[0], xtr[1], ytr[1], xtr[2], ytr[2], clrtr);
   canvas.Update();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   canvas.Destroy();
}
//+------------------------------------------------------------------+
//| 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[])
{
//---

//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
 
Igor Makanu:

Grazie per l'esempio pronto

Se non le dispiace, posso dire qualche parola sui miei errori? È solo che stavo guardando l'aiuto sul sito web, e la documentazione ha solo una descrizione delle funzioni stesse, e gli esempi sotto quale funzione è dopo quale non ci sono

 
Alexandr Sokolov:

Grazie per l'esempio pronto

Se non le dispiace, posso dire qualche parola sui miei errori? Stavo solo guardando l'aiuto sul sito web e la documentazione ha solo una descrizione delle funzioni stesse, e non ci sono esempi sotto quale funzione è dopo quale

leggere gli articoli, ci sono molti esempi già prontihttps://www.mql5.com/ru/search#!keyword=Canvas&module=mql5_module_articles

 

Buon pomeriggio!!!

Voglio provare a scrivere una funzione per ricordare gli ordini perdenti per profitto, lotto e biglietto.
Non ho mai lavorato con gli array, l'ho fatto per esempio e per riferimento.

Non so dove e come specificare la dimensione dell'array.

Si prega di controllare e correggere se possibile.

======

struttura StructOrder

{

doppio OrProf;

doppio OrLot;

int OrTiK;

};

StructOrder OrBuy[];

StructOrder OrSell[];

====

void Cloce_No_FreeMargin()

{

double profit_SELL = 0;

double profit_BUY = 0;

doppio no_profits_BUY = 0;

doppio no_profits_SELL = 0;

doppio cur_profits_SELL = 0;

doppio cur_profits_BUY = 0;

//---

int bo = 0;

int so = 0;

InitStruct_Order(OrBuy);

InitStruct_Order(OrSell);

//ArrayResize(OrBuy,bo);

//ArrayResize(OrSell,so);

for(int trade= OrdersTotal()-1; trade>= 0; trade--)

{

if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==false)

pausa;

if(OrderSymbol()==Symbol() && OrderMagicNumber()==magico)

{

if(OrderType()==OP_SELL)

{

profit_SELL+=OrderProfit()+OrderSwap()+OrderCommission();

}

if(OrderType()==OP_BUY)

{

profit_BUY+=OrderProfit()+OrderSwap()+OrderCommission();

}

//===========================================================

if(OrderType()==OP_SELL)

{

cur_profits_SELL=OrderProfit()+OrderSwap()+OrderCommission();

se(cur_profits_SELL<0)

{

no_profits_SELL+=cur_profits_SELL;

OrSell[so].OrProf = OrderProfit()-OrderSwap()-OrderCommission();

OrSell[so].OrLot = OrderLots();

OrSell[so].OrTiK = OrderTicket();

so++;

Print(" SELL type: Profit - ",OrBuy[bo].OrProf,": Lot - ",OrBuy[bo].OrLot,": Ticket - ",OrBuy[bo].OrTiK);

}

}

//===========================================================

if(OrderType()==OP_BUY)

{

cur_profits_BUY=OrderProfit()+OrderSwap()+OrderCommission();

se(cur_profits_BUY<0)

{

no_profits_BUY+=cur_profits_BUY;

OrBuy[bo].OrProf = OrderProfit()-OrderSwap()-OrderCommission();

OrBuy[bo].OrLot = OrderLots();

OrBuy[bo].OrTiK = OrderTicket();

bo++;

Print(" BUY type: Profit - ",OrBuy[bo].OrProf,": Lot - ",OrBuy[bo].OrLot,": Ticket - ",OrBuy[bo].OrTiK);

}

}

}

}

}

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

//| Init Struct for orders |

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

void InitStruct_Order(StructOrder &Masiv[])

{

int Size = ArrayRange(Masiv,0);


for(int i=0; i<dimensione; i++)

{

Masiv[i].OrProf = 0;

Masiv[i].OrLot = 0;

Masiv[i].OrTiK = 0;

}

}

 

Ciao,

Potete per favore dirmi come costruire un progetto composto da un file mq4 e molti file mqh in uno solo, per un marketplace?

 

Amici, per favore aiutatemi a programmare un indicatore di inversione nel mio Expert Advisor attraverso iCustom, che consiste in una linea, ma con colori diversi per comprare e vendere. Non ha frecce. Per il colore sembra avere tre buffer, ma in realtà se tenuto con il mouse mostra solo un Value1 per entrambi i colori. Ho provato sia a confrontare le barre che a confrontare con lo zero, non serve a niente. Come programmare le inversioni di tali indicatori, chi lo sa? Ecco le impostazioni iniziali dei buffer degli indicatori e la sua immagine. Sembra StepMA, ma non lo è:

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 DodgerBlue
#property indicator_color2 Tomato
#property indicator_color3 Tomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
extern int    Range           = 9;
extern int    FastMA          = 3;
extern int    SlowMA          = 30;
extern int    filter          = 25;
extern int    normalizeDigits = 4;

extern bool   alertsOn        = false;
extern bool   alertsOnCurrent = false;
extern bool   alertsMessage   = true;
extern bool   alertsSound     = true;
extern bool   alertsEmail     = false;
extern string soundfile       = "alert2.wav";


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];

//------------------------------------------------------------------
//
//------------------------------------------------------------------

int init()
  {
   for (int i=0; i<indicator_buffers; i++) SetIndexStyle(i,DRAW_LINE);
   IndicatorBuffers(6);
   SetIndexBuffer(0, fAMA); 
   SetIndexBuffer(1, Downa); 
   SetIndexBuffer(2, Downb); 
   SetIndexBuffer(3, trend); 
   SetIndexBuffer(4, mAMA);
   SetIndexBuffer(5, AMA);
   return(0);
}
int deinit()
{
   return(0);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------


int start()
{
   int counted_bars = IndicatorCounted(); 
      if (counted_bars < 0) return(-1); 
      if (counted_bars > 0) counted_bars--;  
         int limit=MathMin(Bars-counted_bars,Bars-1);
         if (trend[limit] == -1) ClearPoint(limit,Downa,Downb);

 
   
   double k1 = 2.0 / (SlowMA + 1);
   double k2 = 2.0 / (FastMA + 1) - k1;
   for(int i = limit; i>= 0; i--)
   {
      double sdAMA = 0;
      double Noise = 0; for(int k=0; k<Range; k++) Noise += MathAbs(Close[i+k] - Close[i+k+1]);
      double ER    = 0; if(Noise != 0) ER = MathAbs(Close[i] - Close[i+Range]) / Noise;
      double SSC   = (ER*k2+k1);
 
     
      
      AMA[i]  = AMA[i+1] + NormalizeDouble(SSC*SSC*(Close[i] - AMA[i+1]), normalizeDigits);
      mAMA[i] = AMA[i];
 
         if(filter < 1) fAMA[i] = mAMA[i];
         else
         {
            for(k = i; k <= i + SlowMA - 1; k++)  sdAMA = sdAMA + MathAbs(mAMA[k] - mAMA[k+1]);
               double dAMA  = mAMA[i] - mAMA[i+1];
               if(dAMA >= 0)
                  if(dAMA < NormalizeDouble(filter*sdAMA/(100*SlowMA),4) &&  High[i] <= High[Highest(NULL, 0, MODE_HIGH, 4, i)]+10*Point)
                         fAMA[i] = fAMA[i+1];
                  else   fAMA[i] = mAMA[i];
               else
                  if(MathAbs(dAMA) < NormalizeDouble(filter*sdAMA/(100*SlowMA),4) && Low[i] > Low[Lowest(NULL, 0, MODE_LOW, 4, i)]-10*Point)
                        fAMA[i] = fAMA[i+1];
                  else  fAMA[i] = mAMA[i];
         }
       
      Downa[i] = EMPTY_VALUE;
      Downb[i] = EMPTY_VALUE;
      trend[i] = trend[i+1];
         if (fAMA[i]> fAMA[i+1]) trend[i] =1;
         if (fAMA[i]< fAMA[i+1]) trend[i] =-1;
         if (trend[i]==-1) PlotPoint(i,Downa,Downb,fAMA);
   }
    
   //
  
      
   if (alertsOn)
   {
      if (alertsOnCurrent)
           int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
      if (trend[whichBar] == 1)
            doAlert("buy");
      else  doAlert("sell");       
   }
   return(0);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//


void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
   
      if (previousAlert != doWhat || previousTime != Time[0]) {
          previousAlert  = doWhat;
          previousTime   = Time[0];

          //
          //
          

          message =  StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," AMA STL_Color ",doWhat);
             if (alertsMessage) Alert(message);
             if (alertsEmail)   SendMail(StringConcatenate(Symbol()," AMA STL_Color "),message);
             if (alertsSound)   PlaySound(soundfile);
      }
}
      
//------------------------------------------------------------------
//
//------------------------------------------------------------------


void ClearPoint(int i,double& first[],double& second[])
{
   if ((second[i]  != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE))
        second[i+1] = EMPTY_VALUE;
   else
      if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE))
          first[i+1] = EMPTY_VALUE;
}
void PlotPoint(int i,double& first[],double& second[],double& from[])
{
   if (first[i+1] == EMPTY_VALUE)
      if (first[i+2] == EMPTY_VALUE) 
            { first[i]  = from[i]; first[i+1]  = from[i+1]; second[i] = EMPTY_VALUE; }
      else  { second[i] = from[i]; second[i+1] = from[i+1]; first[i]  = EMPTY_VALUE; }
   else     { first[i]  = from[i]; second[i]   = EMPTY_VALUE; }
} 

 
zig2003:

Amici, per favore aiutatemi a programmare un indicatore di inversione nel mio Expert Advisor attraverso iCustom, che consiste in una linea, ma con colori diversi per comprare e vendere. Non ha frecce. Per il colore sembra avere tre buffer, ma in realtà se tenuto con il mouse mostra solo un Value1 per entrambi i colori. Ho provato sia a confrontare le barre che a confrontare con lo zero, non serve. Come programmare le inversioni di tali indicatori, chi lo sa? Ecco le impostazioni iniziali dei buffer degli indicatori e la sua immagine. Sembra StepMA ma non lo è:


Inserisci il codice, per favore, usando il pulsantePulsante "Inserisci codice MQL5

 
zig2003:

Amici, per favore aiutatemi a programmare un indicatore di inversione nel mio Expert Advisor attraverso iCustom, che consiste in una linea, ma con colori diversi per comprare e vendere. Non ha frecce. Per il colore sembra avere tre buffer, ma in realtà, se tenuto con il mouse, mostra solo un Value1 per entrambi i colori. Ho provato sia a confrontare le barre che a confrontare con lo zero, non serve a niente. Come programmare le inversioni di tali indicatori, chi lo sa? Ecco le impostazioni iniziali dei buffer degli indicatori e la sua immagine. Sembra StepMA ma non lo è:


Esempio

Esempio di DRAW_COLOR_LINE Lite

L'indicatore basato su DRAW_COLOR_LINE. Ci sono due buffer di indicatori - uno per i valori ('ColorLineBuffer') e un altro per i colori ( 'ColorLineColors').

//+------------------------------------------------------------------+ 
//|                                         DRAW_COLOR_LINE Lite.mq5 | 
//|                        Copyright 2016, MetaQuotes Software Corp. | 
//|                                             https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright 2011, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00" 

#property description "An indicator to demonstrate DRAW_COLOR_LINE" 
#property description "It draws a line on Close price in colored pieces of 20 bars each" 
#property description "The width, style and color of the line parts are changed randomly" 
#property description "every N ticks" 

#property indicator_chart_window 
#property indicator_buffers 2 
#property indicator_plots   1 
//--- plot ColorLine 
#property indicator_label1  "ColorLine" 
#property indicator_type1   DRAW_COLOR_LINE 
//--- Define 5 colors for coloring each bar (they are stored in the special array) 
#property indicator_color1  clrBlue,clrRed // (Up to 64 colors can be specified) 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  3 
//--- A buffer for plotting 
double         ColorLineBuffer[];
//--- A buffer for storing the line color on each bar 
double         ColorLineColors[];
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit()
  {
//--- Binding an array and an indicator buffer 
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorLineColors,INDICATOR_COLOR_INDEX);
//---
   ArraySetAsSeries(ColorLineBuffer,true);
   ArraySetAsSeries(ColorLineColors,true);
//--- 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+ 
//| 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[])
  {
   ArraySetAsSeries(close,true);
   if(prev_calculated==0)
     {
      for(int i=0;i<rates_total;i++)
         ColorLineBuffer[i]=close[i];
     }
//--- Block for calculating indicator values 
   for(int i=0;i<10;i++)
     {
      //--- Write the indicator value into the buffer 
      ColorLineBuffer[i]=close[i];
      //--- For this bar, the line will have the color with the index color_index 
      if(ColorLineBuffer[i]>ColorLineBuffer[i+1])
         ColorLineColors[i]=0;
      else
         ColorLineColors[i]=1;
     }

//--- Return the prev_calculated value for the next call of the function 
   return(rates_total);
  }
//+------------------------------------------------------------------+


E l'Expert Advisor, copia i valori dal buffer numero '0' ('ColorLineBuffer') e numero '1' ('ColorLineColors').

//+------------------------------------------------------------------+
//|                                 DRAW_COLOR_LINE Lite Example.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//---
int    handle_iCustom;                       // variable for storing the handle of the iCustom indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(Symbol(),Period(),"DRAW_COLOR_LINE Lite");
//--- if the handle is not created
   if(handle_iCustom==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double array_value[],array_color[];
   ArraySetAsSeries(array_value,true);
   ArraySetAsSeries(array_color,true);
   int start_pos=0,count=1;
   if(!iGetArray(handle_iCustom,0,start_pos,count,array_value) ||
      !iGetArray(handle_iCustom,1,start_pos,count,array_color))
     {
      return;
     }
//---
   string text="Value: "+DoubleToString(array_value[0],8)+", color: "+DoubleToString(array_color[0],8);
   Comment(text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • www.mql5.com
В своей статье  я сделал достаточно убедительные тесты, доказывающие тот факт, что далеко не каждый вызов пользовательского или даже технического индикатора в коде - это самый оптимальный вариант для обработки им промежуточных расчетов в разрабатываемом индикаторе. Итоговый результат по скорости своего исполнения может оказаться значительно...