Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1034

 
Alexandr Sokolov:

Ich danke Ihnen! Und wenn es sich um kommerzielle Zwecke handelt?

Für Markt im Sinne von ?

dann müssen Sie Ihre eigene GUI-Bibliothek in Ihrem eigenen Image erstellen :-(

MQL ist nicht für eine komplexe grafische Benutzeroberfläche gedacht. Sie ist zum Zählen und Handeln bestimmt.

Das heißt, es ist möglich, aber es ist unerträglich dumm.

 

Beschlossen, die CCanvas-Bibliothek zu studieren


Ich kann es nicht herausfinden - keine Fehler (oder besser gesagt, der Compiler gibt keine aus), und auf dem Bildschirm ist auch nichts zu sehen. Ich möchte ein rotes Dreieck zeichnen ...

#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);
  }


Und hier ist das Ergebnis


 
Alexandr Sokolov:

Beschlossen, die CCanvas-Bibliothek zu erkunden

#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:

Danke für das vorgefertigte Beispiel

Wenn es Ihnen nichts ausmacht, könnte ich ein paar Worte über meine Fehler verlieren? Es ist nur so, dass ich mir die Hilfe auf der Website angesehen habe, und die Dokumentation enthält nur eine Beschreibung der Funktionen selbst, und die Beispiele darunter, welche Funktion nach welcher kommt, sind nicht vorhanden

 
Alexandr Sokolov:

Danke für das vorgefertigte Beispiel

Wenn es Ihnen nichts ausmacht, könnte ich ein paar Worte über meine Fehler verlieren? Ich habe mir gerade die Hilfe auf der Website angesehen, und die Dokumentation enthält nur eine Beschreibung der Funktionen selbst, und es gibt keine Beispiele dafür, welche Funktion auf welche folgt

Lesen Sie die Artikel, es gibt viele fertige Beispielehttps://www.mql5.com/ru/search#!keyword=Canvas&module=mql5_module_articles

 

Guten Tag!!!

Ich möchte versuchen, eine Funktion zu schreiben, die verlorene Aufträge nach Gewinn, Lot und Ticket speichert.
Ich habe noch nie mit Arrays gearbeitet, ich habe es anhand von Beispielen und Referenzen getan.

Ich weiß nicht, wo und wie ich die Array-Größe angeben kann.

Bitte überprüfen und korrigieren Sie diese, wenn möglich.

======

struct StructOrder

{

doppelt OrProf;

Doppelter OrLot;

int OrTiK;

};

StructOrder OrBuy[];

StructOrder OrSell[];

====

void Cloce_No_FreeMargin()

{

double profit_SELL = 0;

double profit_BUY = 0;

double no_profits_BUY = 0;

double no_profits_SELL = 0;

double cur_profits_SELL = 0;

double 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(Handel,SELECT_BY_POS,MODE_TRADES)==false)

Pause;

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

{

if(OrderType()==OP_SELL)

{

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

}

if(Auftragsart()==OP_BUY)

{

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

}

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

if(OrderType()==OP_SELL)

{

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

if(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(Auftragsart()==OP_BUY)

{

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

if(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-Struktur für Aufträge |

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

void InitStruct_Order(StructOrder &Masiv[])

{

int Size = ArrayRange(Masiv,0);


for(int i=0; i<Größe; i++)

{

Masiv[i].OrProf = 0;

Masiv[i].OrLot = 0;

Masiv[i].OrTiK = 0;

}

}

 

Hallo,

Könnten Sie mir bitte sagen, wie ich ein Projekt, das aus einer mq4-Datei und einer Vielzahl von mqh-Dateien besteht, für einen Marktplatz zusammenstellen kann?

 

Freunde, bitte helft mir, einen Umkehrindikator in meinem Expert Advisor über iCustom zu programmieren, der aus einer Linie besteht, aber mit unterschiedlichen Farben für Kauf und Verkauf. Es hat keine Pfeile. Für Farbe scheint es drei Puffer zu haben, aber tatsächlich zeigt es nur einen Value1 für beide Farben an, wenn es mit der Maus gehalten wird. Ich habe versucht, sowohl Balken zu vergleichen als auch mit Null zu vergleichen, aber es hilft nicht. Wie man Umkehrungen solcher Indikatoren programmiert, wer weiß? Hier sind die Anfangseinstellungen der Indikatorpuffer und ihr Bild. Es sieht aus wie StepMA, ist es aber nicht:

#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:

Freunde, bitte helft mir, einen Umkehrindikator in meinem Expert Advisor über iCustom zu programmieren, der aus einer Linie besteht, aber mit unterschiedlichen Farben für Kauf und Verkauf. Es hat keine Pfeile. Für Farbe scheint es drei Puffer zu haben, aber tatsächlich zeigt es nur einen Value1 für beide Farben an, wenn es mit der Maus gehalten wird. Ich habe versucht, sowohl Balken zu vergleichen als auch mit Null zu vergleichen, aber es hilft nicht. Wie man Umkehrungen solcher Indikatoren programmiert, wer weiß? Hier sind die Anfangseinstellungen der Indikatorpuffer und ihr Bild. Es sieht aus wie StepMA, ist es aber nicht:


Bittefügen Sie den Code über die SchaltflächeSchaltfläche "MQL5-Code einfügen

 
zig2003:

Freunde, bitte helft mir, einen Umkehrindikator in meinem Expert Advisor über iCustom zu programmieren, der aus einer Linie besteht, aber mit unterschiedlichen Farben für Kauf und Verkauf. Es hat keine Pfeile. Für Farbe scheint es drei Puffer zu haben, aber tatsächlich zeigt es nur einen Value1 für beide Farben an, wenn es mit der Maus gehalten wird. Ich habe versucht, sowohl Balken zu vergleichen als auch mit Null zu vergleichen, aber es hilft nicht. Wie man Umkehrungen solcher Indikatoren programmiert, wer weiß? Hier sind die Anfangseinstellungen der Indikatorpuffer und ihr Bild. Es sieht aus wie StepMA, ist es aber nicht:


Beispiel

DRAW_COLOR_LINE Lite Beispiel

Der Indikator basiert auf DRAW_COLOR_LINE. Es gibt zwei Indikatorpuffer - einen für Werte ('ColorLineBuffer') und einen für Farben ( '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);
  }
//+------------------------------------------------------------------+


Und der Expert Advisor kopiert Werte aus dem Puffer Nummer '0' ('ColorLineBuffer') und Nummer '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
В своей статье  я сделал достаточно убедительные тесты, доказывающие тот факт, что далеко не каждый вызов пользовательского или даже технического индикатора в коде - это самый оптимальный вариант для обработки им промежуточных расчетов в разрабатываемом индикаторе. Итоговый результат по скорости своего исполнения может оказаться значительно...