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

 
Alexey Belyakov:

Etwa so? Oder muss ich in OnInit etwas anderes deklarieren?

Nein,alle Zeilen in OnInitsind standardmäßig ausgeblendet:

int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
 
Mihail Matkovskij:

Nein,alle Zeilen werden standardmäßig inOnInit ausgeblendet:

Die Bedingung wird aus irgendeinem Grund ignoriert. Auch wenn ich eine Position öffne.

Die PRL-Variable kann nicht entnommen und in eine Bedingung gesetzt werden.


if (c0<PRL)  
{
MqlTradeRequest request ={0};
MqlTradeResult  result= {0};
      request.action   =TRADE_ACTION_DEAL;                         // тип торговой операции
      request.symbol   =Symbol();                                 // символ
      request.volume   =1;                                       // объем в 1 лот
      request.type     =ORDER_TYPE_SELL;                         // тип ордера
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
      request.deviation=3;
      request.sl    = NormalizeDouble(Bid+50*_Point,_Digits);
      request.tp    = NormalizeDouble(Bid-50*_Point,_Digits);
      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки

Ich versuche, es irgendwie mit GlobalVariableGet herauszuholen. Aber irgendwie ist das zweifelhaft...

Selbst wenn ich sie in den Zustand versetze. Der Mindestpreis ist bereits festgelegt. Aber sie weigert sich immer noch hartnäckig, die Position zu öffnen.


//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine, lLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH=0;
  double   PRL=0;
  double   Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double  Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1 >= rt) && (c1 > o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
if ((rs2 >= rt) && (c1 < o1)) //условия для падающих свечей 
  {
PRL = iLow(NULL, PERIOD_CURRENT, 1);
lLine.Price(0, PRL);
 
  
  
  // double a=GlobalVariableGet("i",PRL); 
Comment(" =======",PRL,"\n");

if (c0<PRL)  
{
MqlTradeRequest request={0};
MqlTradeResult  result={0};
      request.action   =TRADE_ACTION_DEAL;                         // тип торговой операции
      request.symbol   =Symbol();                                 // символ
      request.volume   =1;                                       // объем в 1 лот
      request.type     =ORDER_TYPE_SELL;                         // тип ордера
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
      request.deviation=3;
      request.sl    = NormalizeDouble(Bid+50*_Point,_Digits);
      request.tp    = NormalizeDouble(Bid-50*_Point,_Digits);
      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки;
}
}
}
//+------------------------------------------------------------------+
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Alexey Belyakov:

Die Bedingung wird aus irgendeinem Grund ignoriert. Auch wenn ich eine Position öffne.

Die PRL-Variable kann nicht entnommen und in eine Bedingung gesetzt werden.


PRL, Sie haben Low bei Offset 1
PRL = iLow(NULL, PERIOD_CURRENT, 1);
PRH, dies ist High bei Offset 1
PRH = iHigh(NULL, PERIOD_CURRENT, 1);

Wir erhalten das folgende Bild:

void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH;
  double   PRL;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1 >= rt) && (c1 > o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
  if ((rs2 >= rt) && (c1 < o1)) //условия для падающих свечей 
  {
    PRL = iLow(NULL, PERIOD_CURRENT, 1);
    lLine.Price(0, PRL);  
  }
}

Anstelle vonPRL kann man also auch iLow(NULL, PERIOD_CURRENT, 1) oder l1nehmen.

Ich habe den Eindruck, dass Sie kein Interesse am Schreiben von Code haben und nicht verstehen, was Sie tun. Mit ein wenig Geduld können Sie das alles leicht herausfinden. Bereinigen Sie Ihren Code und viele Fragen werden von selbst verschwinden. Wenn Sie nicht herausfinden können, was schief gelaufen ist, gibt es noch die Fehlersuche, ein sehr mächtiges Werkzeug eines Programmierers. Gehen Sie dem, was Sie tun, auf den Grund und stellen Sie dann Fragen.

 
Alexey Belyakov:

Die Bedingung wird aus irgendeinem Grund ignoriert. Auch wenn ich eine Position öffne.

Die variable PRL kann nicht herausgenommen und in einen Zustand versetzt werden.


Ich versuche, es irgendwie mit GlobalVariableGet herauszuholen. Aber irgendwie ist das zweifelhaft...

Selbst wenn ich sie in den Zustand versetze. Der Mindestpreis ist bereits festgelegt. Ich möchte immer noch keine Position eröffnen.


Warum muss ich also erst eine Nachricht schreiben und sie dann bearbeiten?

 
Alexey Belyakov:

Die Bedingung wird aus irgendeinem Grund ignoriert. Auch wenn ich eine Position öffne.

Die variable PRL kann nicht herausgenommen und in einen Zustand versetzt werden.


Ich versuche, es irgendwie mit GlobalVariableGet herauszuholen. Aber irgendwie ist das zweifelhaft...

Selbst wenn ich sie in den Zustand versetze. Der Mindestpreis ist bereits festgelegt. Ich möchte immer noch keine Position eröffnen.


Der Algorithmus in Ihrem Code war ursprünglich falsch, ebenso wie der Markteintrittsalgorithmus. Ich habe sie korrigiert.

//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine, lLine;

double   PRH = 0;
double   PRL = 0;

double entryPRL = 0;
double entryPRH = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  
  double   Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
  double  Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
  
  rt = MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1 = MathAbs(h1 - c1) / Point(); // размер верхней тени свечи
  rs2 = MathAbs(l1 - c1) / Point(); // размер нижней тени свечи
  
  if ((rs1 >= rt) && (c1 > o1)) { //условия для растущих свечей
    PRH = h1; // то это будет максимум
    hLine.Price(0, PRH);
  }
  
  if ((rs2 >= rt) && (c1 < o1)) { //условия для падающих свечей
    PRL = l1;
    lLine.Price(0, PRL);
    // double a=GlobalVariableGet("i",PRL);
    Comment(" =======", PRL, "\n");
  }
  
  if (PRL > 0 && c0 < PRL && PRL != entryPRL) {
     MqlTradeRequest request={0};
     MqlTradeResult  result={0};

     request.action   =TRADE_ACTION_DEAL;                     
     request.symbol   =Symbol();                          
     request.volume   =0.1;                                   
     request.type     =ORDER_TYPE_SELL;                       
     request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID); 
     request.deviation= 5;                                    
     request.magic    = 0;                         

     if(OrderSend(request,result))
       entryPRL = PRL;
     else
       PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки

  }
}
//+------------------------------------------------------------------+

Aber dieser Code wird eine Menge Überarbeitungen benötigen, um ihn im realen Handel verwenden zu können...

 
Mihail Matkovskij:

In Ihrem Code war der Algorithmus selbst ursprünglich falsch, ebenso wie der Algorithmus für den Markteintritt. Ich habe es korrigiert.

Aber um diesen Code im realen Handel zu verwenden, werden Sie viele Überarbeitungen benötigen...

Sehr cool! Ich danke Ihnen! Wenn Sie hier zur gleichen Zeit suchen, ist das Problem der Mehrfacheingabe gelöst. Es funktioniert jetzt so, wie es sollte.
 

Wie kann im Prüfprogramm während einer Änderung eine 4108 (ungültiges Ticket) auftreten? MQL4

if(OrdersTotal() > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
     {
      if(OrderType() == OP_BUY && SymbolInfoDouble(_Symbol,SYMBOL_BID) >= value_tp1 && !_tps) _tps = OrderClose(ticket,c_lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),(int)slippage,clrNONE);
      if(OrderType() == OP_SELL && SymbolInfoDouble(_Symbol,SYMBOL_ASK) <= value_tp1 && !_tps) _tps = OrderClose(ticket,c_lot,SymbolInfoDouble(_Symbol,SYMBOL_ASK),(int)slippage,clrNONE);
      if(_tps && !sl_mod) sl_mod = OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,clrNONE);
     };


 
Alexandr Sokolov:

Wie kann im Prüfprogramm während einer Änderung eine 4108 (ungültiges Ticket) auftreten? MQL4


höchstwahrscheinlich versuchen Sie, einen Auftrag zu schließen, der sich bereits in der Historie befindet, d.h. ein bereits geschlossener Auftrag

in der Hilfedatei SELECT_BY_TICKET nachsehen, geschieht dies unabhängig davon, ob die Bestellung bereits geöffnet ist oder sich in der Bestellhistorie befindet

SZZY: Prüfung auf OrderCloseTime()

 
Igor Makanu:

Sie versuchen höchstwahrscheinlich, einen Auftrag zu schließen, der sich bereits in der Historie befindet, d.h. ein bereits geschlossener Auftrag

Schauen Sie sich die Hilfedatei SELECT_BY_TICKET an, die dies unabhängig davon tut, ob die Bestellung bereits geöffnet ist oder sich in der Bestellhistorie befindet.

SZY: Prüfung OrderCloseTime()

Ich glaube, es heißt, dass man auswählen soll, welche auf dem Markt ist.

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
OrderSelect - Trade Functions - MQL4 Reference
OrderSelect - Trade Functions - MQL4 Reference
  • docs.mql4.com
To find out from what list the order has been selected, its close time must be analyzed. If the order close time equals to 0, the order is open or pending and taken from the terminal open orders list. One can distinguish an opened order from a pending order by the order type. If the order close time does not equal to 0, the order is a closed...
 
Vitaly Muzichenko:

Ich denke, das sagt aus, wer auf dem Markt ist.

Ich hätte nicht gedacht, dass ich dich bei der Dokumentation zitieren muss...

Hinweis

Der Parameter pool wird ignoriert, wenn der Auftrag über die Ticketnummer ausgewählt wird. Die Ticketnummer ist die eindeutige Kennung für die Bestellung.

Um herauszufinden, aus welcher Liste ein Auftrag ausgewählt wurde, muss man seine Schlusszeit analysieren. Wenn der Zeitpunkt des Orderschlusses 0 ist, dann ist die Order offen oder schwebend und wird aus der Liste der offenen Orders des Terminals übernommen.