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

 
Rustam Bikbulatov:

Diese Funktion schreibt eine Nummer auf jede Bestellung, bzw. Los*100.

Jetzt brauchen wir eine Umkehrfunktion, die anzeigt, was die letzte Zahl war

Versuchen Sie es:

double value = StringToDouble(ObjectGetString(0,object_name,OBJPROP_TEXT)); 

Wenn das Objekt Text (nicht numerisch) enthält, müssen Sie StringSubstr() hinzufügen:

double value = StringToDouble( StringSubstr(ObjectGetString(0,object_name,OBJPROP_TEXT),begin_index,length));

begin_index - Index des Zeichens in der Zeichenkette, beginnend bei Null, length - Länge des numerischen Wertes (wie viele Zeichen die Zahl einnimmt)... Ich denke schon.

 
Yevhenii Levchenko:

Versuchen Sie dies:

Wenn das Objekt Text (nicht numerisch) enthält, fügen Sie StringSubstr() hinzu:

begin_index - Index des Zeichens in der Zeichenkette, beginnend bei Null, length - Länge des numerischen Wertes (wie viele Zeichen die Zahl einnimmt)... Ich denke schon.

Nun, zunächst müssten Sie alle diese Zahlen in der Grafik suchen. So funktioniert es einfach nicht. Das ist das Problem, ich habe es bereits überprüft.

 
Yevhenii Levchenko:

Versuchen Sie dies:

Wenn das Objekt Text (nicht numerisch) enthält, fügen Sie StringSubstr() hinzu:

begin_index - Index des Zeichens in der Zeichenkette, beginnend bei Null, length - Länge des numerischen Wertes (wie viele Zeichen die Zahl einnimmt)... Ich denke schon.

   bool name;
        for(int i=0; i<ObjectsTotal(0,"LOTB"+OrderTicket(),OBJ_TEXT); i++)
     {
      name = ObjectSetString(0,"LOTB"+OrderTicket(),OBJ_TEXT,0);
      Comment("   ",name); 
   }

Ähnlich wie dieses, aber es funktioniert nicht. Es zeigt Null an.

 
Rustam Bikbulatov:

Wie dieses, aber es funktioniert nicht, es zeigt Null an.

Möchten Sie einen Wert festlegen oder einen Wert übernehmen? Die Funktion ObjectSetString() setzt einen Textwert und gibt einen boolschen Wert zurück. Das ist nicht der Fall. Und in der Schleife Kopf Ich denke, es ist nicht die richtige... Wo ObjectsTotal()... Ich bin von mt4 Referenz geführt. Oder ist es ein mt5-Code?

 
Yevhenii Levchenko:

Müssen Sie einen Wert festlegen oder einen Wert übernehmen? Die Funktion ObjectSetString() setzt einen Textwert und gibt einen boolschen Wert zurück. Das ist nicht der Fall. Und im Schleifenkopf ist es, glaube ich, nicht richtig eingerahmt, wo ObjectsTotal() ist. Ich bin von mt4 Referenz geführt. Oder ist es ein mt5-Code?

Dies ist MT4.

 

Nochmals einen schönen Tag an alle!

Ich bin immer noch nicht zufrieden mit der Frage, die ich oben gestellt habe, aber ich bitte um Hilfe mit dem Code.

Dies ist das Forum für Handel, automatisierte Handelssysteme und Strategietests.

Fragen von Neulingen zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes

MrBrooklin, 2019.08.30 14:15

Guten Tag allerseits!!!

Hier ist ein Teil des Skriptcodes für Metatrader5:

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---- показывать входные параметры
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Enum Stop or Limit                                               |
//+------------------------------------------------------------------+
enum ENUM_STOP_OR_LIMIT
  {
   stop=0,     // Buy stop and Sell stop
   limit=1     // Buy limit and Sell limit
  };
//--- input parameters
input ushort               InpUpGap          = 15;    // Gap for pending orders UP from the current price (in points)
input ushort               InpUpStep         = 30;    // Step between orders UP (in points)

input ushort               InpDownGap        = 15;    // Gap for pending orders DOWN from the current price (in points)
input ushort               InpDownStep       = 30;    // Step between orders DOWN (in points)

input ENUM_STOP_OR_LIMIT   InpPending        = stop;  // Type of pending orders

input uchar                InpUpQuantity     = 1;     // UP quantity orders
input uchar                InpDownQuantity   = 1;     // DOWN quantity orders

input double               InpLots           = 0.01;  // Lots
input ushort               InpStopLoss       = 50;    // Stop Loss (in points)
input ushort               InpTakeProfit     = 50;    // Take Profit (in points)
//---
ulong                      m_slippage=30;             // slippage

double                     ExtUpGap=0.0;
double                     ExtUpStep=0.0;

double                     ExtDownGap=0.0;
double                     ExtDownStep=0.0;

double                     ExtStopLoss=0.0;
double                     ExtTakeProfit=0.0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(InpLots<=0.0)
     {
      Print("The \"Lots\" can't be smaller or equal to zero");
      return;
     }
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      return;
   if(!RefreshRates())
      return;

   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      Print(err_text);
      return;
     }

//---
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else
      if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
         m_trade.SetTypeFilling(ORDER_FILLING_IOC);
      else
         m_trade.SetTypeFilling(ORDER_FILLING_RETURN);

//---
   m_trade.SetDeviationInPoints(m_slippage);
   m_trade.SetAsyncMode(true);

//---
   ExtUpGap = m_symbol.Point() * InpUpGap;
   ExtUpStep = m_symbol.Point() * InpUpStep;

   ExtDownGap = m_symbol.Point() * InpDownGap;
   ExtDownStep = m_symbol.Point() * InpDownStep;

   ExtStopLoss = m_symbol.Point() * InpStopLoss;
   ExtTakeProfit = m_symbol.Point() * InpTakeProfit;

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

//--- set pending orders
   for(int i=0; i<InpUpQuantity; i++)
     {
      double price_ask = start_price_ask+i*ExtUpStep;
      double price_bid = start_price_bid+i*ExtUpStep;
      if(InpPending==stop)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyStop(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellLimit(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }

   for(int i=0; i<InpDownQuantity; i++)
     {
      double price_ask = start_price_ask-i*ExtDownStep;
      double price_bid = start_price_bid-i*ExtDownStep;
      if(InpPending==limit)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }
  }

Das Skript sollte entweder schwebende Limit-Aufträge in einem bestimmten Abstand zum Geld- und Briefkurs oder Stop-Aufträge platzieren. Die schwebenden Limit-Aufträge werden ohne Probleme gesetzt, die Stop-Aufträge jedoch nicht. Bitte helfen Sie mir zu verstehen, warum schwebende Buy Stop- und Sell Stop-Aufträge nicht gesetzt werden.

Mit freundlichen Grüßen, Vladimir.

Nur um eine weitere Frage anzuschließen: Gibt es eine Möglichkeit, das Skript zu testen, wenn der Markt geschlossen ist (z. B. an Wochenenden)?

Mit freundlichen Grüßen, Vladimir.

 
Artyom Trishkin:

Von welcher Liste?

Und benutzen Sie bitte den Styler im Editor (Strg+<):

Was soll woher genommen werden?

Können Sie mir einen Tipp geben?

 
MrBrooklin:

Nochmals einen schönen Tag an alle!

Niemand hat auf die Frage geantwortet, die ich vorhin gestellt habe, aber ich bitte immer noch um Hilfe mit dem Code.

Eine weitere Frage: Gibt es eine Möglichkeit, das Skript zu testen, wenn der Markt geschlossen ist (z. B. am Wochenende)?

Mit freundlichen Grüßen, Vladimir.

Nein, das Skript funktioniert nicht in einem geschlossenen Markt - es wird keine Aufträge erteilen.

Um die Fehler zu verstehen, drucken Sie in das Protokoll den Wert des Preises, gegen den Sie die Einstellungsebenen berechnen, und die Werte aller Preisniveaus, die Sie an den Handelsauftrag senden.

 
Hallo Leute. Das Schreiben eines Loses neben einer offenen Bestellung.
for(int no1=0; no1<OrdersTotal(); no1++)
  {
   if(OrderSelect(no1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderType()== OP_BUY)
        {
         ObjectCreate("LOTB"+OrderTicket(),OBJ_TEXT,0,TimeCurrent(),OrderOpenPrice());
         ObjectSetText("LOTB"+OrderTicket(),OrderLots()*100,20,"Arial",clrWheat);
         ObjectSetInteger(0,"LOTB"+OrderTicket(),OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
        }
     }
  } 
Können Sie mir sagen, wie ich den letzten Text aus dieser Liste in einen anderen Teil des Codes übernehmen kann?
 
Rustam Bikbulatov:

Können Sie mir einen Tipp geben?

Sie müssen die letzte Bestellung finden, die geöffnet wurde. Finden Sie das Ticket. Verwenden Sie dann die Liste der Objektnamen, um das Vorkommen einer Teilzeichenkette mit dem gefundenen Ticket der letzten Reihenfolge in der Objektnamenzeile zu finden. Sobald das Ticket der letzten Bestellung im Objektnamen vorkommt, ist dies das notwendige grafische Objekt. Nun müssen Sie nur noch das, was Sie brauchen, aus diesem grafischen Objekt extrahieren.

Grund der Beschwerde: