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

 
datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
int af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);                                // Шаг 1: OrderSelect Выбираем ордер (SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == "EURUSD") && (OrderMagicNumber() == MagicNumber))return(0); // Шаг 2: Если символ EURUSD отсутствует,И если ордер присутствует , и ни один из ордеров НЕ содержит магикномер, то выходим из цикла.( выходим -значит откр. позицию) 
                                                                                    (если какое-либо условие из двух указанных не совпадает, то выходим) 
}
          

             
if ((Close[0]>High[1]))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}

if ((Close[0]<Low[1]))  
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}

return(0);
}

Meines Erachtens handelt es sich dabei um eine regelmäßige Überprüfung der Verfügbarkeit. (Gibt es EURUSD? und gibt es eine Order mit dem angegebenen Magic?) Wenn eine der Bedingungen fehlt, eröffnen wir eine Position. Nur wenn beide Bedingungen erfüllt sind, eröffnen wir eine Position.

In Schritt 2 werden wir dann gefragt. Angenommen, wir haben einen Auftrag manuell eröffnet. Dann ist die erste Bedingung erfüllt (wir haben dasselbe Symbol) und die zweite Bedingung wird nicht erfüllt, da dieser Auftrag keine Magie enthält. Und wenn eine der Bedingungen nicht zutrifft, sollte der Code den Auftrag öffnen. Genau das tut der Code. Aber beim nächsten Ticken öffnet er die dritte, vierte und fünfte Bestellung.....

Warum wird eine dritte Bestellung eröffnet?

Es gibt jedoch zwei Aufträge, die beide Bedingungen insgesamt erfüllen. Es sollte eine Prüfung erfolgen (Wechsel zu return(0)), nicht eine Öffnung. und nicht die Eröffnung.

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Gute Nacht allerseits! Können Sie mir sagen, ob Sie einen Code in mql5 schreiben können, der eine Linie auf dem Diagramm zeichnet (Bild im Anhang) und alle Koordinaten dieser Linie in der Datei aufzeichnet? Wenn Sie diese Linie als Basis für die Zukunft verwenden wollen, dann müssen Sie sie als Basis für den Handelsroboter verwenden. direkt
 
GlushkoV_V_V:
Gute Nacht zusammen! Können Sie mir sagen, ob Sie einen Code in mql5 schreiben können, der eine Linie auf dem Diagramm zeichnet (Bild im Anhang) und alle Koordinaten dieser Linie in der Datei aufzeichnet? Wenn Sie eine Linie zeichnen und sie mit den Koordinaten füllen wollen, müssen Sie die Linie einfach nachzeichnen.

Alles steht in der Dokumentation.

Документация по MQL5: Графические объекты / ObjectCreate
Документация по MQL5: Графические объекты / ObjectCreate
  • www.mql5.com
[in]  Номер подокна графика. 0 означает главное окно графика. Указанное подокно должно существовать, в противном случае функция возвращает false. Возвращает true при успешной постановке команды в очередь указанного графика, иначе false. Если объект был уже создан ранее, то производится попытка изменить его координаты. При вызове ObjectCreate...
 
Сергей Таболин:

Alles steht in der Dokumentation.

Danke für den Tipp, vielleicht können Sie mir helfen, so etwas zu bauen, natürlich kostenlos.

 
GlushkoV_V_V:

Danke für den Tipp, aber vielleicht können Sie mir helfen, so ein Ding zu bauen, natürlich nicht umsonst.

Nicht umsonst - das ist für Sie)))

Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • www.mql5.com
Убрать из советника второй индикатор заменить другим,изменить условие открытие ордера .Условие сделки покупка: НМА линия вверх второй индикатор столбик гистограмы выше нуля (второй индикатор пересечение нуля точка входа) по закрытой свече если нма и второй индикатор не изменили показания совершается покупка для продаже наоборот.Изменить...
 
Vielen Dank, aber für mich ist es wie auf Chinesisch und ich weiß nicht, wie ich es in den Code implementieren kann.
 
Alexey Belyakov:

Meines Erachtens handelt es sich dabei um eine regelmäßige Überprüfung der Verfügbarkeit. (Gibt es EURUSD? und gibt es eine Order mit dem angegebenen Magic?) Wenn eine der Bedingungen fehlt, eröffnen wir eine Position. Nur wenn diese beiden Bedingungen erfüllt sind, eröffnen wir eine Position.

In Schritt 2 werden wir dann gefragt. Angenommen, wir haben einen Auftrag manuell eröffnet. Dann ist die erste Bedingung erfüllt (wir haben dasselbe Symbol) und die zweite Bedingung wird nicht erfüllt, da dieser Auftrag keine Magie enthält. Und wenn eine der Bedingungen nicht zutrifft, sollte der Code den Auftrag öffnen. Genau das tut der Code. Aber beim nächsten Ticken öffnet er die dritte, vierte und fünfte Bestellung.....

Warum wird eine dritte Bestellung eröffnet?

Es gibt jedoch zwei Aufträge, die beide Bedingungen insgesamt erfüllen. Es sollte eine Prüfung erfolgen (Wechsel zu return(0)), nicht eine Öffnung. aber nicht die Eröffnung.

== - wenn es gleich ist != - wenn es nicht gleich ist. Kontinuität - Ende einer Schleifeniteration und Beginn einer neuen Schleifeniteration. Breaking - Beendigung des Zyklus und Übergang zum nächsten Operator nach dem Zyklus, Return - Beendigung der Funktion, in Ihrem Fall Onstart und Warten auf einen neuen Tick. Und wenn ein Auftrag mit Ihrer Magie offen ist, sollte er die Funktion beenden und auf einen neuen Tick warten.

Frage: Wenn Sie einen Auftrag im aktuellen Fenster öffnen wollen, warum müssen Sie das Werkzeug explizit angeben, oder wollen Sie Aufträge aus dem Fenster eines anderen Werkzeugs öffnen? Es ist auch nicht klar, wie viele Aufträge Sie eröffnen wollen. Laut Ihrem Code kann nur eine Bestellung geöffnet werden, und erst wenn diese geschlossen ist, wird die zweite eröffnet. Sie haben einen Magier und ein Werkzeug zum Öffnen von Fenstern. Außerdem werden die Ordereröffnungsbedingungen für das aktuelle Instrument und nicht für die Eurobucks geprüft.

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
bool af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);     // OrderSelect возвращает тип bool                           
                                               // Шаг 1: OrderSelect Выбираем ордер 
                                   //(SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return(0); // Шаг 2: Если символ Выбранного ордера 
                                        //равен EURUSD (заменено на текущий инструмент открытого окна) ,
                                       // И если магик Выбранного ордера равен магик то выходим из функции Онстарт.
// Если же наш ордер не будет выбран из ордеров терминала, то цикл закончится и начнется выставление ордеров. 
                                                                                   
}
          

             
if ((Close[0]>High[1])) // клоз и хай здесь для текущего окна и инструмента. 
{
send=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber); // так же здесь цены аск и бид тоже для текущего инструмента
}

if ((Close[0]<Low[1]))  
{
send=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber); // и поинт кстати тоже.
}

return(0);
}
 
Valeriy Yastremskiy:

== - wenn gleich != - wenn nicht gleich. Kontinue - bricht die Schleifeniteration ab und beginnt eine neue Schleifeniteration. Break - beendet die Schleife und geht zum nächsten Operator, der der Schleife folgt, return - beendet die Funktion, in Ihrem Fall OnStart und wartet auf einen neuen Tick. Und wenn ein Auftrag mit Ihrer Magie offen ist, sollte er die Funktion beenden und auf einen neuen Tick warten.

Frage: Wenn Sie einen Auftrag im aktuellen Fenster öffnen wollen, warum müssen Sie das Werkzeug explizit angeben, oder wollen Sie Aufträge aus dem Fenster eines anderen Werkzeugs öffnen? Es ist auch nicht klar, wie viele Aufträge Sie eröffnen wollen. Laut Ihrem Code kann nur eine Bestellung geöffnet werden, und erst wenn diese geschlossen ist, wird die zweite eröffnet. Sie haben einen Magier und ein Werkzeug zum Öffnen von Fenstern. Außerdem werden die Ordereröffnungsbedingungen für das aktuelle Instrument und nicht für die Eurobucks geprüft.

- Ja, ich möchte im aktuellen Fenster öffnen;

- Eine Bestellung. Der nächste Auftrag wird erst eröffnet, wenn der vorherige Auftrag abgeschlossen ist.

"Außerdem werden die Ordereröffnungsbedingungen für das aktuelle Instrument und nicht für die Eurobucks geprüft" - also ?

((OrderSymbol() == "EURUSD" )  ???
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
Alexey Belyakov:

- Ja, ich möchte im aktuellen Fenster öffnen;

- Eine Bestellung. Der nächste Auftrag wird erst eröffnet, wenn der vorherige Auftrag abgeschlossen ist.

"Auch die Ordereröffnungsbedingungen werden für das aktuelle Instrument und nicht für die Eurobucks geprüft " - also ?

Und was dann, zum Beispiel, haben Sie ein Fenster offen nicht Eurobucks, aber die Eurofunt, vergleichen Sie die ausgewählte Reihenfolge Symbol mit Eurobucks, wenn es wahr ist, dann gibt es einen Auftrag auf Eurobucks und wenn unsere Magie, dann returnee aus der OnStart-Funktion, und wenn nicht, dann setzen wir einen Auftrag auf Eurobucks, aber Kloz, High, Ask, Bid wird ein Fehler bei der Eröffnung von Aufträgen, weil Bid und Ask für diese instuents sind unterschiedlich. Und Symbol() wird das Symbol des aktuellen Fensters zurückgeben und es wird kein Fehler auftreten.

Sie können eine Vorlage aus dem Meta-Editor verwenden. Oben links gibt es eine Schaltfläche Neu. Die Funktion OnStart wird immer noch verwendet, aber das ist nicht richtig, und OnStart ist für Skripte. Die richtige Vorlage.

//+------------------------------------------------------------------+
//|                                                    forumtest.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                                  https://qstr.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://qstr.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Korrekter Code. Ihr Bestellkommentar fehlt, und der Magier ist in Ihrem Code nicht berücksichtigt. In den Warnungen zur Eröffnungszeile beachten Sie Implizite Typkonvertierung einer Zahl in einen String!!!

//+------------------------------------------------------------------+
//|                                                    forumtest.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                                  https://qstr.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://qstr.ru"
#property version   "1.00"
#property strict

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
bool af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);     // OrderSelect возвращает тип bool                           
                                               // Шаг 1: OrderSelect Выбираем ордер 
                                   //(SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return; // Шаг 2: Если символ Выбранного ордера 
                                        //равен EURUSD (заменено на текущий инструмент открытого окна) ,
                                       // И если магик Выбранного ордера равен магик то выходим из функции Онстарт.
// Если же наш ордер не будет выбран из ордеров терминала, то цикл закончится и начнется выставление ордеров. 
                                                                                   
}
          

             
if ((Close[0]>High[1])) // клоз и хай здесь для текущего окна и инструмента. 
{
send=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"My order",MagicNumber,0,clrGreen); // так же здесь цены аск и бид тоже для текущего инструмента

}

if ((Close[0]<Low[1]))  
{
send=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,"My order",MagicNumber,0,clrGreen); // и поинт кстати тоже.
}

return;
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy:

Ihr Beispiel enthält viele Fehler

for(int i = OrdersTotal(); i >=0; i--)  

sollte es geben:

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

hier sind die Preise nicht normalisiert OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"Mein Auftrag",MagicNumber,0,clrGreen);

Hier verstehe ich die Logik nicht, warum der Ausstieg aus OnTick() notwendig ist, wenn die Bedingung falsch ist.

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return;

vielleicht sollten wir mit der Schleife fortfahrenund einfach berechnen, wie viele Aufträge es gibt

Ihr Beispiel ist von der Logik her sehr einfach und es wäre schwierig, es für andere Aufgaben zu ändern... vielleicht würde er gerne einen Nachsatz hinzufügen