Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 189

 
Wie unterscheidet sich Metatrader 5 von den vorherigen 4 ist schwieriger, mit oder nicht zu arbeiten. Jeder Broker bietet diese Programme an, warum gibt es nicht ein Programm für alle Broker, damit man nicht viele davon installieren muss.
Блог полезных и познавательных статей обо всем, на различную тематику категорий, все интересное, что бы Вам хотелось узнать и найти в материалах Интернет сети
Блог полезных и познавательных статей обо всем, на различную тематику категорий, все интересное, что бы Вам хотелось узнать и найти в материалах Интернет сети
  • es-blogy.ru
Если вами соблюдается диета при язве, то это поможет вам избежать частых обострений и свести их к минимуму; а чем меньше обострений, тем меньше количество медикаментозных препаратов вам нужно принимать. Инфекцию Н. pylori можно обнаружить двумя способами: провести анализ крови; анализ желудочного сока. Эндоскопическое или радиологическое...
 
koctik:
Wie unterscheidet sich Metatrader 5 von den vorherigen 4 ist schwieriger, mit oder nicht zu arbeiten. Jeder Makler bietet diese Programme an. Warum gibt es nicht ein Programm für alle Makler, damit man nicht viele davon installieren muss?
Laden Sie beide Terminals herunter, arbeiten Sie mit ihnen auf Demokonten und überzeugen Sie sich selbst.
 

Ich versuche, eine Funktion zu erstellen, die das Ergebnis der letzten geschlossenen Position (plus oder minus) zurückgibt . Diese Funktion ist für einen Multicurrency Expert Advisor gedacht und soll die letzte geschlossene Position aus allen Währungspaaren auswählen, und ich habe einige Probleme damit. Können Sie die Funktion korrigieren?

double last_profit()
{  
int dir = 0;
double prof = 0;
ulong d_ticket;

if (HistorySelect(0,TimeCurrent())) 
    {
       int j=HistoryDealsTotal()-1;
       if(j>0)
      {
         d_ticket = HistoryDealGetTicket(j);
         if (d_ticket>0)
         { 
         mydeal.Ticket(d_ticket);          
         prof = mydeal.Profit();
         }
       }
     }
if(prof < 0)dir = -1;
if(prof > 0)dir = 1;
if(prof == 0)dir =0;

return(dir);
} 

 
Automated-Trading:

OBJ_ALL_PERIODS=2097151

Danke, aber es hat nicht funktioniert. Das Problem ist, dass die D1- und ......-Periodenberechnungen auf allen Zeitrahmen angezeigt werden sollten, aber es kommt nicht so heraus, wie es ist. Was ist zu tun?
Dateien:
macd2.mq5  4 kb
 
Reshetov:

Was meinen Sie mit: nicht verwendete Methoden in Ihren Klassen? Dies ist in der OOP nicht der Fall. Ein normaler OOP-Programmierer erstellt im Gegensatz zur algorithmischen Programmierung Klassen mit allen notwendigen Feldern und Methoden, wie man so schön sagt, für alle Fälle, denn dieselbe Klasse kann später in anderen Anwendungen verwendet werden oder Teil einer Klassenbibliothek werden. Ganz zu schweigen von der Tatsache, dass es selbst innerhalb eines Projekts besser ist, vollständige Klassen zu erstellen und nicht nur abgespeckte, damit Sie nicht den Quellcode durchsuchen und später die erforderlichen Felder und Methoden hinzufügen müssen.

In der OOP kann sich jede Sparsamkeit, an die sich viele Menschen bei der algorithmischen Programmierung gewöhnen, später als nachteilig erweisen. Alles, was nicht verwendet wird, muss vom Compiler und nicht vom Programmierer aus dem Code ausgeschlossen werden.

Natürlich führt OOP im Vergleich zur algorithmischen Programmierung zu einem größeren Quellcode. Dies ist jedoch kein Nachteil, sondern ein Vorteil, da ein Großteil des "unnötigen" Codes in einem bestimmten Projekt in anderen Projekten wiederverwendet werden kann.

Es ist nicht nötig, ein Rätsel zu machen, d.h. alles in einer Klasse. Sie müssen Klassenbibliotheken erstellen, d. h. die Funktionalität in einzelne Klassen aufteilen und nicht vergessen, Kommentare zu diesem Lehen hinzuzufügen, dann ist alles in Ordnung. Als ich nach Pascal anfing, Java zu lernen, versuchte auch ich, alles in einem Stück zu machen, d.h. statt OOP zu verwenden, erstellte ich eine Klasse mit allem, was ich für eine bestimmte Aufgabe brauchte, genau wie in der algorithmischen Programmierung. Das Ergebnis war ein nicht universelles Durcheinander, das später nirgendwo mehr angewendet werden konnte, ganz zu schweigen davon, dass es schwierig war, einen solchen Code zu verstehen.

Ich verstehe das alles sehr gut. Aber können wir Ihnen wenigstens private Variablen zeigen, die nicht verwendet werden, wie es in VisualStudio gemacht wird?

Der Punkt ist, dass die Klassen während des Entwicklungsprozesses entworfen werden. Man kann einfach nicht alles vor der Schöpfung berücksichtigen. Aus diesem Grund werden Rahmenklassen mit möglichst wenig Funktionalität erstellt. Durch die Interaktion mit diesen Rahmenklassen wird die Gesamtarchitektur ausgearbeitet. Einige Methoden werden einfach gelöscht, andere werden in den privaten Bereich verschoben und wieder andere werden von einer Klasse in eine andere migriert. Dabei tauchen unweigerlich vergessene Variablen, Methoden und sogar ganze Klassen auf. Das ist normal, denn es ist so etwas wie das Okama-Prinzip in Aktion - zuerst schreiben wir schlechten, redundanten Code. Dann formalisieren wir die Aufgabe deutlicher und einige der Einheiten verschwinden einfach. Redundanz hat keinen Sinn. Und in diesem Prozess wäre die Hilfe des Compilers sehr nützlich - unbenutzte Variablen und zumindest private Methoden zu sehen, wäre sehr nützlich.

 

Hallo.

Ich verstehe, dass die FunktionOnCalculate(), die in den Indikatoren verwendet wird, von selbst generiert wird, d. h. ohne das Preisänderungsereignis ,

Welche Funktion kann im Indikator angewandt werden, die nur dann generiert wird, wenn ein Preisänderungsereignis eintritt? Dankeschön

 
Vikon:

Hallo.

Ich verstehe, dass die FunktionOnCalculate(), die in den Indikatoren verwendet wird, von selbst generiert wird, d. h. ohne das Preisänderungsereignis ,

Welche Funktion kann im Indikator angewandt werden, die nur dann generiert wird, wenn ein Preisänderungsereignis eintritt? Dankeschön

Das EreignisBerechnen wird für Indikatoren unmittelbar nach dem Ereignis Init und bei jeder Änderung der Preisdaten erzeugt. Sie wird von der FunktionOnCalculate behandelt. Wenn die Historie geändert wird (wenn die Historie geblättert wird), erzeugt dieses Ereignis auchOnCalculate.

OnCalculate ist die wichtigste Funktion für den Indikator, in der alle Berechnungen des Indikators im Falle von Preisdatenänderungen durchgeführt werden.

 
barabashkakvn:

Das EreignisBerechnen wird nur für Indikatoren unmittelbar nach dem Senden des Ereignisses Init und bei jeder Änderung der Preisdaten erzeugt. Dieses Ereignis wird von der FunktionOnCalculate behandelt. DasselbeOnCalculate wird erzeugt, wenn der Verlauf geändert wird (wenn der Verlauf blättert).

OnCalculate ist die wichtigste Funktion für den Indikator, in der alle Berechnungen des Indikators im Falle von Preisdatenänderungen durchgeführt werden.

Hier gibt es eine Schleife, d.h. es wird immer erzeugt, und wenn sich die Periode ändert, ändern sich auch die Messwerte. Worin besteht der Fehler?

#property copyright "Copyright 2014, MetaQuotes Software Corp.
#property link "http://www.mql5.com"
#Eigenschaft Version "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |

int EMA1=12;
int EMA2=26;
int SMA=9;

ENUM_TIMEFRAMES Zeitraum_macd;
datetime t_MACD[];
double MACD[];
bool high_low=false;
int shift_nachalo;
double w_MACD[]; d_MACD[];
int w_MACD_handle,d_MACD_handle;

int barDown=0;
int barUP=0;

//+------------------------------------------------------------------+ return(0);
int OnInit()
{
w_MACD_handle=iMACD(NULL,PERIOD_W1,EMA1,EMA2,SMA,PRICE_CLOSE);
d_MACD_handle=iMACD(NULL,PERIOD_D1,EMA1,EMA2,SMA,PRICE_CLOSE);
ArraySetAsSeries(MACD,true);
ArraySetAsSeries(t_MACD,true);
ArraySetAsSeries(w_MACD,true);
ArraySetAsSeries(d_MACD,true);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+ MACD_handle=iMACD(NULL,PERIOD_W1,EMA1,EMA1,SMA,PRICE_CLOSE);
//| Benutzerdefinierte Indikator-Iterationsfunktion |
//+------------------------------------------------------------------+
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 &Volumen[],
const int &spread[])
{

ObjectsDeleteAll(0,0,-1);
////////////////////////////////////////////////////////
period_macd=PERIOD_D1;
CopyBuffer(d_MACD_handle,0,0,1000,d_MACD);
ArrayCopy(MACD,d_MACD,0,0,WHOLE_ARRAY);
nachalo();
ObjectCreate(0, "lin_2",OBJ_VLINE,0,t_MACD[shift_nachalo],0);
ObjectSetInteger(0, "lin_2",OBJPROP_BACK,true);
ObjectSetInteger(0, "lin_2",OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
ObjectSetInteger(0, "lin_2",OBJPROP_COLOR,clrYellow);
ObjectSetInteger(0, "lin_2",OBJPROP_STYLE,1);
return(rates_total);
}
//+------------------------------------------------------------------+
//////////////////////////////////////////////////////////////////////////////
void nachalo() //Beginn einer neuen Welle
{
double low_nachalo[],high_nachalo[];
CopyTime(NULL,period_macd,0,1000,t_MACD);
wenn (MACD[1]>0)
{high_low=false;
while (MACD[barDown]>0)
{barDown++;}
barUP=barDown;
while (MACD[barUP]<0)
{barUP++;}
CopyLow(NULL,period_macd,0,barUP,low_nachalo);
ArraySetAsSeries(low_nachalo,true);
shift_nachalo=ArrayMinimum(low_nachalo,barDown-1,barUP-(barDown-1));
}
wenn (MACD[1]<0)
{high_low=true;
while (MACD[barUP]<0)
{barUP++;}
barDown=barUP;
while (MACD[barDown]>0)
{barDown++;}
CopyHigh(NULL,period_macd,0,barDown,high_nachalo);

ArraySetAsSeries(high_nachalo,true);

shift_nachalo=ArrayMaximum(high_nachalo,barUP-1,barDown-(barUP-1));
}}
Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
Dateien:
macd2.mq5  4 kb
 
Vikon:

Hier findet die Schleife statt, d. h. sie erzeugt ständig, und wenn sich die Periode ändert, ändern sich auch die Messwerte. Worin besteht der Fehler?


So fügen Sie den Code korrekt in das Forum ein.

 
Vikon:


Beachten Sie den Fehler:

Keine angebundenen Indikatorpuffer

Verwendung:

//---- превращение динамических массивов в индикаторные буферы
   SetIndexBuffer()
Lesen Sie auch den Artikel"Wie man einen Indikator in MQL5schreibt ".



Grund der Beschwerde: