Diskussion zum Artikel "Verwendung von Limit-Orders anstelle von Take-Profit, ohne den ursprünglichen Code des EA zu ändern." - Seite 6

 
bekomme ich den Fehler <Stack Overflow>! Und das Problem liegt in der Bibliotheksdatei:
<LimitTakeProfit.mqh>
Hat jemand herausgefunden, was falsch gelaufen ist?
 

Hallo, liebe Leser!

ist noch jemand über den"stack overflow" Fehler gestolpert?

Ich denke, das Problem liegt in der "LimitTakeProfit.mqh" Bibliothek!!!

 

Hallo Dmitry,


vielen Dank für deinen interessanten Artikel!


Könnten Sie bitte den Fehler "paramter passed as reference, variable expected" in Bezug auf jede der folgenden Zeilen (Zeile 54, 55, 56) erklären?


CSymbolInfo CLimitTakeProfit::c_Symbol = new CSymbolInfo();

CArrayLong CLimitTakeProfit::i_TakeProfit = new CArrayLong();

CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


Danke!

 
Mario Marconi CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


Danke!

Hallo, verwenden Sie?

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>
 
Dmitriy Gizlyk #:

Hallo, benutzen Sie?

Hallo Dmitry,

die folgenden Zeilen sind genau in Ihrer "LimitTakeProfit.mqh" enthalten:

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>

Genauer gesagt, kommt dieser Fehler "paramter passed as reference, variable expected" von der Kompilierung deines EA " MACD Sample LImitTP.mq5".


Vielen Dank für Ihre Antwort!

 
Mario Marconi #:

Hallo Dmitri,

die folgenden Zeilen sind genau in Ihrer "LimitTakeProfit.mqh" enthalten:

Genauer gesagt, kommt dieser Fehler "paramter passed as reference, variable expected" von der Kompilierung deines EA " MACD Sample LImitTP.mq5".


Vielen Dank für Ihre Antwort!

Hallo, Sie müssen * vor paprameter hinzufügen

CSymbolInfo    * CLimitTakeProfit::c_Symbol       =  new CSymbolInfo();
CArrayLong     * CLimitTakeProfit::i_TakeProfit   =  new CArrayLong();
CArrayDouble   * CLimitTakeProfit::d_TakeProfit   =  new CArrayDouble();
 
Dmitriy Gizlyk #:

Hallo, Sie müssen * vor paprameter hinzufügen

Hallo Dmitri,


irgendetwas funktioniert immer noch nicht, die gleichen drei Zeilen geben die folgenden Fehler:

- Parameter als Referenz übergeben, Variable erwartet LimitTakeProfit.mqh 54 57

- Neudefinition; unterschiedliche Typ-Modifikatoren LimitTakeProfit.mqh 54 35


Vielen Dank für Ihre Antwort!

 

Hallo Dmitry,

ich weiß, dass dieser Artikel schon vor einer Weile veröffentlicht wurde, aber ich wollte mich bei dir dafür bedanken! Es ist sehr nützlich, Ihre Erklärung ist wirklich klar, und die Klasse funktioniert wie ein Charme. Vielen Dank dafür!

Ich glaube, ich habe einen kleinen Fehler in dem veröffentlichten Code gefunden. Auf halbem Weg durch die Funktion SetTakeProfits finden wir diese Zeile:

switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))

Diese befindet sich innerhalb einer Schleife durch alle TP. Das Problem ist, dass später in der Schleife die Funktion CheckLimitOrder aufgerufen wird, die wiederum die Funktion CheckOrderInHistory aufruft, und dort kann eine andere Position ausgewählt werden. Das bedeutet, dass bei der nächsten Iteration der Schleife der "Schalter" im obigen Code anders sein kann.

Um dies zu lösen, sollte meiner Meinung nach position_type in einer Variablen gespeichert werden, bevor die Schleife beginnt. So:

bool CLimitTakeProfit::SetTakeProfits(ulong position_ticket, double new_tp=0)

// (...)

   double position_volume=PositionGetDouble(POSITION_VOLUME);

//********** DIE NÄCHSTE ZEILE HINZUFÜGEN
   ENUM_POSITION_TYPE position_type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
//****************************

   double closed=0;
   double closed_perc=0;
   double fix_closed_per=0;
//---
   for(int i=0;i<total;i++)
     {
      tp_request.comment="TP"+IntegerToString(i)+"_"+IntegerToString(position_ticket);
      if(i_TakeProfit.At(i)<tp_int && d_TakeProfit.At(i)>0)
        {
         if(closed>=100 || fix_closed_per>=100)
            break;
//---
         double lot=position_volume*MathMin(d_TakeProfit.At(i),100-closed_perc)/(100-fix_closed_per);
         lot=MathMin(position_volume-closed,lot);
         lot=c_Symbol.LotsMin()+MathMax(0,NormalizeDouble((lot-c_Symbol.LotsMin())/c_Symbol.LotsStep(),0)*c_Symbol.LotsStep());
         lot=NormalizeDouble(lot,2);
         tp_request.volume=lot;

//********** ÄNDERN SIE DIE NÄCHSTE ZEILE
         //switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))
         switch(position_type)
//*******************************
           {
            case POSITION_TYPE_BUY:
              tp_request.type=ORDER_TYPE_SELL_LIMIT;
              tp_request.price=c_Symbol.NormalizePrice(open_price+i_TakeProfit.At(i)*c_Symbol.Point());

// (...)

Ich hoffe, das macht Sinn. Nochmals vielen Dank für die hervorragende Arbeit!

 

Hallo zusammen!

Ich habe ein [Invalid expiration]-Problem, weiß jemand, wie man es beheben kann?

 

Hallo.

Beim Testen des EA mit LimitTakeProfit, gibt es die folgende Fehlermeldung: "Ungültige Ablaufdatum".

Ich habe versucht, den Ablauf zusammen mit der Struktur der Handelsanforderung hinzuzufügen, aber ohne Erfolg.

Kann mir bitte jemand helfen?

Maschinelle Übersetzung vom Moderator angewendet