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

 
Taras Slobodyanik #:

Sie müssen die Bedingungen immer noch bei jedem neuen Tick überprüfen, und wenn es beim vorherigen Tick nicht funktioniert hat, wird es beim neuen Tick anders sein.

Und es muss eine Fehlerbehandlung vorgenommen werden.

Wenn Sie dies über ein Array tun, dann überprüfen Sie nur die Ticks der geänderten Aufträge, die in das Array geschrieben wurden, mit allen anderen Aufträgen.

MakarFX #:
Das stimmt ungefähr, ja, danke. In diesem Fall sollten Sie, wenn Sie in Objekten speichern, besser eindeutige Majicies anstelle von Tickets verwenden, da es sonst Dutzende von Objekten mit demselben Namen gibt.

StringToInteger(ObjectName(0,i,0)
Ein Tippfehler? Ich glaube, beide Funktionen können nur einen Parameter annehmen.
 
Документация по MQL5: Графические объекты / ObjectName
Документация по MQL5: Графические объекты / ObjectName
  • www.mql5.com
ObjectName - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nerd Trader #:
Wenn Sie dies über ein Array tun, dann überprüfen Sie nur die Ticks der geänderten Aufträge, die in das Array geschrieben wurden, mit allen anderen.

Ungefähr richtig, ja, danke. In diesem Fall, wenn wir in Objekten speichern, sollten wir besser eindeutige Majics anstelle von Tickets haben, sonst gibt es Dutzende von Objekten mit dem gleichen Namen.

Ein Tippfehler? Ich glaube, beide Funktionen können nur einen Parameter annehmen.

Das werden sie nicht.

if(ObjectName(i)!=OrderTicket()) ObjectDelete(0,ObjectName(i));

Entschuldigung

StringToInteger(ObjectName( i));
 
MakarFX #:

Das werden sie nicht.

Entschuldigung

Wissen Sie übrigens, warum der folgende Fehler in regelmäßigen Abständen auftritt? Auf 100 erfolgreich eröffnete Aufträge entfallen etwa 10 dieser Aufträge.

2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: 4051 | order.sl_price: 2.813499706815862e-262
2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: OrderSend error 4051
2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: unknown trade cmd 406958564 for OrderSend function

order.sl_price: 2.813499706815862e-262 - Stoploop-Preis, diese Zahl sollte eindeutig nicht sein.
4051 - "Ungültiger Wert des Funktionsparameters"
- ist dies der Auftragstyp? Auch damit sollte es keine Probleme geben.

class Order{
  public:
    double open_price;
    double sl_price;
    double tp_price;
    color  arrow_color;
    string error_text;
    int cmd;

    Order(){};

    void InitForSell(string type = ""){
      if(type == ""){
        Print("Ошибка: 'type' должен иметь значение");
        return;
      }

      sl_price = NormalizeDouble(db_last.hight + (sl_indent*Point), Digits); // (цена + (кол-во пипсов*Point)


      arrow_color = clrRed;

      if(type == "sellstop"){
        open_price = NormalizeDouble(db_last.low - (order_indent*Point), Digits);

        if(tp_size != 0)
          tp_price = NormalizeDouble(db_last.low - (order_indent+tp_size)*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_SELLSTOP;
        error_text = "Ошибка открытия селстопа ";
      }

      if(type == "sell"){
        open_price = Bid;

        if(tp_size != 0)
          tp_price = NormalizeDouble(Bid - tp_size*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_SELL;
        error_text = "Ошибка открытия села ";
      }
    };

    void InitForBuy(string type = ""){
      if(type == ""){
        Print("Ошибка: 'type' должен иметь значение");
        return;
      }

      sl_price = NormalizeDouble(db_last.low - (sl_indent*Point), Digits); // (цена + (кол-во пипсов*Point)


      arrow_color = clrGreen;

      if(type == "buystop"){
        open_price = NormalizeDouble(db_last.hight + (order_indent*Point), Digits);

        if(tp_size != 0)
          tp_price = NormalizeDouble(db_last.hight + (order_indent+tp_size)*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_BUYSTOP;
        error_text = "Ошибка открытия байстопа ";
      }

      if(type == "buy"){
        open_price = Ask;

        if(tp_size != 0)
          tp_price = NormalizeDouble(Bid + tp_size*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_BUY;
        error_text = "Ошибка открытия бая ";
      }
    };

    ~Order(){};
};

//-------------------------------------------

if(...)
  {
    ResetLastError();
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, order.open_price, 1, 
    order.sl_price, order.tp_price, "", 0, 0, order.arrow_color);

    if(order_send == -1) return;
  }
 
MakarFX #:
Meinen Sie mit Ticket oder Preis "min und max"?

Nach Ticket

 
Nerd Trader #:

Wissen Sie übrigens, warum der folgende Fehler in regelmäßigen Abständen auftritt? Auf 100 erfolgreich eröffnete Aufträge entfallen etwa 10 dieser Aufträge.

order.sl_price: 2.813499706815862e-262 - Stoppkurs, offensichtlich sollte diese Zahl nicht sein.
4051 - "Ungültiger Wert des Funktionsparameters"
- ist dies der Auftragstyp? Auch damit sollte es keine Probleme geben.

Versuchen Sie, "NormalizeDouble" zu verschieben

if(...)
  {
    ResetLastError();
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, NormalizeDouble(order.open_price, Digits), 1, 
    NormalizeDouble(order.sl_price, Digits), NormalizeDouble(order.tp_price, Digits), "", 0, 0, order.arrow_color);

    if(order_send == -1) return;
  }

 
EVGENII SHELIPOV #:

Nach Ticket

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderTicket()== GetTicketMaxMinOrder(0) || OrderTicket()== GetTicketMaxMinOrder(1) ) {
             p=MarketInfo(OrderSymbol(), MODE_POINT);
             if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
             if (OrderType()==OP_BUY) {
               pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
             }
             if (OrderType()==OP_SELL) {
               pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
            }
          }
        }
      }
    }
  }
  return(pr);
}
 
MakarFX #:

Versuchen Sie "NormalizeDouble" zu verschieben

unverändert.

 
MakarFX #:

Makar hat Code in den EA so weit nur eingefügt, um Gewinn in Währung und Gewinn in Pips zu vergleichen, soweit ich verstehe, kann es verstanden werden, wenn diese Funktionen Nullwerte haben


Grund der Beschwerde: